diff --git a/libs/_markerlib/__init__.py b/libs/_markerlib/__init__.py new file mode 100644 index 000000000..e2b237b1f --- /dev/null +++ b/libs/_markerlib/__init__.py @@ -0,0 +1,16 @@ +try: + import ast + from _markerlib.markers import default_environment, compile, interpret +except ImportError: + if 'ast' in globals(): + raise + def default_environment(): + return {} + def compile(marker): + def marker_fn(environment=None, override=None): + # 'empty markers are True' heuristic won't install extra deps. + return not marker.strip() + marker_fn.__doc__ = marker + return marker_fn + def interpret(marker, environment=None, override=None): + return compile(marker)() diff --git a/libs/_markerlib/markers.py b/libs/_markerlib/markers.py new file mode 100644 index 000000000..fa837061e --- /dev/null +++ b/libs/_markerlib/markers.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +"""Interpret PEP 345 environment markers. + +EXPR [in|==|!=|not in] EXPR [or|and] ... + +where EXPR belongs to any of those: + + python_version = '%s.%s' % (sys.version_info[0], sys.version_info[1]) + python_full_version = sys.version.split()[0] + os.name = os.name + sys.platform = sys.platform + platform.version = platform.version() + platform.machine = platform.machine() + platform.python_implementation = platform.python_implementation() + a free string, like '2.6', or 'win32' +""" + +__all__ = ['default_environment', 'compile', 'interpret'] + +import ast +import os +import platform +import sys +import weakref + +_builtin_compile = compile + +try: + from platform import python_implementation +except ImportError: + if os.name == "java": + # Jython 2.5 has ast module, but not platform.python_implementation() function. + def python_implementation(): + return "Jython" + else: + raise + + +# restricted set of variables +_VARS = {'sys.platform': sys.platform, + 'python_version': '%s.%s' % sys.version_info[:2], + # FIXME parsing sys.platform is not reliable, but there is no other + # way to get e.g. 2.7.2+, and the PEP is defined with sys.version + 'python_full_version': sys.version.split(' ', 1)[0], + 'os.name': os.name, + 'platform.version': platform.version(), + 'platform.machine': platform.machine(), + 'platform.python_implementation': python_implementation(), + 'extra': None # wheel extension + } + +for var in list(_VARS.keys()): + if '.' in var: + _VARS[var.replace('.', '_')] = _VARS[var] + +def default_environment(): + """Return copy of default PEP 385 globals dictionary.""" + return dict(_VARS) + +class ASTWhitelist(ast.NodeTransformer): + def __init__(self, statement): + self.statement = statement # for error messages + + ALLOWED = (ast.Compare, ast.BoolOp, ast.Attribute, ast.Name, ast.Load, ast.Str) + # Bool operations + ALLOWED += (ast.And, ast.Or) + # Comparison operations + ALLOWED += (ast.Eq, ast.Gt, ast.GtE, ast.In, ast.Is, ast.IsNot, ast.Lt, ast.LtE, ast.NotEq, ast.NotIn) + + def visit(self, node): + """Ensure statement only contains allowed nodes.""" + if not isinstance(node, self.ALLOWED): + raise SyntaxError('Not allowed in environment markers.\n%s\n%s' % + (self.statement, + (' ' * node.col_offset) + '^')) + return ast.NodeTransformer.visit(self, node) + + def visit_Attribute(self, node): + """Flatten one level of attribute access.""" + new_node = ast.Name("%s.%s" % (node.value.id, node.attr), node.ctx) + return ast.copy_location(new_node, node) + +def parse_marker(marker): + tree = ast.parse(marker, mode='eval') + new_tree = ASTWhitelist(marker).generic_visit(tree) + return new_tree + +def compile_marker(parsed_marker): + return _builtin_compile(parsed_marker, '', 'eval', + dont_inherit=True) + +_cache = weakref.WeakValueDictionary() + +def compile(marker): + """Return compiled marker as a function accepting an environment dict.""" + try: + return _cache[marker] + except KeyError: + pass + if not marker.strip(): + def marker_fn(environment=None, override=None): + """""" + return True + else: + compiled_marker = compile_marker(parse_marker(marker)) + def marker_fn(environment=None, override=None): + """override updates environment""" + if override is None: + override = {} + if environment is None: + environment = default_environment() + environment.update(override) + return eval(compiled_marker, environment) + marker_fn.__doc__ = marker + _cache[marker] = marker_fn + return _cache[marker] + +def interpret(marker, environment=None): + return compile(marker)(environment) diff --git a/libs/_scandir.c b/libs/_scandir.c new file mode 100644 index 000000000..295dedde5 --- /dev/null +++ b/libs/_scandir.c @@ -0,0 +1,1825 @@ +/* C speedups for scandir module + +This is divided into four sections (each prefixed with a "SECTION:" +comment): + +1) Python 2/3 compatibility +2) Helper utilities from posixmodule.c, fileutils.h, etc +3) SECTION: Main DirEntry and scandir implementation, taken from + Python 3.5's posixmodule.c +4) Module and method definitions and initialization code + +*/ + +#include +#include +#include +#include "osdefs.h" + +#ifdef MS_WINDOWS +#include +#include "winreparse.h" +#else +#include +#ifndef HAVE_DIRENT_H +#define HAVE_DIRENT_H 1 +#endif +#endif + +#define MODNAME "scandir" + + +/* SECTION: Python 2/3 compatibility */ + +#if PY_MAJOR_VERSION >= 3 +#define INIT_ERROR return NULL +#else +#define INIT_ERROR return +// Because on PyPy, Py_FileSystemDefaultEncoding is (was) defined to be NULL +// (see PyPy Bitbucket issue #2669) +#define FS_ENCODING (Py_FileSystemDefaultEncoding ? Py_FileSystemDefaultEncoding : "UTF-8") +#endif + +#if PY_MAJOR_VERSION < 3 || PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION <= 2 +#define _Py_IDENTIFIER(name) static char * PyId_##name = #name; +#define _PyObject_GetAttrId(obj, pyid_name) PyObject_GetAttrString((obj), *(pyid_name)) +#define PyExc_FileNotFoundError PyExc_OSError +#define PyUnicode_AsUnicodeAndSize(unicode, addr_length) \ + PyUnicode_AsUnicode(unicode); *(addr_length) = PyUnicode_GetSize(unicode) +#endif + + +/* SECTION: Helper utilities from posixmodule.c, fileutils.h, etc */ + +#if !defined(MS_WINDOWS) && defined(DT_UNKNOWN) +#define HAVE_DIRENT_D_TYPE 1 +#endif + +#ifdef HAVE_DIRENT_H +#include +#define NAMLEN(dirent) strlen((dirent)->d_name) +#else +#if defined(__WATCOMC__) && !defined(__QNX__) +#include +#define NAMLEN(dirent) strlen((dirent)->d_name) +#else +#define dirent direct +#define NAMLEN(dirent) (dirent)->d_namlen +#endif +#ifdef HAVE_SYS_NDIR_H +#include +#endif +#ifdef HAVE_SYS_DIR_H +#include +#endif +#ifdef HAVE_NDIR_H +#include +#endif +#endif + +#ifndef Py_CLEANUP_SUPPORTED +#define Py_CLEANUP_SUPPORTED 0x20000 +#endif + +#ifndef S_IFLNK +/* Windows doesn't define S_IFLNK but posixmodule.c maps + * IO_REPARSE_TAG_SYMLINK to S_IFLNK */ +# define S_IFLNK 0120000 +#endif + +// _Py_stat_struct is already defined in fileutils.h on Python 3.5+ +#if PY_MAJOR_VERSION < 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 5) +#ifdef MS_WINDOWS +struct _Py_stat_struct { + unsigned long st_dev; + unsigned __int64 st_ino; + unsigned short st_mode; + int st_nlink; + int st_uid; + int st_gid; + unsigned long st_rdev; + __int64 st_size; + time_t st_atime; + int st_atime_nsec; + time_t st_mtime; + int st_mtime_nsec; + time_t st_ctime; + int st_ctime_nsec; + unsigned long st_file_attributes; +}; +#else +# define _Py_stat_struct stat +#endif +#endif + +/* choose the appropriate stat and fstat functions and return structs */ +#undef STAT +#undef FSTAT +#undef STRUCT_STAT +#ifdef MS_WINDOWS +# define STAT win32_stat +# define LSTAT win32_lstat +# define FSTAT _Py_fstat_noraise +# define STRUCT_STAT struct _Py_stat_struct +#else +# define STAT stat +# define LSTAT lstat +# define FSTAT fstat +# define STRUCT_STAT struct stat +#endif + +#ifdef MS_WINDOWS + +static __int64 secs_between_epochs = 11644473600; /* Seconds between 1.1.1601 and 1.1.1970 */ + +static void +FILE_TIME_to_time_t_nsec(FILETIME *in_ptr, time_t *time_out, int* nsec_out) +{ + /* XXX endianness. Shouldn't matter, as all Windows implementations are little-endian */ + /* Cannot simply cast and dereference in_ptr, + since it might not be aligned properly */ + __int64 in; + memcpy(&in, in_ptr, sizeof(in)); + *nsec_out = (int)(in % 10000000) * 100; /* FILETIME is in units of 100 nsec. */ + *time_out = Py_SAFE_DOWNCAST((in / 10000000) - secs_between_epochs, __int64, time_t); +} + +/* Below, we *know* that ugo+r is 0444 */ +#if _S_IREAD != 0400 +#error Unsupported C library +#endif +static int +attributes_to_mode(DWORD attr) +{ + int m = 0; + if (attr & FILE_ATTRIBUTE_DIRECTORY) + m |= _S_IFDIR | 0111; /* IFEXEC for user,group,other */ + else + m |= _S_IFREG; + if (attr & FILE_ATTRIBUTE_READONLY) + m |= 0444; + else + m |= 0666; + return m; +} + +void +_Py_attribute_data_to_stat(BY_HANDLE_FILE_INFORMATION *info, ULONG reparse_tag, + struct _Py_stat_struct *result) +{ + memset(result, 0, sizeof(*result)); + result->st_mode = attributes_to_mode(info->dwFileAttributes); + result->st_size = (((__int64)info->nFileSizeHigh)<<32) + info->nFileSizeLow; + result->st_dev = info->dwVolumeSerialNumber; + result->st_rdev = result->st_dev; + FILE_TIME_to_time_t_nsec(&info->ftCreationTime, &result->st_ctime, &result->st_ctime_nsec); + FILE_TIME_to_time_t_nsec(&info->ftLastWriteTime, &result->st_mtime, &result->st_mtime_nsec); + FILE_TIME_to_time_t_nsec(&info->ftLastAccessTime, &result->st_atime, &result->st_atime_nsec); + result->st_nlink = info->nNumberOfLinks; + result->st_ino = (((unsigned __int64)info->nFileIndexHigh)<<32) + info->nFileIndexLow; + if (reparse_tag == IO_REPARSE_TAG_SYMLINK) { + /* first clear the S_IFMT bits */ + result->st_mode ^= (result->st_mode & S_IFMT); + /* now set the bits that make this a symlink */ + result->st_mode |= S_IFLNK; + } + result->st_file_attributes = info->dwFileAttributes; +} + +static BOOL +get_target_path(HANDLE hdl, wchar_t **target_path) +{ + int buf_size, result_length; + wchar_t *buf; + + /* We have a good handle to the target, use it to determine + the target path name (then we'll call lstat on it). */ + buf_size = GetFinalPathNameByHandleW(hdl, 0, 0, + VOLUME_NAME_DOS); + if(!buf_size) + return FALSE; + + buf = PyMem_New(wchar_t, buf_size+1); + if (!buf) { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + + result_length = GetFinalPathNameByHandleW(hdl, + buf, buf_size, VOLUME_NAME_DOS); + + if(!result_length) { + PyMem_Free(buf); + return FALSE; + } + + if(!CloseHandle(hdl)) { + PyMem_Free(buf); + return FALSE; + } + + buf[result_length] = 0; + + *target_path = buf; + return TRUE; +} + +static int +win32_get_reparse_tag(HANDLE reparse_point_handle, ULONG *reparse_tag) +{ + char target_buffer[MAXIMUM_REPARSE_DATA_BUFFER_SIZE]; + REPARSE_DATA_BUFFER *rdb = (REPARSE_DATA_BUFFER *)target_buffer; + DWORD n_bytes_returned; + + if (0 == DeviceIoControl( + reparse_point_handle, + FSCTL_GET_REPARSE_POINT, + NULL, 0, /* in buffer */ + target_buffer, sizeof(target_buffer), + &n_bytes_returned, + NULL)) /* we're not using OVERLAPPED_IO */ + return FALSE; + + if (reparse_tag) + *reparse_tag = rdb->ReparseTag; + + return TRUE; +} + +static void +find_data_to_file_info_w(WIN32_FIND_DATAW *pFileData, + BY_HANDLE_FILE_INFORMATION *info, + ULONG *reparse_tag) +{ + memset(info, 0, sizeof(*info)); + info->dwFileAttributes = pFileData->dwFileAttributes; + info->ftCreationTime = pFileData->ftCreationTime; + info->ftLastAccessTime = pFileData->ftLastAccessTime; + info->ftLastWriteTime = pFileData->ftLastWriteTime; + info->nFileSizeHigh = pFileData->nFileSizeHigh; + info->nFileSizeLow = pFileData->nFileSizeLow; +/* info->nNumberOfLinks = 1; */ + if (pFileData->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) + *reparse_tag = pFileData->dwReserved0; + else + *reparse_tag = 0; +} + +static BOOL +attributes_from_dir_w(LPCWSTR pszFile, BY_HANDLE_FILE_INFORMATION *info, ULONG *reparse_tag) +{ + HANDLE hFindFile; + WIN32_FIND_DATAW FileData; + hFindFile = FindFirstFileW(pszFile, &FileData); + if (hFindFile == INVALID_HANDLE_VALUE) + return FALSE; + FindClose(hFindFile); + find_data_to_file_info_w(&FileData, info, reparse_tag); + return TRUE; +} + +static int +win32_xstat_impl_w(const wchar_t *path, struct _Py_stat_struct *result, + BOOL traverse) +{ + int code; + HANDLE hFile, hFile2; + BY_HANDLE_FILE_INFORMATION info; + ULONG reparse_tag = 0; + wchar_t *target_path; + const wchar_t *dot; + + hFile = CreateFileW( + path, + FILE_READ_ATTRIBUTES, /* desired access */ + 0, /* share mode */ + NULL, /* security attributes */ + OPEN_EXISTING, + /* FILE_FLAG_BACKUP_SEMANTICS is required to open a directory */ + /* FILE_FLAG_OPEN_REPARSE_POINT does not follow the symlink. + Because of this, calls like GetFinalPathNameByHandle will return + the symlink path again and not the actual final path. */ + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS| + FILE_FLAG_OPEN_REPARSE_POINT, + NULL); + + if (hFile == INVALID_HANDLE_VALUE) { + /* Either the target doesn't exist, or we don't have access to + get a handle to it. If the former, we need to return an error. + If the latter, we can use attributes_from_dir. */ + if (GetLastError() != ERROR_SHARING_VIOLATION) + return -1; + /* Could not get attributes on open file. Fall back to + reading the directory. */ + if (!attributes_from_dir_w(path, &info, &reparse_tag)) + /* Very strange. This should not fail now */ + return -1; + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (traverse) { + /* Should traverse, but could not open reparse point handle */ + SetLastError(ERROR_SHARING_VIOLATION); + return -1; + } + } + } else { + if (!GetFileInformationByHandle(hFile, &info)) { + CloseHandle(hFile); + return -1; + } + if (info.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + if (!win32_get_reparse_tag(hFile, &reparse_tag)) + return -1; + + /* Close the outer open file handle now that we're about to + reopen it with different flags. */ + if (!CloseHandle(hFile)) + return -1; + + if (traverse) { + /* In order to call GetFinalPathNameByHandle we need to open + the file without the reparse handling flag set. */ + hFile2 = CreateFileW( + path, FILE_READ_ATTRIBUTES, FILE_SHARE_READ, + NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, + NULL); + if (hFile2 == INVALID_HANDLE_VALUE) + return -1; + + if (!get_target_path(hFile2, &target_path)) + return -1; + + code = win32_xstat_impl_w(target_path, result, FALSE); + PyMem_Free(target_path); + return code; + } + } else + CloseHandle(hFile); + } + _Py_attribute_data_to_stat(&info, reparse_tag, result); + + /* Set S_IEXEC if it is an .exe, .bat, ... */ + dot = wcsrchr(path, '.'); + if (dot) { + if (_wcsicmp(dot, L".bat") == 0 || _wcsicmp(dot, L".cmd") == 0 || + _wcsicmp(dot, L".exe") == 0 || _wcsicmp(dot, L".com") == 0) + result->st_mode |= 0111; + } + return 0; +} + +static int +win32_xstat_w(const wchar_t *path, struct _Py_stat_struct *result, BOOL traverse) +{ + /* Protocol violation: we explicitly clear errno, instead of + setting it to a POSIX error. Callers should use GetLastError. */ + int code = win32_xstat_impl_w(path, result, traverse); + errno = 0; + return code; +} + +static int +win32_lstat_w(const wchar_t* path, struct _Py_stat_struct *result) +{ + return win32_xstat_w(path, result, FALSE); +} + +static int +win32_stat_w(const wchar_t* path, struct _Py_stat_struct *result) +{ + return win32_xstat_w(path, result, TRUE); +} + +#endif /* MS_WINDOWS */ + +static PyTypeObject StatResultType; + +static PyObject *billion = NULL; + +static newfunc structseq_new; + +static PyObject * +statresult_new(PyTypeObject *type, PyObject *args, PyObject *kwds) +{ + PyStructSequence *result; + int i; + + result = (PyStructSequence*)structseq_new(type, args, kwds); + if (!result) + return NULL; + /* If we have been initialized from a tuple, + st_?time might be set to None. Initialize it + from the int slots. */ + for (i = 7; i <= 9; i++) { + if (result->ob_item[i+3] == Py_None) { + Py_DECREF(Py_None); + Py_INCREF(result->ob_item[i]); + result->ob_item[i+3] = result->ob_item[i]; + } + } + return (PyObject*)result; +} + +/* If true, st_?time is float. */ +static int _stat_float_times = 1; + +static void +fill_time(PyObject *v, int index, time_t sec, unsigned long nsec) +{ +#if SIZEOF_TIME_T > SIZEOF_LONG + PyObject *s = PyLong_FromLongLong((PY_LONG_LONG)sec); +#else +#if PY_MAJOR_VERSION >= 3 + PyObject *s = PyLong_FromLong((long)sec); +#else + PyObject *s = PyInt_FromLong((long)sec); +#endif +#endif + PyObject *ns_fractional = PyLong_FromUnsignedLong(nsec); + PyObject *s_in_ns = NULL; + PyObject *ns_total = NULL; + PyObject *float_s = NULL; + + if (!(s && ns_fractional)) + goto exit; + + s_in_ns = PyNumber_Multiply(s, billion); + if (!s_in_ns) + goto exit; + + ns_total = PyNumber_Add(s_in_ns, ns_fractional); + if (!ns_total) + goto exit; + + if (_stat_float_times) { + float_s = PyFloat_FromDouble(sec + 1e-9*nsec); + if (!float_s) + goto exit; + } + else { + float_s = s; + Py_INCREF(float_s); + } + + PyStructSequence_SET_ITEM(v, index, s); + PyStructSequence_SET_ITEM(v, index+3, float_s); + PyStructSequence_SET_ITEM(v, index+6, ns_total); + s = NULL; + float_s = NULL; + ns_total = NULL; +exit: + Py_XDECREF(s); + Py_XDECREF(ns_fractional); + Py_XDECREF(s_in_ns); + Py_XDECREF(ns_total); + Py_XDECREF(float_s); +} + +#ifdef MS_WINDOWS +#define HAVE_STAT_NSEC 1 +#define HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES 1 +#endif + +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE +#define ST_BLKSIZE_IDX 16 +#else +#define ST_BLKSIZE_IDX 15 +#endif + +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS +#define ST_BLOCKS_IDX (ST_BLKSIZE_IDX+1) +#else +#define ST_BLOCKS_IDX ST_BLKSIZE_IDX +#endif + +#ifdef HAVE_STRUCT_STAT_ST_RDEV +#define ST_RDEV_IDX (ST_BLOCKS_IDX+1) +#else +#define ST_RDEV_IDX ST_BLOCKS_IDX +#endif + +#ifdef HAVE_STRUCT_STAT_ST_FLAGS +#define ST_FLAGS_IDX (ST_RDEV_IDX+1) +#else +#define ST_FLAGS_IDX ST_RDEV_IDX +#endif + +#ifdef HAVE_STRUCT_STAT_ST_GEN +#define ST_GEN_IDX (ST_FLAGS_IDX+1) +#else +#define ST_GEN_IDX ST_FLAGS_IDX +#endif + +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME +#define ST_BIRTHTIME_IDX (ST_GEN_IDX+1) +#else +#define ST_BIRTHTIME_IDX ST_GEN_IDX +#endif + +#ifdef HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES +#define ST_FILE_ATTRIBUTES_IDX (ST_BIRTHTIME_IDX+1) +#else +#define ST_FILE_ATTRIBUTES_IDX ST_BIRTHTIME_IDX +#endif + +#ifdef HAVE_LONG_LONG +# define _PyLong_FromDev PyLong_FromLongLong +#else +# define _PyLong_FromDev PyLong_FromLong +#endif + +#ifndef MS_WINDOWS +PyObject * +_PyLong_FromUid(uid_t uid) +{ + if (uid == (uid_t)-1) + return PyLong_FromLong(-1); + return PyLong_FromUnsignedLong(uid); +} + +PyObject * +_PyLong_FromGid(gid_t gid) +{ + if (gid == (gid_t)-1) + return PyLong_FromLong(-1); + return PyLong_FromUnsignedLong(gid); +} +#endif + +/* pack a system stat C structure into the Python stat tuple + (used by posix_stat() and posix_fstat()) */ +static PyObject* +_pystat_fromstructstat(STRUCT_STAT *st) +{ + unsigned long ansec, mnsec, cnsec; + PyObject *v = PyStructSequence_New(&StatResultType); + if (v == NULL) + return NULL; + + PyStructSequence_SET_ITEM(v, 0, PyLong_FromLong((long)st->st_mode)); +#ifdef HAVE_LARGEFILE_SUPPORT + PyStructSequence_SET_ITEM(v, 1, + PyLong_FromUnsignedLongLong(st->st_ino)); +#else + PyStructSequence_SET_ITEM(v, 1, PyLong_FromUnsignedLong((unsigned long)st->st_ino)); +#endif +#ifdef MS_WINDOWS + PyStructSequence_SET_ITEM(v, 2, PyLong_FromUnsignedLong(st->st_dev)); +#else + PyStructSequence_SET_ITEM(v, 2, _PyLong_FromDev(st->st_dev)); +#endif + PyStructSequence_SET_ITEM(v, 3, PyLong_FromLong((long)st->st_nlink)); +#if defined(MS_WINDOWS) + PyStructSequence_SET_ITEM(v, 4, PyLong_FromLong(0)); + PyStructSequence_SET_ITEM(v, 5, PyLong_FromLong(0)); +#else + PyStructSequence_SET_ITEM(v, 4, _PyLong_FromUid(st->st_uid)); + PyStructSequence_SET_ITEM(v, 5, _PyLong_FromGid(st->st_gid)); +#endif +#ifdef HAVE_LARGEFILE_SUPPORT + PyStructSequence_SET_ITEM(v, 6, + PyLong_FromLongLong((PY_LONG_LONG)st->st_size)); +#else + PyStructSequence_SET_ITEM(v, 6, PyLong_FromLong(st->st_size)); +#endif + +#if defined(HAVE_STAT_TV_NSEC) + ansec = st->st_atim.tv_nsec; + mnsec = st->st_mtim.tv_nsec; + cnsec = st->st_ctim.tv_nsec; +#elif defined(HAVE_STAT_TV_NSEC2) + ansec = st->st_atimespec.tv_nsec; + mnsec = st->st_mtimespec.tv_nsec; + cnsec = st->st_ctimespec.tv_nsec; +#elif defined(HAVE_STAT_NSEC) + ansec = st->st_atime_nsec; + mnsec = st->st_mtime_nsec; + cnsec = st->st_ctime_nsec; +#else + ansec = mnsec = cnsec = 0; +#endif + fill_time(v, 7, st->st_atime, ansec); + fill_time(v, 8, st->st_mtime, mnsec); + fill_time(v, 9, st->st_ctime, cnsec); + +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE + PyStructSequence_SET_ITEM(v, ST_BLKSIZE_IDX, + PyLong_FromLong((long)st->st_blksize)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS + PyStructSequence_SET_ITEM(v, ST_BLOCKS_IDX, + PyLong_FromLong((long)st->st_blocks)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_RDEV + PyStructSequence_SET_ITEM(v, ST_RDEV_IDX, + PyLong_FromLong((long)st->st_rdev)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_GEN + PyStructSequence_SET_ITEM(v, ST_GEN_IDX, + PyLong_FromLong((long)st->st_gen)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + { + PyObject *val; + unsigned long bsec,bnsec; + bsec = (long)st->st_birthtime; +#ifdef HAVE_STAT_TV_NSEC2 + bnsec = st->st_birthtimespec.tv_nsec; +#else + bnsec = 0; +#endif + if (_stat_float_times) { + val = PyFloat_FromDouble(bsec + 1e-9*bnsec); + } else { + val = PyLong_FromLong((long)bsec); + } + PyStructSequence_SET_ITEM(v, ST_BIRTHTIME_IDX, + val); + } +#endif +#ifdef HAVE_STRUCT_STAT_ST_FLAGS + PyStructSequence_SET_ITEM(v, ST_FLAGS_IDX, + PyLong_FromLong((long)st->st_flags)); +#endif +#ifdef HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES + PyStructSequence_SET_ITEM(v, ST_FILE_ATTRIBUTES_IDX, + PyLong_FromUnsignedLong(st->st_file_attributes)); +#endif + + if (PyErr_Occurred()) { + Py_DECREF(v); + return NULL; + } + + return v; +} + +char *PyStructSequence_UnnamedField = "unnamed field"; + +PyDoc_STRVAR(stat_result__doc__, +"stat_result: Result from stat, fstat, or lstat.\n\n\ +This object may be accessed either as a tuple of\n\ + (mode, ino, dev, nlink, uid, gid, size, atime, mtime, ctime)\n\ +or via the attributes st_mode, st_ino, st_dev, st_nlink, st_uid, and so on.\n\ +\n\ +Posix/windows: If your platform supports st_blksize, st_blocks, st_rdev,\n\ +or st_flags, they are available as attributes only.\n\ +\n\ +See os.stat for more information."); + +static PyStructSequence_Field stat_result_fields[] = { + {"st_mode", "protection bits"}, + {"st_ino", "inode"}, + {"st_dev", "device"}, + {"st_nlink", "number of hard links"}, + {"st_uid", "user ID of owner"}, + {"st_gid", "group ID of owner"}, + {"st_size", "total size, in bytes"}, + /* The NULL is replaced with PyStructSequence_UnnamedField later. */ + {NULL, "integer time of last access"}, + {NULL, "integer time of last modification"}, + {NULL, "integer time of last change"}, + {"st_atime", "time of last access"}, + {"st_mtime", "time of last modification"}, + {"st_ctime", "time of last change"}, + {"st_atime_ns", "time of last access in nanoseconds"}, + {"st_mtime_ns", "time of last modification in nanoseconds"}, + {"st_ctime_ns", "time of last change in nanoseconds"}, +#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE + {"st_blksize", "blocksize for filesystem I/O"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_BLOCKS + {"st_blocks", "number of blocks allocated"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_RDEV + {"st_rdev", "device type (if inode device)"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_FLAGS + {"st_flags", "user defined flags for file"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_GEN + {"st_gen", "generation number"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_BIRTHTIME + {"st_birthtime", "time of creation"}, +#endif +#ifdef HAVE_STRUCT_STAT_ST_FILE_ATTRIBUTES + {"st_file_attributes", "Windows file attribute bits"}, +#endif + {0} +}; + +static PyStructSequence_Desc stat_result_desc = { + "scandir.stat_result", /* name */ + stat_result__doc__, /* doc */ + stat_result_fields, + 10 +}; + + +#ifdef MS_WINDOWS +static int +win32_warn_bytes_api() +{ + return PyErr_WarnEx(PyExc_DeprecationWarning, + "The Windows bytes API has been deprecated, " + "use Unicode filenames instead", + 1); +} +#endif + +typedef struct { + const char *function_name; + const char *argument_name; + int nullable; + wchar_t *wide; + char *narrow; + int fd; + Py_ssize_t length; + PyObject *object; + PyObject *cleanup; +} path_t; + +static void +path_cleanup(path_t *path) { + if (path->cleanup) { + Py_CLEAR(path->cleanup); + } +} + +static int +path_converter(PyObject *o, void *p) { + path_t *path = (path_t *)p; + PyObject *unicode, *bytes; + Py_ssize_t length; + char *narrow; + +#define FORMAT_EXCEPTION(exc, fmt) \ + PyErr_Format(exc, "%s%s" fmt, \ + path->function_name ? path->function_name : "", \ + path->function_name ? ": " : "", \ + path->argument_name ? path->argument_name : "path") + + /* Py_CLEANUP_SUPPORTED support */ + if (o == NULL) { + path_cleanup(path); + return 1; + } + + /* ensure it's always safe to call path_cleanup() */ + path->cleanup = NULL; + + if (o == Py_None) { + if (!path->nullable) { + FORMAT_EXCEPTION(PyExc_TypeError, + "can't specify None for %s argument"); + return 0; + } + path->wide = NULL; + path->narrow = NULL; + path->length = 0; + path->object = o; + path->fd = -1; + return 1; + } + + unicode = PyUnicode_FromObject(o); + if (unicode) { +#ifdef MS_WINDOWS + wchar_t *wide; + + wide = PyUnicode_AsUnicodeAndSize(unicode, &length); + if (!wide) { + Py_DECREF(unicode); + return 0; + } + if (length > 32767) { + FORMAT_EXCEPTION(PyExc_ValueError, "%s too long for Windows"); + Py_DECREF(unicode); + return 0; + } + if (wcslen(wide) != length) { + FORMAT_EXCEPTION(PyExc_ValueError, "embedded null character"); + Py_DECREF(unicode); + return 0; + } + + path->wide = wide; + path->narrow = NULL; + path->length = length; + path->object = o; + path->fd = -1; + path->cleanup = unicode; + return Py_CLEANUP_SUPPORTED; +#else +#if PY_MAJOR_VERSION >= 3 + if (!PyUnicode_FSConverter(unicode, &bytes)) + bytes = NULL; +#else + bytes = PyUnicode_AsEncodedString(unicode, FS_ENCODING, "strict"); +#endif + Py_DECREF(unicode); +#endif + } + else { + PyErr_Clear(); +#if PY_MAJOR_VERSION >= 3 + if (PyObject_CheckBuffer(o)) { + bytes = PyBytes_FromObject(o); + } +#else + if (PyString_Check(o)) { + bytes = o; + Py_INCREF(bytes); + } +#endif + else + bytes = NULL; + if (!bytes) { + PyErr_Clear(); + } + } + + if (!bytes) { + if (!PyErr_Occurred()) + FORMAT_EXCEPTION(PyExc_TypeError, "illegal type for %s parameter"); + return 0; + } + +#ifdef MS_WINDOWS + if (win32_warn_bytes_api()) { + Py_DECREF(bytes); + return 0; + } +#endif + + length = PyBytes_GET_SIZE(bytes); +#ifdef MS_WINDOWS + if (length > MAX_PATH-1) { + FORMAT_EXCEPTION(PyExc_ValueError, "%s too long for Windows"); + Py_DECREF(bytes); + return 0; + } +#endif + + narrow = PyBytes_AS_STRING(bytes); + if ((size_t)length != strlen(narrow)) { + FORMAT_EXCEPTION(PyExc_ValueError, "embedded null character in %s"); + Py_DECREF(bytes); + return 0; + } + + path->wide = NULL; + path->narrow = narrow; + path->length = length; + path->object = o; + path->fd = -1; + path->cleanup = bytes; + return Py_CLEANUP_SUPPORTED; +} + +static PyObject * +path_error(path_t *path) +{ +#ifdef MS_WINDOWS + return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, + 0, path->object); +#else + return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, path->object); +#endif +} + + +/* SECTION: Main DirEntry and scandir implementation, taken from + Python 3.5's posixmodule.c */ + +PyDoc_STRVAR(posix_scandir__doc__, +"scandir(path='.') -> iterator of DirEntry objects for given path"); + +static char *follow_symlinks_keywords[] = {"follow_symlinks", NULL}; +#if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 3 +static char *follow_symlinks_format = "|$p:DirEntry.stat"; +#else +static char *follow_symlinks_format = "|i:DirEntry.stat"; +#endif + +typedef struct { + PyObject_HEAD + PyObject *name; + PyObject *path; + PyObject *stat; + PyObject *lstat; +#ifdef MS_WINDOWS + struct _Py_stat_struct win32_lstat; + unsigned __int64 win32_file_index; + int got_file_index; +#if PY_MAJOR_VERSION < 3 + int name_path_bytes; +#endif +#else /* POSIX */ +#ifdef HAVE_DIRENT_D_TYPE + unsigned char d_type; +#endif + ino_t d_ino; +#endif +} DirEntry; + +static void +DirEntry_dealloc(DirEntry *entry) +{ + Py_XDECREF(entry->name); + Py_XDECREF(entry->path); + Py_XDECREF(entry->stat); + Py_XDECREF(entry->lstat); + Py_TYPE(entry)->tp_free((PyObject *)entry); +} + +/* Forward reference */ +static int +DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits); + +/* Set exception and return -1 on error, 0 for False, 1 for True */ +static int +DirEntry_is_symlink(DirEntry *self) +{ +#ifdef MS_WINDOWS + return (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; +#elif defined(HAVE_DIRENT_D_TYPE) + /* POSIX */ + if (self->d_type != DT_UNKNOWN) + return self->d_type == DT_LNK; + else + return DirEntry_test_mode(self, 0, S_IFLNK); +#else + /* POSIX without d_type */ + return DirEntry_test_mode(self, 0, S_IFLNK); +#endif +} + +static PyObject * +DirEntry_py_is_symlink(DirEntry *self) +{ + int result; + + result = DirEntry_is_symlink(self); + if (result == -1) + return NULL; + return PyBool_FromLong(result); +} + +static PyObject * +DirEntry_fetch_stat(DirEntry *self, int follow_symlinks) +{ + int result; + struct _Py_stat_struct st; + +#ifdef MS_WINDOWS + wchar_t *path; + + path = PyUnicode_AsUnicode(self->path); + if (!path) + return NULL; + + if (follow_symlinks) + result = win32_stat_w(path, &st); + else + result = win32_lstat_w(path, &st); + + if (result != 0) { + return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, + 0, self->path); + } +#else /* POSIX */ + PyObject *bytes; + char *path; + +#if PY_MAJOR_VERSION >= 3 + if (!PyUnicode_FSConverter(self->path, &bytes)) + return NULL; +#else + if (PyString_Check(self->path)) { + bytes = self->path; + Py_INCREF(bytes); + } else { + bytes = PyUnicode_AsEncodedString(self->path, FS_ENCODING, "strict"); + if (!bytes) + return NULL; + } +#endif + path = PyBytes_AS_STRING(bytes); + + if (follow_symlinks) + result = STAT(path, &st); + else + result = LSTAT(path, &st); + Py_DECREF(bytes); + + if (result != 0) + return PyErr_SetFromErrnoWithFilenameObject(PyExc_OSError, self->path); +#endif + + return _pystat_fromstructstat(&st); +} + +static PyObject * +DirEntry_get_lstat(DirEntry *self) +{ + if (!self->lstat) { +#ifdef MS_WINDOWS + self->lstat = _pystat_fromstructstat(&self->win32_lstat); +#else /* POSIX */ + self->lstat = DirEntry_fetch_stat(self, 0); +#endif + } + Py_XINCREF(self->lstat); + return self->lstat; +} + +static PyObject * +DirEntry_get_stat(DirEntry *self, int follow_symlinks) +{ + if (!follow_symlinks) + return DirEntry_get_lstat(self); + + if (!self->stat) { + int result = DirEntry_is_symlink(self); + if (result == -1) + return NULL; + else if (result) + self->stat = DirEntry_fetch_stat(self, 1); + else + self->stat = DirEntry_get_lstat(self); + } + + Py_XINCREF(self->stat); + return self->stat; +} + +static PyObject * +DirEntry_stat(DirEntry *self, PyObject *args, PyObject *kwargs) +{ + int follow_symlinks = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, follow_symlinks_format, + follow_symlinks_keywords, &follow_symlinks)) + return NULL; + + return DirEntry_get_stat(self, follow_symlinks); +} + +/* Set exception and return -1 on error, 0 for False, 1 for True */ +static int +DirEntry_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits) +{ + PyObject *stat = NULL; + PyObject *st_mode = NULL; + long mode; + int result; +#if defined(MS_WINDOWS) || defined(HAVE_DIRENT_D_TYPE) + int is_symlink; + int need_stat; +#endif +#ifdef MS_WINDOWS + unsigned long dir_bits; +#endif + _Py_IDENTIFIER(st_mode); + +#ifdef MS_WINDOWS + is_symlink = (self->win32_lstat.st_mode & S_IFMT) == S_IFLNK; + need_stat = follow_symlinks && is_symlink; +#elif defined(HAVE_DIRENT_D_TYPE) + is_symlink = self->d_type == DT_LNK; + need_stat = self->d_type == DT_UNKNOWN || (follow_symlinks && is_symlink); +#endif + +#if defined(MS_WINDOWS) || defined(HAVE_DIRENT_D_TYPE) + if (need_stat) { +#endif + stat = DirEntry_get_stat(self, follow_symlinks); + if (!stat) { + if (PyErr_ExceptionMatches(PyExc_FileNotFoundError)) { + /* If file doesn't exist (anymore), then return False + (i.e., say it's not a file/directory) */ + PyErr_Clear(); + return 0; + } + goto error; + } + st_mode = _PyObject_GetAttrId(stat, &PyId_st_mode); + if (!st_mode) + goto error; + + mode = PyLong_AsLong(st_mode); + if (mode == -1 && PyErr_Occurred()) + goto error; + Py_CLEAR(st_mode); + Py_CLEAR(stat); + result = (mode & S_IFMT) == mode_bits; +#if defined(MS_WINDOWS) || defined(HAVE_DIRENT_D_TYPE) + } + else if (is_symlink) { + assert(mode_bits != S_IFLNK); + result = 0; + } + else { + assert(mode_bits == S_IFDIR || mode_bits == S_IFREG); +#ifdef MS_WINDOWS + dir_bits = self->win32_lstat.st_file_attributes & FILE_ATTRIBUTE_DIRECTORY; + if (mode_bits == S_IFDIR) + result = dir_bits != 0; + else + result = dir_bits == 0; +#else /* POSIX */ + if (mode_bits == S_IFDIR) + result = self->d_type == DT_DIR; + else + result = self->d_type == DT_REG; +#endif + } +#endif + + return result; + +error: + Py_XDECREF(st_mode); + Py_XDECREF(stat); + return -1; +} + +static PyObject * +DirEntry_py_test_mode(DirEntry *self, int follow_symlinks, unsigned short mode_bits) +{ + int result; + + result = DirEntry_test_mode(self, follow_symlinks, mode_bits); + if (result == -1) + return NULL; + return PyBool_FromLong(result); +} + +static PyObject * +DirEntry_is_dir(DirEntry *self, PyObject *args, PyObject *kwargs) +{ + int follow_symlinks = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, follow_symlinks_format, + follow_symlinks_keywords, &follow_symlinks)) + return NULL; + + return DirEntry_py_test_mode(self, follow_symlinks, S_IFDIR); +} + +static PyObject * +DirEntry_is_file(DirEntry *self, PyObject *args, PyObject *kwargs) +{ + int follow_symlinks = 1; + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, follow_symlinks_format, + follow_symlinks_keywords, &follow_symlinks)) + return NULL; + + return DirEntry_py_test_mode(self, follow_symlinks, S_IFREG); +} + +static PyObject * +DirEntry_inode(DirEntry *self) +{ +#ifdef MS_WINDOWS + if (!self->got_file_index) { + wchar_t *path; + struct _Py_stat_struct stat; + + path = PyUnicode_AsUnicode(self->path); + if (!path) + return NULL; + + if (win32_lstat_w(path, &stat) != 0) { + return PyErr_SetExcFromWindowsErrWithFilenameObject(PyExc_OSError, + 0, self->path); + } + + self->win32_file_index = stat.st_ino; + self->got_file_index = 1; + } + return PyLong_FromUnsignedLongLong(self->win32_file_index); +#else /* POSIX */ +#ifdef HAVE_LARGEFILE_SUPPORT + return PyLong_FromUnsignedLongLong(self->d_ino); +#else + return PyLong_FromUnsignedLong((unsigned long)self->d_ino); +#endif +#endif +} + +#if PY_MAJOR_VERSION < 3 && defined(MS_WINDOWS) + +PyObject *DirEntry_name_getter(DirEntry *self, void *closure) { + if (self->name_path_bytes) { + return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(self->name), + PyUnicode_GetSize(self->name), "strict"); + } else { + Py_INCREF(self->name); + return self->name; + } +} + +PyObject *DirEntry_path_getter(DirEntry *self, void *closure) { + if (self->name_path_bytes) { + return PyUnicode_EncodeMBCS(PyUnicode_AS_UNICODE(self->path), + PyUnicode_GetSize(self->path), "strict"); + } else { + Py_INCREF(self->path); + return self->path; + } +} + +static PyGetSetDef DirEntry_getset[] = { + {"name", (getter)DirEntry_name_getter, NULL, + "the entry's base filename, relative to scandir() \"path\" argument", NULL}, + {"path", (getter)DirEntry_path_getter, NULL, + "the entry's full path name; equivalent to os.path.join(scandir_path, entry.name)", NULL}, + {NULL} +}; + +#else + +static PyMemberDef DirEntry_members[] = { + {"name", T_OBJECT_EX, offsetof(DirEntry, name), READONLY, + "the entry's base filename, relative to scandir() \"path\" argument"}, + {"path", T_OBJECT_EX, offsetof(DirEntry, path), READONLY, + "the entry's full path name; equivalent to os.path.join(scandir_path, entry.name)"}, + {NULL} +}; + +#endif + +static PyObject * +DirEntry_repr(DirEntry *self) +{ +#if PY_MAJOR_VERSION >= 3 + return PyUnicode_FromFormat("", self->name); +#elif defined(MS_WINDOWS) + PyObject *name; + PyObject *name_repr; + PyObject *entry_repr; + + name = DirEntry_name_getter(self, NULL); + if (!name) + return NULL; + name_repr = PyObject_Repr(name); + Py_DECREF(name); + if (!name_repr) + return NULL; + entry_repr = PyString_FromFormat("", PyString_AsString(name_repr)); + Py_DECREF(name_repr); + return entry_repr; +#else + PyObject *name_repr; + PyObject *entry_repr; + + name_repr = PyObject_Repr(self->name); + if (!name_repr) + return NULL; + entry_repr = PyString_FromFormat("", PyString_AsString(name_repr)); + Py_DECREF(name_repr); + return entry_repr; +#endif +} + +static PyMethodDef DirEntry_methods[] = { + {"is_dir", (PyCFunction)DirEntry_is_dir, METH_VARARGS | METH_KEYWORDS, + "return True if the entry is a directory; cached per entry" + }, + {"is_file", (PyCFunction)DirEntry_is_file, METH_VARARGS | METH_KEYWORDS, + "return True if the entry is a file; cached per entry" + }, + {"is_symlink", (PyCFunction)DirEntry_py_is_symlink, METH_NOARGS, + "return True if the entry is a symbolic link; cached per entry" + }, + {"stat", (PyCFunction)DirEntry_stat, METH_VARARGS | METH_KEYWORDS, + "return stat_result object for the entry; cached per entry" + }, + {"inode", (PyCFunction)DirEntry_inode, METH_NOARGS, + "return inode of the entry; cached per entry", + }, + {NULL} +}; + +static PyTypeObject DirEntryType = { + PyVarObject_HEAD_INIT(NULL, 0) + MODNAME ".DirEntry", /* tp_name */ + sizeof(DirEntry), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)DirEntry_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + (reprfunc)DirEntry_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + DirEntry_methods, /* tp_methods */ +#if PY_MAJOR_VERSION < 3 && defined(MS_WINDOWS) + NULL, /* tp_members */ + DirEntry_getset, /* tp_getset */ +#else + DirEntry_members, /* tp_members */ + NULL, /* tp_getset */ +#endif +}; + +#ifdef MS_WINDOWS + +static wchar_t * +join_path_filenameW(wchar_t *path_wide, wchar_t* filename) +{ + Py_ssize_t path_len; + Py_ssize_t size; + wchar_t *result; + wchar_t ch; + + if (!path_wide) { /* Default arg: "." */ + path_wide = L"."; + path_len = 1; + } + else { + path_len = wcslen(path_wide); + } + + /* The +1's are for the path separator and the NUL */ + size = path_len + 1 + wcslen(filename) + 1; + result = PyMem_New(wchar_t, size); + if (!result) { + PyErr_NoMemory(); + return NULL; + } + wcscpy(result, path_wide); + if (path_len > 0) { + ch = result[path_len - 1]; + if (ch != SEP && ch != ALTSEP && ch != L':') + result[path_len++] = SEP; + wcscpy(result + path_len, filename); + } + return result; +} + +static PyObject * +DirEntry_from_find_data(path_t *path, WIN32_FIND_DATAW *dataW) +{ + DirEntry *entry; + BY_HANDLE_FILE_INFORMATION file_info; + ULONG reparse_tag; + wchar_t *joined_path; + + entry = PyObject_New(DirEntry, &DirEntryType); + if (!entry) + return NULL; + entry->name = NULL; + entry->path = NULL; + entry->stat = NULL; + entry->lstat = NULL; + entry->got_file_index = 0; +#if PY_MAJOR_VERSION < 3 + entry->name_path_bytes = path->object && PyBytes_Check(path->object); +#endif + + entry->name = PyUnicode_FromWideChar(dataW->cFileName, wcslen(dataW->cFileName)); + if (!entry->name) + goto error; + + joined_path = join_path_filenameW(path->wide, dataW->cFileName); + if (!joined_path) + goto error; + + entry->path = PyUnicode_FromWideChar(joined_path, wcslen(joined_path)); + PyMem_Free(joined_path); + if (!entry->path) + goto error; + + find_data_to_file_info_w(dataW, &file_info, &reparse_tag); + _Py_attribute_data_to_stat(&file_info, reparse_tag, &entry->win32_lstat); + + return (PyObject *)entry; + +error: + Py_DECREF(entry); + return NULL; +} + +#else /* POSIX */ + +static char * +join_path_filename(char *path_narrow, char* filename, Py_ssize_t filename_len) +{ + Py_ssize_t path_len; + Py_ssize_t size; + char *result; + + if (!path_narrow) { /* Default arg: "." */ + path_narrow = "."; + path_len = 1; + } + else { + path_len = strlen(path_narrow); + } + + if (filename_len == -1) + filename_len = strlen(filename); + + /* The +1's are for the path separator and the NUL */ + size = path_len + 1 + filename_len + 1; + result = PyMem_New(char, size); + if (!result) { + PyErr_NoMemory(); + return NULL; + } + strcpy(result, path_narrow); + if (path_len > 0 && result[path_len - 1] != '/') + result[path_len++] = '/'; + strcpy(result + path_len, filename); + return result; +} + +static PyObject * +DirEntry_from_posix_info(path_t *path, char *name, Py_ssize_t name_len, + ino_t d_ino +#ifdef HAVE_DIRENT_D_TYPE + , unsigned char d_type +#endif + ) +{ + DirEntry *entry; + char *joined_path; + + entry = PyObject_New(DirEntry, &DirEntryType); + if (!entry) + return NULL; + entry->name = NULL; + entry->path = NULL; + entry->stat = NULL; + entry->lstat = NULL; + + joined_path = join_path_filename(path->narrow, name, name_len); + if (!joined_path) + goto error; + + if (!path->narrow || !PyBytes_Check(path->object)) { +#if PY_MAJOR_VERSION >= 3 + entry->name = PyUnicode_DecodeFSDefaultAndSize(name, name_len); + entry->path = PyUnicode_DecodeFSDefault(joined_path); +#else + entry->name = PyUnicode_Decode(name, name_len, + FS_ENCODING, "strict"); + entry->path = PyUnicode_Decode(joined_path, strlen(joined_path), + FS_ENCODING, "strict"); +#endif + } + else { + entry->name = PyBytes_FromStringAndSize(name, name_len); + entry->path = PyBytes_FromString(joined_path); + } + PyMem_Free(joined_path); + if (!entry->name || !entry->path) + goto error; + +#ifdef HAVE_DIRENT_D_TYPE + entry->d_type = d_type; +#endif + entry->d_ino = d_ino; + + return (PyObject *)entry; + +error: + Py_XDECREF(entry); + return NULL; +} + +#endif + + +typedef struct { + PyObject_HEAD + path_t path; +#ifdef MS_WINDOWS + HANDLE handle; + WIN32_FIND_DATAW file_data; + int first_time; +#else /* POSIX */ + DIR *dirp; +#endif +} ScandirIterator; + +#ifdef MS_WINDOWS + +static void +ScandirIterator_close(ScandirIterator *iterator) +{ + if (iterator->handle == INVALID_HANDLE_VALUE) + return; + + Py_BEGIN_ALLOW_THREADS + FindClose(iterator->handle); + Py_END_ALLOW_THREADS + iterator->handle = INVALID_HANDLE_VALUE; +} + +static PyObject * +ScandirIterator_iternext(ScandirIterator *iterator) +{ + WIN32_FIND_DATAW *file_data = &iterator->file_data; + BOOL success; + + /* Happens if the iterator is iterated twice */ + if (iterator->handle == INVALID_HANDLE_VALUE) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + + while (1) { + if (!iterator->first_time) { + Py_BEGIN_ALLOW_THREADS + success = FindNextFileW(iterator->handle, file_data); + Py_END_ALLOW_THREADS + if (!success) { + if (GetLastError() != ERROR_NO_MORE_FILES) + return path_error(&iterator->path); + /* No more files found in directory, stop iterating */ + break; + } + } + iterator->first_time = 0; + + /* Skip over . and .. */ + if (wcscmp(file_data->cFileName, L".") != 0 && + wcscmp(file_data->cFileName, L"..") != 0) + return DirEntry_from_find_data(&iterator->path, file_data); + + /* Loop till we get a non-dot directory or finish iterating */ + } + + ScandirIterator_close(iterator); + + PyErr_SetNone(PyExc_StopIteration); + return NULL; +} + +#else /* POSIX */ + +static void +ScandirIterator_close(ScandirIterator *iterator) +{ + if (!iterator->dirp) + return; + + Py_BEGIN_ALLOW_THREADS + closedir(iterator->dirp); + Py_END_ALLOW_THREADS + iterator->dirp = NULL; + return; +} + +static PyObject * +ScandirIterator_iternext(ScandirIterator *iterator) +{ + struct dirent *direntp; + Py_ssize_t name_len; + int is_dot; + + /* Happens if the iterator is iterated twice */ + if (!iterator->dirp) { + PyErr_SetNone(PyExc_StopIteration); + return NULL; + } + + while (1) { + errno = 0; + Py_BEGIN_ALLOW_THREADS + direntp = readdir(iterator->dirp); + Py_END_ALLOW_THREADS + + if (!direntp) { + if (errno != 0) + return path_error(&iterator->path); + /* No more files found in directory, stop iterating */ + break; + } + + /* Skip over . and .. */ + name_len = NAMLEN(direntp); + is_dot = direntp->d_name[0] == '.' && + (name_len == 1 || (direntp->d_name[1] == '.' && name_len == 2)); + if (!is_dot) { + return DirEntry_from_posix_info(&iterator->path, direntp->d_name, + name_len, direntp->d_ino +#ifdef HAVE_DIRENT_D_TYPE + , direntp->d_type +#endif + ); + } + + /* Loop till we get a non-dot directory or finish iterating */ + } + + ScandirIterator_close(iterator); + + PyErr_SetNone(PyExc_StopIteration); + return NULL; +} + +#endif + +static void +ScandirIterator_dealloc(ScandirIterator *iterator) +{ + ScandirIterator_close(iterator); + Py_XDECREF(iterator->path.object); + path_cleanup(&iterator->path); + Py_TYPE(iterator)->tp_free((PyObject *)iterator); +} + +static PyTypeObject ScandirIteratorType = { + PyVarObject_HEAD_INIT(NULL, 0) + MODNAME ".ScandirIterator", /* tp_name */ + sizeof(ScandirIterator), /* tp_basicsize */ + 0, /* tp_itemsize */ + /* methods */ + (destructor)ScandirIterator_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_compare */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + 0, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + PyObject_SelfIter, /* tp_iter */ + (iternextfunc)ScandirIterator_iternext, /* tp_iternext */ +}; + +static PyObject * +posix_scandir(PyObject *self, PyObject *args, PyObject *kwargs) +{ + ScandirIterator *iterator; + static char *keywords[] = {"path", NULL}; +#ifdef MS_WINDOWS + wchar_t *path_strW; +#else + char *path; +#endif + + iterator = PyObject_New(ScandirIterator, &ScandirIteratorType); + if (!iterator) + return NULL; + memset(&iterator->path, 0, sizeof(path_t)); + iterator->path.function_name = "scandir"; + iterator->path.nullable = 1; + +#ifdef MS_WINDOWS + iterator->handle = INVALID_HANDLE_VALUE; +#else + iterator->dirp = NULL; +#endif + + if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|O&:scandir", keywords, + path_converter, &iterator->path)) + goto error; + + /* path_converter doesn't keep path.object around, so do it + manually for the lifetime of the iterator here (the refcount + is decremented in ScandirIterator_dealloc) + */ + Py_XINCREF(iterator->path.object); + +#ifdef MS_WINDOWS + if (iterator->path.narrow) { + PyErr_SetString(PyExc_TypeError, + "os.scandir() doesn't support bytes path on Windows, use Unicode instead"); + goto error; + } + iterator->first_time = 1; + + path_strW = join_path_filenameW(iterator->path.wide, L"*.*"); + if (!path_strW) + goto error; + + Py_BEGIN_ALLOW_THREADS + iterator->handle = FindFirstFileW(path_strW, &iterator->file_data); + Py_END_ALLOW_THREADS + + PyMem_Free(path_strW); + + if (iterator->handle == INVALID_HANDLE_VALUE) { + path_error(&iterator->path); + goto error; + } +#else /* POSIX */ + if (iterator->path.narrow) + path = iterator->path.narrow; + else + path = "."; + + errno = 0; + Py_BEGIN_ALLOW_THREADS + iterator->dirp = opendir(path); + Py_END_ALLOW_THREADS + + if (!iterator->dirp) { + path_error(&iterator->path); + goto error; + } +#endif + + return (PyObject *)iterator; + +error: + Py_DECREF(iterator); + return NULL; +} + + +/* SECTION: Module and method definitions and initialization code */ + +static PyMethodDef scandir_methods[] = { + {"scandir", (PyCFunction)posix_scandir, + METH_VARARGS | METH_KEYWORDS, + posix_scandir__doc__}, + {NULL, NULL}, +}; + +#if PY_MAJOR_VERSION >= 3 +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "_scandir", + NULL, + 0, + scandir_methods, + NULL, + NULL, + NULL, + NULL, +}; +#endif + +#if PY_MAJOR_VERSION >= 3 +PyObject * +PyInit__scandir(void) +{ + PyObject *module = PyModule_Create(&moduledef); +#else +void +init_scandir(void) +{ + PyObject *module = Py_InitModule("_scandir", scandir_methods); +#endif + if (module == NULL) { + INIT_ERROR; + } + + billion = PyLong_FromLong(1000000000); + if (!billion) + INIT_ERROR; + + stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; + stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; + PyStructSequence_InitType(&StatResultType, &stat_result_desc); + structseq_new = StatResultType.tp_new; + StatResultType.tp_new = statresult_new; + + if (PyType_Ready(&ScandirIteratorType) < 0) + INIT_ERROR; + if (PyType_Ready(&DirEntryType) < 0) + INIT_ERROR; + +#if PY_MAJOR_VERSION >= 3 + return module; +#endif +} diff --git a/libs/anydbm.py b/libs/anydbm.py new file mode 100644 index 000000000..ba7e90510 --- /dev/null +++ b/libs/anydbm.py @@ -0,0 +1,85 @@ +"""Generic interface to all dbm clones. + +Instead of + + import dbm + d = dbm.open(file, 'w', 0666) + +use + + import anydbm + d = anydbm.open(file, 'w') + +The returned object is a dbhash, gdbm, dbm or dumbdbm object, +dependent on the type of database being opened (determined by whichdb +module) in the case of an existing dbm. If the dbm does not exist and +the create or new flag ('c' or 'n') was specified, the dbm type will +be determined by the availability of the modules (tested in the above +order). + +It has the following interface (key and data are strings): + + d[key] = data # store data at key (may override data at + # existing key) + data = d[key] # retrieve data at key (raise KeyError if no + # such key) + del d[key] # delete data stored at key (raises KeyError + # if no such key) + flag = key in d # true if the key exists + list = d.keys() # return a list of all existing keys (slow!) + +Future versions may change the order in which implementations are +tested for existence, and add interfaces to other dbm-like +implementations. +""" + +class error(Exception): + pass + +_names = ['dbhash', 'gdbm', 'dbm', 'dumbdbm'] +_errors = [error] +_defaultmod = None + +for _name in _names: + try: + _mod = __import__(_name) + except ImportError: + continue + if not _defaultmod: + _defaultmod = _mod + _errors.append(_mod.error) + +if not _defaultmod: + raise ImportError, "no dbm clone found; tried %s" % _names + +error = tuple(_errors) + +def open(file, flag='r', mode=0666): + """Open or create database at path given by *file*. + + Optional argument *flag* can be 'r' (default) for read-only access, 'w' + for read-write access of an existing database, 'c' for read-write access + to a new or existing database, and 'n' for read-write access to a new + database. + + Note: 'r' and 'w' fail if the database doesn't exist; 'c' creates it + only if it doesn't exist; and 'n' always creates a new database. + """ + + # guess the type of an existing database + from whichdb import whichdb + result=whichdb(file) + if result is None: + # db doesn't exist + if 'c' in flag or 'n' in flag: + # file doesn't exist and the new + # flag was used so use default type + mod = _defaultmod + else: + raise error, "need 'c' or 'n' flag to open new db" + elif result == "": + # db type cannot be determined + raise error, "db type could not be determined" + else: + mod = __import__(result) + return mod.open(file, flag, mode) diff --git a/libs/appdirs.py b/libs/appdirs.py new file mode 100644 index 000000000..f4dba0953 --- /dev/null +++ b/libs/appdirs.py @@ -0,0 +1,552 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright (c) 2005-2010 ActiveState Software Inc. +# Copyright (c) 2013 Eddy PetriČ™or + +"""Utilities for determining application-specific dirs. + +See for details and usage. +""" +# Dev Notes: +# - MSDN on where to store app data files: +# http://support.microsoft.com/default.aspx?scid=kb;en-us;310294#XSLTH3194121123120121120120 +# - Mac OS X: http://developer.apple.com/documentation/MacOSX/Conceptual/BPFileSystem/index.html +# - XDG spec for Un*x: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html + +__version_info__ = (1, 4, 0) +__version__ = '.'.join(map(str, __version_info__)) + + +import sys +import os + +PY3 = sys.version_info[0] == 3 + +if PY3: + unicode = str + +if sys.platform.startswith('java'): + import platform + os_name = platform.java_ver()[3][0] + if os_name.startswith('Windows'): # "Windows XP", "Windows 7", etc. + system = 'win32' + elif os_name.startswith('Mac'): # "Mac OS X", etc. + system = 'darwin' + else: # "Linux", "SunOS", "FreeBSD", etc. + # Setting this to "linux2" is not ideal, but only Windows or Mac + # are actually checked for and the rest of the module expects + # *sys.platform* style strings. + system = 'linux2' +else: + system = sys.platform + + + +def user_data_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: ~/Library/Application Support/ + Unix: ~/.local/share/ # or in $XDG_DATA_HOME, if defined + Win XP (not roaming): C:\Documents and Settings\\Application Data\\ + Win XP (roaming): C:\Documents and Settings\\Local Settings\Application Data\\ + Win 7 (not roaming): C:\Users\\AppData\Local\\ + Win 7 (roaming): C:\Users\\AppData\Roaming\\ + + For Unix, we follow the XDG spec and support $XDG_DATA_HOME. + That means, by default "~/.local/share/". + """ + if system == "win32": + if appauthor is None: + appauthor = appname + const = roaming and "CSIDL_APPDATA" or "CSIDL_LOCAL_APPDATA" + path = os.path.normpath(_get_win_folder(const)) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('~/Library/Application Support/') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_DATA_HOME', os.path.expanduser("~/.local/share")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_data_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of data dirs should be + returned. By default, the first item from XDG_DATA_DIRS is + returned, or '/usr/local/share/', + if XDG_DATA_DIRS is not set + + Typical user data directories are: + Mac OS X: /Library/Application Support/ + Unix: /usr/local/share/ or /usr/share/ + Win XP: C:\Documents and Settings\All Users\Application Data\\ + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + Win 7: C:\ProgramData\\ # Hidden, but writeable on Win 7. + + For Unix, this is using the $XDG_DATA_DIRS[0] default. + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_COMMON_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + elif system == 'darwin': + path = os.path.expanduser('/Library/Application Support') + if appname: + path = os.path.join(path, appname) + else: + # XDG default for $XDG_DATA_DIRS + # only first, if multipath is False + path = os.getenv('XDG_DATA_DIRS', + os.pathsep.join(['/usr/local/share', '/usr/share'])) + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + if appname and version: + path = os.path.join(path, version) + return path + + +def user_config_dir(appname=None, appauthor=None, version=None, roaming=False): + r"""Return full path to the user-specific config dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "roaming" (boolean, default False) can be set True to use the Windows + roaming appdata directory. That means that for users on a Windows + network setup for roaming profiles, this user data will be + sync'd on login. See + + for a discussion of issues. + + Typical user data directories are: + Mac OS X: same as user_data_dir + Unix: ~/.config/ # or in $XDG_CONFIG_HOME, if defined + Win *: same as user_data_dir + + For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME. + That means, by deafult "~/.config/". + """ + if system in ["win32", "darwin"]: + path = user_data_dir(appname, appauthor, None, roaming) + else: + path = os.getenv('XDG_CONFIG_HOME', os.path.expanduser("~/.config")) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def site_config_dir(appname=None, appauthor=None, version=None, multipath=False): + """Return full path to the user-shared data dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "multipath" is an optional parameter only applicable to *nix + which indicates that the entire list of config dirs should be + returned. By default, the first item from XDG_CONFIG_DIRS is + returned, or '/etc/xdg/', if XDG_CONFIG_DIRS is not set + + Typical user data directories are: + Mac OS X: same as site_data_dir + Unix: /etc/xdg/ or $XDG_CONFIG_DIRS[i]/ for each value in + $XDG_CONFIG_DIRS + Win *: same as site_data_dir + Vista: (Fail! "C:\ProgramData" is a hidden *system* directory on Vista.) + + For Unix, this is using the $XDG_CONFIG_DIRS[0] default, if multipath=False + + WARNING: Do not use this on Windows. See the Vista-Fail note above for why. + """ + if system in ["win32", "darwin"]: + path = site_data_dir(appname, appauthor) + if appname and version: + path = os.path.join(path, version) + else: + # XDG default for $XDG_CONFIG_DIRS + # only first, if multipath is False + path = os.getenv('XDG_CONFIG_DIRS', '/etc/xdg') + pathlist = [os.path.expanduser(x.rstrip(os.sep)) for x in path.split(os.pathsep)] + if appname: + if version: + appname = os.path.join(appname, version) + pathlist = [os.sep.join([x, appname]) for x in pathlist] + + if multipath: + path = os.pathsep.join(pathlist) + else: + path = pathlist[0] + return path + + +def user_cache_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific cache dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Cache" to the base app data dir for Windows. See + discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Caches/ + Unix: ~/.cache/ (XDG default) + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Cache + Vista: C:\Users\\AppData\Local\\\Cache + + On Windows the only suggestion in the MSDN docs is that local settings go in + the `CSIDL_LOCAL_APPDATA` directory. This is identical to the non-roaming + app data dir (the default returned by `user_data_dir` above). Apps typically + put cache data somewhere *under* the given dir here. Some examples: + ...\Mozilla\Firefox\Profiles\\Cache + ...\Acme\SuperApp\Cache\1.0 + OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value. + This can be disabled with the `opinion=False` option. + """ + if system == "win32": + if appauthor is None: + appauthor = appname + path = os.path.normpath(_get_win_folder("CSIDL_LOCAL_APPDATA")) + if appname: + if appauthor is not False: + path = os.path.join(path, appauthor, appname) + else: + path = os.path.join(path, appname) + if opinion: + path = os.path.join(path, "Cache") + elif system == 'darwin': + path = os.path.expanduser('~/Library/Caches') + if appname: + path = os.path.join(path, appname) + else: + path = os.getenv('XDG_CACHE_HOME', os.path.expanduser('~/.cache')) + if appname: + path = os.path.join(path, appname) + if appname and version: + path = os.path.join(path, version) + return path + + +def user_log_dir(appname=None, appauthor=None, version=None, opinion=True): + r"""Return full path to the user-specific log dir for this application. + + "appname" is the name of application. + If None, just the system directory is returned. + "appauthor" (only used on Windows) is the name of the + appauthor or distributing body for this application. Typically + it is the owning company name. This falls back to appname. You may + pass False to disable it. + "version" is an optional version path element to append to the + path. You might want to use this if you want multiple versions + of your app to be able to run independently. If used, this + would typically be ".". + Only applied when appname is present. + "opinion" (boolean) can be False to disable the appending of + "Logs" to the base app data dir for Windows, and "log" to the + base cache dir for Unix. See discussion below. + + Typical user cache directories are: + Mac OS X: ~/Library/Logs/ + Unix: ~/.cache//log # or under $XDG_CACHE_HOME if defined + Win XP: C:\Documents and Settings\\Local Settings\Application Data\\\Logs + Vista: C:\Users\\AppData\Local\\\Logs + + On Windows the only suggestion in the MSDN docs is that local settings + go in the `CSIDL_LOCAL_APPDATA` directory. (Note: I'm interested in + examples of what some windows apps use for a logs dir.) + + OPINION: This function appends "Logs" to the `CSIDL_LOCAL_APPDATA` + value for Windows and appends "log" to the user cache dir for Unix. + This can be disabled with the `opinion=False` option. + """ + if system == "darwin": + path = os.path.join( + os.path.expanduser('~/Library/Logs'), + appname) + elif system == "win32": + path = user_data_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "Logs") + else: + path = user_cache_dir(appname, appauthor, version) + version = False + if opinion: + path = os.path.join(path, "log") + if appname and version: + path = os.path.join(path, version) + return path + + +class AppDirs(object): + """Convenience wrapper for getting application dirs.""" + def __init__(self, appname, appauthor=None, version=None, roaming=False, + multipath=False): + self.appname = appname + self.appauthor = appauthor + self.version = version + self.roaming = roaming + self.multipath = multipath + + @property + def user_data_dir(self): + return user_data_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_data_dir(self): + return site_data_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_config_dir(self): + return user_config_dir(self.appname, self.appauthor, + version=self.version, roaming=self.roaming) + + @property + def site_config_dir(self): + return site_config_dir(self.appname, self.appauthor, + version=self.version, multipath=self.multipath) + + @property + def user_cache_dir(self): + return user_cache_dir(self.appname, self.appauthor, + version=self.version) + + @property + def user_log_dir(self): + return user_log_dir(self.appname, self.appauthor, + version=self.version) + + +#---- internal support stuff + +def _get_win_folder_from_registry(csidl_name): + """This is a fallback technique at best. I'm not sure if using the + registry for this guarantees us the correct answer for all CSIDL_* + names. + """ + import _winreg + + shell_folder_name = { + "CSIDL_APPDATA": "AppData", + "CSIDL_COMMON_APPDATA": "Common AppData", + "CSIDL_LOCAL_APPDATA": "Local AppData", + }[csidl_name] + + key = _winreg.OpenKey( + _winreg.HKEY_CURRENT_USER, + r"Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders" + ) + dir, type = _winreg.QueryValueEx(key, shell_folder_name) + return dir + + +def _get_win_folder_with_pywin32(csidl_name): + from win32com.shell import shellcon, shell + dir = shell.SHGetFolderPath(0, getattr(shellcon, csidl_name), 0, 0) + # Try to make this a unicode path because SHGetFolderPath does + # not return unicode strings when there is unicode data in the + # path. + try: + dir = unicode(dir) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + try: + import win32api + dir = win32api.GetShortPathName(dir) + except ImportError: + pass + except UnicodeError: + pass + return dir + + +def _get_win_folder_with_ctypes(csidl_name): + import ctypes + + csidl_const = { + "CSIDL_APPDATA": 26, + "CSIDL_COMMON_APPDATA": 35, + "CSIDL_LOCAL_APPDATA": 28, + }[csidl_name] + + buf = ctypes.create_unicode_buffer(1024) + ctypes.windll.shell32.SHGetFolderPathW(None, csidl_const, None, 0, buf) + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in buf: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf2 = ctypes.create_unicode_buffer(1024) + if ctypes.windll.kernel32.GetShortPathNameW(buf.value, buf2, 1024): + buf = buf2 + + return buf.value + +def _get_win_folder_with_jna(csidl_name): + import array + from com.sun import jna + from com.sun.jna.platform import win32 + + buf_size = win32.WinDef.MAX_PATH * 2 + buf = array.zeros('c', buf_size) + shell = win32.Shell32.INSTANCE + shell.SHGetFolderPath(None, getattr(win32.ShlObj, csidl_name), None, win32.ShlObj.SHGFP_TYPE_CURRENT, buf) + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + # Downgrade to short path name if have highbit chars. See + # . + has_high_char = False + for c in dir: + if ord(c) > 255: + has_high_char = True + break + if has_high_char: + buf = array.zeros('c', buf_size) + kernel = win32.Kernel32.INSTANCE + if kernal.GetShortPathName(dir, buf, buf_size): + dir = jna.Native.toString(buf.tostring()).rstrip("\0") + + return dir + +if system == "win32": + try: + import win32com.shell + _get_win_folder = _get_win_folder_with_pywin32 + except ImportError: + try: + from ctypes import windll + _get_win_folder = _get_win_folder_with_ctypes + except ImportError: + try: + import com.sun.jna + _get_win_folder = _get_win_folder_with_jna + except ImportError: + _get_win_folder = _get_win_folder_from_registry + + +#---- self test code + +if __name__ == "__main__": + appname = "MyApp" + appauthor = "MyCompany" + + props = ("user_data_dir", "site_data_dir", + "user_config_dir", "site_config_dir", + "user_cache_dir", "user_log_dir") + + print("-- app dirs (with optional 'version')") + dirs = AppDirs(appname, appauthor, version="1.0") + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'version')") + dirs = AppDirs(appname, appauthor) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (without optional 'appauthor')") + dirs = AppDirs(appname) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) + + print("\n-- app dirs (with disabled 'appauthor')") + dirs = AppDirs(appname, appauthor=False) + for prop in props: + print("%s: %s" % (prop, getattr(dirs, prop))) diff --git a/libs/argparse.py b/libs/argparse.py new file mode 100644 index 000000000..70a77cc02 --- /dev/null +++ b/libs/argparse.py @@ -0,0 +1,2392 @@ +# Author: Steven J. Bethard . +# Maintainer: Thomas Waldmann + +"""Command-line parsing library + +This module is an optparse-inspired command-line parsing library that: + + - handles both optional and positional arguments + - produces highly informative usage messages + - supports parsers that dispatch to sub-parsers + +The following is a simple usage example that sums integers from the +command-line and writes the result to a file:: + + parser = argparse.ArgumentParser( + description='sum the integers at the command line') + parser.add_argument( + 'integers', metavar='int', nargs='+', type=int, + help='an integer to be summed') + parser.add_argument( + '--log', default=sys.stdout, type=argparse.FileType('w'), + help='the file where the sum should be written') + args = parser.parse_args() + args.log.write('%s' % sum(args.integers)) + args.log.close() + +The module contains the following public classes: + + - ArgumentParser -- The main entry point for command-line parsing. As the + example above shows, the add_argument() method is used to populate + the parser with actions for optional and positional arguments. Then + the parse_args() method is invoked to convert the args at the + command-line into an object with attributes. + + - ArgumentError -- The exception raised by ArgumentParser objects when + there are errors with the parser's actions. Errors raised while + parsing the command-line are caught by ArgumentParser and emitted + as command-line messages. + + - FileType -- A factory for defining types of files to be created. As the + example above shows, instances of FileType are typically passed as + the type= argument of add_argument() calls. + + - Action -- The base class for parser actions. Typically actions are + selected by passing strings like 'store_true' or 'append_const' to + the action= argument of add_argument(). However, for greater + customization of ArgumentParser actions, subclasses of Action may + be defined and passed as the action= argument. + + - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter, + ArgumentDefaultsHelpFormatter -- Formatter classes which + may be passed as the formatter_class= argument to the + ArgumentParser constructor. HelpFormatter is the default, + RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser + not to change the formatting for help text, and + ArgumentDefaultsHelpFormatter adds information about argument defaults + to the help. + +All other classes in this module are considered implementation details. +(Also note that HelpFormatter and RawDescriptionHelpFormatter are only +considered public as object names -- the API of the formatter objects is +still considered an implementation detail.) +""" + +__version__ = '1.4.0' # we use our own version number independant of the + # one in stdlib and we release this on pypi. + +__external_lib__ = True # to make sure the tests really test THIS lib, + # not the builtin one in Python stdlib + +__all__ = [ + 'ArgumentParser', + 'ArgumentError', + 'ArgumentTypeError', + 'FileType', + 'HelpFormatter', + 'ArgumentDefaultsHelpFormatter', + 'RawDescriptionHelpFormatter', + 'RawTextHelpFormatter', + 'Namespace', + 'Action', + 'ONE_OR_MORE', + 'OPTIONAL', + 'PARSER', + 'REMAINDER', + 'SUPPRESS', + 'ZERO_OR_MORE', +] + + +import copy as _copy +import os as _os +import re as _re +import sys as _sys +import textwrap as _textwrap + +from gettext import gettext as _ + +try: + set +except NameError: + # for python < 2.4 compatibility (sets module is there since 2.3): + from sets import Set as set + +try: + basestring +except NameError: + basestring = str + +try: + sorted +except NameError: + # for python < 2.4 compatibility: + def sorted(iterable, reverse=False): + result = list(iterable) + result.sort() + if reverse: + result.reverse() + return result + + +def _callable(obj): + return hasattr(obj, '__call__') or hasattr(obj, '__bases__') + + +SUPPRESS = '==SUPPRESS==' + +OPTIONAL = '?' +ZERO_OR_MORE = '*' +ONE_OR_MORE = '+' +PARSER = 'A...' +REMAINDER = '...' +_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args' + +# ============================= +# Utility functions and classes +# ============================= + +class _AttributeHolder(object): + """Abstract base class that provides __repr__. + + The __repr__ method returns a string in the format:: + ClassName(attr=name, attr=name, ...) + The attributes are determined either by a class-level attribute, + '_kwarg_names', or by inspecting the instance __dict__. + """ + + def __repr__(self): + type_name = type(self).__name__ + arg_strings = [] + for arg in self._get_args(): + arg_strings.append(repr(arg)) + for name, value in self._get_kwargs(): + arg_strings.append('%s=%r' % (name, value)) + return '%s(%s)' % (type_name, ', '.join(arg_strings)) + + def _get_kwargs(self): + return sorted(self.__dict__.items()) + + def _get_args(self): + return [] + + +def _ensure_value(namespace, name, value): + if getattr(namespace, name, None) is None: + setattr(namespace, name, value) + return getattr(namespace, name) + + +# =============== +# Formatting Help +# =============== + +class HelpFormatter(object): + """Formatter for generating usage messages and argument help strings. + + Only the name of this class is considered a public API. All the methods + provided by the class are considered an implementation detail. + """ + + def __init__(self, + prog, + indent_increment=2, + max_help_position=24, + width=None): + + # default setting for width + if width is None: + try: + width = int(_os.environ['COLUMNS']) + except (KeyError, ValueError): + width = 80 + width -= 2 + + self._prog = prog + self._indent_increment = indent_increment + self._max_help_position = max_help_position + self._width = width + + self._current_indent = 0 + self._level = 0 + self._action_max_length = 0 + + self._root_section = self._Section(self, None) + self._current_section = self._root_section + + self._whitespace_matcher = _re.compile(r'\s+') + self._long_break_matcher = _re.compile(r'\n\n\n+') + + # =============================== + # Section and indentation methods + # =============================== + def _indent(self): + self._current_indent += self._indent_increment + self._level += 1 + + def _dedent(self): + self._current_indent -= self._indent_increment + assert self._current_indent >= 0, 'Indent decreased below 0.' + self._level -= 1 + + class _Section(object): + + def __init__(self, formatter, parent, heading=None): + self.formatter = formatter + self.parent = parent + self.heading = heading + self.items = [] + + def format_help(self): + # format the indented section + if self.parent is not None: + self.formatter._indent() + join = self.formatter._join_parts + for func, args in self.items: + func(*args) + item_help = join([func(*args) for func, args in self.items]) + if self.parent is not None: + self.formatter._dedent() + + # return nothing if the section was empty + if not item_help: + return '' + + # add the heading if the section was non-empty + if self.heading is not SUPPRESS and self.heading is not None: + current_indent = self.formatter._current_indent + heading = '%*s%s:\n' % (current_indent, '', self.heading) + else: + heading = '' + + # join the section-initial newline, the heading and the help + return join(['\n', heading, item_help, '\n']) + + def _add_item(self, func, args): + self._current_section.items.append((func, args)) + + # ======================== + # Message building methods + # ======================== + def start_section(self, heading): + self._indent() + section = self._Section(self, self._current_section, heading) + self._add_item(section.format_help, []) + self._current_section = section + + def end_section(self): + self._current_section = self._current_section.parent + self._dedent() + + def add_text(self, text): + if text is not SUPPRESS and text is not None: + self._add_item(self._format_text, [text]) + + def add_usage(self, usage, actions, groups, prefix=None): + if usage is not SUPPRESS: + args = usage, actions, groups, prefix + self._add_item(self._format_usage, args) + + def add_argument(self, action): + if action.help is not SUPPRESS: + + # find all invocations + get_invocation = self._format_action_invocation + invocations = [get_invocation(action)] + for subaction in self._iter_indented_subactions(action): + invocations.append(get_invocation(subaction)) + + # update the maximum item length + invocation_length = max([len(s) for s in invocations]) + action_length = invocation_length + self._current_indent + self._action_max_length = max(self._action_max_length, + action_length) + + # add the item to the list + self._add_item(self._format_action, [action]) + + def add_arguments(self, actions): + for action in actions: + self.add_argument(action) + + # ======================= + # Help-formatting methods + # ======================= + def format_help(self): + help = self._root_section.format_help() + if help: + help = self._long_break_matcher.sub('\n\n', help) + help = help.strip('\n') + '\n' + return help + + def _join_parts(self, part_strings): + return ''.join([part + for part in part_strings + if part and part is not SUPPRESS]) + + def _format_usage(self, usage, actions, groups, prefix): + if prefix is None: + prefix = _('usage: ') + + # if usage is specified, use that + if usage is not None: + usage = usage % dict(prog=self._prog) + + # if no optionals or positionals are available, usage is just prog + elif usage is None and not actions: + usage = '%(prog)s' % dict(prog=self._prog) + + # if optionals and positionals are available, calculate usage + elif usage is None: + prog = '%(prog)s' % dict(prog=self._prog) + + # split optionals from positionals + optionals = [] + positionals = [] + for action in actions: + if action.option_strings: + optionals.append(action) + else: + positionals.append(action) + + # build full usage string + format = self._format_actions_usage + action_usage = format(optionals + positionals, groups) + usage = ' '.join([s for s in [prog, action_usage] if s]) + + # wrap the usage parts if it's too long + text_width = self._width - self._current_indent + if len(prefix) + len(usage) > text_width: + + # break usage into wrappable parts + part_regexp = r'\(.*?\)+|\[.*?\]+|\S+' + opt_usage = format(optionals, groups) + pos_usage = format(positionals, groups) + opt_parts = _re.findall(part_regexp, opt_usage) + pos_parts = _re.findall(part_regexp, pos_usage) + assert ' '.join(opt_parts) == opt_usage + assert ' '.join(pos_parts) == pos_usage + + # helper for wrapping lines + def get_lines(parts, indent, prefix=None): + lines = [] + line = [] + if prefix is not None: + line_len = len(prefix) - 1 + else: + line_len = len(indent) - 1 + for part in parts: + if line_len + 1 + len(part) > text_width: + lines.append(indent + ' '.join(line)) + line = [] + line_len = len(indent) - 1 + line.append(part) + line_len += len(part) + 1 + if line: + lines.append(indent + ' '.join(line)) + if prefix is not None: + lines[0] = lines[0][len(indent):] + return lines + + # if prog is short, follow it with optionals or positionals + if len(prefix) + len(prog) <= 0.75 * text_width: + indent = ' ' * (len(prefix) + len(prog) + 1) + if opt_parts: + lines = get_lines([prog] + opt_parts, indent, prefix) + lines.extend(get_lines(pos_parts, indent)) + elif pos_parts: + lines = get_lines([prog] + pos_parts, indent, prefix) + else: + lines = [prog] + + # if prog is long, put it on its own line + else: + indent = ' ' * len(prefix) + parts = opt_parts + pos_parts + lines = get_lines(parts, indent) + if len(lines) > 1: + lines = [] + lines.extend(get_lines(opt_parts, indent)) + lines.extend(get_lines(pos_parts, indent)) + lines = [prog] + lines + + # join lines into usage + usage = '\n'.join(lines) + + # prefix with 'usage:' + return '%s%s\n\n' % (prefix, usage) + + def _format_actions_usage(self, actions, groups): + # find group indices and identify actions in groups + group_actions = set() + inserts = {} + for group in groups: + try: + start = actions.index(group._group_actions[0]) + except ValueError: + continue + else: + end = start + len(group._group_actions) + if actions[start:end] == group._group_actions: + for action in group._group_actions: + group_actions.add(action) + if not group.required: + if start in inserts: + inserts[start] += ' [' + else: + inserts[start] = '[' + inserts[end] = ']' + else: + if start in inserts: + inserts[start] += ' (' + else: + inserts[start] = '(' + inserts[end] = ')' + for i in range(start + 1, end): + inserts[i] = '|' + + # collect all actions format strings + parts = [] + for i, action in enumerate(actions): + + # suppressed arguments are marked with None + # remove | separators for suppressed arguments + if action.help is SUPPRESS: + parts.append(None) + if inserts.get(i) == '|': + inserts.pop(i) + elif inserts.get(i + 1) == '|': + inserts.pop(i + 1) + + # produce all arg strings + elif not action.option_strings: + part = self._format_args(action, action.dest) + + # if it's in a group, strip the outer [] + if action in group_actions: + if part[0] == '[' and part[-1] == ']': + part = part[1:-1] + + # add the action string to the list + parts.append(part) + + # produce the first way to invoke the option in brackets + else: + option_string = action.option_strings[0] + + # if the Optional doesn't take a value, format is: + # -s or --long + if action.nargs == 0: + part = '%s' % option_string + + # if the Optional takes a value, format is: + # -s ARGS or --long ARGS + else: + default = action.dest.upper() + args_string = self._format_args(action, default) + part = '%s %s' % (option_string, args_string) + + # make it look optional if it's not required or in a group + if not action.required and action not in group_actions: + part = '[%s]' % part + + # add the action string to the list + parts.append(part) + + # insert things at the necessary indices + for i in sorted(inserts, reverse=True): + parts[i:i] = [inserts[i]] + + # join all the action items with spaces + text = ' '.join([item for item in parts if item is not None]) + + # clean up separators for mutually exclusive groups + open = r'[\[(]' + close = r'[\])]' + text = _re.sub(r'(%s) ' % open, r'\1', text) + text = _re.sub(r' (%s)' % close, r'\1', text) + text = _re.sub(r'%s *%s' % (open, close), r'', text) + text = _re.sub(r'\(([^|]*)\)', r'\1', text) + text = text.strip() + + # return the text + return text + + def _format_text(self, text): + if '%(prog)' in text: + text = text % dict(prog=self._prog) + text_width = self._width - self._current_indent + indent = ' ' * self._current_indent + return self._fill_text(text, text_width, indent) + '\n\n' + + def _format_action(self, action): + # determine the required width and the entry label + help_position = min(self._action_max_length + 2, + self._max_help_position) + help_width = self._width - help_position + action_width = help_position - self._current_indent - 2 + action_header = self._format_action_invocation(action) + + # ho nelp; start on same line and add a final newline + if not action.help: + tup = self._current_indent, '', action_header + action_header = '%*s%s\n' % tup + + # short action name; start on the same line and pad two spaces + elif len(action_header) <= action_width: + tup = self._current_indent, '', action_width, action_header + action_header = '%*s%-*s ' % tup + indent_first = 0 + + # long action name; start on the next line + else: + tup = self._current_indent, '', action_header + action_header = '%*s%s\n' % tup + indent_first = help_position + + # collect the pieces of the action help + parts = [action_header] + + # if there was help for the action, add lines of help text + if action.help: + help_text = self._expand_help(action) + help_lines = self._split_lines(help_text, help_width) + parts.append('%*s%s\n' % (indent_first, '', help_lines[0])) + for line in help_lines[1:]: + parts.append('%*s%s\n' % (help_position, '', line)) + + # or add a newline if the description doesn't end with one + elif not action_header.endswith('\n'): + parts.append('\n') + + # if there are any sub-actions, add their help as well + for subaction in self._iter_indented_subactions(action): + parts.append(self._format_action(subaction)) + + # return a single string + return self._join_parts(parts) + + def _format_action_invocation(self, action): + if not action.option_strings: + metavar, = self._metavar_formatter(action, action.dest)(1) + return metavar + + else: + parts = [] + + # if the Optional doesn't take a value, format is: + # -s, --long + if action.nargs == 0: + parts.extend(action.option_strings) + + # if the Optional takes a value, format is: + # -s ARGS, --long ARGS + else: + default = action.dest.upper() + args_string = self._format_args(action, default) + for option_string in action.option_strings: + parts.append('%s %s' % (option_string, args_string)) + + return ', '.join(parts) + + def _metavar_formatter(self, action, default_metavar): + if action.metavar is not None: + result = action.metavar + elif action.choices is not None: + choice_strs = [str(choice) for choice in action.choices] + result = '{%s}' % ','.join(choice_strs) + else: + result = default_metavar + + def format(tuple_size): + if isinstance(result, tuple): + return result + else: + return (result, ) * tuple_size + return format + + def _format_args(self, action, default_metavar): + get_metavar = self._metavar_formatter(action, default_metavar) + if action.nargs is None: + result = '%s' % get_metavar(1) + elif action.nargs == OPTIONAL: + result = '[%s]' % get_metavar(1) + elif action.nargs == ZERO_OR_MORE: + result = '[%s [%s ...]]' % get_metavar(2) + elif action.nargs == ONE_OR_MORE: + result = '%s [%s ...]' % get_metavar(2) + elif action.nargs == REMAINDER: + result = '...' + elif action.nargs == PARSER: + result = '%s ...' % get_metavar(1) + else: + formats = ['%s' for _ in range(action.nargs)] + result = ' '.join(formats) % get_metavar(action.nargs) + return result + + def _expand_help(self, action): + params = dict(vars(action), prog=self._prog) + for name in list(params): + if params[name] is SUPPRESS: + del params[name] + for name in list(params): + if hasattr(params[name], '__name__'): + params[name] = params[name].__name__ + if params.get('choices') is not None: + choices_str = ', '.join([str(c) for c in params['choices']]) + params['choices'] = choices_str + return self._get_help_string(action) % params + + def _iter_indented_subactions(self, action): + try: + get_subactions = action._get_subactions + except AttributeError: + pass + else: + self._indent() + for subaction in get_subactions(): + yield subaction + self._dedent() + + def _split_lines(self, text, width): + text = self._whitespace_matcher.sub(' ', text).strip() + return _textwrap.wrap(text, width) + + def _fill_text(self, text, width, indent): + text = self._whitespace_matcher.sub(' ', text).strip() + return _textwrap.fill(text, width, initial_indent=indent, + subsequent_indent=indent) + + def _get_help_string(self, action): + return action.help + + +class RawDescriptionHelpFormatter(HelpFormatter): + """Help message formatter which retains any formatting in descriptions. + + Only the name of this class is considered a public API. All the methods + provided by the class are considered an implementation detail. + """ + + def _fill_text(self, text, width, indent): + return ''.join([indent + line for line in text.splitlines(True)]) + + +class RawTextHelpFormatter(RawDescriptionHelpFormatter): + """Help message formatter which retains formatting of all help text. + + Only the name of this class is considered a public API. All the methods + provided by the class are considered an implementation detail. + """ + + def _split_lines(self, text, width): + return text.splitlines() + + +class ArgumentDefaultsHelpFormatter(HelpFormatter): + """Help message formatter which adds default values to argument help. + + Only the name of this class is considered a public API. All the methods + provided by the class are considered an implementation detail. + """ + + def _get_help_string(self, action): + help = action.help + if '%(default)' not in action.help: + if action.default is not SUPPRESS: + defaulting_nargs = [OPTIONAL, ZERO_OR_MORE] + if action.option_strings or action.nargs in defaulting_nargs: + help += ' (default: %(default)s)' + return help + + +# ===================== +# Options and Arguments +# ===================== + +def _get_action_name(argument): + if argument is None: + return None + elif argument.option_strings: + return '/'.join(argument.option_strings) + elif argument.metavar not in (None, SUPPRESS): + return argument.metavar + elif argument.dest not in (None, SUPPRESS): + return argument.dest + else: + return None + + +class ArgumentError(Exception): + """An error from creating or using an argument (optional or positional). + + The string value of this exception is the message, augmented with + information about the argument that caused it. + """ + + def __init__(self, argument, message): + self.argument_name = _get_action_name(argument) + self.message = message + + def __str__(self): + if self.argument_name is None: + format = '%(message)s' + else: + format = 'argument %(argument_name)s: %(message)s' + return format % dict(message=self.message, + argument_name=self.argument_name) + + +class ArgumentTypeError(Exception): + """An error from trying to convert a command line string to a type.""" + pass + + +# ============== +# Action classes +# ============== + +class Action(_AttributeHolder): + """Information about how to convert command line strings to Python objects. + + Action objects are used by an ArgumentParser to represent the information + needed to parse a single argument from one or more strings from the + command line. The keyword arguments to the Action constructor are also + all attributes of Action instances. + + Keyword Arguments: + + - option_strings -- A list of command-line option strings which + should be associated with this action. + + - dest -- The name of the attribute to hold the created object(s) + + - nargs -- The number of command-line arguments that should be + consumed. By default, one argument will be consumed and a single + value will be produced. Other values include: + - N (an integer) consumes N arguments (and produces a list) + - '?' consumes zero or one arguments + - '*' consumes zero or more arguments (and produces a list) + - '+' consumes one or more arguments (and produces a list) + Note that the difference between the default and nargs=1 is that + with the default, a single value will be produced, while with + nargs=1, a list containing a single value will be produced. + + - const -- The value to be produced if the option is specified and the + option uses an action that takes no values. + + - default -- The value to be produced if the option is not specified. + + - type -- The type which the command-line arguments should be converted + to, should be one of 'string', 'int', 'float', 'complex' or a + callable object that accepts a single string argument. If None, + 'string' is assumed. + + - choices -- A container of values that should be allowed. If not None, + after a command-line argument has been converted to the appropriate + type, an exception will be raised if it is not a member of this + collection. + + - required -- True if the action must always be specified at the + command line. This is only meaningful for optional command-line + arguments. + + - help -- The help string describing the argument. + + - metavar -- The name to be used for the option's argument with the + help string. If None, the 'dest' value will be used as the name. + """ + + def __init__(self, + option_strings, + dest, + nargs=None, + const=None, + default=None, + type=None, + choices=None, + required=False, + help=None, + metavar=None): + self.option_strings = option_strings + self.dest = dest + self.nargs = nargs + self.const = const + self.default = default + self.type = type + self.choices = choices + self.required = required + self.help = help + self.metavar = metavar + + def _get_kwargs(self): + names = [ + 'option_strings', + 'dest', + 'nargs', + 'const', + 'default', + 'type', + 'choices', + 'help', + 'metavar', + ] + return [(name, getattr(self, name)) for name in names] + + def __call__(self, parser, namespace, values, option_string=None): + raise NotImplementedError(_('.__call__() not defined')) + + +class _StoreAction(Action): + + def __init__(self, + option_strings, + dest, + nargs=None, + const=None, + default=None, + type=None, + choices=None, + required=False, + help=None, + metavar=None): + if nargs == 0: + raise ValueError('nargs for store actions must be > 0; if you ' + 'have nothing to store, actions such as store ' + 'true or store const may be more appropriate') + if const is not None and nargs != OPTIONAL: + raise ValueError('nargs must be %r to supply const' % OPTIONAL) + super(_StoreAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=nargs, + const=const, + default=default, + type=type, + choices=choices, + required=required, + help=help, + metavar=metavar) + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, values) + + +class _StoreConstAction(Action): + + def __init__(self, + option_strings, + dest, + const, + default=None, + required=False, + help=None, + metavar=None): + super(_StoreConstAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + const=const, + default=default, + required=required, + help=help) + + def __call__(self, parser, namespace, values, option_string=None): + setattr(namespace, self.dest, self.const) + + +class _StoreTrueAction(_StoreConstAction): + + def __init__(self, + option_strings, + dest, + default=False, + required=False, + help=None): + super(_StoreTrueAction, self).__init__( + option_strings=option_strings, + dest=dest, + const=True, + default=default, + required=required, + help=help) + + +class _StoreFalseAction(_StoreConstAction): + + def __init__(self, + option_strings, + dest, + default=True, + required=False, + help=None): + super(_StoreFalseAction, self).__init__( + option_strings=option_strings, + dest=dest, + const=False, + default=default, + required=required, + help=help) + + +class _AppendAction(Action): + + def __init__(self, + option_strings, + dest, + nargs=None, + const=None, + default=None, + type=None, + choices=None, + required=False, + help=None, + metavar=None): + if nargs == 0: + raise ValueError('nargs for append actions must be > 0; if arg ' + 'strings are not supplying the value to append, ' + 'the append const action may be more appropriate') + if const is not None and nargs != OPTIONAL: + raise ValueError('nargs must be %r to supply const' % OPTIONAL) + super(_AppendAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=nargs, + const=const, + default=default, + type=type, + choices=choices, + required=required, + help=help, + metavar=metavar) + + def __call__(self, parser, namespace, values, option_string=None): + items = _copy.copy(_ensure_value(namespace, self.dest, [])) + items.append(values) + setattr(namespace, self.dest, items) + + +class _AppendConstAction(Action): + + def __init__(self, + option_strings, + dest, + const, + default=None, + required=False, + help=None, + metavar=None): + super(_AppendConstAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + const=const, + default=default, + required=required, + help=help, + metavar=metavar) + + def __call__(self, parser, namespace, values, option_string=None): + items = _copy.copy(_ensure_value(namespace, self.dest, [])) + items.append(self.const) + setattr(namespace, self.dest, items) + + +class _CountAction(Action): + + def __init__(self, + option_strings, + dest, + default=None, + required=False, + help=None): + super(_CountAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=0, + default=default, + required=required, + help=help) + + def __call__(self, parser, namespace, values, option_string=None): + new_count = _ensure_value(namespace, self.dest, 0) + 1 + setattr(namespace, self.dest, new_count) + + +class _HelpAction(Action): + + def __init__(self, + option_strings, + dest=SUPPRESS, + default=SUPPRESS, + help=None): + super(_HelpAction, self).__init__( + option_strings=option_strings, + dest=dest, + default=default, + nargs=0, + help=help) + + def __call__(self, parser, namespace, values, option_string=None): + parser.print_help() + parser.exit() + + +class _VersionAction(Action): + + def __init__(self, + option_strings, + version=None, + dest=SUPPRESS, + default=SUPPRESS, + help="show program's version number and exit"): + super(_VersionAction, self).__init__( + option_strings=option_strings, + dest=dest, + default=default, + nargs=0, + help=help) + self.version = version + + def __call__(self, parser, namespace, values, option_string=None): + version = self.version + if version is None: + version = parser.version + formatter = parser._get_formatter() + formatter.add_text(version) + parser.exit(message=formatter.format_help()) + + +class _SubParsersAction(Action): + + class _ChoicesPseudoAction(Action): + + def __init__(self, name, aliases, help): + metavar = dest = name + if aliases: + metavar += ' (%s)' % ', '.join(aliases) + sup = super(_SubParsersAction._ChoicesPseudoAction, self) + sup.__init__(option_strings=[], dest=dest, help=help, + metavar=metavar) + + def __init__(self, + option_strings, + prog, + parser_class, + dest=SUPPRESS, + help=None, + metavar=None): + + self._prog_prefix = prog + self._parser_class = parser_class + self._name_parser_map = {} + self._choices_actions = [] + + super(_SubParsersAction, self).__init__( + option_strings=option_strings, + dest=dest, + nargs=PARSER, + choices=self._name_parser_map, + help=help, + metavar=metavar) + + def add_parser(self, name, **kwargs): + # set prog from the existing prefix + if kwargs.get('prog') is None: + kwargs['prog'] = '%s %s' % (self._prog_prefix, name) + + aliases = kwargs.pop('aliases', ()) + + # create a pseudo-action to hold the choice help + if 'help' in kwargs: + help = kwargs.pop('help') + choice_action = self._ChoicesPseudoAction(name, aliases, help) + self._choices_actions.append(choice_action) + + # create the parser and add it to the map + parser = self._parser_class(**kwargs) + self._name_parser_map[name] = parser + + # make parser available under aliases also + for alias in aliases: + self._name_parser_map[alias] = parser + + return parser + + def _get_subactions(self): + return self._choices_actions + + def __call__(self, parser, namespace, values, option_string=None): + parser_name = values[0] + arg_strings = values[1:] + + # set the parser name if requested + if self.dest is not SUPPRESS: + setattr(namespace, self.dest, parser_name) + + # select the parser + try: + parser = self._name_parser_map[parser_name] + except KeyError: + tup = parser_name, ', '.join(self._name_parser_map) + msg = _('unknown parser %r (choices: %s)' % tup) + raise ArgumentError(self, msg) + + # parse all the remaining options into the namespace + # store any unrecognized options on the object, so that the top + # level parser can decide what to do with them + namespace, arg_strings = parser.parse_known_args(arg_strings, namespace) + if arg_strings: + vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, []) + getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings) + + +# ============== +# Type classes +# ============== + +class FileType(object): + """Factory for creating file object types + + Instances of FileType are typically passed as type= arguments to the + ArgumentParser add_argument() method. + + Keyword Arguments: + - mode -- A string indicating how the file is to be opened. Accepts the + same values as the builtin open() function. + - bufsize -- The file's desired buffer size. Accepts the same values as + the builtin open() function. + """ + + def __init__(self, mode='r', bufsize=None): + self._mode = mode + self._bufsize = bufsize + + def __call__(self, string): + # the special argument "-" means sys.std{in,out} + if string == '-': + if 'r' in self._mode: + return _sys.stdin + elif 'w' in self._mode: + return _sys.stdout + else: + msg = _('argument "-" with mode %r' % self._mode) + raise ValueError(msg) + + try: + # all other arguments are used as file names + if self._bufsize: + return open(string, self._mode, self._bufsize) + else: + return open(string, self._mode) + except IOError: + err = _sys.exc_info()[1] + message = _("can't open '%s': %s") + raise ArgumentTypeError(message % (string, err)) + + def __repr__(self): + args = [self._mode, self._bufsize] + args_str = ', '.join([repr(arg) for arg in args if arg is not None]) + return '%s(%s)' % (type(self).__name__, args_str) + +# =========================== +# Optional and Positional Parsing +# =========================== + +class Namespace(_AttributeHolder): + """Simple object for storing attributes. + + Implements equality by attribute names and values, and provides a simple + string representation. + """ + + def __init__(self, **kwargs): + for name in kwargs: + setattr(self, name, kwargs[name]) + + __hash__ = None + + def __eq__(self, other): + return vars(self) == vars(other) + + def __ne__(self, other): + return not (self == other) + + def __contains__(self, key): + return key in self.__dict__ + + +class _ActionsContainer(object): + + def __init__(self, + description, + prefix_chars, + argument_default, + conflict_handler): + super(_ActionsContainer, self).__init__() + + self.description = description + self.argument_default = argument_default + self.prefix_chars = prefix_chars + self.conflict_handler = conflict_handler + + # set up registries + self._registries = {} + + # register actions + self.register('action', None, _StoreAction) + self.register('action', 'store', _StoreAction) + self.register('action', 'store_const', _StoreConstAction) + self.register('action', 'store_true', _StoreTrueAction) + self.register('action', 'store_false', _StoreFalseAction) + self.register('action', 'append', _AppendAction) + self.register('action', 'append_const', _AppendConstAction) + self.register('action', 'count', _CountAction) + self.register('action', 'help', _HelpAction) + self.register('action', 'version', _VersionAction) + self.register('action', 'parsers', _SubParsersAction) + + # raise an exception if the conflict handler is invalid + self._get_handler() + + # action storage + self._actions = [] + self._option_string_actions = {} + + # groups + self._action_groups = [] + self._mutually_exclusive_groups = [] + + # defaults storage + self._defaults = {} + + # determines whether an "option" looks like a negative number + self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$') + + # whether or not there are any optionals that look like negative + # numbers -- uses a list so it can be shared and edited + self._has_negative_number_optionals = [] + + # ==================== + # Registration methods + # ==================== + def register(self, registry_name, value, object): + registry = self._registries.setdefault(registry_name, {}) + registry[value] = object + + def _registry_get(self, registry_name, value, default=None): + return self._registries[registry_name].get(value, default) + + # ================================== + # Namespace default accessor methods + # ================================== + def set_defaults(self, **kwargs): + self._defaults.update(kwargs) + + # if these defaults match any existing arguments, replace + # the previous default on the object with the new one + for action in self._actions: + if action.dest in kwargs: + action.default = kwargs[action.dest] + + def get_default(self, dest): + for action in self._actions: + if action.dest == dest and action.default is not None: + return action.default + return self._defaults.get(dest, None) + + + # ======================= + # Adding argument actions + # ======================= + def add_argument(self, *args, **kwargs): + """ + add_argument(dest, ..., name=value, ...) + add_argument(option_string, option_string, ..., name=value, ...) + """ + + # if no positional args are supplied or only one is supplied and + # it doesn't look like an option string, parse a positional + # argument + chars = self.prefix_chars + if not args or len(args) == 1 and args[0][0] not in chars: + if args and 'dest' in kwargs: + raise ValueError('dest supplied twice for positional argument') + kwargs = self._get_positional_kwargs(*args, **kwargs) + + # otherwise, we're adding an optional argument + else: + kwargs = self._get_optional_kwargs(*args, **kwargs) + + # if no default was supplied, use the parser-level default + if 'default' not in kwargs: + dest = kwargs['dest'] + if dest in self._defaults: + kwargs['default'] = self._defaults[dest] + elif self.argument_default is not None: + kwargs['default'] = self.argument_default + + # create the action object, and add it to the parser + action_class = self._pop_action_class(kwargs) + if not _callable(action_class): + raise ValueError('unknown action "%s"' % action_class) + action = action_class(**kwargs) + + # raise an error if the action type is not callable + type_func = self._registry_get('type', action.type, action.type) + if not _callable(type_func): + raise ValueError('%r is not callable' % type_func) + + return self._add_action(action) + + def add_argument_group(self, *args, **kwargs): + group = _ArgumentGroup(self, *args, **kwargs) + self._action_groups.append(group) + return group + + def add_mutually_exclusive_group(self, **kwargs): + group = _MutuallyExclusiveGroup(self, **kwargs) + self._mutually_exclusive_groups.append(group) + return group + + def _add_action(self, action): + # resolve any conflicts + self._check_conflict(action) + + # add to actions list + self._actions.append(action) + action.container = self + + # index the action by any option strings it has + for option_string in action.option_strings: + self._option_string_actions[option_string] = action + + # set the flag if any option strings look like negative numbers + for option_string in action.option_strings: + if self._negative_number_matcher.match(option_string): + if not self._has_negative_number_optionals: + self._has_negative_number_optionals.append(True) + + # return the created action + return action + + def _remove_action(self, action): + self._actions.remove(action) + + def _add_container_actions(self, container): + # collect groups by titles + title_group_map = {} + for group in self._action_groups: + if group.title in title_group_map: + msg = _('cannot merge actions - two groups are named %r') + raise ValueError(msg % (group.title)) + title_group_map[group.title] = group + + # map each action to its group + group_map = {} + for group in container._action_groups: + + # if a group with the title exists, use that, otherwise + # create a new group matching the container's group + if group.title not in title_group_map: + title_group_map[group.title] = self.add_argument_group( + title=group.title, + description=group.description, + conflict_handler=group.conflict_handler) + + # map the actions to their new group + for action in group._group_actions: + group_map[action] = title_group_map[group.title] + + # add container's mutually exclusive groups + # NOTE: if add_mutually_exclusive_group ever gains title= and + # description= then this code will need to be expanded as above + for group in container._mutually_exclusive_groups: + mutex_group = self.add_mutually_exclusive_group( + required=group.required) + + # map the actions to their new mutex group + for action in group._group_actions: + group_map[action] = mutex_group + + # add all actions to this container or their group + for action in container._actions: + group_map.get(action, self)._add_action(action) + + def _get_positional_kwargs(self, dest, **kwargs): + # make sure required is not specified + if 'required' in kwargs: + msg = _("'required' is an invalid argument for positionals") + raise TypeError(msg) + + # mark positional arguments as required if at least one is + # always required + if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]: + kwargs['required'] = True + if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs: + kwargs['required'] = True + + # return the keyword arguments with no option strings + return dict(kwargs, dest=dest, option_strings=[]) + + def _get_optional_kwargs(self, *args, **kwargs): + # determine short and long option strings + option_strings = [] + long_option_strings = [] + for option_string in args: + # error on strings that don't start with an appropriate prefix + if not option_string[0] in self.prefix_chars: + msg = _('invalid option string %r: ' + 'must start with a character %r') + tup = option_string, self.prefix_chars + raise ValueError(msg % tup) + + # strings starting with two prefix characters are long options + option_strings.append(option_string) + if option_string[0] in self.prefix_chars: + if len(option_string) > 1: + if option_string[1] in self.prefix_chars: + long_option_strings.append(option_string) + + # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x' + dest = kwargs.pop('dest', None) + if dest is None: + if long_option_strings: + dest_option_string = long_option_strings[0] + else: + dest_option_string = option_strings[0] + dest = dest_option_string.lstrip(self.prefix_chars) + if not dest: + msg = _('dest= is required for options like %r') + raise ValueError(msg % option_string) + dest = dest.replace('-', '_') + + # return the updated keyword arguments + return dict(kwargs, dest=dest, option_strings=option_strings) + + def _pop_action_class(self, kwargs, default=None): + action = kwargs.pop('action', default) + return self._registry_get('action', action, action) + + def _get_handler(self): + # determine function from conflict handler string + handler_func_name = '_handle_conflict_%s' % self.conflict_handler + try: + return getattr(self, handler_func_name) + except AttributeError: + msg = _('invalid conflict_resolution value: %r') + raise ValueError(msg % self.conflict_handler) + + def _check_conflict(self, action): + + # find all options that conflict with this option + confl_optionals = [] + for option_string in action.option_strings: + if option_string in self._option_string_actions: + confl_optional = self._option_string_actions[option_string] + confl_optionals.append((option_string, confl_optional)) + + # resolve any conflicts + if confl_optionals: + conflict_handler = self._get_handler() + conflict_handler(action, confl_optionals) + + def _handle_conflict_error(self, action, conflicting_actions): + message = _('conflicting option string(s): %s') + conflict_string = ', '.join([option_string + for option_string, action + in conflicting_actions]) + raise ArgumentError(action, message % conflict_string) + + def _handle_conflict_resolve(self, action, conflicting_actions): + + # remove all conflicting options + for option_string, action in conflicting_actions: + + # remove the conflicting option + action.option_strings.remove(option_string) + self._option_string_actions.pop(option_string, None) + + # if the option now has no option string, remove it from the + # container holding it + if not action.option_strings: + action.container._remove_action(action) + + +class _ArgumentGroup(_ActionsContainer): + + def __init__(self, container, title=None, description=None, **kwargs): + # add any missing keyword arguments by checking the container + update = kwargs.setdefault + update('conflict_handler', container.conflict_handler) + update('prefix_chars', container.prefix_chars) + update('argument_default', container.argument_default) + super_init = super(_ArgumentGroup, self).__init__ + super_init(description=description, **kwargs) + + # group attributes + self.title = title + self._group_actions = [] + + # share most attributes with the container + self._registries = container._registries + self._actions = container._actions + self._option_string_actions = container._option_string_actions + self._defaults = container._defaults + self._has_negative_number_optionals = \ + container._has_negative_number_optionals + + def _add_action(self, action): + action = super(_ArgumentGroup, self)._add_action(action) + self._group_actions.append(action) + return action + + def _remove_action(self, action): + super(_ArgumentGroup, self)._remove_action(action) + self._group_actions.remove(action) + + +class _MutuallyExclusiveGroup(_ArgumentGroup): + + def __init__(self, container, required=False): + super(_MutuallyExclusiveGroup, self).__init__(container) + self.required = required + self._container = container + + def _add_action(self, action): + if action.required: + msg = _('mutually exclusive arguments must be optional') + raise ValueError(msg) + action = self._container._add_action(action) + self._group_actions.append(action) + return action + + def _remove_action(self, action): + self._container._remove_action(action) + self._group_actions.remove(action) + + +class ArgumentParser(_AttributeHolder, _ActionsContainer): + """Object for parsing command line strings into Python objects. + + Keyword Arguments: + - prog -- The name of the program (default: sys.argv[0]) + - usage -- A usage message (default: auto-generated from arguments) + - description -- A description of what the program does + - epilog -- Text following the argument descriptions + - parents -- Parsers whose arguments should be copied into this one + - formatter_class -- HelpFormatter class for printing help messages + - prefix_chars -- Characters that prefix optional arguments + - fromfile_prefix_chars -- Characters that prefix files containing + additional arguments + - argument_default -- The default value for all arguments + - conflict_handler -- String indicating how to handle conflicts + - add_help -- Add a -h/-help option + """ + + def __init__(self, + prog=None, + usage=None, + description=None, + epilog=None, + version=None, + parents=[], + formatter_class=HelpFormatter, + prefix_chars='-', + fromfile_prefix_chars=None, + argument_default=None, + conflict_handler='error', + add_help=True): + + if version is not None: + import warnings + warnings.warn( + """The "version" argument to ArgumentParser is deprecated. """ + """Please use """ + """"add_argument(..., action='version', version="N", ...)" """ + """instead""", DeprecationWarning) + + superinit = super(ArgumentParser, self).__init__ + superinit(description=description, + prefix_chars=prefix_chars, + argument_default=argument_default, + conflict_handler=conflict_handler) + + # default setting for prog + if prog is None: + prog = _os.path.basename(_sys.argv[0]) + + self.prog = prog + self.usage = usage + self.epilog = epilog + self.version = version + self.formatter_class = formatter_class + self.fromfile_prefix_chars = fromfile_prefix_chars + self.add_help = add_help + + add_group = self.add_argument_group + self._positionals = add_group(_('positional arguments')) + self._optionals = add_group(_('optional arguments')) + self._subparsers = None + + # register types + def identity(string): + return string + self.register('type', None, identity) + + # add help and version arguments if necessary + # (using explicit default to override global argument_default) + if '-' in prefix_chars: + default_prefix = '-' + else: + default_prefix = prefix_chars[0] + if self.add_help: + self.add_argument( + default_prefix+'h', default_prefix*2+'help', + action='help', default=SUPPRESS, + help=_('show this help message and exit')) + if self.version: + self.add_argument( + default_prefix+'v', default_prefix*2+'version', + action='version', default=SUPPRESS, + version=self.version, + help=_("show program's version number and exit")) + + # add parent arguments and defaults + for parent in parents: + self._add_container_actions(parent) + try: + defaults = parent._defaults + except AttributeError: + pass + else: + self._defaults.update(defaults) + + # ======================= + # Pretty __repr__ methods + # ======================= + def _get_kwargs(self): + names = [ + 'prog', + 'usage', + 'description', + 'version', + 'formatter_class', + 'conflict_handler', + 'add_help', + ] + return [(name, getattr(self, name)) for name in names] + + # ================================== + # Optional/Positional adding methods + # ================================== + def add_subparsers(self, **kwargs): + if self._subparsers is not None: + self.error(_('cannot have multiple subparser arguments')) + + # add the parser class to the arguments if it's not present + kwargs.setdefault('parser_class', type(self)) + + if 'title' in kwargs or 'description' in kwargs: + title = _(kwargs.pop('title', 'subcommands')) + description = _(kwargs.pop('description', None)) + self._subparsers = self.add_argument_group(title, description) + else: + self._subparsers = self._positionals + + # prog defaults to the usage message of this parser, skipping + # optional arguments and with no "usage:" prefix + if kwargs.get('prog') is None: + formatter = self._get_formatter() + positionals = self._get_positional_actions() + groups = self._mutually_exclusive_groups + formatter.add_usage(self.usage, positionals, groups, '') + kwargs['prog'] = formatter.format_help().strip() + + # create the parsers action and add it to the positionals list + parsers_class = self._pop_action_class(kwargs, 'parsers') + action = parsers_class(option_strings=[], **kwargs) + self._subparsers._add_action(action) + + # return the created parsers action + return action + + def _add_action(self, action): + if action.option_strings: + self._optionals._add_action(action) + else: + self._positionals._add_action(action) + return action + + def _get_optional_actions(self): + return [action + for action in self._actions + if action.option_strings] + + def _get_positional_actions(self): + return [action + for action in self._actions + if not action.option_strings] + + # ===================================== + # Command line argument parsing methods + # ===================================== + def parse_args(self, args=None, namespace=None): + args, argv = self.parse_known_args(args, namespace) + if argv: + msg = _('unrecognized arguments: %s') + self.error(msg % ' '.join(argv)) + return args + + def parse_known_args(self, args=None, namespace=None): + # args default to the system args + if args is None: + args = _sys.argv[1:] + + # default Namespace built from parser defaults + if namespace is None: + namespace = Namespace() + + # add any action defaults that aren't present + for action in self._actions: + if action.dest is not SUPPRESS: + if not hasattr(namespace, action.dest): + if action.default is not SUPPRESS: + setattr(namespace, action.dest, action.default) + + # add any parser defaults that aren't present + for dest in self._defaults: + if not hasattr(namespace, dest): + setattr(namespace, dest, self._defaults[dest]) + + # parse the arguments and exit if there are any errors + try: + namespace, args = self._parse_known_args(args, namespace) + if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR): + args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR)) + delattr(namespace, _UNRECOGNIZED_ARGS_ATTR) + return namespace, args + except ArgumentError: + err = _sys.exc_info()[1] + self.error(str(err)) + + def _parse_known_args(self, arg_strings, namespace): + # replace arg strings that are file references + if self.fromfile_prefix_chars is not None: + arg_strings = self._read_args_from_files(arg_strings) + + # map all mutually exclusive arguments to the other arguments + # they can't occur with + action_conflicts = {} + for mutex_group in self._mutually_exclusive_groups: + group_actions = mutex_group._group_actions + for i, mutex_action in enumerate(mutex_group._group_actions): + conflicts = action_conflicts.setdefault(mutex_action, []) + conflicts.extend(group_actions[:i]) + conflicts.extend(group_actions[i + 1:]) + + # find all option indices, and determine the arg_string_pattern + # which has an 'O' if there is an option at an index, + # an 'A' if there is an argument, or a '-' if there is a '--' + option_string_indices = {} + arg_string_pattern_parts = [] + arg_strings_iter = iter(arg_strings) + for i, arg_string in enumerate(arg_strings_iter): + + # all args after -- are non-options + if arg_string == '--': + arg_string_pattern_parts.append('-') + for arg_string in arg_strings_iter: + arg_string_pattern_parts.append('A') + + # otherwise, add the arg to the arg strings + # and note the index if it was an option + else: + option_tuple = self._parse_optional(arg_string) + if option_tuple is None: + pattern = 'A' + else: + option_string_indices[i] = option_tuple + pattern = 'O' + arg_string_pattern_parts.append(pattern) + + # join the pieces together to form the pattern + arg_strings_pattern = ''.join(arg_string_pattern_parts) + + # converts arg strings to the appropriate and then takes the action + seen_actions = set() + seen_non_default_actions = set() + + def take_action(action, argument_strings, option_string=None): + seen_actions.add(action) + argument_values = self._get_values(action, argument_strings) + + # error if this argument is not allowed with other previously + # seen arguments, assuming that actions that use the default + # value don't really count as "present" + if argument_values is not action.default: + seen_non_default_actions.add(action) + for conflict_action in action_conflicts.get(action, []): + if conflict_action in seen_non_default_actions: + msg = _('not allowed with argument %s') + action_name = _get_action_name(conflict_action) + raise ArgumentError(action, msg % action_name) + + # take the action if we didn't receive a SUPPRESS value + # (e.g. from a default) + if argument_values is not SUPPRESS: + action(self, namespace, argument_values, option_string) + + # function to convert arg_strings into an optional action + def consume_optional(start_index): + + # get the optional identified at this index + option_tuple = option_string_indices[start_index] + action, option_string, explicit_arg = option_tuple + + # identify additional optionals in the same arg string + # (e.g. -xyz is the same as -x -y -z if no args are required) + match_argument = self._match_argument + action_tuples = [] + while True: + + # if we found no optional action, skip it + if action is None: + extras.append(arg_strings[start_index]) + return start_index + 1 + + # if there is an explicit argument, try to match the + # optional's string arguments to only this + if explicit_arg is not None: + arg_count = match_argument(action, 'A') + + # if the action is a single-dash option and takes no + # arguments, try to parse more single-dash options out + # of the tail of the option string + chars = self.prefix_chars + if arg_count == 0 and option_string[1] not in chars: + action_tuples.append((action, [], option_string)) + char = option_string[0] + option_string = char + explicit_arg[0] + new_explicit_arg = explicit_arg[1:] or None + optionals_map = self._option_string_actions + if option_string in optionals_map: + action = optionals_map[option_string] + explicit_arg = new_explicit_arg + else: + msg = _('ignored explicit argument %r') + raise ArgumentError(action, msg % explicit_arg) + + # if the action expect exactly one argument, we've + # successfully matched the option; exit the loop + elif arg_count == 1: + stop = start_index + 1 + args = [explicit_arg] + action_tuples.append((action, args, option_string)) + break + + # error if a double-dash option did not use the + # explicit argument + else: + msg = _('ignored explicit argument %r') + raise ArgumentError(action, msg % explicit_arg) + + # if there is no explicit argument, try to match the + # optional's string arguments with the following strings + # if successful, exit the loop + else: + start = start_index + 1 + selected_patterns = arg_strings_pattern[start:] + arg_count = match_argument(action, selected_patterns) + stop = start + arg_count + args = arg_strings[start:stop] + action_tuples.append((action, args, option_string)) + break + + # add the Optional to the list and return the index at which + # the Optional's string args stopped + assert action_tuples + for action, args, option_string in action_tuples: + take_action(action, args, option_string) + return stop + + # the list of Positionals left to be parsed; this is modified + # by consume_positionals() + positionals = self._get_positional_actions() + + # function to convert arg_strings into positional actions + def consume_positionals(start_index): + # match as many Positionals as possible + match_partial = self._match_arguments_partial + selected_pattern = arg_strings_pattern[start_index:] + arg_counts = match_partial(positionals, selected_pattern) + + # slice off the appropriate arg strings for each Positional + # and add the Positional and its args to the list + for action, arg_count in zip(positionals, arg_counts): + args = arg_strings[start_index: start_index + arg_count] + start_index += arg_count + take_action(action, args) + + # slice off the Positionals that we just parsed and return the + # index at which the Positionals' string args stopped + positionals[:] = positionals[len(arg_counts):] + return start_index + + # consume Positionals and Optionals alternately, until we have + # passed the last option string + extras = [] + start_index = 0 + if option_string_indices: + max_option_string_index = max(option_string_indices) + else: + max_option_string_index = -1 + while start_index <= max_option_string_index: + + # consume any Positionals preceding the next option + next_option_string_index = min([ + index + for index in option_string_indices + if index >= start_index]) + if start_index != next_option_string_index: + positionals_end_index = consume_positionals(start_index) + + # only try to parse the next optional if we didn't consume + # the option string during the positionals parsing + if positionals_end_index > start_index: + start_index = positionals_end_index + continue + else: + start_index = positionals_end_index + + # if we consumed all the positionals we could and we're not + # at the index of an option string, there were extra arguments + if start_index not in option_string_indices: + strings = arg_strings[start_index:next_option_string_index] + extras.extend(strings) + start_index = next_option_string_index + + # consume the next optional and any arguments for it + start_index = consume_optional(start_index) + + # consume any positionals following the last Optional + stop_index = consume_positionals(start_index) + + # if we didn't consume all the argument strings, there were extras + extras.extend(arg_strings[stop_index:]) + + # if we didn't use all the Positional objects, there were too few + # arg strings supplied. + if positionals: + self.error(_('too few arguments')) + + # make sure all required actions were present, and convert defaults. + for action in self._actions: + if action not in seen_actions: + if action.required: + name = _get_action_name(action) + self.error(_('argument %s is required') % name) + else: + # Convert action default now instead of doing it before + # parsing arguments to avoid calling convert functions + # twice (which may fail) if the argument was given, but + # only if it was defined already in the namespace + if (action.default is not None and + isinstance(action.default, basestring) and + hasattr(namespace, action.dest) and + action.default is getattr(namespace, action.dest)): + setattr(namespace, action.dest, + self._get_value(action, action.default)) + + # make sure all required groups had one option present + for group in self._mutually_exclusive_groups: + if group.required: + for action in group._group_actions: + if action in seen_non_default_actions: + break + + # if no actions were used, report the error + else: + names = [_get_action_name(action) + for action in group._group_actions + if action.help is not SUPPRESS] + msg = _('one of the arguments %s is required') + self.error(msg % ' '.join(names)) + + # return the updated namespace and the extra arguments + return namespace, extras + + def _read_args_from_files(self, arg_strings): + # expand arguments referencing files + new_arg_strings = [] + for arg_string in arg_strings: + + # for regular arguments, just add them back into the list + if arg_string[0] not in self.fromfile_prefix_chars: + new_arg_strings.append(arg_string) + + # replace arguments referencing files with the file content + else: + try: + args_file = open(arg_string[1:]) + try: + arg_strings = [] + for arg_line in args_file.read().splitlines(): + for arg in self.convert_arg_line_to_args(arg_line): + arg_strings.append(arg) + arg_strings = self._read_args_from_files(arg_strings) + new_arg_strings.extend(arg_strings) + finally: + args_file.close() + except IOError: + err = _sys.exc_info()[1] + self.error(str(err)) + + # return the modified argument list + return new_arg_strings + + def convert_arg_line_to_args(self, arg_line): + return [arg_line] + + def _match_argument(self, action, arg_strings_pattern): + # match the pattern for this action to the arg strings + nargs_pattern = self._get_nargs_pattern(action) + match = _re.match(nargs_pattern, arg_strings_pattern) + + # raise an exception if we weren't able to find a match + if match is None: + nargs_errors = { + None: _('expected one argument'), + OPTIONAL: _('expected at most one argument'), + ONE_OR_MORE: _('expected at least one argument'), + } + default = _('expected %s argument(s)') % action.nargs + msg = nargs_errors.get(action.nargs, default) + raise ArgumentError(action, msg) + + # return the number of arguments matched + return len(match.group(1)) + + def _match_arguments_partial(self, actions, arg_strings_pattern): + # progressively shorten the actions list by slicing off the + # final actions until we find a match + result = [] + for i in range(len(actions), 0, -1): + actions_slice = actions[:i] + pattern = ''.join([self._get_nargs_pattern(action) + for action in actions_slice]) + match = _re.match(pattern, arg_strings_pattern) + if match is not None: + result.extend([len(string) for string in match.groups()]) + break + + # return the list of arg string counts + return result + + def _parse_optional(self, arg_string): + # if it's an empty string, it was meant to be a positional + if not arg_string: + return None + + # if it doesn't start with a prefix, it was meant to be positional + if not arg_string[0] in self.prefix_chars: + return None + + # if the option string is present in the parser, return the action + if arg_string in self._option_string_actions: + action = self._option_string_actions[arg_string] + return action, arg_string, None + + # if it's just a single character, it was meant to be positional + if len(arg_string) == 1: + return None + + # if the option string before the "=" is present, return the action + if '=' in arg_string: + option_string, explicit_arg = arg_string.split('=', 1) + if option_string in self._option_string_actions: + action = self._option_string_actions[option_string] + return action, option_string, explicit_arg + + # search through all possible prefixes of the option string + # and all actions in the parser for possible interpretations + option_tuples = self._get_option_tuples(arg_string) + + # if multiple actions match, the option string was ambiguous + if len(option_tuples) > 1: + options = ', '.join([option_string + for action, option_string, explicit_arg in option_tuples]) + tup = arg_string, options + self.error(_('ambiguous option: %s could match %s') % tup) + + # if exactly one action matched, this segmentation is good, + # so return the parsed action + elif len(option_tuples) == 1: + option_tuple, = option_tuples + return option_tuple + + # if it was not found as an option, but it looks like a negative + # number, it was meant to be positional + # unless there are negative-number-like options + if self._negative_number_matcher.match(arg_string): + if not self._has_negative_number_optionals: + return None + + # if it contains a space, it was meant to be a positional + if ' ' in arg_string: + return None + + # it was meant to be an optional but there is no such option + # in this parser (though it might be a valid option in a subparser) + return None, arg_string, None + + def _get_option_tuples(self, option_string): + result = [] + + # option strings starting with two prefix characters are only + # split at the '=' + chars = self.prefix_chars + if option_string[0] in chars and option_string[1] in chars: + if '=' in option_string: + option_prefix, explicit_arg = option_string.split('=', 1) + else: + option_prefix = option_string + explicit_arg = None + for option_string in self._option_string_actions: + if option_string.startswith(option_prefix): + action = self._option_string_actions[option_string] + tup = action, option_string, explicit_arg + result.append(tup) + + # single character options can be concatenated with their arguments + # but multiple character options always have to have their argument + # separate + elif option_string[0] in chars and option_string[1] not in chars: + option_prefix = option_string + explicit_arg = None + short_option_prefix = option_string[:2] + short_explicit_arg = option_string[2:] + + for option_string in self._option_string_actions: + if option_string == short_option_prefix: + action = self._option_string_actions[option_string] + tup = action, option_string, short_explicit_arg + result.append(tup) + elif option_string.startswith(option_prefix): + action = self._option_string_actions[option_string] + tup = action, option_string, explicit_arg + result.append(tup) + + # shouldn't ever get here + else: + self.error(_('unexpected option string: %s') % option_string) + + # return the collected option tuples + return result + + def _get_nargs_pattern(self, action): + # in all examples below, we have to allow for '--' args + # which are represented as '-' in the pattern + nargs = action.nargs + + # the default (None) is assumed to be a single argument + if nargs is None: + nargs_pattern = '(-*A-*)' + + # allow zero or one arguments + elif nargs == OPTIONAL: + nargs_pattern = '(-*A?-*)' + + # allow zero or more arguments + elif nargs == ZERO_OR_MORE: + nargs_pattern = '(-*[A-]*)' + + # allow one or more arguments + elif nargs == ONE_OR_MORE: + nargs_pattern = '(-*A[A-]*)' + + # allow any number of options or arguments + elif nargs == REMAINDER: + nargs_pattern = '([-AO]*)' + + # allow one argument followed by any number of options or arguments + elif nargs == PARSER: + nargs_pattern = '(-*A[-AO]*)' + + # all others should be integers + else: + nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs) + + # if this is an optional action, -- is not allowed + if action.option_strings: + nargs_pattern = nargs_pattern.replace('-*', '') + nargs_pattern = nargs_pattern.replace('-', '') + + # return the pattern + return nargs_pattern + + # ======================== + # Value conversion methods + # ======================== + def _get_values(self, action, arg_strings): + # for everything but PARSER args, strip out '--' + if action.nargs not in [PARSER, REMAINDER]: + arg_strings = [s for s in arg_strings if s != '--'] + + # optional argument produces a default when not present + if not arg_strings and action.nargs == OPTIONAL: + if action.option_strings: + value = action.const + else: + value = action.default + if isinstance(value, basestring): + value = self._get_value(action, value) + self._check_value(action, value) + + # when nargs='*' on a positional, if there were no command-line + # args, use the default if it is anything other than None + elif (not arg_strings and action.nargs == ZERO_OR_MORE and + not action.option_strings): + if action.default is not None: + value = action.default + else: + value = arg_strings + self._check_value(action, value) + + # single argument or optional argument produces a single value + elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]: + arg_string, = arg_strings + value = self._get_value(action, arg_string) + self._check_value(action, value) + + # REMAINDER arguments convert all values, checking none + elif action.nargs == REMAINDER: + value = [self._get_value(action, v) for v in arg_strings] + + # PARSER arguments convert all values, but check only the first + elif action.nargs == PARSER: + value = [self._get_value(action, v) for v in arg_strings] + self._check_value(action, value[0]) + + # all other types of nargs produce a list + else: + value = [self._get_value(action, v) for v in arg_strings] + for v in value: + self._check_value(action, v) + + # return the converted value + return value + + def _get_value(self, action, arg_string): + type_func = self._registry_get('type', action.type, action.type) + if not _callable(type_func): + msg = _('%r is not callable') + raise ArgumentError(action, msg % type_func) + + # convert the value to the appropriate type + try: + result = type_func(arg_string) + + # ArgumentTypeErrors indicate errors + except ArgumentTypeError: + name = getattr(action.type, '__name__', repr(action.type)) + msg = str(_sys.exc_info()[1]) + raise ArgumentError(action, msg) + + # TypeErrors or ValueErrors also indicate errors + except (TypeError, ValueError): + name = getattr(action.type, '__name__', repr(action.type)) + msg = _('invalid %s value: %r') + raise ArgumentError(action, msg % (name, arg_string)) + + # return the converted value + return result + + def _check_value(self, action, value): + # converted value must be one of the choices (if specified) + if action.choices is not None and value not in action.choices: + tup = value, ', '.join(map(repr, action.choices)) + msg = _('invalid choice: %r (choose from %s)') % tup + raise ArgumentError(action, msg) + + # ======================= + # Help-formatting methods + # ======================= + def format_usage(self): + formatter = self._get_formatter() + formatter.add_usage(self.usage, self._actions, + self._mutually_exclusive_groups) + return formatter.format_help() + + def format_help(self): + formatter = self._get_formatter() + + # usage + formatter.add_usage(self.usage, self._actions, + self._mutually_exclusive_groups) + + # description + formatter.add_text(self.description) + + # positionals, optionals and user-defined groups + for action_group in self._action_groups: + formatter.start_section(action_group.title) + formatter.add_text(action_group.description) + formatter.add_arguments(action_group._group_actions) + formatter.end_section() + + # epilog + formatter.add_text(self.epilog) + + # determine help from format above + return formatter.format_help() + + def format_version(self): + import warnings + warnings.warn( + 'The format_version method is deprecated -- the "version" ' + 'argument to ArgumentParser is no longer supported.', + DeprecationWarning) + formatter = self._get_formatter() + formatter.add_text(self.version) + return formatter.format_help() + + def _get_formatter(self): + return self.formatter_class(prog=self.prog) + + # ===================== + # Help-printing methods + # ===================== + def print_usage(self, file=None): + if file is None: + file = _sys.stdout + self._print_message(self.format_usage(), file) + + def print_help(self, file=None): + if file is None: + file = _sys.stdout + self._print_message(self.format_help(), file) + + def print_version(self, file=None): + import warnings + warnings.warn( + 'The print_version method is deprecated -- the "version" ' + 'argument to ArgumentParser is no longer supported.', + DeprecationWarning) + self._print_message(self.format_version(), file) + + def _print_message(self, message, file=None): + if message: + if file is None: + file = _sys.stderr + file.write(message) + + # =============== + # Exiting methods + # =============== + def exit(self, status=0, message=None): + if message: + self._print_message(message, _sys.stderr) + _sys.exit(status) + + def error(self, message): + """error(message: string) + + Prints a usage message incorporating the message to stderr and + exits. + + If you override this in a subclass, it should not return -- it + should either exit or raise an exception. + """ + self.print_usage(_sys.stderr) + self.exit(2, _('%s: error: %s\n') % (self.prog, message)) diff --git a/libs/asio/__init__.py b/libs/asio/__init__.py new file mode 100644 index 000000000..ca8ded235 --- /dev/null +++ b/libs/asio/__init__.py @@ -0,0 +1,61 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from asio.file import SEEK_ORIGIN_CURRENT +from asio.file_opener import FileOpener +from asio.open_parameters import OpenParameters +from asio.interfaces.posix import PosixInterface +from asio.interfaces.windows import WindowsInterface + +import os + + +class ASIO(object): + platform_handler = None + + @classmethod + def get_handler(cls): + if cls.platform_handler: + return cls.platform_handler + + if os.name == 'nt': + cls.platform_handler = WindowsInterface + elif os.name == 'posix': + cls.platform_handler = PosixInterface + else: + raise NotImplementedError() + + return cls.platform_handler + + @classmethod + def open(cls, file_path, opener=True, parameters=None): + """Open file + + :type file_path: str + + :param opener: Use FileOpener, for use with the 'with' statement + :type opener: bool + + :rtype: asio.file.File + """ + if not parameters: + parameters = OpenParameters() + + if opener: + return FileOpener(file_path, parameters) + + return ASIO.get_handler().open( + file_path, + parameters=parameters.handlers.get(ASIO.get_handler()) + ) diff --git a/libs/asio/file.py b/libs/asio/file.py new file mode 100644 index 000000000..a44970815 --- /dev/null +++ b/libs/asio/file.py @@ -0,0 +1,92 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from io import RawIOBase +import time + +DEFAULT_BUFFER_SIZE = 4096 + +SEEK_ORIGIN_BEGIN = 0 +SEEK_ORIGIN_CURRENT = 1 +SEEK_ORIGIN_END = 2 + + +class ReadTimeoutError(Exception): + pass + + +class File(RawIOBase): + platform_handler = None + + def __init__(self, *args, **kwargs): + super(File, self).__init__(*args, **kwargs) + + def get_handler(self): + """ + :rtype: asio.interfaces.base.Interface + """ + if not self.platform_handler: + raise ValueError() + + return self.platform_handler + + def get_size(self): + """Get the current file size + + :rtype: int + """ + return self.get_handler().get_size(self) + + def get_path(self): + """Get the path of this file + + :rtype: str + """ + return self.get_handler().get_path(self) + + def seek(self, offset, origin): + """Sets a reference point of a file to the given value. + + :param offset: The point relative to origin to move + :type offset: int + + :param origin: Reference point to seek (SEEK_ORIGIN_BEGIN, SEEK_ORIGIN_CURRENT, SEEK_ORIGIN_END) + :type origin: int + """ + return self.get_handler().seek(self, offset, origin) + + def read(self, n=-1): + """Read up to n bytes from the object and return them. + + :type n: int + :rtype: str + """ + return self.get_handler().read(self, n) + + def readinto(self, b): + """Read up to len(b) bytes into bytearray b and return the number of bytes read.""" + data = self.read(len(b)) + + if data is None: + return None + + b[:len(data)] = data + return len(data) + + def close(self): + """Close the file handle""" + return self.get_handler().close(self) + + def readable(self, *args, **kwargs): + return True diff --git a/libs/asio/file_opener.py b/libs/asio/file_opener.py new file mode 100644 index 000000000..990cc9804 --- /dev/null +++ b/libs/asio/file_opener.py @@ -0,0 +1,21 @@ +class FileOpener(object): + def __init__(self, file_path, parameters=None): + self.file_path = file_path + self.parameters = parameters + + self.file = None + + def __enter__(self): + self.file = ASIO.get_handler().open( + self.file_path, + self.parameters.handlers.get(ASIO.get_handler()) + ) + + return self.file + + def __exit__(self, exc_type, exc_val, exc_tb): + if not self.file: + return + + self.file.close() + self.file = None diff --git a/libs/asio/interfaces/__init__.py b/libs/asio/interfaces/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/libs/asio/interfaces/base.py b/libs/asio/interfaces/base.py new file mode 100644 index 000000000..6188b000f --- /dev/null +++ b/libs/asio/interfaces/base.py @@ -0,0 +1,41 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from asio.file import DEFAULT_BUFFER_SIZE + + +class Interface(object): + @classmethod + def open(cls, file_path, parameters=None): + raise NotImplementedError() + + @classmethod + def get_size(cls, fp): + raise NotImplementedError() + + @classmethod + def get_path(cls, fp): + raise NotImplementedError() + + @classmethod + def seek(cls, fp, pointer, distance): + raise NotImplementedError() + + @classmethod + def read(cls, fp, n=DEFAULT_BUFFER_SIZE): + raise NotImplementedError() + + @classmethod + def close(cls, fp): + raise NotImplementedError() diff --git a/libs/asio/interfaces/posix.py b/libs/asio/interfaces/posix.py new file mode 100644 index 000000000..b235c02b9 --- /dev/null +++ b/libs/asio/interfaces/posix.py @@ -0,0 +1,123 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from asio.file import File, DEFAULT_BUFFER_SIZE +from asio.interfaces.base import Interface + +import sys +import os + +if os.name == 'posix': + import select + + # fcntl is only required on darwin + if sys.platform == 'darwin': + import fcntl + +F_GETPATH = 50 + + +class PosixInterface(Interface): + @classmethod + def open(cls, file_path, parameters=None): + """ + :type file_path: str + :rtype: asio.interfaces.posix.PosixFile + """ + if not parameters: + parameters = {} + + if not parameters.get('mode'): + parameters.pop('mode') + + if not parameters.get('buffering'): + parameters.pop('buffering') + + fd = os.open(file_path, os.O_RDONLY | os.O_NONBLOCK) + + return PosixFile(fd) + + @classmethod + def get_size(cls, fp): + """ + :type fp: asio.interfaces.posix.PosixFile + :rtype: int + """ + return os.fstat(fp.fd).st_size + + @classmethod + def get_path(cls, fp): + """ + :type fp: asio.interfaces.posix.PosixFile + :rtype: int + """ + + # readlink /dev/fd fails on darwin, so instead use fcntl F_GETPATH + if sys.platform == 'darwin': + return fcntl.fcntl(fp.fd, F_GETPATH, '\0' * 1024).rstrip('\0') + + # Use /proc/self/fd if available + if os.path.lexists("/proc/self/fd/"): + return os.readlink("/proc/self/fd/%s" % fp.fd) + + # Fallback to /dev/fd + if os.path.lexists("/dev/fd/"): + return os.readlink("/dev/fd/%s" % fp.fd) + + raise NotImplementedError('Environment not supported (fdescfs not mounted?)') + + @classmethod + def seek(cls, fp, offset, origin): + """ + :type fp: asio.interfaces.posix.PosixFile + :type offset: int + :type origin: int + """ + os.lseek(fp.fd, offset, origin) + + @classmethod + def read(cls, fp, n=DEFAULT_BUFFER_SIZE): + """ + :type fp: asio.interfaces.posix.PosixFile + :type n: int + :rtype: str + """ + r, w, x = select.select([fp.fd], [], [], 5) + + if r: + return os.read(fp.fd, n) + + return None + + @classmethod + def close(cls, fp): + """ + :type fp: asio.interfaces.posix.PosixFile + """ + os.close(fp.fd) + + +class PosixFile(File): + platform_handler = PosixInterface + + def __init__(self, fd, *args, **kwargs): + """ + :type fd: asio.file.File + """ + super(PosixFile, self).__init__(*args, **kwargs) + + self.fd = fd + + def __str__(self): + return "" % self.fd diff --git a/libs/asio/interfaces/windows/__init__.py b/libs/asio/interfaces/windows/__init__.py new file mode 100644 index 000000000..20ce0bdc2 --- /dev/null +++ b/libs/asio/interfaces/windows/__init__.py @@ -0,0 +1,201 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from asio.file import File, DEFAULT_BUFFER_SIZE +from asio.interfaces.base import Interface + +import os + + +NULL = 0 + +if os.name == 'nt': + from asio.interfaces.windows.interop import WindowsInterop + + +class WindowsInterface(Interface): + @classmethod + def open(cls, file_path, parameters=None): + """ + :type file_path: str + :rtype: asio.interfaces.windows.WindowsFile + """ + if not parameters: + parameters = {} + + return WindowsFile(WindowsInterop.create_file( + file_path, + parameters.get('desired_access', WindowsInterface.GenericAccess.READ), + parameters.get('share_mode', WindowsInterface.ShareMode.ALL), + parameters.get('creation_disposition', WindowsInterface.CreationDisposition.OPEN_EXISTING), + parameters.get('flags_and_attributes', NULL) + )) + + @classmethod + def get_size(cls, fp): + """ + :type fp: asio.interfaces.windows.WindowsFile + :rtype: int + """ + return WindowsInterop.get_file_size(fp.handle) + + @classmethod + def get_path(cls, fp): + """ + :type fp: asio.interfaces.windows.WindowsFile + :rtype: str + """ + + if not fp.file_map: + fp.file_map = WindowsInterop.create_file_mapping(fp.handle, WindowsInterface.Protection.READONLY) + + if not fp.map_view: + fp.map_view = WindowsInterop.map_view_of_file(fp.file_map, WindowsInterface.FileMapAccess.READ, 1) + + file_name = WindowsInterop.get_mapped_file_name(fp.map_view) + + return file_name + + @classmethod + def seek(cls, fp, offset, origin): + """ + :type fp: asio.interfaces.windows.WindowsFile + :type offset: int + :type origin: int + :rtype: int + """ + + return WindowsInterop.set_file_pointer( + fp.handle, + offset, + origin + ) + + @classmethod + def read(cls, fp, n=DEFAULT_BUFFER_SIZE): + """ + :type fp: asio.interfaces.windows.WindowsFile + :type n: int + :rtype: str + """ + return WindowsInterop.read(fp.handle, n) + + @classmethod + def read_into(cls, fp, b): + """ + :type fp: asio.interfaces.windows.WindowsFile + :type b: str + :rtype: int + """ + return WindowsInterop.read_into(fp.handle, b) + + @classmethod + def close(cls, fp): + """ + :type fp: asio.interfaces.windows.WindowsFile + :rtype: bool + """ + if fp.map_view: + WindowsInterop.unmap_view_of_file(fp.map_view) + + if fp.file_map: + WindowsInterop.close_handle(fp.file_map) + + return bool(WindowsInterop.close_handle(fp.handle)) + + class GenericAccess(object): + READ = 0x80000000 + WRITE = 0x40000000 + EXECUTE = 0x20000000 + ALL = 0x10000000 + + class ShareMode(object): + READ = 0x00000001 + WRITE = 0x00000002 + DELETE = 0x00000004 + ALL = READ | WRITE | DELETE + + class CreationDisposition(object): + CREATE_NEW = 1 + CREATE_ALWAYS = 2 + OPEN_EXISTING = 3 + OPEN_ALWAYS = 4 + TRUNCATE_EXISTING = 5 + + class Attribute(object): + READONLY = 0x00000001 + HIDDEN = 0x00000002 + SYSTEM = 0x00000004 + DIRECTORY = 0x00000010 + ARCHIVE = 0x00000020 + DEVICE = 0x00000040 + NORMAL = 0x00000080 + TEMPORARY = 0x00000100 + SPARSE_FILE = 0x00000200 + REPARSE_POINT = 0x00000400 + COMPRESSED = 0x00000800 + OFFLINE = 0x00001000 + NOT_CONTENT_INDEXED = 0x00002000 + ENCRYPTED = 0x00004000 + + class Flag(object): + WRITE_THROUGH = 0x80000000 + OVERLAPPED = 0x40000000 + NO_BUFFERING = 0x20000000 + RANDOM_ACCESS = 0x10000000 + SEQUENTIAL_SCAN = 0x08000000 + DELETE_ON_CLOSE = 0x04000000 + BACKUP_SEMANTICS = 0x02000000 + POSIX_SEMANTICS = 0x01000000 + OPEN_REPARSE_POINT = 0x00200000 + OPEN_NO_RECALL = 0x00100000 + FIRST_PIPE_INSTANCE = 0x00080000 + + class Protection(object): + NOACCESS = 0x01 + READONLY = 0x02 + READWRITE = 0x04 + WRITECOPY = 0x08 + EXECUTE = 0x10 + EXECUTE_READ = 0x20, + EXECUTE_READWRITE = 0x40 + EXECUTE_WRITECOPY = 0x80 + GUARD = 0x100 + NOCACHE = 0x200 + WRITECOMBINE = 0x400 + + class FileMapAccess(object): + COPY = 0x0001 + WRITE = 0x0002 + READ = 0x0004 + ALL_ACCESS = 0x001f + EXECUTE = 0x0020 + + +class WindowsFile(File): + platform_handler = WindowsInterface + + def __init__(self, handle, *args, **kwargs): + super(WindowsFile, self).__init__(*args, **kwargs) + + self.handle = handle + + self.file_map = None + self.map_view = None + + def readinto(self, b): + return self.get_handler().read_into(self, b) + + def __str__(self): + return "" % self.handle diff --git a/libs/asio/interfaces/windows/interop.py b/libs/asio/interfaces/windows/interop.py new file mode 100644 index 000000000..7bce197c2 --- /dev/null +++ b/libs/asio/interfaces/windows/interop.py @@ -0,0 +1,230 @@ +# Copyright 2013 Dean Gardiner +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from ctypes.wintypes import * +from ctypes import * +import logging + +log = logging.getLogger(__name__) + + +CreateFileW = windll.kernel32.CreateFileW +CreateFileW.argtypes = (LPCWSTR, DWORD, DWORD, c_void_p, DWORD, DWORD, HANDLE) +CreateFileW.restype = HANDLE + +ReadFile = windll.kernel32.ReadFile +ReadFile.argtypes = (HANDLE, c_void_p, DWORD, POINTER(DWORD), HANDLE) +ReadFile.restype = BOOL + + +NULL = 0 +MAX_PATH = 260 +DEFAULT_BUFFER_SIZE = 4096 +LPSECURITY_ATTRIBUTES = c_void_p + + +class WindowsInterop(object): + ri_buffer = None + + @classmethod + def create_file(cls, path, desired_access, share_mode, creation_disposition, flags_and_attributes): + h = CreateFileW( + path, + desired_access, + share_mode, + NULL, + creation_disposition, + flags_and_attributes, + NULL + ) + + error = GetLastError() + if error != 0: + raise Exception('[WindowsASIO.open] "%s"' % FormatError(error)) + + return h + + @classmethod + def read(cls, handle, buf_size=DEFAULT_BUFFER_SIZE): + buf = create_string_buffer(buf_size) + bytes_read = c_ulong(0) + + success = ReadFile(handle, buf, buf_size, byref(bytes_read), NULL) + + error = GetLastError() + if error: + log.debug('read_file - error: (%s) "%s"', error, FormatError(error)) + + if not success and error: + raise Exception('[WindowsInterop.read_file] (%s) "%s"' % (error, FormatError(error))) + + # Return if we have a valid buffer + if success and bytes_read.value: + return buf.value + + return None + + @classmethod + def read_into(cls, handle, b): + if cls.ri_buffer is None or len(cls.ri_buffer) < len(b): + cls.ri_buffer = create_string_buffer(len(b)) + + bytes_read = c_ulong(0) + + success = ReadFile(handle, cls.ri_buffer, len(b), byref(bytes_read), NULL) + bytes_read = int(bytes_read.value) + + b[:bytes_read] = cls.ri_buffer[:bytes_read] + + error = GetLastError() + + if not success and error: + raise Exception('[WindowsInterop.read_file] (%s) "%s"' % (error, FormatError(error))) + + # Return if we have a valid buffer + if success and bytes_read: + return bytes_read + + return None + + @classmethod + def set_file_pointer(cls, handle, distance, method): + pos_high = DWORD(NULL) + + result = windll.kernel32.SetFilePointer( + handle, + c_ulong(distance), + byref(pos_high), + DWORD(method) + ) + + if result == -1: + raise Exception('[WindowsASIO.seek] INVALID_SET_FILE_POINTER: "%s"' % FormatError(GetLastError())) + + return result + + @classmethod + def get_file_size(cls, handle): + return windll.kernel32.GetFileSize( + handle, + DWORD(NULL) + ) + + @classmethod + def close_handle(cls, handle): + return windll.kernel32.CloseHandle(handle) + + @classmethod + def create_file_mapping(cls, handle, protect, maximum_size_high=0, maximum_size_low=1): + return HANDLE(windll.kernel32.CreateFileMappingW( + handle, + LPSECURITY_ATTRIBUTES(NULL), + DWORD(protect), + DWORD(maximum_size_high), + DWORD(maximum_size_low), + LPCSTR(NULL) + )) + + @classmethod + def map_view_of_file(cls, map_handle, desired_access, num_bytes, file_offset_high=0, file_offset_low=0): + return HANDLE(windll.kernel32.MapViewOfFile( + map_handle, + DWORD(desired_access), + DWORD(file_offset_high), + DWORD(file_offset_low), + num_bytes + )) + + @classmethod + def unmap_view_of_file(cls, view_handle): + return windll.kernel32.UnmapViewOfFile(view_handle) + + @classmethod + def get_mapped_file_name(cls, view_handle, translate_device_name=True): + buf = create_string_buffer(MAX_PATH + 1) + + result = windll.psapi.GetMappedFileNameW( + cls.get_current_process(), + view_handle, + buf, + MAX_PATH + ) + + # Raise exception on error + error = GetLastError() + if result == 0: + raise Exception(FormatError(error)) + + # Retrieve a clean file name (skipping over NUL bytes) + file_name = cls.clean_buffer_value(buf) + + # If we are not translating the device name return here + if not translate_device_name: + return file_name + + drives = cls.get_logical_drive_strings() + + # Find the drive matching the file_name device name + translated = False + for drive in drives: + device_name = cls.query_dos_device(drive) + + if file_name.startswith(device_name): + file_name = drive + file_name[len(device_name):] + translated = True + break + + if not translated: + raise Exception('Unable to translate device name') + + return file_name + + @classmethod + def get_logical_drive_strings(cls, buf_size=512): + buf = create_string_buffer(buf_size) + + result = windll.kernel32.GetLogicalDriveStringsW(buf_size, buf) + + error = GetLastError() + if result == 0: + raise Exception(FormatError(error)) + + drive_strings = cls.clean_buffer_value(buf) + return [dr for dr in drive_strings.split('\\') if dr != ''] + + @classmethod + def query_dos_device(cls, drive, buf_size=MAX_PATH): + buf = create_string_buffer(buf_size) + + result = windll.kernel32.QueryDosDeviceA( + drive, + buf, + buf_size + ) + + return cls.clean_buffer_value(buf) + + @classmethod + def get_current_process(cls): + return HANDLE(windll.kernel32.GetCurrentProcess()) + + @classmethod + def clean_buffer_value(cls, buf): + value = "" + + for ch in buf.raw: + if ord(ch) != 0: + value += ch + + return value diff --git a/libs/asio/open_parameters.py b/libs/asio/open_parameters.py new file mode 100644 index 000000000..a1463854d --- /dev/null +++ b/libs/asio/open_parameters.py @@ -0,0 +1,47 @@ +from asio.interfaces.posix import PosixInterface +from asio.interfaces.windows import WindowsInterface + + +class OpenParameters(object): + def __init__(self): + self.handlers = {} + + # Update handler_parameters with defaults + self.posix() + self.windows() + + def posix(self, mode=None, buffering=None): + """ + :type mode: str + :type buffering: int + """ + self.handlers.update({PosixInterface: { + 'mode': mode, + 'buffering': buffering + }}) + + def windows(self, desired_access=WindowsInterface.GenericAccess.READ, + share_mode=WindowsInterface.ShareMode.ALL, + creation_disposition=WindowsInterface.CreationDisposition.OPEN_EXISTING, + flags_and_attributes=0): + + """ + :param desired_access: WindowsInterface.DesiredAccess + :type desired_access: int + + :param share_mode: WindowsInterface.ShareMode + :type share_mode: int + + :param creation_disposition: WindowsInterface.CreationDisposition + :type creation_disposition: int + + :param flags_and_attributes: WindowsInterface.Attribute, WindowsInterface.Flag + :type flags_and_attributes: int + """ + + self.handlers.update({WindowsInterface: { + 'desired_access': desired_access, + 'share_mode': share_mode, + 'creation_disposition': creation_disposition, + 'flags_and_attributes': flags_and_attributes + }}) diff --git a/libs/babelfish/converters/opensubtitles.py b/libs/babelfish/converters/opensubtitles.py index 101c40fda..5b18e648c 100644 --- a/libs/babelfish/converters/opensubtitles.py +++ b/libs/babelfish/converters/opensubtitles.py @@ -17,7 +17,7 @@ class OpenSubtitlesConverter(LanguageReverseConverter): self.to_opensubtitles = {('por', 'BR'): 'pob', ('gre', None): 'ell', ('srp', None): 'scc', ('srp', 'ME'): 'mne'} self.from_opensubtitles = CaseInsensitiveDict({'pob': ('por', 'BR'), 'pb': ('por', 'BR'), 'ell': ('ell', None), 'scc': ('srp', None), 'mne': ('srp', 'ME')}) - self.codes = (self.alpha2_converter.codes | self.alpha3b_converter.codes | set(['pob', 'pb', 'scc', 'mne'])) + self.codes = (self.alpha2_converter.codes | self.alpha3b_converter.codes | set(self.from_opensubtitles.keys())) def convert(self, alpha3, country=None, script=None): alpha3b = self.alpha3b_converter.convert(alpha3, country, script) diff --git a/libs/babelfish/country.py b/libs/babelfish/country.py index 4c24b52b2..dbc14ce61 100644 --- a/libs/babelfish/country.py +++ b/libs/babelfish/country.py @@ -4,7 +4,6 @@ # Use of this source code is governed by the 3-clause BSD license # that can be found in the LICENSE file. # -from __future__ import unicode_literals from collections import namedtuple from functools import partial from pkg_resources import resource_stream # @UnresolvedImport diff --git a/libs/babelfish/data/get_files.py b/libs/babelfish/data/get_files.py new file mode 100644 index 000000000..aaa090ccc --- /dev/null +++ b/libs/babelfish/data/get_files.py @@ -0,0 +1,45 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# +# Copyright (c) 2013 the BabelFish authors. All rights reserved. +# Use of this source code is governed by the 3-clause BSD license +# that can be found in the LICENSE file. +# +from __future__ import unicode_literals +import os.path +import tempfile +import zipfile +import requests + + +DATA_DIR = os.path.dirname(__file__) + +# iso-3166-1.txt +print('Downloading ISO-3166-1 standard (ISO country codes)...') +with open(os.path.join(DATA_DIR, 'iso-3166-1.txt'), 'w') as f: + r = requests.get('http://www.iso.org/iso/home/standards/country_codes/country_names_and_code_elements_txt.htm') + f.write(r.content.strip()) + +# iso-639-3.tab +print('Downloading ISO-639-3 standard (ISO language codes)...') +with tempfile.TemporaryFile() as f: + r = requests.get('http://www-01.sil.org/iso639-3/iso-639-3_Code_Tables_20130531.zip') + f.write(r.content) + with zipfile.ZipFile(f) as z: + z.extract('iso-639-3.tab', DATA_DIR) + +# iso-15924 +print('Downloading ISO-15924 standard (ISO script codes)...') +with tempfile.TemporaryFile() as f: + r = requests.get('http://www.unicode.org/iso15924/iso15924.txt.zip') + f.write(r.content) + with zipfile.ZipFile(f) as z: + z.extract('iso15924-utf8-20131012.txt', DATA_DIR) + +# opensubtitles supported languages +print('Downloading OpenSubtitles supported languages...') +with open(os.path.join(DATA_DIR, 'opensubtitles_languages.txt'), 'w') as f: + r = requests.get('http://www.opensubtitles.org/addons/export_languages.php') + f.write(r.content) + +print('Done!') diff --git a/libs/babelfish/language.py b/libs/babelfish/language.py index b4b251937..6c98fb602 100644 --- a/libs/babelfish/language.py +++ b/libs/babelfish/language.py @@ -4,7 +4,6 @@ # Use of this source code is governed by the 3-clause BSD license # that can be found in the LICENSE file. # -from __future__ import unicode_literals from collections import namedtuple from functools import partial from pkg_resources import resource_stream # @UnresolvedImport diff --git a/libs/babelfish/script.py b/libs/babelfish/script.py index 4b59ce016..52258c95a 100644 --- a/libs/babelfish/script.py +++ b/libs/babelfish/script.py @@ -4,7 +4,6 @@ # Use of this source code is governed by the 3-clause BSD license # that can be found in the LICENSE file. # -from __future__ import unicode_literals from collections import namedtuple from pkg_resources import resource_stream # @UnresolvedImport from . import basestr diff --git a/libs/babelfish/tests.py b/libs/babelfish/tests.py index beed54694..b72ec284c 100644 --- a/libs/babelfish/tests.py +++ b/libs/babelfish/tests.py @@ -212,7 +212,7 @@ class TestLanguage(TestCase, _Py26FixTestCase): self.assertEqual(Language.fromcode('pob', 'opensubtitles'), Language('por', 'BR')) self.assertRaises(LanguageReverseError, lambda: Language.fromopensubtitles('zzz')) self.assertRaises(LanguageConvertError, lambda: Language('aaa').opensubtitles) - self.assertEqual(len(language_converters['opensubtitles'].codes), 606) + self.assertEqual(len(language_converters['opensubtitles'].codes), 607) # test with all the LANGUAGES from the opensubtitles api # downloaded from: http://www.opensubtitles.org/addons/export_languages.php @@ -228,6 +228,10 @@ class TestLanguage(TestCase, _Py26FixTestCase): self.assertEqual(Language.fromopensubtitles(idlang), Language.fromopensubtitles(alpha2)) f.close() + def test_converter_opensubtitles_codes(self): + for code in language_converters['opensubtitles'].from_opensubtitles.keys(): + self.assertIn(code, language_converters['opensubtitles'].codes) + def test_fromietf_country_script(self): language = Language.fromietf('fra-FR-Latn') self.assertEqual(language.alpha3, 'fra') diff --git a/libs/bs4/AUTHORS.txt b/libs/bs4/AUTHORS.txt new file mode 100644 index 000000000..2ac8fcc8c --- /dev/null +++ b/libs/bs4/AUTHORS.txt @@ -0,0 +1,43 @@ +Behold, mortal, the origins of Beautiful Soup... +================================================ + +Leonard Richardson is the primary programmer. + +Aaron DeVore is awesome. + +Mark Pilgrim provided the encoding detection code that forms the base +of UnicodeDammit. + +Thomas Kluyver and Ezio Melotti finished the work of getting Beautiful +Soup 4 working under Python 3. + +Simon Willison wrote soupselect, which was used to make Beautiful Soup +support CSS selectors. + +Sam Ruby helped with a lot of edge cases. + +Jonathan Ellis was awarded the prestigous Beau Potage D'Or for his +work in solving the nestable tags conundrum. + +An incomplete list of people have contributed patches to Beautiful +Soup: + + Istvan Albert, Andrew Lin, Anthony Baxter, Andrew Boyko, Tony Chang, + Zephyr Fang, Fuzzy, Roman Gaufman, Yoni Gilad, Richie Hindle, Peteris + Krumins, Kent Johnson, Ben Last, Robert Leftwich, Staffan Malmgren, + Ksenia Marasanova, JP Moins, Adam Monsen, John Nagle, "Jon", Ed + Oskiewicz, Greg Phillips, Giles Radford, Arthur Rudolph, Marko + Samastur, Jouni Seppänen, Alexander Schmolck, Andy Theyers, Glyn + Webster, Paul Wright, Danny Yoo + +An incomplete list of people who made suggestions or found bugs or +found ways to break Beautiful Soup: + + Hanno Böck, Matteo Bertini, Chris Curvey, Simon Cusack, Bruce Eckel, + Matt Ernst, Michael Foord, Tom Harris, Bill de hOra, Donald Howes, + Matt Patterson, Scott Roberts, Steve Strassmann, Mike Williams, + warchild at redho dot com, Sami Kuisma, Carlos Rocha, Bob Hutchison, + Joren Mc, Michal Migurski, John Kleven, Tim Heaney, Tripp Lilley, Ed + Summers, Dennis Sutch, Chris Smith, Aaron Sweep^W Swartz, Stuart + Turner, Greg Edwards, Kevin J Kalupson, Nikos Kouremenos, Artur de + Sousa Rocha, Yichun Wei, Per Vognsen diff --git a/libs/bs4/COPYING.txt b/libs/bs4/COPYING.txt new file mode 100644 index 000000000..b91188869 --- /dev/null +++ b/libs/bs4/COPYING.txt @@ -0,0 +1,27 @@ +Beautiful Soup is made available under the MIT license: + + Copyright (c) 2004-2015 Leonard Richardson + + Permission is hereby granted, free of charge, to any person obtaining + a copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS + BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +Beautiful Soup incorporates code from the html5lib library, which is +also made available under the MIT license. Copyright (c) 2006-2013 +James Graham and other contributors diff --git a/libs/bs4/NEWS.txt b/libs/bs4/NEWS.txt new file mode 100644 index 000000000..3726c570a --- /dev/null +++ b/libs/bs4/NEWS.txt @@ -0,0 +1,1190 @@ += 4.4.1 (20150928) = + +* Fixed a bug that deranged the tree when part of it was + removed. Thanks to Eric Weiser for the patch and John Wiseman for a + test. [bug=1481520] + +* Fixed a parse bug with the html5lib tree-builder. Thanks to Roel + Kramer for the patch. [bug=1483781] + +* Improved the implementation of CSS selector grouping. Thanks to + Orangain for the patch. [bug=1484543] + +* Fixed the test_detect_utf8 test so that it works when chardet is + installed. [bug=1471359] + +* Corrected the output of Declaration objects. [bug=1477847] + + += 4.4.0 (20150703) = + +Especially important changes: + +* Added a warning when you instantiate a BeautifulSoup object without + explicitly naming a parser. [bug=1398866] + +* __repr__ now returns an ASCII bytestring in Python 2, and a Unicode + string in Python 3, instead of a UTF8-encoded bytestring in both + versions. In Python 3, __str__ now returns a Unicode string instead + of a bytestring. [bug=1420131] + +* The `text` argument to the find_* methods is now called `string`, + which is more accurate. `text` still works, but `string` is the + argument described in the documentation. `text` may eventually + change its meaning, but not for a very long time. [bug=1366856] + +* Changed the way soup objects work under copy.copy(). Copying a + NavigableString or a Tag will give you a new NavigableString that's + equal to the old one but not connected to the parse tree. Patch by + Martijn Peters. [bug=1307490] + +* Started using a standard MIT license. [bug=1294662] + +* Added a Chinese translation of the documentation by Delong .w. + +New features: + +* Introduced the select_one() method, which uses a CSS selector but + only returns the first match, instead of a list of + matches. [bug=1349367] + +* You can now create a Tag object without specifying a + TreeBuilder. Patch by Martijn Pieters. [bug=1307471] + +* You can now create a NavigableString or a subclass just by invoking + the constructor. [bug=1294315] + +* Added an `exclude_encodings` argument to UnicodeDammit and to the + Beautiful Soup constructor, which lets you prohibit the detection of + an encoding that you know is wrong. [bug=1469408] + +* The select() method now supports selector grouping. Patch by + Francisco Canas [bug=1191917] + +Bug fixes: + +* Fixed yet another problem that caused the html5lib tree builder to + create a disconnected parse tree. [bug=1237763] + +* Force object_was_parsed() to keep the tree intact even when an element + from later in the document is moved into place. [bug=1430633] + +* Fixed yet another bug that caused a disconnected tree when html5lib + copied an element from one part of the tree to another. [bug=1270611] + +* Fixed a bug where Element.extract() could create an infinite loop in + the remaining tree. + +* The select() method can now find tags whose names contain + dashes. Patch by Francisco Canas. [bug=1276211] + +* The select() method can now find tags with attributes whose names + contain dashes. Patch by Marek Kapolka. [bug=1304007] + +* Improved the lxml tree builder's handling of processing + instructions. [bug=1294645] + +* Restored the helpful syntax error that happens when you try to + import the Python 2 edition of Beautiful Soup under Python + 3. [bug=1213387] + +* In Python 3.4 and above, set the new convert_charrefs argument to + the html.parser constructor to avoid a warning and future + failures. Patch by Stefano Revera. [bug=1375721] + +* The warning when you pass in a filename or URL as markup will now be + displayed correctly even if the filename or URL is a Unicode + string. [bug=1268888] + +* If the initial tag contains a CDATA list attribute such as + 'class', the html5lib tree builder will now turn its value into a + list, as it would with any other tag. [bug=1296481] + +* Fixed an import error in Python 3.5 caused by the removal of the + HTMLParseError class. [bug=1420063] + +* Improved docstring for encode_contents() and + decode_contents(). [bug=1441543] + +* Fixed a crash in Unicode, Dammit's encoding detector when the name + of the encoding itself contained invalid bytes. [bug=1360913] + +* Improved the exception raised when you call .unwrap() or + .replace_with() on an element that's not attached to a tree. + +* Raise a NotImplementedError whenever an unsupported CSS pseudoclass + is used in select(). Previously some cases did not result in a + NotImplementedError. + +* It's now possible to pickle a BeautifulSoup object no matter which + tree builder was used to create it. However, the only tree builder + that survives the pickling process is the HTMLParserTreeBuilder + ('html.parser'). If you unpickle a BeautifulSoup object created with + some other tree builder, soup.builder will be None. [bug=1231545] + += 4.3.2 (20131002) = + +* Fixed a bug in which short Unicode input was improperly encoded to + ASCII when checking whether or not it was the name of a file on + disk. [bug=1227016] + +* Fixed a crash when a short input contains data not valid in + filenames. [bug=1232604] + +* Fixed a bug that caused Unicode data put into UnicodeDammit to + return None instead of the original data. [bug=1214983] + +* Combined two tests to stop a spurious test failure when tests are + run by nosetests. [bug=1212445] + += 4.3.1 (20130815) = + +* Fixed yet another problem with the html5lib tree builder, caused by + html5lib's tendency to rearrange the tree during + parsing. [bug=1189267] + +* Fixed a bug that caused the optimized version of find_all() to + return nothing. [bug=1212655] + += 4.3.0 (20130812) = + +* Instead of converting incoming data to Unicode and feeding it to the + lxml tree builder in chunks, Beautiful Soup now makes successive + guesses at the encoding of the incoming data, and tells lxml to + parse the data as that encoding. Giving lxml more control over the + parsing process improves performance and avoids a number of bugs and + issues with the lxml parser which had previously required elaborate + workarounds: + + - An issue in which lxml refuses to parse Unicode strings on some + systems. [bug=1180527] + + - A returning bug that truncated documents longer than a (very + small) size. [bug=963880] + + - A returning bug in which extra spaces were added to a document if + the document defined a charset other than UTF-8. [bug=972466] + + This required a major overhaul of the tree builder architecture. If + you wrote your own tree builder and didn't tell me, you'll need to + modify your prepare_markup() method. + +* The UnicodeDammit code that makes guesses at encodings has been + split into its own class, EncodingDetector. A lot of apparently + redundant code has been removed from Unicode, Dammit, and some + undocumented features have also been removed. + +* Beautiful Soup will issue a warning if instead of markup you pass it + a URL or the name of a file on disk (a common beginner's mistake). + +* A number of optimizations improve the performance of the lxml tree + builder by about 33%, the html.parser tree builder by about 20%, and + the html5lib tree builder by about 15%. + +* All find_all calls should now return a ResultSet object. Patch by + Aaron DeVore. [bug=1194034] + += 4.2.1 (20130531) = + +* The default XML formatter will now replace ampersands even if they + appear to be part of entities. That is, "<" will become + "&lt;". The old code was left over from Beautiful Soup 3, which + didn't always turn entities into Unicode characters. + + If you really want the old behavior (maybe because you add new + strings to the tree, those strings include entities, and you want + the formatter to leave them alone on output), it can be found in + EntitySubstitution.substitute_xml_containing_entities(). [bug=1182183] + +* Gave new_string() the ability to create subclasses of + NavigableString. [bug=1181986] + +* Fixed another bug by which the html5lib tree builder could create a + disconnected tree. [bug=1182089] + +* The .previous_element of a BeautifulSoup object is now always None, + not the last element to be parsed. [bug=1182089] + +* Fixed test failures when lxml is not installed. [bug=1181589] + +* html5lib now supports Python 3. Fixed some Python 2-specific + code in the html5lib test suite. [bug=1181624] + +* The html.parser treebuilder can now handle numeric attributes in + text when the hexidecimal name of the attribute starts with a + capital X. Patch by Tim Shirley. [bug=1186242] + += 4.2.0 (20130514) = + +* The Tag.select() method now supports a much wider variety of CSS + selectors. + + - Added support for the adjacent sibling combinator (+) and the + general sibling combinator (~). Tests by "liquider". [bug=1082144] + + - The combinators (>, +, and ~) can now combine with any supported + selector, not just one that selects based on tag name. + + - Added limited support for the "nth-of-type" pseudo-class. Code + by Sven Slootweg. [bug=1109952] + +* The BeautifulSoup class is now aliased to "_s" and "_soup", making + it quicker to type the import statement in an interactive session: + + from bs4 import _s + or + from bs4 import _soup + + The alias may change in the future, so don't use this in code you're + going to run more than once. + +* Added the 'diagnose' submodule, which includes several useful + functions for reporting problems and doing tech support. + + - diagnose(data) tries the given markup on every installed parser, + reporting exceptions and displaying successes. If a parser is not + installed, diagnose() mentions this fact. + + - lxml_trace(data, html=True) runs the given markup through lxml's + XML parser or HTML parser, and prints out the parser events as + they happen. This helps you quickly determine whether a given + problem occurs in lxml code or Beautiful Soup code. + + - htmlparser_trace(data) is the same thing, but for Python's + built-in HTMLParser class. + +* In an HTML document, the contents of a ') + # => <script> do_nasty_stuff() </script> + # sanitize_html('Click here for $100') + # => Click here for $100 + def sanitize_token(self, token): + + # accommodate filters which use token_type differently + token_type = token["type"] + if token_type in ("StartTag", "EndTag", "EmptyTag"): + name = token["name"] + namespace = token["namespace"] + if ((namespace, name) in self.allowed_elements or + (namespace is None and + (namespaces["html"], name) in self.allowed_elements)): + return self.allowed_token(token) + else: + return self.disallowed_token(token) + elif token_type == "Comment": + pass + else: + return token + + def allowed_token(self, token): + if "data" in token: + attrs = token["data"] + attr_names = set(attrs.keys()) + + # Remove forbidden attributes + for to_remove in (attr_names - self.allowed_attributes): + del token["data"][to_remove] + attr_names.remove(to_remove) + + # Remove attributes with disallowed URL values + for attr in (attr_names & self.attr_val_is_uri): + assert attr in attrs + # I don't have a clue where this regexp comes from or why it matches those + # characters, nor why we call unescape. I just know it's always been here. + # Should you be worried by this comment in a sanitizer? Yes. On the other hand, all + # this will do is remove *more* than it otherwise would. + val_unescaped = re.sub("[`\x00-\x20\x7f-\xa0\\s]+", '', + unescape(attrs[attr])).lower() + # remove replacement characters from unescaped characters + val_unescaped = val_unescaped.replace("\ufffd", "") + try: + uri = urlparse.urlparse(val_unescaped) + except ValueError: + uri = None + del attrs[attr] + if uri and uri.scheme: + if uri.scheme not in self.allowed_protocols: + del attrs[attr] + if uri.scheme == 'data': + m = data_content_type.match(uri.path) + if not m: + del attrs[attr] + elif m.group('content_type') not in self.allowed_content_types: + del attrs[attr] + + for attr in self.svg_attr_val_allows_ref: + if attr in attrs: + attrs[attr] = re.sub(r'url\s*\(\s*[^#\s][^)]+?\)', + ' ', + unescape(attrs[attr])) + if (token["name"] in self.svg_allow_local_href and + (namespaces['xlink'], 'href') in attrs and re.search(r'^\s*[^#\s].*', + attrs[(namespaces['xlink'], 'href')])): + del attrs[(namespaces['xlink'], 'href')] + if (None, 'style') in attrs: + attrs[(None, 'style')] = self.sanitize_css(attrs[(None, 'style')]) + token["data"] = attrs + return token + + def disallowed_token(self, token): + token_type = token["type"] + if token_type == "EndTag": + token["data"] = "" % token["name"] + elif token["data"]: + assert token_type in ("StartTag", "EmptyTag") + attrs = [] + for (ns, name), v in token["data"].items(): + attrs.append(' %s="%s"' % (name if ns is None else "%s:%s" % (prefixes[ns], name), escape(v))) + token["data"] = "<%s%s>" % (token["name"], ''.join(attrs)) + else: + token["data"] = "<%s>" % token["name"] + if token.get("selfClosing"): + token["data"] = token["data"][:-1] + "/>" + + token["type"] = "Characters" + + del token["name"] + return token + + def sanitize_css(self, style): + # disallow urls + style = re.compile(r'url\s*\(\s*[^\s)]+?\s*\)\s*').sub(' ', style) + + # gauntlet + if not re.match(r"""^([:,;#%.\sa-zA-Z0-9!]|\w-\w|'[\s\w]+'|"[\s\w]+"|\([\d,\s]+\))*$""", style): + return '' + if not re.match(r"^\s*([-\w]+\s*:[^:;]*(;\s*|$))*$", style): + return '' + + clean = [] + for prop, value in re.findall(r"([-\w]+)\s*:\s*([^:;]*)", style): + if not value: + continue + if prop.lower() in self.allowed_css_properties: + clean.append(prop + ': ' + value + ';') + elif prop.split('-')[0].lower() in ['background', 'border', 'margin', + 'padding']: + for keyword in value.split(): + if keyword not in self.allowed_css_keywords and \ + not re.match(r"^(#[0-9a-fA-F]+|rgb\(\d+%?,\d*%?,?\d*%?\)?|\d{0,2}\.?\d{0,2}(cm|em|ex|in|mm|pc|pt|px|%|,|\))?)$", keyword): # noqa + break + else: + clean.append(prop + ': ' + value + ';') + elif prop.lower() in self.allowed_svg_properties: + clean.append(prop + ': ' + value + ';') + + return ' '.join(clean) diff --git a/libs/html5lib/filters/whitespace.py b/libs/html5lib/filters/whitespace.py new file mode 100644 index 000000000..0d12584b4 --- /dev/null +++ b/libs/html5lib/filters/whitespace.py @@ -0,0 +1,38 @@ +from __future__ import absolute_import, division, unicode_literals + +import re + +from . import base +from ..constants import rcdataElements, spaceCharacters +spaceCharacters = "".join(spaceCharacters) + +SPACES_REGEX = re.compile("[%s]+" % spaceCharacters) + + +class Filter(base.Filter): + """Collapses whitespace except in pre, textarea, and script elements""" + spacePreserveElements = frozenset(["pre", "textarea"] + list(rcdataElements)) + + def __iter__(self): + preserve = 0 + for token in base.Filter.__iter__(self): + type = token["type"] + if type == "StartTag" \ + and (preserve or token["name"] in self.spacePreserveElements): + preserve += 1 + + elif type == "EndTag" and preserve: + preserve -= 1 + + elif not preserve and type == "SpaceCharacters" and token["data"]: + # Test on token["data"] above to not introduce spaces where there were not + token["data"] = " " + + elif not preserve and type == "Characters": + token["data"] = collapse_spaces(token["data"]) + + yield token + + +def collapse_spaces(text): + return SPACES_REGEX.sub(' ', text) diff --git a/libs/html5lib/html5parser.py b/libs/html5lib/html5parser.py new file mode 100644 index 000000000..9d39b9d41 --- /dev/null +++ b/libs/html5lib/html5parser.py @@ -0,0 +1,2791 @@ +from __future__ import absolute_import, division, unicode_literals +from six import with_metaclass, viewkeys + +import types +from collections import OrderedDict + +from . import _inputstream +from . import _tokenizer + +from . import treebuilders +from .treebuilders.base import Marker + +from . import _utils +from .constants import ( + spaceCharacters, asciiUpper2Lower, + specialElements, headingElements, cdataElements, rcdataElements, + tokenTypes, tagTokenTypes, + namespaces, + htmlIntegrationPointElements, mathmlTextIntegrationPointElements, + adjustForeignAttributes as adjustForeignAttributesMap, + adjustMathMLAttributes, adjustSVGAttributes, + E, + _ReparseException +) + + +def parse(doc, treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML document as a string or file-like object into a tree + + :arg doc: the document to parse as a string or file-like object + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import parse + >>> parse('

This is a doc

') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parse(doc, **kwargs) + + +def parseFragment(doc, container="div", treebuilder="etree", namespaceHTMLElements=True, **kwargs): + """Parse an HTML fragment as a string or file-like object into a tree + + :arg doc: the fragment to parse as a string or file-like object + + :arg container: the container context to parse the fragment in + + :arg treebuilder: the treebuilder to use when parsing + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import parseFragment + >>> parseFragment('this is a fragment') + + + """ + tb = treebuilders.getTreeBuilder(treebuilder) + p = HTMLParser(tb, namespaceHTMLElements=namespaceHTMLElements) + return p.parseFragment(doc, container=container, **kwargs) + + +def method_decorator_metaclass(function): + class Decorated(type): + def __new__(meta, classname, bases, classDict): + for attributeName, attribute in classDict.items(): + if isinstance(attribute, types.FunctionType): + attribute = function(attribute) + + classDict[attributeName] = attribute + return type.__new__(meta, classname, bases, classDict) + return Decorated + + +class HTMLParser(object): + """HTML parser + + Generates a tree structure from a stream of (possibly malformed) HTML. + + """ + + def __init__(self, tree=None, strict=False, namespaceHTMLElements=True, debug=False): + """ + :arg tree: a treebuilder class controlling the type of tree that will be + returned. Built in treebuilders can be accessed through + html5lib.treebuilders.getTreeBuilder(treeType) + + :arg strict: raise an exception when a parse error is encountered + + :arg namespaceHTMLElements: whether or not to namespace HTML elements + + :arg debug: whether or not to enable debug mode which logs things + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() # generates parser with etree builder + >>> parser = HTMLParser('lxml', strict=True) # generates parser with lxml builder which is strict + + """ + + # Raise an exception on the first error encountered + self.strict = strict + + if tree is None: + tree = treebuilders.getTreeBuilder("etree") + self.tree = tree(namespaceHTMLElements) + self.errors = [] + + self.phases = dict([(name, cls(self, self.tree)) for name, cls in + getPhases(debug).items()]) + + def _parse(self, stream, innerHTML=False, container="div", scripting=False, **kwargs): + + self.innerHTMLMode = innerHTML + self.container = container + self.scripting = scripting + self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) + self.reset() + + try: + self.mainLoop() + except _ReparseException: + self.reset() + self.mainLoop() + + def reset(self): + self.tree.reset() + self.firstStartTag = False + self.errors = [] + self.log = [] # only used with debug mode + # "quirks" / "limited quirks" / "no quirks" + self.compatMode = "no quirks" + + if self.innerHTMLMode: + self.innerHTML = self.container.lower() + + if self.innerHTML in cdataElements: + self.tokenizer.state = self.tokenizer.rcdataState + elif self.innerHTML in rcdataElements: + self.tokenizer.state = self.tokenizer.rawtextState + elif self.innerHTML == 'plaintext': + self.tokenizer.state = self.tokenizer.plaintextState + else: + # state already is data state + # self.tokenizer.state = self.tokenizer.dataState + pass + self.phase = self.phases["beforeHtml"] + self.phase.insertHtmlElement() + self.resetInsertionMode() + else: + self.innerHTML = False # pylint:disable=redefined-variable-type + self.phase = self.phases["initial"] + + self.lastPhase = None + + self.beforeRCDataPhase = None + + self.framesetOK = True + + @property + def documentEncoding(self): + """Name of the character encoding that was used to decode the input stream, or + :obj:`None` if that is not determined yet + + """ + if not hasattr(self, 'tokenizer'): + return None + return self.tokenizer.stream.charEncoding[0].name + + def isHTMLIntegrationPoint(self, element): + if (element.name == "annotation-xml" and + element.namespace == namespaces["mathml"]): + return ("encoding" in element.attributes and + element.attributes["encoding"].translate( + asciiUpper2Lower) in + ("text/html", "application/xhtml+xml")) + else: + return (element.namespace, element.name) in htmlIntegrationPointElements + + def isMathMLTextIntegrationPoint(self, element): + return (element.namespace, element.name) in mathmlTextIntegrationPointElements + + def mainLoop(self): + CharactersToken = tokenTypes["Characters"] + SpaceCharactersToken = tokenTypes["SpaceCharacters"] + StartTagToken = tokenTypes["StartTag"] + EndTagToken = tokenTypes["EndTag"] + CommentToken = tokenTypes["Comment"] + DoctypeToken = tokenTypes["Doctype"] + ParseErrorToken = tokenTypes["ParseError"] + + for token in self.normalizedTokens(): + prev_token = None + new_token = token + while new_token is not None: + prev_token = new_token + currentNode = self.tree.openElements[-1] if self.tree.openElements else None + currentNodeNamespace = currentNode.namespace if currentNode else None + currentNodeName = currentNode.name if currentNode else None + + type = new_token["type"] + + if type == ParseErrorToken: + self.parseError(new_token["data"], new_token.get("datavars", {})) + new_token = None + else: + if (len(self.tree.openElements) == 0 or + currentNodeNamespace == self.tree.defaultNamespace or + (self.isMathMLTextIntegrationPoint(currentNode) and + ((type == StartTagToken and + token["name"] not in frozenset(["mglyph", "malignmark"])) or + type in (CharactersToken, SpaceCharactersToken))) or + (currentNodeNamespace == namespaces["mathml"] and + currentNodeName == "annotation-xml" and + type == StartTagToken and + token["name"] == "svg") or + (self.isHTMLIntegrationPoint(currentNode) and + type in (StartTagToken, CharactersToken, SpaceCharactersToken))): + phase = self.phase + else: + phase = self.phases["inForeignContent"] + + if type == CharactersToken: + new_token = phase.processCharacters(new_token) + elif type == SpaceCharactersToken: + new_token = phase.processSpaceCharacters(new_token) + elif type == StartTagToken: + new_token = phase.processStartTag(new_token) + elif type == EndTagToken: + new_token = phase.processEndTag(new_token) + elif type == CommentToken: + new_token = phase.processComment(new_token) + elif type == DoctypeToken: + new_token = phase.processDoctype(new_token) + + if (type == StartTagToken and prev_token["selfClosing"] and + not prev_token["selfClosingAcknowledged"]): + self.parseError("non-void-element-with-trailing-solidus", + {"name": prev_token["name"]}) + + # When the loop finishes it's EOF + reprocess = True + phases = [] + while reprocess: + phases.append(self.phase) + reprocess = self.phase.processEOF() + if reprocess: + assert self.phase not in phases + + def normalizedTokens(self): + for token in self.tokenizer: + yield self.normalizeToken(token) + + def parse(self, stream, *args, **kwargs): + """Parse a HTML document into a well-formed tree + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element). + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5parser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parse('

This is a doc

') + + + """ + self._parse(stream, False, None, *args, **kwargs) + return self.tree.getDocument() + + def parseFragment(self, stream, *args, **kwargs): + """Parse a HTML fragment into a well-formed tree fragment + + :arg container: name of the element we're setting the innerHTML + property if set to None, default to 'div' + + :arg stream: a file-like object or string containing the HTML to be parsed + + The optional encoding parameter must be a string that indicates + the encoding. If specified, that encoding will be used, + regardless of any BOM or later declaration (such as in a meta + element) + + :arg scripting: treat noscript elements as if JavaScript was turned on + + :returns: parsed tree + + Example: + + >>> from html5lib.html5libparser import HTMLParser + >>> parser = HTMLParser() + >>> parser.parseFragment('this is a fragment') + + + """ + self._parse(stream, True, *args, **kwargs) + return self.tree.getFragment() + + def parseError(self, errorcode="XXX-undefined-error", datavars=None): + # XXX The idea is to make errorcode mandatory. + if datavars is None: + datavars = {} + self.errors.append((self.tokenizer.stream.position(), errorcode, datavars)) + if self.strict: + raise ParseError(E[errorcode] % datavars) + + def normalizeToken(self, token): + # HTML5 specific normalizations to the token stream + if token["type"] == tokenTypes["StartTag"]: + raw = token["data"] + token["data"] = OrderedDict(raw) + if len(raw) > len(token["data"]): + # we had some duplicated attribute, fix so first wins + token["data"].update(raw[::-1]) + + return token + + def adjustMathMLAttributes(self, token): + adjust_attributes(token, adjustMathMLAttributes) + + def adjustSVGAttributes(self, token): + adjust_attributes(token, adjustSVGAttributes) + + def adjustForeignAttributes(self, token): + adjust_attributes(token, adjustForeignAttributesMap) + + def reparseTokenNormal(self, token): + # pylint:disable=unused-argument + self.parser.phase() + + def resetInsertionMode(self): + # The name of this method is mostly historical. (It's also used in the + # specification.) + last = False + newModes = { + "select": "inSelect", + "td": "inCell", + "th": "inCell", + "tr": "inRow", + "tbody": "inTableBody", + "thead": "inTableBody", + "tfoot": "inTableBody", + "caption": "inCaption", + "colgroup": "inColumnGroup", + "table": "inTable", + "head": "inBody", + "body": "inBody", + "frameset": "inFrameset", + "html": "beforeHead" + } + for node in self.tree.openElements[::-1]: + nodeName = node.name + new_phase = None + if node == self.tree.openElements[0]: + assert self.innerHTML + last = True + nodeName = self.innerHTML + # Check for conditions that should only happen in the innerHTML + # case + if nodeName in ("select", "colgroup", "head", "html"): + assert self.innerHTML + + if not last and node.namespace != self.tree.defaultNamespace: + continue + + if nodeName in newModes: + new_phase = self.phases[newModes[nodeName]] + break + elif last: + new_phase = self.phases["inBody"] + break + + self.phase = new_phase + + def parseRCDataRawtext(self, token, contentType): + # Generic RCDATA/RAWTEXT Parsing algorithm + assert contentType in ("RAWTEXT", "RCDATA") + + self.tree.insertElement(token) + + if contentType == "RAWTEXT": + self.tokenizer.state = self.tokenizer.rawtextState + else: + self.tokenizer.state = self.tokenizer.rcdataState + + self.originalPhase = self.phase + + self.phase = self.phases["text"] + + +@_utils.memoize +def getPhases(debug): + def log(function): + """Logger that records which phase processes each token""" + type_names = dict((value, key) for key, value in + tokenTypes.items()) + + def wrapped(self, *args, **kwargs): + if function.__name__.startswith("process") and len(args) > 0: + token = args[0] + try: + info = {"type": type_names[token['type']]} + except: + raise + if token['type'] in tagTokenTypes: + info["name"] = token['name'] + + self.parser.log.append((self.parser.tokenizer.state.__name__, + self.parser.phase.__class__.__name__, + self.__class__.__name__, + function.__name__, + info)) + return function(self, *args, **kwargs) + else: + return function(self, *args, **kwargs) + return wrapped + + def getMetaclass(use_metaclass, metaclass_func): + if use_metaclass: + return method_decorator_metaclass(metaclass_func) + else: + return type + + # pylint:disable=unused-argument + class Phase(with_metaclass(getMetaclass(debug, log))): + """Base class for helper object that implements each phase of processing + """ + + def __init__(self, parser, tree): + self.parser = parser + self.tree = tree + + def processEOF(self): + raise NotImplementedError + + def processComment(self, token): + # For most phases the following is correct. Where it's not it will be + # overridden. + self.tree.insertComment(token, self.tree.openElements[-1]) + + def processDoctype(self, token): + self.parser.parseError("unexpected-doctype") + + def processCharacters(self, token): + self.tree.insertText(token["data"]) + + def processSpaceCharacters(self, token): + self.tree.insertText(token["data"]) + + def processStartTag(self, token): + return self.startTagHandler[token["name"]](token) + + def startTagHtml(self, token): + if not self.parser.firstStartTag and token["name"] == "html": + self.parser.parseError("non-html-root") + # XXX Need a check here to see if the first start tag token emitted is + # this token... If it's not, invoke self.parser.parseError(). + for attr, value in token["data"].items(): + if attr not in self.tree.openElements[0].attributes: + self.tree.openElements[0].attributes[attr] = value + self.parser.firstStartTag = False + + def processEndTag(self, token): + return self.endTagHandler[token["name"]](token) + + class InitialPhase(Phase): + def processSpaceCharacters(self, token): + pass + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processDoctype(self, token): + name = token["name"] + publicId = token["publicId"] + systemId = token["systemId"] + correct = token["correct"] + + if (name != "html" or publicId is not None or + systemId is not None and systemId != "about:legacy-compat"): + self.parser.parseError("unknown-doctype") + + if publicId is None: + publicId = "" + + self.tree.insertDoctype(token) + + if publicId != "": + publicId = publicId.translate(asciiUpper2Lower) + + if (not correct or token["name"] != "html" or + publicId.startswith( + ("+//silmaril//dtd html pro v0r11 19970101//", + "-//advasoft ltd//dtd html 3.0 aswedit + extensions//", + "-//as//dtd html 3.0 aswedit + extensions//", + "-//ietf//dtd html 2.0 level 1//", + "-//ietf//dtd html 2.0 level 2//", + "-//ietf//dtd html 2.0 strict level 1//", + "-//ietf//dtd html 2.0 strict level 2//", + "-//ietf//dtd html 2.0 strict//", + "-//ietf//dtd html 2.0//", + "-//ietf//dtd html 2.1e//", + "-//ietf//dtd html 3.0//", + "-//ietf//dtd html 3.2 final//", + "-//ietf//dtd html 3.2//", + "-//ietf//dtd html 3//", + "-//ietf//dtd html level 0//", + "-//ietf//dtd html level 1//", + "-//ietf//dtd html level 2//", + "-//ietf//dtd html level 3//", + "-//ietf//dtd html strict level 0//", + "-//ietf//dtd html strict level 1//", + "-//ietf//dtd html strict level 2//", + "-//ietf//dtd html strict level 3//", + "-//ietf//dtd html strict//", + "-//ietf//dtd html//", + "-//metrius//dtd metrius presentational//", + "-//microsoft//dtd internet explorer 2.0 html strict//", + "-//microsoft//dtd internet explorer 2.0 html//", + "-//microsoft//dtd internet explorer 2.0 tables//", + "-//microsoft//dtd internet explorer 3.0 html strict//", + "-//microsoft//dtd internet explorer 3.0 html//", + "-//microsoft//dtd internet explorer 3.0 tables//", + "-//netscape comm. corp.//dtd html//", + "-//netscape comm. corp.//dtd strict html//", + "-//o'reilly and associates//dtd html 2.0//", + "-//o'reilly and associates//dtd html extended 1.0//", + "-//o'reilly and associates//dtd html extended relaxed 1.0//", + "-//softquad software//dtd hotmetal pro 6.0::19990601::extensions to html 4.0//", + "-//softquad//dtd hotmetal pro 4.0::19971010::extensions to html 4.0//", + "-//spyglass//dtd html 2.0 extended//", + "-//sq//dtd html 2.0 hotmetal + extensions//", + "-//sun microsystems corp.//dtd hotjava html//", + "-//sun microsystems corp.//dtd hotjava strict html//", + "-//w3c//dtd html 3 1995-03-24//", + "-//w3c//dtd html 3.2 draft//", + "-//w3c//dtd html 3.2 final//", + "-//w3c//dtd html 3.2//", + "-//w3c//dtd html 3.2s draft//", + "-//w3c//dtd html 4.0 frameset//", + "-//w3c//dtd html 4.0 transitional//", + "-//w3c//dtd html experimental 19960712//", + "-//w3c//dtd html experimental 970421//", + "-//w3c//dtd w3 html//", + "-//w3o//dtd w3 html 3.0//", + "-//webtechs//dtd mozilla html 2.0//", + "-//webtechs//dtd mozilla html//")) or + publicId in ("-//w3o//dtd w3 html strict 3.0//en//", + "-/w3c/dtd html 4.0 transitional/en", + "html") or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is None or + systemId and systemId.lower() == "http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd"): + self.parser.compatMode = "quirks" + elif (publicId.startswith( + ("-//w3c//dtd xhtml 1.0 frameset//", + "-//w3c//dtd xhtml 1.0 transitional//")) or + publicId.startswith( + ("-//w3c//dtd html 4.01 frameset//", + "-//w3c//dtd html 4.01 transitional//")) and + systemId is not None): + self.parser.compatMode = "limited quirks" + + self.parser.phase = self.parser.phases["beforeHtml"] + + def anythingElse(self): + self.parser.compatMode = "quirks" + self.parser.phase = self.parser.phases["beforeHtml"] + + def processCharacters(self, token): + self.parser.parseError("expected-doctype-but-got-chars") + self.anythingElse() + return token + + def processStartTag(self, token): + self.parser.parseError("expected-doctype-but-got-start-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEndTag(self, token): + self.parser.parseError("expected-doctype-but-got-end-tag", + {"name": token["name"]}) + self.anythingElse() + return token + + def processEOF(self): + self.parser.parseError("expected-doctype-but-got-eof") + self.anythingElse() + return True + + class BeforeHtmlPhase(Phase): + # helper methods + def insertHtmlElement(self): + self.tree.insertRoot(impliedTagToken("html", "StartTag")) + self.parser.phase = self.parser.phases["beforeHead"] + + # other + def processEOF(self): + self.insertHtmlElement() + return True + + def processComment(self, token): + self.tree.insertComment(token, self.tree.document) + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.insertHtmlElement() + return token + + def processStartTag(self, token): + if token["name"] == "html": + self.parser.firstStartTag = True + self.insertHtmlElement() + return token + + def processEndTag(self, token): + if token["name"] not in ("head", "body", "html", "br"): + self.parser.parseError("unexpected-end-tag-before-html", + {"name": token["name"]}) + else: + self.insertHtmlElement() + return token + + class BeforeHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + (("head", "body", "html", "br"), self.endTagImplyHead) + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.startTagHead(impliedTagToken("head", "StartTag")) + return True + + def processSpaceCharacters(self, token): + pass + + def processCharacters(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.tree.insertElement(token) + self.tree.headPointer = self.tree.openElements[-1] + self.parser.phase = self.parser.phases["inHead"] + + def startTagOther(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagImplyHead(self, token): + self.startTagHead(impliedTagToken("head", "StartTag")) + return token + + def endTagOther(self, token): + self.parser.parseError("end-tag-after-implied-root", + {"name": token["name"]}) + + class InHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("title", self.startTagTitle), + (("noframes", "style"), self.startTagNoFramesStyle), + ("noscript", self.startTagNoscript), + ("script", self.startTagScript), + (("base", "basefont", "bgsound", "command", "link"), + self.startTagBaseLinkCommand), + ("meta", self.startTagMeta), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("head", self.endTagHead), + (("br", "html", "body"), self.endTagHtmlBodyBr) + ]) + self.endTagHandler.default = self.endTagOther + + # the real thing + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagHead(self, token): + self.parser.parseError("two-heads-are-not-better-than-one") + + def startTagBaseLinkCommand(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + def startTagMeta(self, token): + self.tree.insertElement(token) + self.tree.openElements.pop() + token["selfClosingAcknowledged"] = True + + attributes = token["data"] + if self.parser.tokenizer.stream.charEncoding[1] == "tentative": + if "charset" in attributes: + self.parser.tokenizer.stream.changeEncoding(attributes["charset"]) + elif ("content" in attributes and + "http-equiv" in attributes and + attributes["http-equiv"].lower() == "content-type"): + # Encoding it as UTF-8 here is a hack, as really we should pass + # the abstract Unicode string, and just use the + # ContentAttrParser on that, but using UTF-8 allows all chars + # to be encoded and as a ASCII-superset works. + data = _inputstream.EncodingBytes(attributes["content"].encode("utf-8")) + parser = _inputstream.ContentAttrParser(data) + codec = parser.parse() + self.parser.tokenizer.stream.changeEncoding(codec) + + def startTagTitle(self, token): + self.parser.parseRCDataRawtext(token, "RCDATA") + + def startTagNoFramesStyle(self, token): + # Need to decide whether to implement the scripting-disabled case + self.parser.parseRCDataRawtext(token, "RAWTEXT") + + def startTagNoscript(self, token): + if self.parser.scripting: + self.parser.parseRCDataRawtext(token, "RAWTEXT") + else: + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inHeadNoscript"] + + def startTagScript(self, token): + self.tree.insertElement(token) + self.parser.tokenizer.state = self.parser.tokenizer.scriptDataState + self.parser.originalPhase = self.parser.phase + self.parser.phase = self.parser.phases["text"] + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHead(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "head", "Expected head got %s" % node.name + self.parser.phase = self.parser.phases["afterHead"] + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.endTagHead(impliedTagToken("head")) + + class InHeadNoscriptPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("basefont", "bgsound", "link", "meta", "noframes", "style"), self.startTagBaseLinkCommand), + (("head", "noscript"), self.startTagHeadNoscript), + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("noscript", self.endTagNoscript), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.parser.parseError("eof-in-head-noscript") + self.anythingElse() + return True + + def processComment(self, token): + return self.parser.phases["inHead"].processComment(token) + + def processCharacters(self, token): + self.parser.parseError("char-in-head-noscript") + self.anythingElse() + return token + + def processSpaceCharacters(self, token): + return self.parser.phases["inHead"].processSpaceCharacters(token) + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBaseLinkCommand(self, token): + return self.parser.phases["inHead"].processStartTag(token) + + def startTagHeadNoscript(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagNoscript(self, token): + node = self.parser.tree.openElements.pop() + assert node.name == "noscript", "Expected noscript got %s" % node.name + self.parser.phase = self.parser.phases["inHead"] + + def endTagBr(self, token): + self.parser.parseError("unexpected-inhead-noscript-tag", {"name": token["name"]}) + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + # Caller must raise parse error first! + self.endTagNoscript(impliedTagToken("noscript")) + + class AfterHeadPhase(Phase): + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("base", "basefont", "bgsound", "link", "meta", "noframes", "script", + "style", "title"), + self.startTagFromHead), + ("head", self.startTagHead) + ]) + self.startTagHandler.default = self.startTagOther + self.endTagHandler = _utils.MethodDispatcher([(("body", "html", "br"), + self.endTagHtmlBodyBr)]) + self.endTagHandler.default = self.endTagOther + + def processEOF(self): + self.anythingElse() + return True + + def processCharacters(self, token): + self.anythingElse() + return token + + def startTagHtml(self, token): + return self.parser.phases["inBody"].processStartTag(token) + + def startTagBody(self, token): + self.parser.framesetOK = False + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inBody"] + + def startTagFrameset(self, token): + self.tree.insertElement(token) + self.parser.phase = self.parser.phases["inFrameset"] + + def startTagFromHead(self, token): + self.parser.parseError("unexpected-start-tag-out-of-my-head", + {"name": token["name"]}) + self.tree.openElements.append(self.tree.headPointer) + self.parser.phases["inHead"].processStartTag(token) + for node in self.tree.openElements[::-1]: + if node.name == "head": + self.tree.openElements.remove(node) + break + + def startTagHead(self, token): + self.parser.parseError("unexpected-start-tag", {"name": token["name"]}) + + def startTagOther(self, token): + self.anythingElse() + return token + + def endTagHtmlBodyBr(self, token): + self.anythingElse() + return token + + def endTagOther(self, token): + self.parser.parseError("unexpected-end-tag", {"name": token["name"]}) + + def anythingElse(self): + self.tree.insertElement(impliedTagToken("body", "StartTag")) + self.parser.phase = self.parser.phases["inBody"] + self.parser.framesetOK = True + + class InBodyPhase(Phase): + # http://www.whatwg.org/specs/web-apps/current-work/#parsing-main-inbody + # the really-really-really-very crazy mode + def __init__(self, parser, tree): + Phase.__init__(self, parser, tree) + + # Set this to the default handler + self.processSpaceCharacters = self.processSpaceCharactersNonPre + + self.startTagHandler = _utils.MethodDispatcher([ + ("html", self.startTagHtml), + (("base", "basefont", "bgsound", "command", "link", "meta", + "script", "style", "title"), + self.startTagProcessInHead), + ("body", self.startTagBody), + ("frameset", self.startTagFrameset), + (("address", "article", "aside", "blockquote", "center", "details", + "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "main", "menu", "nav", "ol", "p", + "section", "summary", "ul"), + self.startTagCloseP), + (headingElements, self.startTagHeading), + (("pre", "listing"), self.startTagPreListing), + ("form", self.startTagForm), + (("li", "dd", "dt"), self.startTagListItem), + ("plaintext", self.startTagPlaintext), + ("a", self.startTagA), + (("b", "big", "code", "em", "font", "i", "s", "small", "strike", + "strong", "tt", "u"), self.startTagFormatting), + ("nobr", self.startTagNobr), + ("button", self.startTagButton), + (("applet", "marquee", "object"), self.startTagAppletMarqueeObject), + ("xmp", self.startTagXmp), + ("table", self.startTagTable), + (("area", "br", "embed", "img", "keygen", "wbr"), + self.startTagVoidFormatting), + (("param", "source", "track"), self.startTagParamSource), + ("input", self.startTagInput), + ("hr", self.startTagHr), + ("image", self.startTagImage), + ("isindex", self.startTagIsIndex), + ("textarea", self.startTagTextarea), + ("iframe", self.startTagIFrame), + ("noscript", self.startTagNoscript), + (("noembed", "noframes"), self.startTagRawtext), + ("select", self.startTagSelect), + (("rp", "rt"), self.startTagRpRt), + (("option", "optgroup"), self.startTagOpt), + (("math"), self.startTagMath), + (("svg"), self.startTagSvg), + (("caption", "col", "colgroup", "frame", "head", + "tbody", "td", "tfoot", "th", "thead", + "tr"), self.startTagMisplaced) + ]) + self.startTagHandler.default = self.startTagOther + + self.endTagHandler = _utils.MethodDispatcher([ + ("body", self.endTagBody), + ("html", self.endTagHtml), + (("address", "article", "aside", "blockquote", "button", "center", + "details", "dialog", "dir", "div", "dl", "fieldset", "figcaption", "figure", + "footer", "header", "hgroup", "listing", "main", "menu", "nav", "ol", "pre", + "section", "summary", "ul"), self.endTagBlock), + ("form", self.endTagForm), + ("p", self.endTagP), + (("dd", "dt", "li"), self.endTagListItem), + (headingElements, self.endTagHeading), + (("a", "b", "big", "code", "em", "font", "i", "nobr", "s", "small", + "strike", "strong", "tt", "u"), self.endTagFormatting), + (("applet", "marquee", "object"), self.endTagAppletMarqueeObject), + ("br", self.endTagBr), + ]) + self.endTagHandler.default = self.endTagOther + + def isMatchingFormattingElement(self, node1, node2): + return (node1.name == node2.name and + node1.namespace == node2.namespace and + node1.attributes == node2.attributes) + + # helper + def addFormattingElement(self, token): + self.tree.insertElement(token) + element = self.tree.openElements[-1] + + matchingElements = [] + for node in self.tree.activeFormattingElements[::-1]: + if node is Marker: + break + elif self.isMatchingFormattingElement(node, element): + matchingElements.append(node) + + assert len(matchingElements) <= 3 + if len(matchingElements) == 3: + self.tree.activeFormattingElements.remove(matchingElements[-1]) + self.tree.activeFormattingElements.append(element) + + # the real deal + def processEOF(self): + allowed_elements = frozenset(("dd", "dt", "li", "p", "tbody", "td", + "tfoot", "th", "thead", "tr", "body", + "html")) + for node in self.tree.openElements[::-1]: + if node.name not in allowed_elements: + self.parser.parseError("expected-closing-tag-but-got-eof") + break + # Stop parsing + + def processSpaceCharactersDropNewline(self, token): + # Sometimes (start of
, , and "]
+},
+
+{"description": "text within "]
+},
+
+{"description": "text within "]
+}
+
+]}
\ No newline at end of file
diff --git a/libs/html5lib/tests/testdata/tokenizer/README.md b/libs/html5lib/tests/testdata/tokenizer/README.md
new file mode 100644
index 000000000..4218c26bb
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/README.md
@@ -0,0 +1,104 @@
+Tokenizer tests
+===============
+
+The test format is [JSON](http://www.json.org/). This has the advantage
+that the syntax allows backward-compatible extensions to the tests and
+the disadvantage that it is relatively verbose.
+
+Basic Structure
+---------------
+
+    {"tests": [
+        {"description": "Test description",
+        "input": "input_string",
+        "output": [expected_output_tokens],
+        "initialStates": [initial_states],
+        "lastStartTag": last_start_tag,
+        "ignoreErrorOrder": ignore_error_order
+        }
+    ]}
+
+Multiple tests per file are allowed simply by adding more objects to the
+"tests" list.
+
+`description`, `input` and `output` are always present. The other values
+are optional.
+
+### Test set-up
+
+`test.input` is a string containing the characters to pass to the
+tokenizer. Specifically, it represents the characters of the **input
+stream**, and so implementations are expected to perform the processing
+described in the spec's **Preprocessing the input stream** section
+before feeding the result to the tokenizer.
+
+If `test.doubleEscaped` is present and `true`, then `test.input` is not
+quite as described above. Instead, it must first be subjected to another
+round of unescaping (i.e., in addition to any unescaping involved in the
+JSON import), and the result of *that* represents the characters of the
+input stream. Currently, the only unescaping required by this option is
+to convert each sequence of the form \\uHHHH (where H is a hex digit)
+into the corresponding Unicode code point. (Note that this option also
+affects the interpretation of `test.output`.)
+
+`test.initialStates` is a list of strings, each being the name of a
+tokenizer state. The test should be run once for each string, using it
+to set the tokenizer's initial state for that run. If
+`test.initialStates` is omitted, it defaults to `["data state"]`.
+
+`test.lastStartTag` is a lowercase string that should be used as "the
+tag name of the last start tag to have been emitted from this
+tokenizer", referenced in the spec's definition of **appropriate end tag
+token**. If it is omitted, it is treated as if "no start tag has been
+emitted from this tokenizer".
+
+### Test results
+
+`test.output` is a list of tokens, ordered with the first produced by
+the tokenizer the first (leftmost) in the list. The list must mach the
+**complete** list of tokens that the tokenizer should produce. Valid
+tokens are:
+
+    ["DOCTYPE", name, public_id, system_id, correctness]
+    ["StartTag", name, {attributes}*, true*]
+    ["StartTag", name, {attributes}]
+    ["EndTag", name]
+    ["Comment", data]
+    ["Character", data]
+    "ParseError"
+
+`public_id` and `system_id` are either strings or `null`. `correctness`
+is either `true` or `false`; `true` corresponds to the force-quirks flag
+being false, and vice-versa.
+
+When the self-closing flag is set, the `StartTag` array has `true` as
+its fourth entry. When the flag is not set, the array has only three
+entries for backwards compatibility.
+
+All adjacent character tokens are coalesced into a single
+`["Character", data]` token.
+
+If `test.doubleEscaped` is present and `true`, then every string within
+`test.output` must be further unescaped (as described above) before
+comparing with the tokenizer's output.
+
+`test.ignoreErrorOrder` is a boolean value indicating that the order of
+`ParseError` tokens relative to other tokens in the output stream is
+unimportant, and implementations should ignore such differences between
+their output and `expected_output_tokens`. (This is used for errors
+emitted by the input stream preprocessing stage, since it is useful to
+test that code but it is undefined when the errors occur). If it is
+omitted, it defaults to `false`.
+
+xmlViolation tests
+------------------
+
+`tokenizer/xmlViolation.test` differs from the above in a couple of
+ways:
+
+-   The name of the single member of the top-level JSON object is
+    "xmlViolationTests" instead of "tests".
+-   Each test's expected output assumes that implementation is applying
+    the tweaks given in the spec's "Coercing an HTML DOM into an
+    infoset" section.
+
diff --git a/libs/html5lib/tests/testdata/tokenizer/contentModelFlags.test b/libs/html5lib/tests/testdata/tokenizer/contentModelFlags.test
new file mode 100644
index 000000000..89b8170c6
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/contentModelFlags.test
@@ -0,0 +1,81 @@
+{"tests": [
+
+{"description":"PLAINTEXT content model flag",
+"initialStates":["PLAINTEXT state"],
+"lastStartTag":"plaintext",
+"input":"&body;",
+"output":[["Character", "&body;"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo",
+"output":[["Character", "foo"], ["EndTag", "xmp"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (case-insensitivity)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo",
+"output":[["Character", "foo"], ["EndTag", "xmp"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT (ending with space)",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foobar",
+"output":[["Character", "bar"], ["EndTag", "xmp"]]},
+
+{"description":"Partial end tags leading straight into partial end tags",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"",
+"output":[["Character", "bar",
+"output":[["Character", "bar"]]},
+
+{"description":"End tag closing RCDATA or RAWTEXT, switching back to PCDATA",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo",
+"output":[["Character", "foo"], ["EndTag", "xmp"], ["EndTag", "baz"]]},
+
+{"description":"RAWTEXT w/ something looking like an entity",
+"initialStates":["RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"&foo;",
+"output":[["Character", "&foo;"]]},
+
+{"description":"RCDATA w/ an entity",
+"initialStates":["RCDATA state"],
+"lastStartTag":"textarea",
+"input":"<",
+"output":[["Character", "<"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/domjs.test b/libs/html5lib/tests/testdata/tokenizer/domjs.test
new file mode 100644
index 000000000..8f1e42f35
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/domjs.test
@@ -0,0 +1,96 @@
+{
+    "tests": [
+        {
+            "description":"CR in bogus comment state",
+            "input":"",
+            "output":[["EndTag","xmp"]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"",
+            "output":[["Character",""]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"",
+            "output":[["Character",""]]
+        },
+        {
+            "description":"bad endtag in RCDATA and RAWTEXT",
+            "initialStates":["RCDATA state", "RAWTEXT state"],
+            "lastStartTag":"xmp",
+            "input":"",
+            "output":[["StartTag", "p", {"id":"\u2242\u0338"}]]
+        },
+        {
+            "description":"--!NUL in comment ",
+            "doubleEscaped":true,
+            "input":"",
+            "output":["ParseError", "ParseError", ["Comment", "--!\\uFFFD"]]
+        },
+        {
+            "description":"space EOF after doctype ",
+            "input":"",
+"output": [["StartTag", "h", {"a": "¬i;"}]]},
+
+{"description": "Entity name followed by the equals sign in an attribute value.",
+"input":"",
+"output": [["StartTag", "h", {"a": "&lang="}]]},
+
+{"description": "CR as numeric entity",
+"input":"
",
+"output": ["ParseError", ["Character", "\r"]]},
+
+{"description": "CR as hexadecimal numeric entity",
+"input":"
",
+"output": ["ParseError", ["Character", "\r"]]},
+
+{"description": "Windows-1252 EURO SIGN numeric entity.",
+"input":"€",
+"output": ["ParseError", ["Character", "\u20AC"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u0081"]]},
+
+{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK numeric entity.",
+"input":"‚",
+"output": ["ParseError", ["Character", "\u201A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK numeric entity.",
+"input":"ƒ",
+"output": ["ParseError", ["Character", "\u0192"]]},
+
+{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK numeric entity.",
+"input":"„",
+"output": ["ParseError", ["Character", "\u201E"]]},
+
+{"description": "Windows-1252 HORIZONTAL ELLIPSIS numeric entity.",
+"input":"…",
+"output": ["ParseError", ["Character", "\u2026"]]},
+
+{"description": "Windows-1252 DAGGER numeric entity.",
+"input":"†",
+"output": ["ParseError", ["Character", "\u2020"]]},
+
+{"description": "Windows-1252 DOUBLE DAGGER numeric entity.",
+"input":"‡",
+"output": ["ParseError", ["Character", "\u2021"]]},
+
+{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT numeric entity.",
+"input":"ˆ",
+"output": ["ParseError", ["Character", "\u02C6"]]},
+
+{"description": "Windows-1252 PER MILLE SIGN numeric entity.",
+"input":"‰",
+"output": ["ParseError", ["Character", "\u2030"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON numeric entity.",
+"input":"Š",
+"output": ["ParseError", ["Character", "\u0160"]]},
+
+{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK numeric entity.",
+"input":"‹",
+"output": ["ParseError", ["Character", "\u2039"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE numeric entity.",
+"input":"Œ",
+"output": ["ParseError", ["Character", "\u0152"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u008D"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON numeric entity.",
+"input":"Ž",
+"output": ["ParseError", ["Character", "\u017D"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u008F"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u0090"]]},
+
+{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK numeric entity.",
+"input":"‘",
+"output": ["ParseError", ["Character", "\u2018"]]},
+
+{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK numeric entity.",
+"input":"’",
+"output": ["ParseError", ["Character", "\u2019"]]},
+
+{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK numeric entity.",
+"input":"“",
+"output": ["ParseError", ["Character", "\u201C"]]},
+
+{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK numeric entity.",
+"input":"”",
+"output": ["ParseError", ["Character", "\u201D"]]},
+
+{"description": "Windows-1252 BULLET numeric entity.",
+"input":"•",
+"output": ["ParseError", ["Character", "\u2022"]]},
+
+{"description": "Windows-1252 EN DASH numeric entity.",
+"input":"–",
+"output": ["ParseError", ["Character", "\u2013"]]},
+
+{"description": "Windows-1252 EM DASH numeric entity.",
+"input":"—",
+"output": ["ParseError", ["Character", "\u2014"]]},
+
+{"description": "Windows-1252 SMALL TILDE numeric entity.",
+"input":"˜",
+"output": ["ParseError", ["Character", "\u02DC"]]},
+
+{"description": "Windows-1252 TRADE MARK SIGN numeric entity.",
+"input":"™",
+"output": ["ParseError", ["Character", "\u2122"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON numeric entity.",
+"input":"š",
+"output": ["ParseError", ["Character", "\u0161"]]},
+
+{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK numeric entity.",
+"input":"›",
+"output": ["ParseError", ["Character", "\u203A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LIGATURE OE numeric entity.",
+"input":"œ",
+"output": ["ParseError", ["Character", "\u0153"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u009D"]]},
+
+{"description": "Windows-1252 EURO SIGN hexadecimal numeric entity.",
+"input":"€",
+"output": ["ParseError", ["Character", "\u20AC"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u0081"]]},
+
+{"description": "Windows-1252 SINGLE LOW-9 QUOTATION MARK hexadecimal numeric entity.",
+"input":"‚",
+"output": ["ParseError", ["Character", "\u201A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER F WITH HOOK hexadecimal numeric entity.",
+"input":"ƒ",
+"output": ["ParseError", ["Character", "\u0192"]]},
+
+{"description": "Windows-1252 DOUBLE LOW-9 QUOTATION MARK hexadecimal numeric entity.",
+"input":"„",
+"output": ["ParseError", ["Character", "\u201E"]]},
+
+{"description": "Windows-1252 HORIZONTAL ELLIPSIS hexadecimal numeric entity.",
+"input":"…",
+"output": ["ParseError", ["Character", "\u2026"]]},
+
+{"description": "Windows-1252 DAGGER hexadecimal numeric entity.",
+"input":"†",
+"output": ["ParseError", ["Character", "\u2020"]]},
+
+{"description": "Windows-1252 DOUBLE DAGGER hexadecimal numeric entity.",
+"input":"‡",
+"output": ["ParseError", ["Character", "\u2021"]]},
+
+{"description": "Windows-1252 MODIFIER LETTER CIRCUMFLEX ACCENT hexadecimal numeric entity.",
+"input":"ˆ",
+"output": ["ParseError", ["Character", "\u02C6"]]},
+
+{"description": "Windows-1252 PER MILLE SIGN hexadecimal numeric entity.",
+"input":"‰",
+"output": ["ParseError", ["Character", "\u2030"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER S WITH CARON hexadecimal numeric entity.",
+"input":"Š",
+"output": ["ParseError", ["Character", "\u0160"]]},
+
+{"description": "Windows-1252 SINGLE LEFT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"‹",
+"output": ["ParseError", ["Character", "\u2039"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LIGATURE OE hexadecimal numeric entity.",
+"input":"Œ",
+"output": ["ParseError", ["Character", "\u0152"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u008D"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Z WITH CARON hexadecimal numeric entity.",
+"input":"Ž",
+"output": ["ParseError", ["Character", "\u017D"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u008F"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u0090"]]},
+
+{"description": "Windows-1252 LEFT SINGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"‘",
+"output": ["ParseError", ["Character", "\u2018"]]},
+
+{"description": "Windows-1252 RIGHT SINGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"’",
+"output": ["ParseError", ["Character", "\u2019"]]},
+
+{"description": "Windows-1252 LEFT DOUBLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"“",
+"output": ["ParseError", ["Character", "\u201C"]]},
+
+{"description": "Windows-1252 RIGHT DOUBLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"”",
+"output": ["ParseError", ["Character", "\u201D"]]},
+
+{"description": "Windows-1252 BULLET hexadecimal numeric entity.",
+"input":"•",
+"output": ["ParseError", ["Character", "\u2022"]]},
+
+{"description": "Windows-1252 EN DASH hexadecimal numeric entity.",
+"input":"–",
+"output": ["ParseError", ["Character", "\u2013"]]},
+
+{"description": "Windows-1252 EM DASH hexadecimal numeric entity.",
+"input":"—",
+"output": ["ParseError", ["Character", "\u2014"]]},
+
+{"description": "Windows-1252 SMALL TILDE hexadecimal numeric entity.",
+"input":"˜",
+"output": ["ParseError", ["Character", "\u02DC"]]},
+
+{"description": "Windows-1252 TRADE MARK SIGN hexadecimal numeric entity.",
+"input":"™",
+"output": ["ParseError", ["Character", "\u2122"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER S WITH CARON hexadecimal numeric entity.",
+"input":"š",
+"output": ["ParseError", ["Character", "\u0161"]]},
+
+{"description": "Windows-1252 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK hexadecimal numeric entity.",
+"input":"›",
+"output": ["ParseError", ["Character", "\u203A"]]},
+
+{"description": "Windows-1252 LATIN SMALL LIGATURE OE hexadecimal numeric entity.",
+"input":"œ",
+"output": ["ParseError", ["Character", "\u0153"]]},
+
+{"description": "Windows-1252 REPLACEMENT CHAR hexadecimal numeric entity.",
+"input":"",
+"output": ["ParseError", ["Character", "\u009D"]]},
+
+{"description": "Windows-1252 LATIN SMALL LETTER Z WITH CARON hexadecimal numeric entity.",
+"input":"ž",
+"output": ["ParseError", ["Character", "\u017E"]]},
+
+{"description": "Windows-1252 LATIN CAPITAL LETTER Y WITH DIAERESIS hexadecimal numeric entity.",
+"input":"Ÿ",
+"output": ["ParseError", ["Character", "\u0178"]]},
+
+{"description": "Decimal numeric entity followed by hex character a.",
+"input":"aa",
+"output": ["ParseError", ["Character", "aa"]]},
+
+{"description": "Decimal numeric entity followed by hex character A.",
+"input":"aA",
+"output": ["ParseError", ["Character", "aA"]]},
+
+{"description": "Decimal numeric entity followed by hex character f.",
+"input":"af",
+"output": ["ParseError", ["Character", "af"]]},
+
+{"description": "Decimal numeric entity followed by hex character A.",
+"input":"aF",
+"output": ["ParseError", ["Character", "aF"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/escapeFlag.test b/libs/html5lib/tests/testdata/tokenizer/escapeFlag.test
new file mode 100644
index 000000000..18cb4309e
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/escapeFlag.test
@@ -0,0 +1,33 @@
+{"tests": [
+
+{"description":"Commented close tag in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foo",
+"output":[["Character", "foo"], ["EndTag", "xmp"]]},
+
+{"description":"Bogus comment in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foobaz",
+"output":[["Character", "foobaz"], ["EndTag", "xmp"]]},
+
+{"description":"End tag surrounded by bogus comment in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foobaz",
+"output":[["Character", "foo"], ["EndTag", "xmp"], "ParseError", ["Comment", ""], ["Character", "baz"], ["EndTag", "xmp"]]},
+
+{"description":"Commented entities in RCDATA",
+"initialStates":["RCDATA state"],
+"lastStartTag":"xmp",
+"input":" &  & ",
+"output":[["Character", " &  & "], ["EndTag", "xmp"]]},
+
+{"description":"Incorrect comment ending sequences in RCDATA or RAWTEXT",
+"initialStates":["RCDATA state", "RAWTEXT state"],
+"lastStartTag":"xmp",
+"input":"foox--<>",
+"output":[["Character", "foox--<>"], ["EndTag", "xmp"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/namedEntities.test b/libs/html5lib/tests/testdata/tokenizer/namedEntities.test
new file mode 100644
index 000000000..14db2ede0
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/namedEntities.test
@@ -0,0 +1,42210 @@
+{
+    "tests": [
+        {
+            "input": "Æ", 
+            "description": "Named entity: AElig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "Æ", 
+            "description": "Named entity: AElig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&", 
+            "description": "Named entity: AMP without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&", 
+            "description": "Named entity: AMP; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "Á", 
+            "description": "Named entity: Aacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "Á", 
+            "description": "Named entity: Aacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Abreve", 
+            "description": "Bad named entity: Abreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Abreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ă", 
+            "description": "Named entity: Abreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0102"
+                ]
+            ]
+        }, 
+        {
+            "input": "Â", 
+            "description": "Named entity: Acirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "Â", 
+            "description": "Named entity: Acirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Acy", 
+            "description": "Bad named entity: Acy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Acy"
+                ]
+            ]
+        }, 
+        {
+            "input": "А", 
+            "description": "Named entity: Acy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0410"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Afr", 
+            "description": "Bad named entity: Afr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Afr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔄", 
+            "description": "Named entity: Afr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd04"
+                ]
+            ]
+        }, 
+        {
+            "input": "À", 
+            "description": "Named entity: Agrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "À", 
+            "description": "Named entity: Agrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Alpha", 
+            "description": "Bad named entity: Alpha without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Alpha"
+                ]
+            ]
+        }, 
+        {
+            "input": "Α", 
+            "description": "Named entity: Alpha; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0391"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Amacr", 
+            "description": "Bad named entity: Amacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Amacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ā", 
+            "description": "Named entity: Amacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0100"
+                ]
+            ]
+        }, 
+        {
+            "input": "&And", 
+            "description": "Bad named entity: And without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&And"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩓", 
+            "description": "Named entity: And; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a53"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aogon", 
+            "description": "Bad named entity: Aogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Aogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ą", 
+            "description": "Named entity: Aogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0104"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Aopf", 
+            "description": "Bad named entity: Aopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Aopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔸", 
+            "description": "Named entity: Aopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd38"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ApplyFunction", 
+            "description": "Bad named entity: ApplyFunction without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ApplyFunction"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁡", 
+            "description": "Named entity: ApplyFunction; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2061"
+                ]
+            ]
+        }, 
+        {
+            "input": "Å", 
+            "description": "Named entity: Aring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "Å", 
+            "description": "Named entity: Aring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ascr", 
+            "description": "Bad named entity: Ascr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ascr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒜", 
+            "description": "Named entity: Ascr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Assign", 
+            "description": "Bad named entity: Assign without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Assign"
+                ]
+            ]
+        }, 
+        {
+            "input": "≔", 
+            "description": "Named entity: Assign; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ã", 
+            "description": "Named entity: Atilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ã", 
+            "description": "Named entity: Atilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ä", 
+            "description": "Named entity: Auml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ä", 
+            "description": "Named entity: Auml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Backslash", 
+            "description": "Bad named entity: Backslash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Backslash"
+                ]
+            ]
+        }, 
+        {
+            "input": "∖", 
+            "description": "Named entity: Backslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barv", 
+            "description": "Bad named entity: Barv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Barv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫧", 
+            "description": "Named entity: Barv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Barwed", 
+            "description": "Bad named entity: Barwed without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Barwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌆", 
+            "description": "Named entity: Barwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2306"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bcy", 
+            "description": "Bad named entity: Bcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Б", 
+            "description": "Named entity: Bcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0411"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Because", 
+            "description": "Bad named entity: Because without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Because"
+                ]
+            ]
+        }, 
+        {
+            "input": "∵", 
+            "description": "Named entity: Because; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bernoullis", 
+            "description": "Bad named entity: Bernoullis without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bernoullis"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℬ", 
+            "description": "Named entity: Bernoullis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Beta", 
+            "description": "Bad named entity: Beta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Beta"
+                ]
+            ]
+        }, 
+        {
+            "input": "Β", 
+            "description": "Named entity: Beta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0392"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bfr", 
+            "description": "Bad named entity: Bfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔅", 
+            "description": "Named entity: Bfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd05"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bopf", 
+            "description": "Bad named entity: Bopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔹", 
+            "description": "Named entity: Bopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd39"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Breve", 
+            "description": "Bad named entity: Breve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Breve"
+                ]
+            ]
+        }, 
+        {
+            "input": "˘", 
+            "description": "Named entity: Breve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bscr", 
+            "description": "Bad named entity: Bscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℬ", 
+            "description": "Named entity: Bscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Bumpeq", 
+            "description": "Bad named entity: Bumpeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Bumpeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≎", 
+            "description": "Named entity: Bumpeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CHcy", 
+            "description": "Bad named entity: CHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ч", 
+            "description": "Named entity: CHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0427"
+                ]
+            ]
+        }, 
+        {
+            "input": "©", 
+            "description": "Named entity: COPY without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "©", 
+            "description": "Named entity: COPY; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cacute", 
+            "description": "Bad named entity: Cacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ć", 
+            "description": "Named entity: Cacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0106"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cap", 
+            "description": "Bad named entity: Cap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋒", 
+            "description": "Named entity: Cap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CapitalDifferentialD", 
+            "description": "Bad named entity: CapitalDifferentialD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CapitalDifferentialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅅ", 
+            "description": "Named entity: CapitalDifferentialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cayleys", 
+            "description": "Bad named entity: Cayleys without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cayleys"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℭ", 
+            "description": "Named entity: Cayleys; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccaron", 
+            "description": "Bad named entity: Ccaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ccaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Č", 
+            "description": "Named entity: Ccaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010c"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ç", 
+            "description": "Named entity: Ccedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ç", 
+            "description": "Named entity: Ccedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ccirc", 
+            "description": "Bad named entity: Ccirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ccirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĉ", 
+            "description": "Named entity: Ccirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0108"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cconint", 
+            "description": "Bad named entity: Cconint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∰", 
+            "description": "Named entity: Cconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2230"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cdot", 
+            "description": "Bad named entity: Cdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ċ", 
+            "description": "Named entity: Cdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cedilla", 
+            "description": "Bad named entity: Cedilla without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cedilla"
+                ]
+            ]
+        }, 
+        {
+            "input": "¸", 
+            "description": "Named entity: Cedilla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CenterDot", 
+            "description": "Bad named entity: CenterDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CenterDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "·", 
+            "description": "Named entity: CenterDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cfr", 
+            "description": "Bad named entity: Cfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℭ", 
+            "description": "Named entity: Cfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Chi", 
+            "description": "Bad named entity: Chi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Chi"
+                ]
+            ]
+        }, 
+        {
+            "input": "Χ", 
+            "description": "Named entity: Chi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleDot", 
+            "description": "Bad named entity: CircleDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CircleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊙", 
+            "description": "Named entity: CircleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2299"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleMinus", 
+            "description": "Bad named entity: CircleMinus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CircleMinus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊖", 
+            "description": "Named entity: CircleMinus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2296"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CirclePlus", 
+            "description": "Bad named entity: CirclePlus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CirclePlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊕", 
+            "description": "Named entity: CirclePlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2295"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CircleTimes", 
+            "description": "Bad named entity: CircleTimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CircleTimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊗", 
+            "description": "Named entity: CircleTimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2297"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ClockwiseContourIntegral", 
+            "description": "Bad named entity: ClockwiseContourIntegral without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ClockwiseContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "∲", 
+            "description": "Named entity: ClockwiseContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2232"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyDoubleQuote", 
+            "description": "Bad named entity: CloseCurlyDoubleQuote without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CloseCurlyDoubleQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "”", 
+            "description": "Named entity: CloseCurlyDoubleQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CloseCurlyQuote", 
+            "description": "Bad named entity: CloseCurlyQuote without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CloseCurlyQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "’", 
+            "description": "Named entity: CloseCurlyQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colon", 
+            "description": "Bad named entity: Colon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Colon"
+                ]
+            ]
+        }, 
+        {
+            "input": "∷", 
+            "description": "Named entity: Colon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Colone", 
+            "description": "Bad named entity: Colone without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Colone"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩴", 
+            "description": "Named entity: Colone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a74"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Congruent", 
+            "description": "Bad named entity: Congruent without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Congruent"
+                ]
+            ]
+        }, 
+        {
+            "input": "≡", 
+            "description": "Named entity: Congruent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Conint", 
+            "description": "Bad named entity: Conint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Conint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∯", 
+            "description": "Named entity: Conint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ContourIntegral", 
+            "description": "Bad named entity: ContourIntegral without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "∮", 
+            "description": "Named entity: ContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Copf", 
+            "description": "Bad named entity: Copf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Copf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℂ", 
+            "description": "Named entity: Copf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2102"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Coproduct", 
+            "description": "Bad named entity: Coproduct without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Coproduct"
+                ]
+            ]
+        }, 
+        {
+            "input": "∐", 
+            "description": "Named entity: Coproduct; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2210"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CounterClockwiseContourIntegral", 
+            "description": "Bad named entity: CounterClockwiseContourIntegral without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CounterClockwiseContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "∳", 
+            "description": "Named entity: CounterClockwiseContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2233"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cross", 
+            "description": "Bad named entity: Cross without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cross"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨯", 
+            "description": "Named entity: Cross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cscr", 
+            "description": "Bad named entity: Cscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒞", 
+            "description": "Named entity: Cscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Cup", 
+            "description": "Bad named entity: Cup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Cup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋓", 
+            "description": "Named entity: Cup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&CupCap", 
+            "description": "Bad named entity: CupCap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&CupCap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≍", 
+            "description": "Named entity: CupCap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DD", 
+            "description": "Bad named entity: DD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DD"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅅ", 
+            "description": "Named entity: DD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DDotrahd", 
+            "description": "Bad named entity: DDotrahd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DDotrahd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤑", 
+            "description": "Named entity: DDotrahd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2911"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DJcy", 
+            "description": "Bad named entity: DJcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ђ", 
+            "description": "Named entity: DJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0402"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DScy", 
+            "description": "Bad named entity: DScy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DScy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ѕ", 
+            "description": "Named entity: DScy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0405"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DZcy", 
+            "description": "Bad named entity: DZcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DZcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Џ", 
+            "description": "Named entity: DZcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dagger", 
+            "description": "Bad named entity: Dagger without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "‡", 
+            "description": "Named entity: Dagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2021"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Darr", 
+            "description": "Bad named entity: Darr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Darr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↡", 
+            "description": "Named entity: Darr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dashv", 
+            "description": "Bad named entity: Dashv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dashv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫤", 
+            "description": "Named entity: Dashv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcaron", 
+            "description": "Bad named entity: Dcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ď", 
+            "description": "Named entity: Dcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dcy", 
+            "description": "Bad named entity: Dcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Д", 
+            "description": "Named entity: Dcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0414"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Del", 
+            "description": "Bad named entity: Del without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Del"
+                ]
+            ]
+        }, 
+        {
+            "input": "∇", 
+            "description": "Named entity: Del; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2207"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Delta", 
+            "description": "Bad named entity: Delta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Delta"
+                ]
+            ]
+        }, 
+        {
+            "input": "Δ", 
+            "description": "Named entity: Delta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0394"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dfr", 
+            "description": "Bad named entity: Dfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔇", 
+            "description": "Named entity: Dfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd07"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalAcute", 
+            "description": "Bad named entity: DiacriticalAcute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DiacriticalAcute"
+                ]
+            ]
+        }, 
+        {
+            "input": "´", 
+            "description": "Named entity: DiacriticalAcute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDot", 
+            "description": "Bad named entity: DiacriticalDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DiacriticalDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "˙", 
+            "description": "Named entity: DiacriticalDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalDoubleAcute", 
+            "description": "Bad named entity: DiacriticalDoubleAcute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DiacriticalDoubleAcute"
+                ]
+            ]
+        }, 
+        {
+            "input": "˝", 
+            "description": "Named entity: DiacriticalDoubleAcute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalGrave", 
+            "description": "Bad named entity: DiacriticalGrave without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DiacriticalGrave"
+                ]
+            ]
+        }, 
+        {
+            "input": "`", 
+            "description": "Named entity: DiacriticalGrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "`"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DiacriticalTilde", 
+            "description": "Bad named entity: DiacriticalTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DiacriticalTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "˜", 
+            "description": "Named entity: DiacriticalTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Diamond", 
+            "description": "Bad named entity: Diamond without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Diamond"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋄", 
+            "description": "Named entity: Diamond; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DifferentialD", 
+            "description": "Bad named entity: DifferentialD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DifferentialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅆ", 
+            "description": "Named entity: DifferentialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dopf", 
+            "description": "Bad named entity: Dopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔻", 
+            "description": "Named entity: Dopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dot", 
+            "description": "Bad named entity: Dot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dot"
+                ]
+            ]
+        }, 
+        {
+            "input": "¨", 
+            "description": "Named entity: Dot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotDot", 
+            "description": "Bad named entity: DotDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DotDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⃜", 
+            "description": "Named entity: DotDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DotEqual", 
+            "description": "Bad named entity: DotEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DotEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≐", 
+            "description": "Named entity: DotEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleContourIntegral", 
+            "description": "Bad named entity: DoubleContourIntegral without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleContourIntegral"
+                ]
+            ]
+        }, 
+        {
+            "input": "∯", 
+            "description": "Named entity: DoubleContourIntegral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDot", 
+            "description": "Bad named entity: DoubleDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "¨", 
+            "description": "Named entity: DoubleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleDownArrow", 
+            "description": "Bad named entity: DoubleDownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇓", 
+            "description": "Named entity: DoubleDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftArrow", 
+            "description": "Bad named entity: DoubleLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇐", 
+            "description": "Named entity: DoubleLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftRightArrow", 
+            "description": "Bad named entity: DoubleLeftRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇔", 
+            "description": "Named entity: DoubleLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLeftTee", 
+            "description": "Bad named entity: DoubleLeftTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLeftTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫤", 
+            "description": "Named entity: DoubleLeftTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftArrow", 
+            "description": "Bad named entity: DoubleLongLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLongLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟸", 
+            "description": "Named entity: DoubleLongLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongLeftRightArrow", 
+            "description": "Bad named entity: DoubleLongLeftRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLongLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟺", 
+            "description": "Named entity: DoubleLongLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleLongRightArrow", 
+            "description": "Bad named entity: DoubleLongRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleLongRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟹", 
+            "description": "Named entity: DoubleLongRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightArrow", 
+            "description": "Bad named entity: DoubleRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇒", 
+            "description": "Named entity: DoubleRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleRightTee", 
+            "description": "Bad named entity: DoubleRightTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleRightTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊨", 
+            "description": "Named entity: DoubleRightTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpArrow", 
+            "description": "Bad named entity: DoubleUpArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇑", 
+            "description": "Named entity: DoubleUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleUpDownArrow", 
+            "description": "Bad named entity: DoubleUpDownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleUpDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇕", 
+            "description": "Named entity: DoubleUpDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DoubleVerticalBar", 
+            "description": "Bad named entity: DoubleVerticalBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DoubleVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∥", 
+            "description": "Named entity: DoubleVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrow", 
+            "description": "Bad named entity: DownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↓", 
+            "description": "Named entity: DownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowBar", 
+            "description": "Bad named entity: DownArrowBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤓", 
+            "description": "Named entity: DownArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2913"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownArrowUpArrow", 
+            "description": "Bad named entity: DownArrowUpArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownArrowUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇵", 
+            "description": "Named entity: DownArrowUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownBreve", 
+            "description": "Bad named entity: DownBreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownBreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "̑", 
+            "description": "Named entity: DownBreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0311"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftRightVector", 
+            "description": "Bad named entity: DownLeftRightVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownLeftRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥐", 
+            "description": "Named entity: DownLeftRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2950"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftTeeVector", 
+            "description": "Bad named entity: DownLeftTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownLeftTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥞", 
+            "description": "Named entity: DownLeftTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVector", 
+            "description": "Bad named entity: DownLeftVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownLeftVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "↽", 
+            "description": "Named entity: DownLeftVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownLeftVectorBar", 
+            "description": "Bad named entity: DownLeftVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownLeftVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥖", 
+            "description": "Named entity: DownLeftVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2956"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightTeeVector", 
+            "description": "Bad named entity: DownRightTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownRightTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥟", 
+            "description": "Named entity: DownRightTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVector", 
+            "description": "Bad named entity: DownRightVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇁", 
+            "description": "Named entity: DownRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownRightVectorBar", 
+            "description": "Bad named entity: DownRightVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownRightVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥗", 
+            "description": "Named entity: DownRightVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2957"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTee", 
+            "description": "Bad named entity: DownTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊤", 
+            "description": "Named entity: DownTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&DownTeeArrow", 
+            "description": "Bad named entity: DownTeeArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&DownTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↧", 
+            "description": "Named entity: DownTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Downarrow", 
+            "description": "Bad named entity: Downarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Downarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇓", 
+            "description": "Named entity: Downarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dscr", 
+            "description": "Bad named entity: Dscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒟", 
+            "description": "Named entity: Dscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udc9f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Dstrok", 
+            "description": "Bad named entity: Dstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Dstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "Đ", 
+            "description": "Named entity: Dstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ENG", 
+            "description": "Bad named entity: ENG without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ENG"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŋ", 
+            "description": "Named entity: ENG; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014a"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ð", 
+            "description": "Named entity: ETH without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ð", 
+            "description": "Named entity: ETH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "É", 
+            "description": "Named entity: Eacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "É", 
+            "description": "Named entity: Eacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecaron", 
+            "description": "Bad named entity: Ecaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ecaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ě", 
+            "description": "Named entity: Ecaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011a"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ê", 
+            "description": "Named entity: Ecirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ê", 
+            "description": "Named entity: Ecirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ecy", 
+            "description": "Bad named entity: Ecy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Э", 
+            "description": "Named entity: Ecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Edot", 
+            "description": "Bad named entity: Edot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Edot"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ė", 
+            "description": "Named entity: Edot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0116"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Efr", 
+            "description": "Bad named entity: Efr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Efr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔈", 
+            "description": "Named entity: Efr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd08"
+                ]
+            ]
+        }, 
+        {
+            "input": "È", 
+            "description": "Named entity: Egrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "È", 
+            "description": "Named entity: Egrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Element", 
+            "description": "Bad named entity: Element without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Element"
+                ]
+            ]
+        }, 
+        {
+            "input": "∈", 
+            "description": "Named entity: Element; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Emacr", 
+            "description": "Bad named entity: Emacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Emacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ē", 
+            "description": "Named entity: Emacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptySmallSquare", 
+            "description": "Bad named entity: EmptySmallSquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&EmptySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "◻", 
+            "description": "Named entity: EmptySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EmptyVerySmallSquare", 
+            "description": "Bad named entity: EmptyVerySmallSquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&EmptyVerySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "▫", 
+            "description": "Named entity: EmptyVerySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eogon", 
+            "description": "Bad named entity: Eogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Eogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ę", 
+            "description": "Named entity: Eogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eopf", 
+            "description": "Bad named entity: Eopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Eopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔼", 
+            "description": "Named entity: Eopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Epsilon", 
+            "description": "Bad named entity: Epsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Epsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ε", 
+            "description": "Named entity: Epsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0395"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equal", 
+            "description": "Bad named entity: Equal without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Equal"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩵", 
+            "description": "Named entity: Equal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a75"
+                ]
+            ]
+        }, 
+        {
+            "input": "&EqualTilde", 
+            "description": "Bad named entity: EqualTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&EqualTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≂", 
+            "description": "Named entity: EqualTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Equilibrium", 
+            "description": "Bad named entity: Equilibrium without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Equilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇌", 
+            "description": "Named entity: Equilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Escr", 
+            "description": "Bad named entity: Escr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Escr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℰ", 
+            "description": "Named entity: Escr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Esim", 
+            "description": "Bad named entity: Esim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Esim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩳", 
+            "description": "Named entity: Esim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a73"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Eta", 
+            "description": "Bad named entity: Eta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Eta"
+                ]
+            ]
+        }, 
+        {
+            "input": "Η", 
+            "description": "Named entity: Eta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0397"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ë", 
+            "description": "Named entity: Euml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ë", 
+            "description": "Named entity: Euml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Exists", 
+            "description": "Bad named entity: Exists without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Exists"
+                ]
+            ]
+        }, 
+        {
+            "input": "∃", 
+            "description": "Named entity: Exists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2203"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ExponentialE", 
+            "description": "Bad named entity: ExponentialE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ExponentialE"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅇ", 
+            "description": "Named entity: ExponentialE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fcy", 
+            "description": "Bad named entity: Fcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Fcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ф", 
+            "description": "Named entity: Fcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0424"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ffr", 
+            "description": "Bad named entity: Ffr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ffr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔉", 
+            "description": "Named entity: Ffr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd09"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledSmallSquare", 
+            "description": "Bad named entity: FilledSmallSquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&FilledSmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "◼", 
+            "description": "Named entity: FilledSmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&FilledVerySmallSquare", 
+            "description": "Bad named entity: FilledVerySmallSquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&FilledVerySmallSquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "▪", 
+            "description": "Named entity: FilledVerySmallSquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fopf", 
+            "description": "Bad named entity: Fopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Fopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔽", 
+            "description": "Named entity: Fopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ForAll", 
+            "description": "Bad named entity: ForAll without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ForAll"
+                ]
+            ]
+        }, 
+        {
+            "input": "∀", 
+            "description": "Named entity: ForAll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2200"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fouriertrf", 
+            "description": "Bad named entity: Fouriertrf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Fouriertrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℱ", 
+            "description": "Named entity: Fouriertrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Fscr", 
+            "description": "Bad named entity: Fscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Fscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℱ", 
+            "description": "Named entity: Fscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GJcy", 
+            "description": "Bad named entity: GJcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ѓ", 
+            "description": "Named entity: GJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0403"
+                ]
+            ]
+        }, 
+        {
+            "input": ">", 
+            "description": "Named entity: GT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": ">", 
+            "description": "Named entity: GT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gamma", 
+            "description": "Bad named entity: Gamma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "Γ", 
+            "description": "Named entity: Gamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0393"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gammad", 
+            "description": "Bad named entity: Gammad without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gammad"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ϝ", 
+            "description": "Named entity: Gammad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gbreve", 
+            "description": "Bad named entity: Gbreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gbreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ğ", 
+            "description": "Named entity: Gbreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcedil", 
+            "description": "Bad named entity: Gcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ģ", 
+            "description": "Named entity: Gcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcirc", 
+            "description": "Bad named entity: Gcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĝ", 
+            "description": "Named entity: Gcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gcy", 
+            "description": "Bad named entity: Gcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Г", 
+            "description": "Named entity: Gcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0413"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gdot", 
+            "description": "Bad named entity: Gdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ġ", 
+            "description": "Named entity: Gdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0120"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gfr", 
+            "description": "Bad named entity: Gfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔊", 
+            "description": "Named entity: Gfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gg", 
+            "description": "Bad named entity: Gg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋙", 
+            "description": "Named entity: Gg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gopf", 
+            "description": "Bad named entity: Gopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔾", 
+            "description": "Named entity: Gopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd3e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqual", 
+            "description": "Bad named entity: GreaterEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≥", 
+            "description": "Named entity: GreaterEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterEqualLess", 
+            "description": "Bad named entity: GreaterEqualLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterEqualLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋛", 
+            "description": "Named entity: GreaterEqualLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterFullEqual", 
+            "description": "Bad named entity: GreaterFullEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧", 
+            "description": "Named entity: GreaterFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterGreater", 
+            "description": "Bad named entity: GreaterGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪢", 
+            "description": "Named entity: GreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterLess", 
+            "description": "Bad named entity: GreaterLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "≷", 
+            "description": "Named entity: GreaterLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterSlantEqual", 
+            "description": "Bad named entity: GreaterSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾", 
+            "description": "Named entity: GreaterSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&GreaterTilde", 
+            "description": "Bad named entity: GreaterTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&GreaterTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≳", 
+            "description": "Named entity: GreaterTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gscr", 
+            "description": "Bad named entity: Gscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒢", 
+            "description": "Named entity: Gscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Gt", 
+            "description": "Bad named entity: Gt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Gt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫", 
+            "description": "Named entity: Gt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HARDcy", 
+            "description": "Bad named entity: HARDcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&HARDcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ъ", 
+            "description": "Named entity: HARDcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hacek", 
+            "description": "Bad named entity: Hacek without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hacek"
+                ]
+            ]
+        }, 
+        {
+            "input": "ˇ", 
+            "description": "Named entity: Hacek; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hat", 
+            "description": "Bad named entity: Hat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hat"
+                ]
+            ]
+        }, 
+        {
+            "input": "^", 
+            "description": "Named entity: Hat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "^"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hcirc", 
+            "description": "Bad named entity: Hcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĥ", 
+            "description": "Named entity: Hcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hfr", 
+            "description": "Bad named entity: Hfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℌ", 
+            "description": "Named entity: Hfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HilbertSpace", 
+            "description": "Bad named entity: HilbertSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&HilbertSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℋ", 
+            "description": "Named entity: HilbertSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hopf", 
+            "description": "Bad named entity: Hopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℍ", 
+            "description": "Named entity: Hopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HorizontalLine", 
+            "description": "Bad named entity: HorizontalLine without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&HorizontalLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "─", 
+            "description": "Named entity: HorizontalLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2500"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hscr", 
+            "description": "Bad named entity: Hscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℋ", 
+            "description": "Named entity: Hscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Hstrok", 
+            "description": "Bad named entity: Hstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Hstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ħ", 
+            "description": "Named entity: Hstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0126"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpDownHump", 
+            "description": "Bad named entity: HumpDownHump without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&HumpDownHump"
+                ]
+            ]
+        }, 
+        {
+            "input": "≎", 
+            "description": "Named entity: HumpDownHump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&HumpEqual", 
+            "description": "Bad named entity: HumpEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&HumpEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≏", 
+            "description": "Named entity: HumpEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IEcy", 
+            "description": "Bad named entity: IEcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&IEcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Е", 
+            "description": "Named entity: IEcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0415"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IJlig", 
+            "description": "Bad named entity: IJlig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&IJlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "IJ", 
+            "description": "Named entity: IJlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0132"
+                ]
+            ]
+        }, 
+        {
+            "input": "&IOcy", 
+            "description": "Bad named entity: IOcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&IOcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ё", 
+            "description": "Named entity: IOcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0401"
+                ]
+            ]
+        }, 
+        {
+            "input": "Í", 
+            "description": "Named entity: Iacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "Í", 
+            "description": "Named entity: Iacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "Î", 
+            "description": "Named entity: Icirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "Î", 
+            "description": "Named entity: Icirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Icy", 
+            "description": "Bad named entity: Icy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Icy"
+                ]
+            ]
+        }, 
+        {
+            "input": "И", 
+            "description": "Named entity: Icy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0418"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Idot", 
+            "description": "Bad named entity: Idot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Idot"
+                ]
+            ]
+        }, 
+        {
+            "input": "İ", 
+            "description": "Named entity: Idot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ifr", 
+            "description": "Bad named entity: Ifr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ifr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℑ", 
+            "description": "Named entity: Ifr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ì", 
+            "description": "Named entity: Igrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ì", 
+            "description": "Named entity: Igrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Im", 
+            "description": "Bad named entity: Im without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Im"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℑ", 
+            "description": "Named entity: Im; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Imacr", 
+            "description": "Bad named entity: Imacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Imacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ī", 
+            "description": "Named entity: Imacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ImaginaryI", 
+            "description": "Bad named entity: ImaginaryI without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ImaginaryI"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅈ", 
+            "description": "Named entity: ImaginaryI; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Implies", 
+            "description": "Bad named entity: Implies without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Implies"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇒", 
+            "description": "Named entity: Implies; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Int", 
+            "description": "Bad named entity: Int without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Int"
+                ]
+            ]
+        }, 
+        {
+            "input": "∬", 
+            "description": "Named entity: Int; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Integral", 
+            "description": "Bad named entity: Integral without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Integral"
+                ]
+            ]
+        }, 
+        {
+            "input": "∫", 
+            "description": "Named entity: Integral; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Intersection", 
+            "description": "Bad named entity: Intersection without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Intersection"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋂", 
+            "description": "Named entity: Intersection; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleComma", 
+            "description": "Bad named entity: InvisibleComma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&InvisibleComma"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁣", 
+            "description": "Named entity: InvisibleComma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2063"
+                ]
+            ]
+        }, 
+        {
+            "input": "&InvisibleTimes", 
+            "description": "Bad named entity: InvisibleTimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&InvisibleTimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁢", 
+            "description": "Named entity: InvisibleTimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2062"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iogon", 
+            "description": "Bad named entity: Iogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Iogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Į", 
+            "description": "Named entity: Iogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iopf", 
+            "description": "Bad named entity: Iopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Iopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕀", 
+            "description": "Named entity: Iopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd40"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iota", 
+            "description": "Bad named entity: Iota without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Iota"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ι", 
+            "description": "Named entity: Iota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0399"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iscr", 
+            "description": "Bad named entity: Iscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Iscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℐ", 
+            "description": "Named entity: Iscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Itilde", 
+            "description": "Bad named entity: Itilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Itilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĩ", 
+            "description": "Named entity: Itilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Iukcy", 
+            "description": "Bad named entity: Iukcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Iukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "І", 
+            "description": "Named entity: Iukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0406"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ï", 
+            "description": "Named entity: Iuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ï", 
+            "description": "Named entity: Iuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcirc", 
+            "description": "Bad named entity: Jcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĵ", 
+            "description": "Named entity: Jcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jcy", 
+            "description": "Bad named entity: Jcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Й", 
+            "description": "Named entity: Jcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0419"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jfr", 
+            "description": "Bad named entity: Jfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔍", 
+            "description": "Named entity: Jfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jopf", 
+            "description": "Bad named entity: Jopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕁", 
+            "description": "Named entity: Jopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd41"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jscr", 
+            "description": "Bad named entity: Jscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒥", 
+            "description": "Named entity: Jscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jsercy", 
+            "description": "Bad named entity: Jsercy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jsercy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ј", 
+            "description": "Named entity: Jsercy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0408"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Jukcy", 
+            "description": "Bad named entity: Jukcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Jukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Є", 
+            "description": "Named entity: Jukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0404"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KHcy", 
+            "description": "Bad named entity: KHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&KHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Х", 
+            "description": "Named entity: KHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0425"
+                ]
+            ]
+        }, 
+        {
+            "input": "&KJcy", 
+            "description": "Bad named entity: KJcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&KJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ќ", 
+            "description": "Named entity: KJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kappa", 
+            "description": "Bad named entity: Kappa without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "Κ", 
+            "description": "Named entity: Kappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcedil", 
+            "description": "Bad named entity: Kcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ķ", 
+            "description": "Named entity: Kcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0136"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kcy", 
+            "description": "Bad named entity: Kcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "К", 
+            "description": "Named entity: Kcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kfr", 
+            "description": "Bad named entity: Kfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔎", 
+            "description": "Named entity: Kfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kopf", 
+            "description": "Bad named entity: Kopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕂", 
+            "description": "Named entity: Kopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd42"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Kscr", 
+            "description": "Bad named entity: Kscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Kscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒦", 
+            "description": "Named entity: Kscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LJcy", 
+            "description": "Bad named entity: LJcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Љ", 
+            "description": "Named entity: LJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0409"
+                ]
+            ]
+        }, 
+        {
+            "input": "<", 
+            "description": "Named entity: LT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "<", 
+            "description": "Named entity: LT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lacute", 
+            "description": "Bad named entity: Lacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ĺ", 
+            "description": "Named entity: Lacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0139"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lambda", 
+            "description": "Bad named entity: Lambda without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lambda"
+                ]
+            ]
+        }, 
+        {
+            "input": "Λ", 
+            "description": "Named entity: Lambda; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lang", 
+            "description": "Bad named entity: Lang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟪", 
+            "description": "Named entity: Lang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Laplacetrf", 
+            "description": "Bad named entity: Laplacetrf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Laplacetrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℒ", 
+            "description": "Named entity: Laplacetrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Larr", 
+            "description": "Bad named entity: Larr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Larr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↞", 
+            "description": "Named entity: Larr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcaron", 
+            "description": "Bad named entity: Lcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ľ", 
+            "description": "Named entity: Lcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcedil", 
+            "description": "Bad named entity: Lcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ļ", 
+            "description": "Named entity: Lcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lcy", 
+            "description": "Bad named entity: Lcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Л", 
+            "description": "Named entity: Lcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftAngleBracket", 
+            "description": "Bad named entity: LeftAngleBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftAngleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟨", 
+            "description": "Named entity: LeftAngleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrow", 
+            "description": "Bad named entity: LeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "←", 
+            "description": "Named entity: LeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowBar", 
+            "description": "Bad named entity: LeftArrowBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇤", 
+            "description": "Named entity: LeftArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftArrowRightArrow", 
+            "description": "Bad named entity: LeftArrowRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftArrowRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇆", 
+            "description": "Named entity: LeftArrowRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftCeiling", 
+            "description": "Bad named entity: LeftCeiling without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftCeiling"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌈", 
+            "description": "Named entity: LeftCeiling; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2308"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDoubleBracket", 
+            "description": "Bad named entity: LeftDoubleBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftDoubleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟦", 
+            "description": "Named entity: LeftDoubleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownTeeVector", 
+            "description": "Bad named entity: LeftDownTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftDownTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥡", 
+            "description": "Named entity: LeftDownTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2961"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVector", 
+            "description": "Bad named entity: LeftDownVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇃", 
+            "description": "Named entity: LeftDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftDownVectorBar", 
+            "description": "Bad named entity: LeftDownVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftDownVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥙", 
+            "description": "Named entity: LeftDownVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2959"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftFloor", 
+            "description": "Bad named entity: LeftFloor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftFloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌊", 
+            "description": "Named entity: LeftFloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightArrow", 
+            "description": "Bad named entity: LeftRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↔", 
+            "description": "Named entity: LeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftRightVector", 
+            "description": "Bad named entity: LeftRightVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftRightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥎", 
+            "description": "Named entity: LeftRightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTee", 
+            "description": "Bad named entity: LeftTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊣", 
+            "description": "Named entity: LeftTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeArrow", 
+            "description": "Bad named entity: LeftTeeArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↤", 
+            "description": "Named entity: LeftTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTeeVector", 
+            "description": "Bad named entity: LeftTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥚", 
+            "description": "Named entity: LeftTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangle", 
+            "description": "Bad named entity: LeftTriangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊲", 
+            "description": "Named entity: LeftTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleBar", 
+            "description": "Bad named entity: LeftTriangleBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧏", 
+            "description": "Named entity: LeftTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftTriangleEqual", 
+            "description": "Bad named entity: LeftTriangleEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊴", 
+            "description": "Named entity: LeftTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpDownVector", 
+            "description": "Bad named entity: LeftUpDownVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftUpDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥑", 
+            "description": "Named entity: LeftUpDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2951"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpTeeVector", 
+            "description": "Bad named entity: LeftUpTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftUpTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥠", 
+            "description": "Named entity: LeftUpTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2960"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVector", 
+            "description": "Bad named entity: LeftUpVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftUpVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "↿", 
+            "description": "Named entity: LeftUpVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftUpVectorBar", 
+            "description": "Bad named entity: LeftUpVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftUpVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥘", 
+            "description": "Named entity: LeftUpVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2958"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVector", 
+            "description": "Bad named entity: LeftVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "↼", 
+            "description": "Named entity: LeftVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LeftVectorBar", 
+            "description": "Bad named entity: LeftVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LeftVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥒", 
+            "description": "Named entity: LeftVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2952"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftarrow", 
+            "description": "Bad named entity: Leftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Leftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇐", 
+            "description": "Named entity: Leftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Leftrightarrow", 
+            "description": "Bad named entity: Leftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Leftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇔", 
+            "description": "Named entity: Leftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessEqualGreater", 
+            "description": "Bad named entity: LessEqualGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessEqualGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋚", 
+            "description": "Named entity: LessEqualGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessFullEqual", 
+            "description": "Bad named entity: LessFullEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≦", 
+            "description": "Named entity: LessFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessGreater", 
+            "description": "Bad named entity: LessGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "≶", 
+            "description": "Named entity: LessGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessLess", 
+            "description": "Bad named entity: LessLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪡", 
+            "description": "Named entity: LessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessSlantEqual", 
+            "description": "Bad named entity: LessSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽", 
+            "description": "Named entity: LessSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LessTilde", 
+            "description": "Bad named entity: LessTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LessTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≲", 
+            "description": "Named entity: LessTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lfr", 
+            "description": "Bad named entity: Lfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔏", 
+            "description": "Named entity: Lfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd0f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ll", 
+            "description": "Bad named entity: Ll without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ll"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋘", 
+            "description": "Named entity: Ll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lleftarrow", 
+            "description": "Bad named entity: Lleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇚", 
+            "description": "Named entity: Lleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lmidot", 
+            "description": "Bad named entity: Lmidot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lmidot"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŀ", 
+            "description": "Named entity: Lmidot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftArrow", 
+            "description": "Bad named entity: LongLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LongLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟵", 
+            "description": "Named entity: LongLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongLeftRightArrow", 
+            "description": "Bad named entity: LongLeftRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LongLeftRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟷", 
+            "description": "Named entity: LongLeftRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LongRightArrow", 
+            "description": "Bad named entity: LongRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LongRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟶", 
+            "description": "Named entity: LongRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftarrow", 
+            "description": "Bad named entity: Longleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Longleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟸", 
+            "description": "Named entity: Longleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longleftrightarrow", 
+            "description": "Bad named entity: Longleftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Longleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟺", 
+            "description": "Named entity: Longleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Longrightarrow", 
+            "description": "Bad named entity: Longrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Longrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟹", 
+            "description": "Named entity: Longrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lopf", 
+            "description": "Bad named entity: Lopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕃", 
+            "description": "Named entity: Lopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd43"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerLeftArrow", 
+            "description": "Bad named entity: LowerLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LowerLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↙", 
+            "description": "Named entity: LowerLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&LowerRightArrow", 
+            "description": "Bad named entity: LowerRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&LowerRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↘", 
+            "description": "Named entity: LowerRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lscr", 
+            "description": "Bad named entity: Lscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℒ", 
+            "description": "Named entity: Lscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lsh", 
+            "description": "Bad named entity: Lsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↰", 
+            "description": "Named entity: Lsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lstrok", 
+            "description": "Bad named entity: Lstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ł", 
+            "description": "Named entity: Lstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0141"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Lt", 
+            "description": "Bad named entity: Lt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Lt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪", 
+            "description": "Named entity: Lt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Map", 
+            "description": "Bad named entity: Map without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Map"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤅", 
+            "description": "Named entity: Map; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2905"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mcy", 
+            "description": "Bad named entity: Mcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "М", 
+            "description": "Named entity: Mcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MediumSpace", 
+            "description": "Bad named entity: MediumSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&MediumSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: MediumSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u205f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mellintrf", 
+            "description": "Bad named entity: Mellintrf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mellintrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℳ", 
+            "description": "Named entity: Mellintrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mfr", 
+            "description": "Bad named entity: Mfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔐", 
+            "description": "Named entity: Mfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd10"
+                ]
+            ]
+        }, 
+        {
+            "input": "&MinusPlus", 
+            "description": "Bad named entity: MinusPlus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&MinusPlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∓", 
+            "description": "Named entity: MinusPlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mopf", 
+            "description": "Bad named entity: Mopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕄", 
+            "description": "Named entity: Mopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd44"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mscr", 
+            "description": "Bad named entity: Mscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℳ", 
+            "description": "Named entity: Mscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Mu", 
+            "description": "Bad named entity: Mu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Mu"
+                ]
+            ]
+        }, 
+        {
+            "input": "Μ", 
+            "description": "Named entity: Mu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NJcy", 
+            "description": "Bad named entity: NJcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NJcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Њ", 
+            "description": "Named entity: NJcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nacute", 
+            "description": "Bad named entity: Nacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Nacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ń", 
+            "description": "Named entity: Nacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0143"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncaron", 
+            "description": "Bad named entity: Ncaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ncaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ň", 
+            "description": "Named entity: Ncaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncedil", 
+            "description": "Bad named entity: Ncedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ncedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ņ", 
+            "description": "Named entity: Ncedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0145"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ncy", 
+            "description": "Bad named entity: Ncy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ncy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Н", 
+            "description": "Named entity: Ncy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeMediumSpace", 
+            "description": "Bad named entity: NegativeMediumSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NegativeMediumSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "​", 
+            "description": "Named entity: NegativeMediumSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThickSpace", 
+            "description": "Bad named entity: NegativeThickSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NegativeThickSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "​", 
+            "description": "Named entity: NegativeThickSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeThinSpace", 
+            "description": "Bad named entity: NegativeThinSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NegativeThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "​", 
+            "description": "Named entity: NegativeThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NegativeVeryThinSpace", 
+            "description": "Bad named entity: NegativeVeryThinSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NegativeVeryThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "​", 
+            "description": "Named entity: NegativeVeryThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedGreaterGreater", 
+            "description": "Bad named entity: NestedGreaterGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NestedGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫", 
+            "description": "Named entity: NestedGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NestedLessLess", 
+            "description": "Bad named entity: NestedLessLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NestedLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪", 
+            "description": "Named entity: NestedLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NewLine", 
+            "description": "Bad named entity: NewLine without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NewLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "
", 
+            "description": "Named entity: NewLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\n"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nfr", 
+            "description": "Bad named entity: Nfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Nfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔑", 
+            "description": "Named entity: Nfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd11"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NoBreak", 
+            "description": "Bad named entity: NoBreak without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NoBreak"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁠", 
+            "description": "Named entity: NoBreak; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2060"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NonBreakingSpace", 
+            "description": "Bad named entity: NonBreakingSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NonBreakingSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: NonBreakingSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nopf", 
+            "description": "Bad named entity: Nopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Nopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℕ", 
+            "description": "Named entity: Nopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2115"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Not", 
+            "description": "Bad named entity: Not without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Not"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫬", 
+            "description": "Named entity: Not; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCongruent", 
+            "description": "Bad named entity: NotCongruent without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotCongruent"
+                ]
+            ]
+        }, 
+        {
+            "input": "≢", 
+            "description": "Named entity: NotCongruent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2262"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotCupCap", 
+            "description": "Bad named entity: NotCupCap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotCupCap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≭", 
+            "description": "Named entity: NotCupCap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotDoubleVerticalBar", 
+            "description": "Bad named entity: NotDoubleVerticalBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotDoubleVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∦", 
+            "description": "Named entity: NotDoubleVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotElement", 
+            "description": "Bad named entity: NotElement without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "∉", 
+            "description": "Named entity: NotElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqual", 
+            "description": "Bad named entity: NotEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≠", 
+            "description": "Named entity: NotEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2260"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotEqualTilde", 
+            "description": "Bad named entity: NotEqualTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotEqualTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≂̸", 
+            "description": "Named entity: NotEqualTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotExists", 
+            "description": "Bad named entity: NotExists without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotExists"
+                ]
+            ]
+        }, 
+        {
+            "input": "∄", 
+            "description": "Named entity: NotExists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreater", 
+            "description": "Bad named entity: NotGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "≯", 
+            "description": "Named entity: NotGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterEqual", 
+            "description": "Bad named entity: NotGreaterEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≱", 
+            "description": "Named entity: NotGreaterEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterFullEqual", 
+            "description": "Bad named entity: NotGreaterFullEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧̸", 
+            "description": "Named entity: NotGreaterFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterGreater", 
+            "description": "Bad named entity: NotGreaterGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫̸", 
+            "description": "Named entity: NotGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterLess", 
+            "description": "Bad named entity: NotGreaterLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "≹", 
+            "description": "Named entity: NotGreaterLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2279"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterSlantEqual", 
+            "description": "Bad named entity: NotGreaterSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾̸", 
+            "description": "Named entity: NotGreaterSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotGreaterTilde", 
+            "description": "Bad named entity: NotGreaterTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotGreaterTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≵", 
+            "description": "Named entity: NotGreaterTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2275"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpDownHump", 
+            "description": "Bad named entity: NotHumpDownHump without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotHumpDownHump"
+                ]
+            ]
+        }, 
+        {
+            "input": "≎̸", 
+            "description": "Named entity: NotHumpDownHump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotHumpEqual", 
+            "description": "Bad named entity: NotHumpEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotHumpEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≏̸", 
+            "description": "Named entity: NotHumpEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangle", 
+            "description": "Bad named entity: NotLeftTriangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLeftTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋪", 
+            "description": "Named entity: NotLeftTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleBar", 
+            "description": "Bad named entity: NotLeftTriangleBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLeftTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧏̸", 
+            "description": "Named entity: NotLeftTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLeftTriangleEqual", 
+            "description": "Bad named entity: NotLeftTriangleEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLeftTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋬", 
+            "description": "Named entity: NotLeftTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLess", 
+            "description": "Bad named entity: NotLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "≮", 
+            "description": "Named entity: NotLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessEqual", 
+            "description": "Bad named entity: NotLessEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLessEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≰", 
+            "description": "Named entity: NotLessEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessGreater", 
+            "description": "Bad named entity: NotLessGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLessGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "≸", 
+            "description": "Named entity: NotLessGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2278"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessLess", 
+            "description": "Bad named entity: NotLessLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪̸", 
+            "description": "Named entity: NotLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessSlantEqual", 
+            "description": "Bad named entity: NotLessSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLessSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽̸", 
+            "description": "Named entity: NotLessSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotLessTilde", 
+            "description": "Bad named entity: NotLessTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotLessTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≴", 
+            "description": "Named entity: NotLessTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2274"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedGreaterGreater", 
+            "description": "Bad named entity: NotNestedGreaterGreater without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotNestedGreaterGreater"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪢̸", 
+            "description": "Named entity: NotNestedGreaterGreater; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa2\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotNestedLessLess", 
+            "description": "Bad named entity: NotNestedLessLess without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotNestedLessLess"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪡̸", 
+            "description": "Named entity: NotNestedLessLess; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa1\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedes", 
+            "description": "Bad named entity: NotPrecedes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotPrecedes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊀", 
+            "description": "Named entity: NotPrecedes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesEqual", 
+            "description": "Bad named entity: NotPrecedesEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotPrecedesEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯̸", 
+            "description": "Named entity: NotPrecedesEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotPrecedesSlantEqual", 
+            "description": "Bad named entity: NotPrecedesSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotPrecedesSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋠", 
+            "description": "Named entity: NotPrecedesSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotReverseElement", 
+            "description": "Bad named entity: NotReverseElement without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotReverseElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "∌", 
+            "description": "Named entity: NotReverseElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangle", 
+            "description": "Bad named entity: NotRightTriangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotRightTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋫", 
+            "description": "Named entity: NotRightTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleBar", 
+            "description": "Bad named entity: NotRightTriangleBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotRightTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧐̸", 
+            "description": "Named entity: NotRightTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29d0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotRightTriangleEqual", 
+            "description": "Bad named entity: NotRightTriangleEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotRightTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋭", 
+            "description": "Named entity: NotRightTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubset", 
+            "description": "Bad named entity: NotSquareSubset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSquareSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊏̸", 
+            "description": "Named entity: NotSquareSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSubsetEqual", 
+            "description": "Bad named entity: NotSquareSubsetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSquareSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋢", 
+            "description": "Named entity: NotSquareSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSuperset", 
+            "description": "Bad named entity: NotSquareSuperset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSquareSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊐̸", 
+            "description": "Named entity: NotSquareSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSquareSupersetEqual", 
+            "description": "Bad named entity: NotSquareSupersetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSquareSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋣", 
+            "description": "Named entity: NotSquareSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubset", 
+            "description": "Bad named entity: NotSubset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊂⃒", 
+            "description": "Named entity: NotSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSubsetEqual", 
+            "description": "Bad named entity: NotSubsetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊈", 
+            "description": "Named entity: NotSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceeds", 
+            "description": "Bad named entity: NotSucceeds without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSucceeds"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊁", 
+            "description": "Named entity: NotSucceeds; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsEqual", 
+            "description": "Bad named entity: NotSucceedsEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSucceedsEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰̸", 
+            "description": "Named entity: NotSucceedsEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsSlantEqual", 
+            "description": "Bad named entity: NotSucceedsSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSucceedsSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋡", 
+            "description": "Named entity: NotSucceedsSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSucceedsTilde", 
+            "description": "Bad named entity: NotSucceedsTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSucceedsTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≿̸", 
+            "description": "Named entity: NotSucceedsTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSuperset", 
+            "description": "Bad named entity: NotSuperset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃⃒", 
+            "description": "Named entity: NotSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotSupersetEqual", 
+            "description": "Bad named entity: NotSupersetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊉", 
+            "description": "Named entity: NotSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTilde", 
+            "description": "Bad named entity: NotTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≁", 
+            "description": "Named entity: NotTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2241"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeEqual", 
+            "description": "Bad named entity: NotTildeEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotTildeEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≄", 
+            "description": "Named entity: NotTildeEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeFullEqual", 
+            "description": "Bad named entity: NotTildeFullEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotTildeFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≇", 
+            "description": "Named entity: NotTildeFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2247"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotTildeTilde", 
+            "description": "Bad named entity: NotTildeTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotTildeTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≉", 
+            "description": "Named entity: NotTildeTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&NotVerticalBar", 
+            "description": "Bad named entity: NotVerticalBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&NotVerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∤", 
+            "description": "Named entity: NotVerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nscr", 
+            "description": "Bad named entity: Nscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Nscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒩", 
+            "description": "Named entity: Nscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udca9"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ñ", 
+            "description": "Named entity: Ntilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ñ", 
+            "description": "Named entity: Ntilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Nu", 
+            "description": "Bad named entity: Nu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Nu"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ν", 
+            "description": "Named entity: Nu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OElig", 
+            "description": "Bad named entity: OElig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OElig"
+                ]
+            ]
+        }, 
+        {
+            "input": "Œ", 
+            "description": "Named entity: OElig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0152"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ó", 
+            "description": "Named entity: Oacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ó", 
+            "description": "Named entity: Oacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ô", 
+            "description": "Named entity: Ocirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ô", 
+            "description": "Named entity: Ocirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ocy", 
+            "description": "Bad named entity: Ocy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "О", 
+            "description": "Named entity: Ocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Odblac", 
+            "description": "Bad named entity: Odblac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Odblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ő", 
+            "description": "Named entity: Odblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0150"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ofr", 
+            "description": "Bad named entity: Ofr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ofr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔒", 
+            "description": "Named entity: Ofr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd12"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ò", 
+            "description": "Named entity: Ograve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ò", 
+            "description": "Named entity: Ograve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omacr", 
+            "description": "Bad named entity: Omacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Omacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ō", 
+            "description": "Named entity: Omacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omega", 
+            "description": "Bad named entity: Omega without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Omega"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ω", 
+            "description": "Named entity: Omega; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Omicron", 
+            "description": "Bad named entity: Omicron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Omicron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ο", 
+            "description": "Named entity: Omicron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oopf", 
+            "description": "Bad named entity: Oopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Oopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕆", 
+            "description": "Named entity: Oopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd46"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyDoubleQuote", 
+            "description": "Bad named entity: OpenCurlyDoubleQuote without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OpenCurlyDoubleQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "“", 
+            "description": "Named entity: OpenCurlyDoubleQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OpenCurlyQuote", 
+            "description": "Bad named entity: OpenCurlyQuote without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OpenCurlyQuote"
+                ]
+            ]
+        }, 
+        {
+            "input": "‘", 
+            "description": "Named entity: OpenCurlyQuote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2018"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Or", 
+            "description": "Bad named entity: Or without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Or"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩔", 
+            "description": "Named entity: Or; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a54"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Oscr", 
+            "description": "Bad named entity: Oscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Oscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒪", 
+            "description": "Named entity: Oscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ø", 
+            "description": "Named entity: Oslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ø", 
+            "description": "Named entity: Oslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "Õ", 
+            "description": "Named entity: Otilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "Õ", 
+            "description": "Named entity: Otilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Otimes", 
+            "description": "Bad named entity: Otimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Otimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨷", 
+            "description": "Named entity: Otimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a37"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ö", 
+            "description": "Named entity: Ouml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ö", 
+            "description": "Named entity: Ouml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBar", 
+            "description": "Bad named entity: OverBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OverBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "‾", 
+            "description": "Named entity: OverBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBrace", 
+            "description": "Bad named entity: OverBrace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OverBrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏞", 
+            "description": "Named entity: OverBrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverBracket", 
+            "description": "Bad named entity: OverBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OverBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎴", 
+            "description": "Named entity: OverBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&OverParenthesis", 
+            "description": "Bad named entity: OverParenthesis without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&OverParenthesis"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏜", 
+            "description": "Named entity: OverParenthesis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PartialD", 
+            "description": "Bad named entity: PartialD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&PartialD"
+                ]
+            ]
+        }, 
+        {
+            "input": "∂", 
+            "description": "Named entity: PartialD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pcy", 
+            "description": "Bad named entity: Pcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Pcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "П", 
+            "description": "Named entity: Pcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u041f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pfr", 
+            "description": "Bad named entity: Pfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Pfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔓", 
+            "description": "Named entity: Pfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Phi", 
+            "description": "Bad named entity: Phi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Phi"
+                ]
+            ]
+        }, 
+        {
+            "input": "Φ", 
+            "description": "Named entity: Phi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pi", 
+            "description": "Bad named entity: Pi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Pi"
+                ]
+            ]
+        }, 
+        {
+            "input": "Π", 
+            "description": "Named entity: Pi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PlusMinus", 
+            "description": "Bad named entity: PlusMinus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&PlusMinus"
+                ]
+            ]
+        }, 
+        {
+            "input": "±", 
+            "description": "Named entity: PlusMinus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Poincareplane", 
+            "description": "Bad named entity: Poincareplane without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Poincareplane"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℌ", 
+            "description": "Named entity: Poincareplane; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Popf", 
+            "description": "Bad named entity: Popf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Popf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℙ", 
+            "description": "Named entity: Popf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pr", 
+            "description": "Bad named entity: Pr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Pr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪻", 
+            "description": "Named entity: Pr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Precedes", 
+            "description": "Bad named entity: Precedes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Precedes"
+                ]
+            ]
+        }, 
+        {
+            "input": "≺", 
+            "description": "Named entity: Precedes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesEqual", 
+            "description": "Bad named entity: PrecedesEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&PrecedesEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯", 
+            "description": "Named entity: PrecedesEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesSlantEqual", 
+            "description": "Bad named entity: PrecedesSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&PrecedesSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≼", 
+            "description": "Named entity: PrecedesSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&PrecedesTilde", 
+            "description": "Bad named entity: PrecedesTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&PrecedesTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≾", 
+            "description": "Named entity: PrecedesTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Prime", 
+            "description": "Bad named entity: Prime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Prime"
+                ]
+            ]
+        }, 
+        {
+            "input": "″", 
+            "description": "Named entity: Prime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2033"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Product", 
+            "description": "Bad named entity: Product without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Product"
+                ]
+            ]
+        }, 
+        {
+            "input": "∏", 
+            "description": "Named entity: Product; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportion", 
+            "description": "Bad named entity: Proportion without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Proportion"
+                ]
+            ]
+        }, 
+        {
+            "input": "∷", 
+            "description": "Named entity: Proportion; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Proportional", 
+            "description": "Bad named entity: Proportional without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Proportional"
+                ]
+            ]
+        }, 
+        {
+            "input": "∝", 
+            "description": "Named entity: Proportional; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Pscr", 
+            "description": "Bad named entity: Pscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Pscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒫", 
+            "description": "Named entity: Pscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Psi", 
+            "description": "Bad named entity: Psi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Psi"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ψ", 
+            "description": "Named entity: Psi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a8"
+                ]
+            ]
+        }, 
+        {
+            "input": """, 
+            "description": "Named entity: QUOT without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": """, 
+            "description": "Named entity: QUOT; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qfr", 
+            "description": "Bad named entity: Qfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Qfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔔", 
+            "description": "Named entity: Qfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qopf", 
+            "description": "Bad named entity: Qopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Qopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℚ", 
+            "description": "Named entity: Qopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Qscr", 
+            "description": "Bad named entity: Qscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Qscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒬", 
+            "description": "Named entity: Qscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RBarr", 
+            "description": "Bad named entity: RBarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤐", 
+            "description": "Named entity: RBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2910"
+                ]
+            ]
+        }, 
+        {
+            "input": "®", 
+            "description": "Named entity: REG without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "®", 
+            "description": "Named entity: REG; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Racute", 
+            "description": "Bad named entity: Racute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Racute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŕ", 
+            "description": "Named entity: Racute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0154"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rang", 
+            "description": "Bad named entity: Rang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟫", 
+            "description": "Named entity: Rang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarr", 
+            "description": "Bad named entity: Rarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↠", 
+            "description": "Named entity: Rarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rarrtl", 
+            "description": "Bad named entity: Rarrtl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rarrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤖", 
+            "description": "Named entity: Rarrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2916"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcaron", 
+            "description": "Bad named entity: Rcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ř", 
+            "description": "Named entity: Rcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0158"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcedil", 
+            "description": "Bad named entity: Rcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŗ", 
+            "description": "Named entity: Rcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0156"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rcy", 
+            "description": "Bad named entity: Rcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Р", 
+            "description": "Named entity: Rcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0420"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Re", 
+            "description": "Bad named entity: Re without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Re"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℜ", 
+            "description": "Named entity: Re; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseElement", 
+            "description": "Bad named entity: ReverseElement without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ReverseElement"
+                ]
+            ]
+        }, 
+        {
+            "input": "∋", 
+            "description": "Named entity: ReverseElement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseEquilibrium", 
+            "description": "Bad named entity: ReverseEquilibrium without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ReverseEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇋", 
+            "description": "Named entity: ReverseEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ReverseUpEquilibrium", 
+            "description": "Bad named entity: ReverseUpEquilibrium without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ReverseUpEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥯", 
+            "description": "Named entity: ReverseUpEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rfr", 
+            "description": "Bad named entity: Rfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℜ", 
+            "description": "Named entity: Rfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rho", 
+            "description": "Bad named entity: Rho without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rho"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ρ", 
+            "description": "Named entity: Rho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightAngleBracket", 
+            "description": "Bad named entity: RightAngleBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightAngleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟩", 
+            "description": "Named entity: RightAngleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrow", 
+            "description": "Bad named entity: RightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "→", 
+            "description": "Named entity: RightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowBar", 
+            "description": "Bad named entity: RightArrowBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇥", 
+            "description": "Named entity: RightArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightArrowLeftArrow", 
+            "description": "Bad named entity: RightArrowLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightArrowLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇄", 
+            "description": "Named entity: RightArrowLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightCeiling", 
+            "description": "Bad named entity: RightCeiling without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightCeiling"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌉", 
+            "description": "Named entity: RightCeiling; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2309"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDoubleBracket", 
+            "description": "Bad named entity: RightDoubleBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightDoubleBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟧", 
+            "description": "Named entity: RightDoubleBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownTeeVector", 
+            "description": "Bad named entity: RightDownTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightDownTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥝", 
+            "description": "Named entity: RightDownTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVector", 
+            "description": "Bad named entity: RightDownVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇂", 
+            "description": "Named entity: RightDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightDownVectorBar", 
+            "description": "Bad named entity: RightDownVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightDownVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥕", 
+            "description": "Named entity: RightDownVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2955"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightFloor", 
+            "description": "Bad named entity: RightFloor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightFloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌋", 
+            "description": "Named entity: RightFloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTee", 
+            "description": "Bad named entity: RightTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊢", 
+            "description": "Named entity: RightTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeArrow", 
+            "description": "Bad named entity: RightTeeArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↦", 
+            "description": "Named entity: RightTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTeeVector", 
+            "description": "Bad named entity: RightTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥛", 
+            "description": "Named entity: RightTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangle", 
+            "description": "Bad named entity: RightTriangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊳", 
+            "description": "Named entity: RightTriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleBar", 
+            "description": "Bad named entity: RightTriangleBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTriangleBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧐", 
+            "description": "Named entity: RightTriangleBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightTriangleEqual", 
+            "description": "Bad named entity: RightTriangleEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightTriangleEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊵", 
+            "description": "Named entity: RightTriangleEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpDownVector", 
+            "description": "Bad named entity: RightUpDownVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightUpDownVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥏", 
+            "description": "Named entity: RightUpDownVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpTeeVector", 
+            "description": "Bad named entity: RightUpTeeVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightUpTeeVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥜", 
+            "description": "Named entity: RightUpTeeVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u295c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVector", 
+            "description": "Bad named entity: RightUpVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightUpVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "↾", 
+            "description": "Named entity: RightUpVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightUpVectorBar", 
+            "description": "Bad named entity: RightUpVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightUpVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥔", 
+            "description": "Named entity: RightUpVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2954"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVector", 
+            "description": "Bad named entity: RightVector without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightVector"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇀", 
+            "description": "Named entity: RightVector; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RightVectorBar", 
+            "description": "Bad named entity: RightVectorBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RightVectorBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥓", 
+            "description": "Named entity: RightVectorBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2953"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rightarrow", 
+            "description": "Bad named entity: Rightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇒", 
+            "description": "Named entity: Rightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ropf", 
+            "description": "Bad named entity: Ropf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ropf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℝ", 
+            "description": "Named entity: Ropf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RoundImplies", 
+            "description": "Bad named entity: RoundImplies without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RoundImplies"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥰", 
+            "description": "Named entity: RoundImplies; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2970"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rrightarrow", 
+            "description": "Bad named entity: Rrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇛", 
+            "description": "Named entity: Rrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rscr", 
+            "description": "Bad named entity: Rscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℛ", 
+            "description": "Named entity: Rscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Rsh", 
+            "description": "Bad named entity: Rsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Rsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↱", 
+            "description": "Named entity: Rsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&RuleDelayed", 
+            "description": "Bad named entity: RuleDelayed without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&RuleDelayed"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧴", 
+            "description": "Named entity: RuleDelayed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHCHcy", 
+            "description": "Bad named entity: SHCHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SHCHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Щ", 
+            "description": "Named entity: SHCHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0429"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SHcy", 
+            "description": "Bad named entity: SHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ш", 
+            "description": "Named entity: SHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0428"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SOFTcy", 
+            "description": "Bad named entity: SOFTcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SOFTcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ь", 
+            "description": "Named entity: SOFTcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sacute", 
+            "description": "Bad named entity: Sacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ś", 
+            "description": "Named entity: Sacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sc", 
+            "description": "Bad named entity: Sc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪼", 
+            "description": "Named entity: Sc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scaron", 
+            "description": "Bad named entity: Scaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Scaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Š", 
+            "description": "Named entity: Scaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0160"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scedil", 
+            "description": "Bad named entity: Scedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Scedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ş", 
+            "description": "Named entity: Scedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scirc", 
+            "description": "Bad named entity: Scirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Scirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŝ", 
+            "description": "Named entity: Scirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Scy", 
+            "description": "Bad named entity: Scy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Scy"
+                ]
+            ]
+        }, 
+        {
+            "input": "С", 
+            "description": "Named entity: Scy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0421"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sfr", 
+            "description": "Bad named entity: Sfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔖", 
+            "description": "Named entity: Sfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd16"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortDownArrow", 
+            "description": "Bad named entity: ShortDownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ShortDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↓", 
+            "description": "Named entity: ShortDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortLeftArrow", 
+            "description": "Bad named entity: ShortLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ShortLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "←", 
+            "description": "Named entity: ShortLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortRightArrow", 
+            "description": "Bad named entity: ShortRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ShortRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "→", 
+            "description": "Named entity: ShortRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ShortUpArrow", 
+            "description": "Bad named entity: ShortUpArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ShortUpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↑", 
+            "description": "Named entity: ShortUpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sigma", 
+            "description": "Bad named entity: Sigma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "Σ", 
+            "description": "Named entity: Sigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SmallCircle", 
+            "description": "Bad named entity: SmallCircle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SmallCircle"
+                ]
+            ]
+        }, 
+        {
+            "input": "∘", 
+            "description": "Named entity: SmallCircle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2218"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sopf", 
+            "description": "Bad named entity: Sopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕊", 
+            "description": "Named entity: Sopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sqrt", 
+            "description": "Bad named entity: Sqrt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sqrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "√", 
+            "description": "Named entity: Sqrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Square", 
+            "description": "Bad named entity: Square without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Square"
+                ]
+            ]
+        }, 
+        {
+            "input": "□", 
+            "description": "Named entity: Square; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareIntersection", 
+            "description": "Bad named entity: SquareIntersection without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareIntersection"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊓", 
+            "description": "Named entity: SquareIntersection; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubset", 
+            "description": "Bad named entity: SquareSubset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareSubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊏", 
+            "description": "Named entity: SquareSubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSubsetEqual", 
+            "description": "Bad named entity: SquareSubsetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareSubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊑", 
+            "description": "Named entity: SquareSubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSuperset", 
+            "description": "Bad named entity: SquareSuperset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareSuperset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊐", 
+            "description": "Named entity: SquareSuperset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareSupersetEqual", 
+            "description": "Bad named entity: SquareSupersetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareSupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊒", 
+            "description": "Named entity: SquareSupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SquareUnion", 
+            "description": "Bad named entity: SquareUnion without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SquareUnion"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊔", 
+            "description": "Named entity: SquareUnion; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sscr", 
+            "description": "Bad named entity: Sscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒮", 
+            "description": "Named entity: Sscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Star", 
+            "description": "Bad named entity: Star without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Star"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋆", 
+            "description": "Named entity: Star; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sub", 
+            "description": "Bad named entity: Sub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋐", 
+            "description": "Named entity: Sub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Subset", 
+            "description": "Bad named entity: Subset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Subset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋐", 
+            "description": "Named entity: Subset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SubsetEqual", 
+            "description": "Bad named entity: SubsetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SubsetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊆", 
+            "description": "Named entity: SubsetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Succeeds", 
+            "description": "Bad named entity: Succeeds without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Succeeds"
+                ]
+            ]
+        }, 
+        {
+            "input": "≻", 
+            "description": "Named entity: Succeeds; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsEqual", 
+            "description": "Bad named entity: SucceedsEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SucceedsEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰", 
+            "description": "Named entity: SucceedsEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsSlantEqual", 
+            "description": "Bad named entity: SucceedsSlantEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SucceedsSlantEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≽", 
+            "description": "Named entity: SucceedsSlantEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SucceedsTilde", 
+            "description": "Bad named entity: SucceedsTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SucceedsTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≿", 
+            "description": "Named entity: SucceedsTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SuchThat", 
+            "description": "Bad named entity: SuchThat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SuchThat"
+                ]
+            ]
+        }, 
+        {
+            "input": "∋", 
+            "description": "Named entity: SuchThat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sum", 
+            "description": "Bad named entity: Sum without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sum"
+                ]
+            ]
+        }, 
+        {
+            "input": "∑", 
+            "description": "Named entity: Sum; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2211"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Sup", 
+            "description": "Bad named entity: Sup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Sup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋑", 
+            "description": "Named entity: Sup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Superset", 
+            "description": "Bad named entity: Superset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Superset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃", 
+            "description": "Named entity: Superset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&SupersetEqual", 
+            "description": "Bad named entity: SupersetEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&SupersetEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊇", 
+            "description": "Named entity: SupersetEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Supset", 
+            "description": "Bad named entity: Supset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Supset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋑", 
+            "description": "Named entity: Supset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "Þ", 
+            "description": "Named entity: THORN without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00de"
+                ]
+            ]
+        }, 
+        {
+            "input": "Þ", 
+            "description": "Named entity: THORN; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TRADE", 
+            "description": "Bad named entity: TRADE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TRADE"
+                ]
+            ]
+        }, 
+        {
+            "input": "™", 
+            "description": "Named entity: TRADE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TSHcy", 
+            "description": "Bad named entity: TSHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TSHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ћ", 
+            "description": "Named entity: TSHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TScy", 
+            "description": "Bad named entity: TScy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TScy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ц", 
+            "description": "Named entity: TScy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0426"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tab", 
+            "description": "Bad named entity: Tab without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tab"
+                ]
+            ]
+        }, 
+        {
+            "input": "	", 
+            "description": "Named entity: Tab; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\t"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tau", 
+            "description": "Bad named entity: Tau without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tau"
+                ]
+            ]
+        }, 
+        {
+            "input": "Τ", 
+            "description": "Named entity: Tau; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcaron", 
+            "description": "Bad named entity: Tcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ť", 
+            "description": "Named entity: Tcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0164"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcedil", 
+            "description": "Bad named entity: Tcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ţ", 
+            "description": "Named entity: Tcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0162"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tcy", 
+            "description": "Bad named entity: Tcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Т", 
+            "description": "Named entity: Tcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0422"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tfr", 
+            "description": "Bad named entity: Tfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔗", 
+            "description": "Named entity: Tfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd17"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Therefore", 
+            "description": "Bad named entity: Therefore without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Therefore"
+                ]
+            ]
+        }, 
+        {
+            "input": "∴", 
+            "description": "Named entity: Therefore; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Theta", 
+            "description": "Bad named entity: Theta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Theta"
+                ]
+            ]
+        }, 
+        {
+            "input": "Θ", 
+            "description": "Named entity: Theta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0398"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThickSpace", 
+            "description": "Bad named entity: ThickSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ThickSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "  ", 
+            "description": "Named entity: ThickSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u205f\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ThinSpace", 
+            "description": "Bad named entity: ThinSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: ThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2009"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tilde", 
+            "description": "Bad named entity: Tilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "∼", 
+            "description": "Named entity: Tilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeEqual", 
+            "description": "Bad named entity: TildeEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TildeEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≃", 
+            "description": "Named entity: TildeEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeFullEqual", 
+            "description": "Bad named entity: TildeFullEqual without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TildeFullEqual"
+                ]
+            ]
+        }, 
+        {
+            "input": "≅", 
+            "description": "Named entity: TildeFullEqual; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2245"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TildeTilde", 
+            "description": "Bad named entity: TildeTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TildeTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: TildeTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Topf", 
+            "description": "Bad named entity: Topf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Topf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕋", 
+            "description": "Named entity: Topf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&TripleDot", 
+            "description": "Bad named entity: TripleDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&TripleDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⃛", 
+            "description": "Named entity: TripleDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tscr", 
+            "description": "Bad named entity: Tscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒯", 
+            "description": "Named entity: Tscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Tstrok", 
+            "description": "Bad named entity: Tstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Tstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŧ", 
+            "description": "Named entity: Tstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0166"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ú", 
+            "description": "Named entity: Uacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00da"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ú", 
+            "description": "Named entity: Uacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarr", 
+            "description": "Bad named entity: Uarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↟", 
+            "description": "Named entity: Uarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uarrocir", 
+            "description": "Bad named entity: Uarrocir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uarrocir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥉", 
+            "description": "Named entity: Uarrocir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2949"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubrcy", 
+            "description": "Bad named entity: Ubrcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ubrcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ў", 
+            "description": "Named entity: Ubrcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u040e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ubreve", 
+            "description": "Bad named entity: Ubreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ubreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŭ", 
+            "description": "Named entity: Ubreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016c"
+                ]
+            ]
+        }, 
+        {
+            "input": "Û", 
+            "description": "Named entity: Ucirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00db"
+                ]
+            ]
+        }, 
+        {
+            "input": "Û", 
+            "description": "Named entity: Ucirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ucy", 
+            "description": "Bad named entity: Ucy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "У", 
+            "description": "Named entity: Ucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0423"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Udblac", 
+            "description": "Bad named entity: Udblac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Udblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ű", 
+            "description": "Named entity: Udblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0170"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ufr", 
+            "description": "Bad named entity: Ufr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ufr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔘", 
+            "description": "Named entity: Ufr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd18"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ù", 
+            "description": "Named entity: Ugrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ù", 
+            "description": "Named entity: Ugrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Umacr", 
+            "description": "Bad named entity: Umacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Umacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ū", 
+            "description": "Named entity: Umacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBar", 
+            "description": "Bad named entity: UnderBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UnderBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "_", 
+            "description": "Named entity: UnderBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "_"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBrace", 
+            "description": "Bad named entity: UnderBrace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UnderBrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏟", 
+            "description": "Named entity: UnderBrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderBracket", 
+            "description": "Bad named entity: UnderBracket without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UnderBracket"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎵", 
+            "description": "Named entity: UnderBracket; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnderParenthesis", 
+            "description": "Bad named entity: UnderParenthesis without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UnderParenthesis"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏝", 
+            "description": "Named entity: UnderParenthesis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Union", 
+            "description": "Bad named entity: Union without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Union"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋃", 
+            "description": "Named entity: Union; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UnionPlus", 
+            "description": "Bad named entity: UnionPlus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UnionPlus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊎", 
+            "description": "Named entity: UnionPlus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uogon", 
+            "description": "Bad named entity: Uogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ų", 
+            "description": "Named entity: Uogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0172"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uopf", 
+            "description": "Bad named entity: Uopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕌", 
+            "description": "Named entity: Uopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrow", 
+            "description": "Bad named entity: UpArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↑", 
+            "description": "Named entity: UpArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowBar", 
+            "description": "Bad named entity: UpArrowBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpArrowBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤒", 
+            "description": "Named entity: UpArrowBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2912"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpArrowDownArrow", 
+            "description": "Bad named entity: UpArrowDownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpArrowDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇅", 
+            "description": "Named entity: UpArrowDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpDownArrow", 
+            "description": "Bad named entity: UpDownArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpDownArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↕", 
+            "description": "Named entity: UpDownArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpEquilibrium", 
+            "description": "Bad named entity: UpEquilibrium without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpEquilibrium"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥮", 
+            "description": "Named entity: UpEquilibrium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTee", 
+            "description": "Bad named entity: UpTee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpTee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊥", 
+            "description": "Named entity: UpTee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpTeeArrow", 
+            "description": "Bad named entity: UpTeeArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpTeeArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↥", 
+            "description": "Named entity: UpTeeArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uparrow", 
+            "description": "Bad named entity: Uparrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uparrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇑", 
+            "description": "Named entity: Uparrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Updownarrow", 
+            "description": "Bad named entity: Updownarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Updownarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇕", 
+            "description": "Named entity: Updownarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperLeftArrow", 
+            "description": "Bad named entity: UpperLeftArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpperLeftArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↖", 
+            "description": "Named entity: UpperLeftArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&UpperRightArrow", 
+            "description": "Bad named entity: UpperRightArrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&UpperRightArrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↗", 
+            "description": "Named entity: UpperRightArrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsi", 
+            "description": "Bad named entity: Upsi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Upsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϒ", 
+            "description": "Named entity: Upsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Upsilon", 
+            "description": "Bad named entity: Upsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Upsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "Υ", 
+            "description": "Named entity: Upsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uring", 
+            "description": "Bad named entity: Uring without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uring"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ů", 
+            "description": "Named entity: Uring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Uscr", 
+            "description": "Bad named entity: Uscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Uscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒰", 
+            "description": "Named entity: Uscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Utilde", 
+            "description": "Bad named entity: Utilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Utilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ũ", 
+            "description": "Named entity: Utilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0168"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ü", 
+            "description": "Named entity: Uuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ü", 
+            "description": "Named entity: Uuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VDash", 
+            "description": "Bad named entity: VDash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊫", 
+            "description": "Named entity: VDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vbar", 
+            "description": "Bad named entity: Vbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫫", 
+            "description": "Named entity: Vbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aeb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vcy", 
+            "description": "Bad named entity: Vcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "В", 
+            "description": "Named entity: Vcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0412"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdash", 
+            "description": "Bad named entity: Vdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊩", 
+            "description": "Named entity: Vdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vdashl", 
+            "description": "Bad named entity: Vdashl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vdashl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫦", 
+            "description": "Named entity: Vdashl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vee", 
+            "description": "Bad named entity: Vee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋁", 
+            "description": "Named entity: Vee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Verbar", 
+            "description": "Bad named entity: Verbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Verbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "‖", 
+            "description": "Named entity: Verbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2016"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vert", 
+            "description": "Bad named entity: Vert without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vert"
+                ]
+            ]
+        }, 
+        {
+            "input": "‖", 
+            "description": "Named entity: Vert; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2016"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalBar", 
+            "description": "Bad named entity: VerticalBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VerticalBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∣", 
+            "description": "Named entity: VerticalBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalLine", 
+            "description": "Bad named entity: VerticalLine without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VerticalLine"
+                ]
+            ]
+        }, 
+        {
+            "input": "|", 
+            "description": "Named entity: VerticalLine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalSeparator", 
+            "description": "Bad named entity: VerticalSeparator without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VerticalSeparator"
+                ]
+            ]
+        }, 
+        {
+            "input": "❘", 
+            "description": "Named entity: VerticalSeparator; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2758"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VerticalTilde", 
+            "description": "Bad named entity: VerticalTilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VerticalTilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "≀", 
+            "description": "Named entity: VerticalTilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&VeryThinSpace", 
+            "description": "Bad named entity: VeryThinSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&VeryThinSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: VeryThinSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vfr", 
+            "description": "Bad named entity: Vfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔙", 
+            "description": "Named entity: Vfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd19"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vopf", 
+            "description": "Bad named entity: Vopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕍", 
+            "description": "Named entity: Vopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vscr", 
+            "description": "Bad named entity: Vscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒱", 
+            "description": "Named entity: Vscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Vvdash", 
+            "description": "Bad named entity: Vvdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Vvdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊪", 
+            "description": "Named entity: Vvdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wcirc", 
+            "description": "Bad named entity: Wcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Wcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŵ", 
+            "description": "Named entity: Wcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0174"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wedge", 
+            "description": "Bad named entity: Wedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Wedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋀", 
+            "description": "Named entity: Wedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wfr", 
+            "description": "Bad named entity: Wfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Wfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔚", 
+            "description": "Named entity: Wfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wopf", 
+            "description": "Bad named entity: Wopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Wopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕎", 
+            "description": "Named entity: Wopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Wscr", 
+            "description": "Bad named entity: Wscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Wscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒲", 
+            "description": "Named entity: Wscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xfr", 
+            "description": "Bad named entity: Xfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Xfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔛", 
+            "description": "Named entity: Xfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xi", 
+            "description": "Bad named entity: Xi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Xi"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ξ", 
+            "description": "Named entity: Xi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u039e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xopf", 
+            "description": "Bad named entity: Xopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Xopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕏", 
+            "description": "Named entity: Xopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd4f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Xscr", 
+            "description": "Bad named entity: Xscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Xscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒳", 
+            "description": "Named entity: Xscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YAcy", 
+            "description": "Bad named entity: YAcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&YAcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Я", 
+            "description": "Named entity: YAcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YIcy", 
+            "description": "Bad named entity: YIcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&YIcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ї", 
+            "description": "Named entity: YIcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0407"
+                ]
+            ]
+        }, 
+        {
+            "input": "&YUcy", 
+            "description": "Bad named entity: YUcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&YUcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ю", 
+            "description": "Named entity: YUcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042e"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ý", 
+            "description": "Named entity: Yacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ý", 
+            "description": "Named entity: Yacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycirc", 
+            "description": "Bad named entity: Ycirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ycirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ŷ", 
+            "description": "Named entity: Ycirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0176"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Ycy", 
+            "description": "Bad named entity: Ycy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Ycy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ы", 
+            "description": "Named entity: Ycy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u042b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yfr", 
+            "description": "Bad named entity: Yfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Yfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔜", 
+            "description": "Named entity: Yfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yopf", 
+            "description": "Bad named entity: Yopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Yopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕐", 
+            "description": "Named entity: Yopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd50"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yscr", 
+            "description": "Bad named entity: Yscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Yscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒴", 
+            "description": "Named entity: Yscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Yuml", 
+            "description": "Bad named entity: Yuml without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Yuml"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ÿ", 
+            "description": "Named entity: Yuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0178"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZHcy", 
+            "description": "Bad named entity: ZHcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ZHcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ж", 
+            "description": "Named entity: ZHcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0416"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zacute", 
+            "description": "Bad named entity: Zacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ź", 
+            "description": "Named entity: Zacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0179"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcaron", 
+            "description": "Bad named entity: Zcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ž", 
+            "description": "Named entity: Zcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zcy", 
+            "description": "Bad named entity: Zcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "З", 
+            "description": "Named entity: Zcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0417"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zdot", 
+            "description": "Bad named entity: Zdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ż", 
+            "description": "Named entity: Zdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ZeroWidthSpace", 
+            "description": "Bad named entity: ZeroWidthSpace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ZeroWidthSpace"
+                ]
+            ]
+        }, 
+        {
+            "input": "​", 
+            "description": "Named entity: ZeroWidthSpace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zeta", 
+            "description": "Bad named entity: Zeta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zeta"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ζ", 
+            "description": "Named entity: Zeta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0396"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zfr", 
+            "description": "Bad named entity: Zfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℨ", 
+            "description": "Named entity: Zfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zopf", 
+            "description": "Bad named entity: Zopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℤ", 
+            "description": "Named entity: Zopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&Zscr", 
+            "description": "Bad named entity: Zscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&Zscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒵", 
+            "description": "Named entity: Zscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb5"
+                ]
+            ]
+        }, 
+        {
+            "input": "á", 
+            "description": "Named entity: aacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "á", 
+            "description": "Named entity: aacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&abreve", 
+            "description": "Bad named entity: abreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&abreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "ă", 
+            "description": "Named entity: abreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0103"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ac", 
+            "description": "Bad named entity: ac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "∾", 
+            "description": "Named entity: ac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acE", 
+            "description": "Bad named entity: acE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&acE"
+                ]
+            ]
+        }, 
+        {
+            "input": "∾̳", 
+            "description": "Named entity: acE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e\u0333"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acd", 
+            "description": "Bad named entity: acd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&acd"
+                ]
+            ]
+        }, 
+        {
+            "input": "∿", 
+            "description": "Named entity: acd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223f"
+                ]
+            ]
+        }, 
+        {
+            "input": "â", 
+            "description": "Named entity: acirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "â", 
+            "description": "Named entity: acirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "´", 
+            "description": "Named entity: acute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "´", 
+            "description": "Named entity: acute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&acy", 
+            "description": "Bad named entity: acy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&acy"
+                ]
+            ]
+        }, 
+        {
+            "input": "а", 
+            "description": "Named entity: acy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0430"
+                ]
+            ]
+        }, 
+        {
+            "input": "æ", 
+            "description": "Named entity: aelig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "æ", 
+            "description": "Named entity: aelig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&af", 
+            "description": "Bad named entity: af without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&af"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁡", 
+            "description": "Named entity: af; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2061"
+                ]
+            ]
+        }, 
+        {
+            "input": "&afr", 
+            "description": "Bad named entity: afr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&afr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔞", 
+            "description": "Named entity: afr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1e"
+                ]
+            ]
+        }, 
+        {
+            "input": "à", 
+            "description": "Named entity: agrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "à", 
+            "description": "Named entity: agrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alefsym", 
+            "description": "Bad named entity: alefsym without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&alefsym"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℵ", 
+            "description": "Named entity: alefsym; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aleph", 
+            "description": "Bad named entity: aleph without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&aleph"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℵ", 
+            "description": "Named entity: aleph; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&alpha", 
+            "description": "Bad named entity: alpha without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&alpha"
+                ]
+            ]
+        }, 
+        {
+            "input": "α", 
+            "description": "Named entity: alpha; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amacr", 
+            "description": "Bad named entity: amacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&amacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ā", 
+            "description": "Named entity: amacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0101"
+                ]
+            ]
+        }, 
+        {
+            "input": "&amalg", 
+            "description": "Bad named entity: amalg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&amalg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨿", 
+            "description": "Named entity: amalg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&", 
+            "description": "Named entity: amp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&", 
+            "description": "Named entity: amp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&"
+                ]
+            ]
+        }, 
+        {
+            "input": "&and", 
+            "description": "Bad named entity: and without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&and"
+                ]
+            ]
+        }, 
+        {
+            "input": "∧", 
+            "description": "Named entity: and; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2227"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andand", 
+            "description": "Bad named entity: andand without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&andand"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩕", 
+            "description": "Named entity: andand; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a55"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andd", 
+            "description": "Bad named entity: andd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&andd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩜", 
+            "description": "Named entity: andd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andslope", 
+            "description": "Bad named entity: andslope without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&andslope"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩘", 
+            "description": "Named entity: andslope; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a58"
+                ]
+            ]
+        }, 
+        {
+            "input": "&andv", 
+            "description": "Bad named entity: andv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&andv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩚", 
+            "description": "Named entity: andv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ang", 
+            "description": "Bad named entity: ang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ang"
+                ]
+            ]
+        }, 
+        {
+            "input": "∠", 
+            "description": "Named entity: ang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ange", 
+            "description": "Bad named entity: ange without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ange"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦤", 
+            "description": "Named entity: ange; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angle", 
+            "description": "Bad named entity: angle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angle"
+                ]
+            ]
+        }, 
+        {
+            "input": "∠", 
+            "description": "Named entity: angle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsd", 
+            "description": "Bad named entity: angmsd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsd"
+                ]
+            ]
+        }, 
+        {
+            "input": "∡", 
+            "description": "Named entity: angmsd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2221"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaa", 
+            "description": "Bad named entity: angmsdaa without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦨", 
+            "description": "Named entity: angmsdaa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdab", 
+            "description": "Bad named entity: angmsdab without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdab"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦩", 
+            "description": "Named entity: angmsdab; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdac", 
+            "description": "Bad named entity: angmsdac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdac"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦪", 
+            "description": "Named entity: angmsdac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdad", 
+            "description": "Bad named entity: angmsdad without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdad"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦫", 
+            "description": "Named entity: angmsdad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdae", 
+            "description": "Bad named entity: angmsdae without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdae"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦬", 
+            "description": "Named entity: angmsdae; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdaf", 
+            "description": "Bad named entity: angmsdaf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦭", 
+            "description": "Named entity: angmsdaf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdag", 
+            "description": "Bad named entity: angmsdag without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdag"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦮", 
+            "description": "Named entity: angmsdag; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angmsdah", 
+            "description": "Bad named entity: angmsdah without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angmsdah"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦯", 
+            "description": "Named entity: angmsdah; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrt", 
+            "description": "Bad named entity: angrt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "∟", 
+            "description": "Named entity: angrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvb", 
+            "description": "Bad named entity: angrtvb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angrtvb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊾", 
+            "description": "Named entity: angrtvb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angrtvbd", 
+            "description": "Bad named entity: angrtvbd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angrtvbd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦝", 
+            "description": "Named entity: angrtvbd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angsph", 
+            "description": "Bad named entity: angsph without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angsph"
+                ]
+            ]
+        }, 
+        {
+            "input": "∢", 
+            "description": "Named entity: angsph; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2222"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angst", 
+            "description": "Bad named entity: angst without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angst"
+                ]
+            ]
+        }, 
+        {
+            "input": "Å", 
+            "description": "Named entity: angst; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&angzarr", 
+            "description": "Bad named entity: angzarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&angzarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⍼", 
+            "description": "Named entity: angzarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u237c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aogon", 
+            "description": "Bad named entity: aogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&aogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ą", 
+            "description": "Named entity: aogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0105"
+                ]
+            ]
+        }, 
+        {
+            "input": "&aopf", 
+            "description": "Bad named entity: aopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&aopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕒", 
+            "description": "Named entity: aopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd52"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ap", 
+            "description": "Bad named entity: ap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: ap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apE", 
+            "description": "Bad named entity: apE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&apE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩰", 
+            "description": "Named entity: apE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a70"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apacir", 
+            "description": "Bad named entity: apacir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&apacir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩯", 
+            "description": "Named entity: apacir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ape", 
+            "description": "Bad named entity: ape without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ape"
+                ]
+            ]
+        }, 
+        {
+            "input": "≊", 
+            "description": "Named entity: ape; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apid", 
+            "description": "Bad named entity: apid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&apid"
+                ]
+            ]
+        }, 
+        {
+            "input": "≋", 
+            "description": "Named entity: apid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&apos", 
+            "description": "Bad named entity: apos without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&apos"
+                ]
+            ]
+        }, 
+        {
+            "input": "'", 
+            "description": "Named entity: apos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "'"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approx", 
+            "description": "Bad named entity: approx without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&approx"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: approx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&approxeq", 
+            "description": "Bad named entity: approxeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&approxeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≊", 
+            "description": "Named entity: approxeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224a"
+                ]
+            ]
+        }, 
+        {
+            "input": "å", 
+            "description": "Named entity: aring without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "å", 
+            "description": "Named entity: aring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ascr", 
+            "description": "Bad named entity: ascr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ascr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒶", 
+            "description": "Named entity: ascr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ast", 
+            "description": "Bad named entity: ast without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ast"
+                ]
+            ]
+        }, 
+        {
+            "input": "*", 
+            "description": "Named entity: ast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "*"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asymp", 
+            "description": "Bad named entity: asymp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&asymp"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: asymp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&asympeq", 
+            "description": "Bad named entity: asympeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&asympeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≍", 
+            "description": "Named entity: asympeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d"
+                ]
+            ]
+        }, 
+        {
+            "input": "ã", 
+            "description": "Named entity: atilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "ã", 
+            "description": "Named entity: atilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "ä", 
+            "description": "Named entity: auml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "ä", 
+            "description": "Named entity: auml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awconint", 
+            "description": "Bad named entity: awconint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&awconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∳", 
+            "description": "Named entity: awconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2233"
+                ]
+            ]
+        }, 
+        {
+            "input": "&awint", 
+            "description": "Bad named entity: awint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&awint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨑", 
+            "description": "Named entity: awint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a11"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bNot", 
+            "description": "Bad named entity: bNot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bNot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫭", 
+            "description": "Named entity: bNot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backcong", 
+            "description": "Bad named entity: backcong without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&backcong"
+                ]
+            ]
+        }, 
+        {
+            "input": "≌", 
+            "description": "Named entity: backcong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backepsilon", 
+            "description": "Bad named entity: backepsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&backepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "϶", 
+            "description": "Named entity: backepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backprime", 
+            "description": "Bad named entity: backprime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&backprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "‵", 
+            "description": "Named entity: backprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2035"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsim", 
+            "description": "Bad named entity: backsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&backsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∽", 
+            "description": "Named entity: backsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&backsimeq", 
+            "description": "Bad named entity: backsimeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&backsimeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋍", 
+            "description": "Named entity: backsimeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barvee", 
+            "description": "Bad named entity: barvee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&barvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊽", 
+            "description": "Named entity: barvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwed", 
+            "description": "Bad named entity: barwed without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&barwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌅", 
+            "description": "Named entity: barwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2305"
+                ]
+            ]
+        }, 
+        {
+            "input": "&barwedge", 
+            "description": "Bad named entity: barwedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&barwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌅", 
+            "description": "Named entity: barwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2305"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrk", 
+            "description": "Bad named entity: bbrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎵", 
+            "description": "Named entity: bbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bbrktbrk", 
+            "description": "Bad named entity: bbrktbrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bbrktbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎶", 
+            "description": "Named entity: bbrktbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcong", 
+            "description": "Bad named entity: bcong without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bcong"
+                ]
+            ]
+        }, 
+        {
+            "input": "≌", 
+            "description": "Named entity: bcong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bcy", 
+            "description": "Bad named entity: bcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "б", 
+            "description": "Named entity: bcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0431"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bdquo", 
+            "description": "Bad named entity: bdquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bdquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "„", 
+            "description": "Named entity: bdquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&becaus", 
+            "description": "Bad named entity: becaus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&becaus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∵", 
+            "description": "Named entity: becaus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&because", 
+            "description": "Bad named entity: because without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&because"
+                ]
+            ]
+        }, 
+        {
+            "input": "∵", 
+            "description": "Named entity: because; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2235"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bemptyv", 
+            "description": "Bad named entity: bemptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦰", 
+            "description": "Named entity: bemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bepsi", 
+            "description": "Bad named entity: bepsi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bepsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "϶", 
+            "description": "Named entity: bepsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bernou", 
+            "description": "Bad named entity: bernou without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bernou"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℬ", 
+            "description": "Named entity: bernou; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beta", 
+            "description": "Bad named entity: beta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&beta"
+                ]
+            ]
+        }, 
+        {
+            "input": "β", 
+            "description": "Named entity: beta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&beth", 
+            "description": "Bad named entity: beth without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&beth"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℶ", 
+            "description": "Named entity: beth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2136"
+                ]
+            ]
+        }, 
+        {
+            "input": "&between", 
+            "description": "Bad named entity: between without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&between"
+                ]
+            ]
+        }, 
+        {
+            "input": "≬", 
+            "description": "Named entity: between; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bfr", 
+            "description": "Bad named entity: bfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔟", 
+            "description": "Named entity: bfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd1f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcap", 
+            "description": "Bad named entity: bigcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋂", 
+            "description": "Named entity: bigcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcirc", 
+            "description": "Bad named entity: bigcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "◯", 
+            "description": "Named entity: bigcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigcup", 
+            "description": "Bad named entity: bigcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋃", 
+            "description": "Named entity: bigcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigodot", 
+            "description": "Bad named entity: bigodot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨀", 
+            "description": "Named entity: bigodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigoplus", 
+            "description": "Bad named entity: bigoplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigoplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨁", 
+            "description": "Named entity: bigoplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigotimes", 
+            "description": "Bad named entity: bigotimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨂", 
+            "description": "Named entity: bigotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigsqcup", 
+            "description": "Bad named entity: bigsqcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigsqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨆", 
+            "description": "Named entity: bigsqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a06"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigstar", 
+            "description": "Bad named entity: bigstar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigstar"
+                ]
+            ]
+        }, 
+        {
+            "input": "★", 
+            "description": "Named entity: bigstar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2605"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangledown", 
+            "description": "Bad named entity: bigtriangledown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigtriangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "▽", 
+            "description": "Named entity: bigtriangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigtriangleup", 
+            "description": "Bad named entity: bigtriangleup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigtriangleup"
+                ]
+            ]
+        }, 
+        {
+            "input": "△", 
+            "description": "Named entity: bigtriangleup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&biguplus", 
+            "description": "Bad named entity: biguplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&biguplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨄", 
+            "description": "Named entity: biguplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigvee", 
+            "description": "Bad named entity: bigvee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋁", 
+            "description": "Named entity: bigvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bigwedge", 
+            "description": "Bad named entity: bigwedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bigwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋀", 
+            "description": "Named entity: bigwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bkarow", 
+            "description": "Bad named entity: bkarow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤍", 
+            "description": "Named entity: bkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacklozenge", 
+            "description": "Bad named entity: blacklozenge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacklozenge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧫", 
+            "description": "Named entity: blacklozenge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacksquare", 
+            "description": "Bad named entity: blacksquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacksquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "▪", 
+            "description": "Named entity: blacksquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangle", 
+            "description": "Bad named entity: blacktriangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacktriangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "▴", 
+            "description": "Named entity: blacktriangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangledown", 
+            "description": "Bad named entity: blacktriangledown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacktriangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "▾", 
+            "description": "Named entity: blacktriangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleleft", 
+            "description": "Bad named entity: blacktriangleleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacktriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "◂", 
+            "description": "Named entity: blacktriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blacktriangleright", 
+            "description": "Bad named entity: blacktriangleright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blacktriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "▸", 
+            "description": "Named entity: blacktriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blank", 
+            "description": "Bad named entity: blank without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blank"
+                ]
+            ]
+        }, 
+        {
+            "input": "␣", 
+            "description": "Named entity: blank; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2423"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk12", 
+            "description": "Bad named entity: blk12 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blk12"
+                ]
+            ]
+        }, 
+        {
+            "input": "▒", 
+            "description": "Named entity: blk12; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2592"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk14", 
+            "description": "Bad named entity: blk14 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blk14"
+                ]
+            ]
+        }, 
+        {
+            "input": "░", 
+            "description": "Named entity: blk14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2591"
+                ]
+            ]
+        }, 
+        {
+            "input": "&blk34", 
+            "description": "Bad named entity: blk34 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&blk34"
+                ]
+            ]
+        }, 
+        {
+            "input": "▓", 
+            "description": "Named entity: blk34; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2593"
+                ]
+            ]
+        }, 
+        {
+            "input": "&block", 
+            "description": "Bad named entity: block without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&block"
+                ]
+            ]
+        }, 
+        {
+            "input": "█", 
+            "description": "Named entity: block; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2588"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bne", 
+            "description": "Bad named entity: bne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bne"
+                ]
+            ]
+        }, 
+        {
+            "input": "=⃥", 
+            "description": "Named entity: bne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "=\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnequiv", 
+            "description": "Bad named entity: bnequiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bnequiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "≡⃥", 
+            "description": "Named entity: bnequiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bnot", 
+            "description": "Bad named entity: bnot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bnot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌐", 
+            "description": "Named entity: bnot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2310"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bopf", 
+            "description": "Bad named entity: bopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕓", 
+            "description": "Named entity: bopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd53"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bot", 
+            "description": "Bad named entity: bot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊥", 
+            "description": "Named entity: bot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bottom", 
+            "description": "Bad named entity: bottom without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bottom"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊥", 
+            "description": "Named entity: bottom; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bowtie", 
+            "description": "Bad named entity: bowtie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bowtie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋈", 
+            "description": "Named entity: bowtie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDL", 
+            "description": "Bad named entity: boxDL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxDL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╗", 
+            "description": "Named entity: boxDL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2557"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDR", 
+            "description": "Bad named entity: boxDR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxDR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╔", 
+            "description": "Named entity: boxDR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2554"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDl", 
+            "description": "Bad named entity: boxDl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxDl"
+                ]
+            ]
+        }, 
+        {
+            "input": "╖", 
+            "description": "Named entity: boxDl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2556"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxDr", 
+            "description": "Bad named entity: boxDr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxDr"
+                ]
+            ]
+        }, 
+        {
+            "input": "╓", 
+            "description": "Named entity: boxDr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2553"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxH", 
+            "description": "Bad named entity: boxH without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxH"
+                ]
+            ]
+        }, 
+        {
+            "input": "═", 
+            "description": "Named entity: boxH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2550"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHD", 
+            "description": "Bad named entity: boxHD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxHD"
+                ]
+            ]
+        }, 
+        {
+            "input": "╦", 
+            "description": "Named entity: boxHD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2566"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHU", 
+            "description": "Bad named entity: boxHU without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxHU"
+                ]
+            ]
+        }, 
+        {
+            "input": "╩", 
+            "description": "Named entity: boxHU; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2569"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHd", 
+            "description": "Bad named entity: boxHd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxHd"
+                ]
+            ]
+        }, 
+        {
+            "input": "╤", 
+            "description": "Named entity: boxHd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2564"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxHu", 
+            "description": "Bad named entity: boxHu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxHu"
+                ]
+            ]
+        }, 
+        {
+            "input": "╧", 
+            "description": "Named entity: boxHu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2567"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUL", 
+            "description": "Bad named entity: boxUL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxUL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╝", 
+            "description": "Named entity: boxUL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUR", 
+            "description": "Bad named entity: boxUR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxUR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╚", 
+            "description": "Named entity: boxUR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUl", 
+            "description": "Bad named entity: boxUl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxUl"
+                ]
+            ]
+        }, 
+        {
+            "input": "╜", 
+            "description": "Named entity: boxUl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxUr", 
+            "description": "Bad named entity: boxUr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxUr"
+                ]
+            ]
+        }, 
+        {
+            "input": "╙", 
+            "description": "Named entity: boxUr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2559"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxV", 
+            "description": "Bad named entity: boxV without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxV"
+                ]
+            ]
+        }, 
+        {
+            "input": "║", 
+            "description": "Named entity: boxV; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2551"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVH", 
+            "description": "Bad named entity: boxVH without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVH"
+                ]
+            ]
+        }, 
+        {
+            "input": "╬", 
+            "description": "Named entity: boxVH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVL", 
+            "description": "Bad named entity: boxVL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╣", 
+            "description": "Named entity: boxVL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2563"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVR", 
+            "description": "Bad named entity: boxVR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╠", 
+            "description": "Named entity: boxVR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2560"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVh", 
+            "description": "Bad named entity: boxVh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVh"
+                ]
+            ]
+        }, 
+        {
+            "input": "╫", 
+            "description": "Named entity: boxVh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVl", 
+            "description": "Bad named entity: boxVl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVl"
+                ]
+            ]
+        }, 
+        {
+            "input": "╢", 
+            "description": "Named entity: boxVl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2562"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxVr", 
+            "description": "Bad named entity: boxVr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxVr"
+                ]
+            ]
+        }, 
+        {
+            "input": "╟", 
+            "description": "Named entity: boxVr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxbox", 
+            "description": "Bad named entity: boxbox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxbox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧉", 
+            "description": "Named entity: boxbox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdL", 
+            "description": "Bad named entity: boxdL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxdL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╕", 
+            "description": "Named entity: boxdL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2555"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdR", 
+            "description": "Bad named entity: boxdR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxdR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╒", 
+            "description": "Named entity: boxdR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2552"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdl", 
+            "description": "Bad named entity: boxdl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxdl"
+                ]
+            ]
+        }, 
+        {
+            "input": "┐", 
+            "description": "Named entity: boxdl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2510"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxdr", 
+            "description": "Bad named entity: boxdr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxdr"
+                ]
+            ]
+        }, 
+        {
+            "input": "┌", 
+            "description": "Named entity: boxdr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u250c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxh", 
+            "description": "Bad named entity: boxh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxh"
+                ]
+            ]
+        }, 
+        {
+            "input": "─", 
+            "description": "Named entity: boxh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2500"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhD", 
+            "description": "Bad named entity: boxhD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxhD"
+                ]
+            ]
+        }, 
+        {
+            "input": "╥", 
+            "description": "Named entity: boxhD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2565"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhU", 
+            "description": "Bad named entity: boxhU without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxhU"
+                ]
+            ]
+        }, 
+        {
+            "input": "╨", 
+            "description": "Named entity: boxhU; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2568"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhd", 
+            "description": "Bad named entity: boxhd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxhd"
+                ]
+            ]
+        }, 
+        {
+            "input": "┬", 
+            "description": "Named entity: boxhd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u252c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxhu", 
+            "description": "Bad named entity: boxhu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxhu"
+                ]
+            ]
+        }, 
+        {
+            "input": "┴", 
+            "description": "Named entity: boxhu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2534"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxminus", 
+            "description": "Bad named entity: boxminus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊟", 
+            "description": "Named entity: boxminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxplus", 
+            "description": "Bad named entity: boxplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊞", 
+            "description": "Named entity: boxplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxtimes", 
+            "description": "Bad named entity: boxtimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxtimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊠", 
+            "description": "Named entity: boxtimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuL", 
+            "description": "Bad named entity: boxuL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxuL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╛", 
+            "description": "Named entity: boxuL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxuR", 
+            "description": "Bad named entity: boxuR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxuR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╘", 
+            "description": "Named entity: boxuR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2558"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxul", 
+            "description": "Bad named entity: boxul without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxul"
+                ]
+            ]
+        }, 
+        {
+            "input": "┘", 
+            "description": "Named entity: boxul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2518"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxur", 
+            "description": "Bad named entity: boxur without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxur"
+                ]
+            ]
+        }, 
+        {
+            "input": "└", 
+            "description": "Named entity: boxur; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2514"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxv", 
+            "description": "Bad named entity: boxv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxv"
+                ]
+            ]
+        }, 
+        {
+            "input": "│", 
+            "description": "Named entity: boxv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2502"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvH", 
+            "description": "Bad named entity: boxvH without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvH"
+                ]
+            ]
+        }, 
+        {
+            "input": "╪", 
+            "description": "Named entity: boxvH; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u256a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvL", 
+            "description": "Bad named entity: boxvL without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvL"
+                ]
+            ]
+        }, 
+        {
+            "input": "╡", 
+            "description": "Named entity: boxvL; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2561"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvR", 
+            "description": "Bad named entity: boxvR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvR"
+                ]
+            ]
+        }, 
+        {
+            "input": "╞", 
+            "description": "Named entity: boxvR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u255e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvh", 
+            "description": "Bad named entity: boxvh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvh"
+                ]
+            ]
+        }, 
+        {
+            "input": "┼", 
+            "description": "Named entity: boxvh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u253c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvl", 
+            "description": "Bad named entity: boxvl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvl"
+                ]
+            ]
+        }, 
+        {
+            "input": "┤", 
+            "description": "Named entity: boxvl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2524"
+                ]
+            ]
+        }, 
+        {
+            "input": "&boxvr", 
+            "description": "Bad named entity: boxvr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&boxvr"
+                ]
+            ]
+        }, 
+        {
+            "input": "├", 
+            "description": "Named entity: boxvr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u251c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bprime", 
+            "description": "Bad named entity: bprime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "‵", 
+            "description": "Named entity: bprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2035"
+                ]
+            ]
+        }, 
+        {
+            "input": "&breve", 
+            "description": "Bad named entity: breve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&breve"
+                ]
+            ]
+        }, 
+        {
+            "input": "˘", 
+            "description": "Named entity: breve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "¦", 
+            "description": "Named entity: brvbar without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "¦", 
+            "description": "Named entity: brvbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bscr", 
+            "description": "Bad named entity: bscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒷", 
+            "description": "Named entity: bscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsemi", 
+            "description": "Bad named entity: bsemi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsemi"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁏", 
+            "description": "Named entity: bsemi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u204f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsim", 
+            "description": "Bad named entity: bsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∽", 
+            "description": "Named entity: bsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsime", 
+            "description": "Bad named entity: bsime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋍", 
+            "description": "Named entity: bsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsol", 
+            "description": "Bad named entity: bsol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "\", 
+            "description": "Named entity: bsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\\"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolb", 
+            "description": "Bad named entity: bsolb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsolb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧅", 
+            "description": "Named entity: bsolb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bsolhsub", 
+            "description": "Bad named entity: bsolhsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bsolhsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟈", 
+            "description": "Named entity: bsolhsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bull", 
+            "description": "Bad named entity: bull without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bull"
+                ]
+            ]
+        }, 
+        {
+            "input": "•", 
+            "description": "Named entity: bull; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2022"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bullet", 
+            "description": "Bad named entity: bullet without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bullet"
+                ]
+            ]
+        }, 
+        {
+            "input": "•", 
+            "description": "Named entity: bullet; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2022"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bump", 
+            "description": "Bad named entity: bump without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bump"
+                ]
+            ]
+        }, 
+        {
+            "input": "≎", 
+            "description": "Named entity: bump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpE", 
+            "description": "Bad named entity: bumpE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bumpE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪮", 
+            "description": "Named entity: bumpE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpe", 
+            "description": "Bad named entity: bumpe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bumpe"
+                ]
+            ]
+        }, 
+        {
+            "input": "≏", 
+            "description": "Named entity: bumpe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&bumpeq", 
+            "description": "Bad named entity: bumpeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&bumpeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≏", 
+            "description": "Named entity: bumpeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cacute", 
+            "description": "Bad named entity: cacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ć", 
+            "description": "Named entity: cacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0107"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cap", 
+            "description": "Bad named entity: cap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cap"
+                ]
+            ]
+        }, 
+        {
+            "input": "∩", 
+            "description": "Named entity: cap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2229"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capand", 
+            "description": "Bad named entity: capand without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&capand"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩄", 
+            "description": "Named entity: capand; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a44"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capbrcup", 
+            "description": "Bad named entity: capbrcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&capbrcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩉", 
+            "description": "Named entity: capbrcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a49"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcap", 
+            "description": "Bad named entity: capcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&capcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩋", 
+            "description": "Named entity: capcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capcup", 
+            "description": "Bad named entity: capcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&capcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩇", 
+            "description": "Named entity: capcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a47"
+                ]
+            ]
+        }, 
+        {
+            "input": "&capdot", 
+            "description": "Bad named entity: capdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&capdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩀", 
+            "description": "Named entity: capdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a40"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caps", 
+            "description": "Bad named entity: caps without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&caps"
+                ]
+            ]
+        }, 
+        {
+            "input": "∩︀", 
+            "description": "Named entity: caps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2229\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caret", 
+            "description": "Bad named entity: caret without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&caret"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁁", 
+            "description": "Named entity: caret; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2041"
+                ]
+            ]
+        }, 
+        {
+            "input": "&caron", 
+            "description": "Bad named entity: caron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&caron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ˇ", 
+            "description": "Named entity: caron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaps", 
+            "description": "Bad named entity: ccaps without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ccaps"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩍", 
+            "description": "Named entity: ccaps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccaron", 
+            "description": "Bad named entity: ccaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ccaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "č", 
+            "description": "Named entity: ccaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010d"
+                ]
+            ]
+        }, 
+        {
+            "input": "ç", 
+            "description": "Named entity: ccedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "ç", 
+            "description": "Named entity: ccedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccirc", 
+            "description": "Bad named entity: ccirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ccirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĉ", 
+            "description": "Named entity: ccirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0109"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccups", 
+            "description": "Bad named entity: ccups without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ccups"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩌", 
+            "description": "Named entity: ccups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ccupssm", 
+            "description": "Bad named entity: ccupssm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ccupssm"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩐", 
+            "description": "Named entity: ccupssm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a50"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cdot", 
+            "description": "Bad named entity: cdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ċ", 
+            "description": "Named entity: cdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010b"
+                ]
+            ]
+        }, 
+        {
+            "input": "¸", 
+            "description": "Named entity: cedil without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "¸", 
+            "description": "Named entity: cedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cemptyv", 
+            "description": "Bad named entity: cemptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦲", 
+            "description": "Named entity: cemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "¢", 
+            "description": "Named entity: cent without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "¢", 
+            "description": "Named entity: cent; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "·", 
+            "description": "Named entity: centerdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cfr", 
+            "description": "Bad named entity: cfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔠", 
+            "description": "Named entity: cfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd20"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chcy", 
+            "description": "Bad named entity: chcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&chcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ч", 
+            "description": "Named entity: chcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0447"
+                ]
+            ]
+        }, 
+        {
+            "input": "&check", 
+            "description": "Bad named entity: check without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&check"
+                ]
+            ]
+        }, 
+        {
+            "input": "✓", 
+            "description": "Named entity: check; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2713"
+                ]
+            ]
+        }, 
+        {
+            "input": "&checkmark", 
+            "description": "Bad named entity: checkmark without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&checkmark"
+                ]
+            ]
+        }, 
+        {
+            "input": "✓", 
+            "description": "Named entity: checkmark; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2713"
+                ]
+            ]
+        }, 
+        {
+            "input": "&chi", 
+            "description": "Bad named entity: chi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&chi"
+                ]
+            ]
+        }, 
+        {
+            "input": "χ", 
+            "description": "Named entity: chi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cir", 
+            "description": "Bad named entity: cir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cir"
+                ]
+            ]
+        }, 
+        {
+            "input": "○", 
+            "description": "Named entity: cir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirE", 
+            "description": "Bad named entity: cirE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cirE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧃", 
+            "description": "Named entity: cirE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circ", 
+            "description": "Bad named entity: circ without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circ"
+                ]
+            ]
+        }, 
+        {
+            "input": "ˆ", 
+            "description": "Named entity: circ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circeq", 
+            "description": "Bad named entity: circeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≗", 
+            "description": "Named entity: circeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2257"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowleft", 
+            "description": "Bad named entity: circlearrowleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circlearrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "↺", 
+            "description": "Named entity: circlearrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circlearrowright", 
+            "description": "Bad named entity: circlearrowright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circlearrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "↻", 
+            "description": "Named entity: circlearrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledR", 
+            "description": "Bad named entity: circledR without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circledR"
+                ]
+            ]
+        }, 
+        {
+            "input": "®", 
+            "description": "Named entity: circledR; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledS", 
+            "description": "Bad named entity: circledS without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circledS"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ⓢ", 
+            "description": "Named entity: circledS; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u24c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledast", 
+            "description": "Bad named entity: circledast without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circledast"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊛", 
+            "description": "Named entity: circledast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circledcirc", 
+            "description": "Bad named entity: circledcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circledcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊚", 
+            "description": "Named entity: circledcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&circleddash", 
+            "description": "Bad named entity: circleddash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&circleddash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊝", 
+            "description": "Named entity: circleddash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cire", 
+            "description": "Bad named entity: cire without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cire"
+                ]
+            ]
+        }, 
+        {
+            "input": "≗", 
+            "description": "Named entity: cire; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2257"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirfnint", 
+            "description": "Bad named entity: cirfnint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cirfnint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨐", 
+            "description": "Named entity: cirfnint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a10"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirmid", 
+            "description": "Bad named entity: cirmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cirmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫯", 
+            "description": "Named entity: cirmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cirscir", 
+            "description": "Bad named entity: cirscir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cirscir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧂", 
+            "description": "Named entity: cirscir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubs", 
+            "description": "Bad named entity: clubs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&clubs"
+                ]
+            ]
+        }, 
+        {
+            "input": "♣", 
+            "description": "Named entity: clubs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2663"
+                ]
+            ]
+        }, 
+        {
+            "input": "&clubsuit", 
+            "description": "Bad named entity: clubsuit without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&clubsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "♣", 
+            "description": "Named entity: clubsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2663"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colon", 
+            "description": "Bad named entity: colon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&colon"
+                ]
+            ]
+        }, 
+        {
+            "input": ":", 
+            "description": "Named entity: colon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ":"
+                ]
+            ]
+        }, 
+        {
+            "input": "&colone", 
+            "description": "Bad named entity: colone without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&colone"
+                ]
+            ]
+        }, 
+        {
+            "input": "≔", 
+            "description": "Named entity: colone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coloneq", 
+            "description": "Bad named entity: coloneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&coloneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≔", 
+            "description": "Named entity: coloneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2254"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comma", 
+            "description": "Bad named entity: comma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&comma"
+                ]
+            ]
+        }, 
+        {
+            "input": ",", 
+            "description": "Named entity: comma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ","
+                ]
+            ]
+        }, 
+        {
+            "input": "&commat", 
+            "description": "Bad named entity: commat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&commat"
+                ]
+            ]
+        }, 
+        {
+            "input": "@", 
+            "description": "Named entity: commat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "@"
+                ]
+            ]
+        }, 
+        {
+            "input": "&comp", 
+            "description": "Bad named entity: comp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&comp"
+                ]
+            ]
+        }, 
+        {
+            "input": "∁", 
+            "description": "Named entity: comp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2201"
+                ]
+            ]
+        }, 
+        {
+            "input": "&compfn", 
+            "description": "Bad named entity: compfn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&compfn"
+                ]
+            ]
+        }, 
+        {
+            "input": "∘", 
+            "description": "Named entity: compfn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2218"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complement", 
+            "description": "Bad named entity: complement without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&complement"
+                ]
+            ]
+        }, 
+        {
+            "input": "∁", 
+            "description": "Named entity: complement; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2201"
+                ]
+            ]
+        }, 
+        {
+            "input": "&complexes", 
+            "description": "Bad named entity: complexes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&complexes"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℂ", 
+            "description": "Named entity: complexes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2102"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cong", 
+            "description": "Bad named entity: cong without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cong"
+                ]
+            ]
+        }, 
+        {
+            "input": "≅", 
+            "description": "Named entity: cong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2245"
+                ]
+            ]
+        }, 
+        {
+            "input": "&congdot", 
+            "description": "Bad named entity: congdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&congdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩭", 
+            "description": "Named entity: congdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&conint", 
+            "description": "Bad named entity: conint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&conint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∮", 
+            "description": "Named entity: conint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&copf", 
+            "description": "Bad named entity: copf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&copf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕔", 
+            "description": "Named entity: copf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd54"
+                ]
+            ]
+        }, 
+        {
+            "input": "&coprod", 
+            "description": "Bad named entity: coprod without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&coprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "∐", 
+            "description": "Named entity: coprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2210"
+                ]
+            ]
+        }, 
+        {
+            "input": "©", 
+            "description": "Named entity: copy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "©", 
+            "description": "Named entity: copy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "℗", 
+            "description": "Named entity: copysr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2117"
+                ]
+            ]
+        }, 
+        {
+            "input": "&crarr", 
+            "description": "Bad named entity: crarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&crarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↵", 
+            "description": "Named entity: crarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cross", 
+            "description": "Bad named entity: cross without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cross"
+                ]
+            ]
+        }, 
+        {
+            "input": "✗", 
+            "description": "Named entity: cross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2717"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cscr", 
+            "description": "Bad named entity: cscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒸", 
+            "description": "Named entity: cscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csub", 
+            "description": "Bad named entity: csub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&csub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫏", 
+            "description": "Named entity: csub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csube", 
+            "description": "Bad named entity: csube without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&csube"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫑", 
+            "description": "Named entity: csube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csup", 
+            "description": "Bad named entity: csup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&csup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫐", 
+            "description": "Named entity: csup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&csupe", 
+            "description": "Bad named entity: csupe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&csupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫒", 
+            "description": "Named entity: csupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ctdot", 
+            "description": "Bad named entity: ctdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ctdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋯", 
+            "description": "Named entity: ctdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrl", 
+            "description": "Bad named entity: cudarrl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cudarrl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤸", 
+            "description": "Named entity: cudarrl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2938"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cudarrr", 
+            "description": "Bad named entity: cudarrr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cudarrr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤵", 
+            "description": "Named entity: cudarrr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2935"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuepr", 
+            "description": "Bad named entity: cuepr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cuepr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋞", 
+            "description": "Named entity: cuepr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuesc", 
+            "description": "Bad named entity: cuesc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cuesc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋟", 
+            "description": "Named entity: cuesc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularr", 
+            "description": "Bad named entity: cularr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cularr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↶", 
+            "description": "Named entity: cularr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cularrp", 
+            "description": "Bad named entity: cularrp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cularrp"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤽", 
+            "description": "Named entity: cularrp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u293d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cup", 
+            "description": "Bad named entity: cup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cup"
+                ]
+            ]
+        }, 
+        {
+            "input": "∪", 
+            "description": "Named entity: cup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupbrcap", 
+            "description": "Bad named entity: cupbrcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cupbrcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩈", 
+            "description": "Named entity: cupbrcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a48"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcap", 
+            "description": "Bad named entity: cupcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cupcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩆", 
+            "description": "Named entity: cupcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a46"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupcup", 
+            "description": "Bad named entity: cupcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cupcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩊", 
+            "description": "Named entity: cupcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a4a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupdot", 
+            "description": "Bad named entity: cupdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cupdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊍", 
+            "description": "Named entity: cupdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cupor", 
+            "description": "Bad named entity: cupor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cupor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩅", 
+            "description": "Named entity: cupor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a45"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cups", 
+            "description": "Bad named entity: cups without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cups"
+                ]
+            ]
+        }, 
+        {
+            "input": "∪︀", 
+            "description": "Named entity: cups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarr", 
+            "description": "Bad named entity: curarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↷", 
+            "description": "Named entity: curarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curarrm", 
+            "description": "Bad named entity: curarrm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curarrm"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤼", 
+            "description": "Named entity: curarrm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u293c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqprec", 
+            "description": "Bad named entity: curlyeqprec without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curlyeqprec"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋞", 
+            "description": "Named entity: curlyeqprec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyeqsucc", 
+            "description": "Bad named entity: curlyeqsucc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curlyeqsucc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋟", 
+            "description": "Named entity: curlyeqsucc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlyvee", 
+            "description": "Bad named entity: curlyvee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curlyvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋎", 
+            "description": "Named entity: curlyvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curlywedge", 
+            "description": "Bad named entity: curlywedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curlywedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋏", 
+            "description": "Named entity: curlywedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "¤", 
+            "description": "Named entity: curren without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "¤", 
+            "description": "Named entity: curren; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowleft", 
+            "description": "Bad named entity: curvearrowleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curvearrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "↶", 
+            "description": "Named entity: curvearrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&curvearrowright", 
+            "description": "Bad named entity: curvearrowright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&curvearrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "↷", 
+            "description": "Named entity: curvearrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuvee", 
+            "description": "Bad named entity: cuvee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cuvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋎", 
+            "description": "Named entity: cuvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cuwed", 
+            "description": "Bad named entity: cuwed without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cuwed"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋏", 
+            "description": "Named entity: cuwed; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwconint", 
+            "description": "Bad named entity: cwconint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cwconint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∲", 
+            "description": "Named entity: cwconint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2232"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cwint", 
+            "description": "Bad named entity: cwint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cwint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∱", 
+            "description": "Named entity: cwint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2231"
+                ]
+            ]
+        }, 
+        {
+            "input": "&cylcty", 
+            "description": "Bad named entity: cylcty without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&cylcty"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌭", 
+            "description": "Named entity: cylcty; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u232d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dArr", 
+            "description": "Bad named entity: dArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇓", 
+            "description": "Named entity: dArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dHar", 
+            "description": "Bad named entity: dHar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥥", 
+            "description": "Named entity: dHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2965"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dagger", 
+            "description": "Bad named entity: dagger without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "†", 
+            "description": "Named entity: dagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2020"
+                ]
+            ]
+        }, 
+        {
+            "input": "&daleth", 
+            "description": "Bad named entity: daleth without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&daleth"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℸ", 
+            "description": "Named entity: daleth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2138"
+                ]
+            ]
+        }, 
+        {
+            "input": "&darr", 
+            "description": "Bad named entity: darr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&darr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↓", 
+            "description": "Named entity: darr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dash", 
+            "description": "Bad named entity: dash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dash"
+                ]
+            ]
+        }, 
+        {
+            "input": "‐", 
+            "description": "Named entity: dash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2010"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dashv", 
+            "description": "Bad named entity: dashv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dashv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊣", 
+            "description": "Named entity: dashv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dbkarow", 
+            "description": "Bad named entity: dbkarow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dbkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤏", 
+            "description": "Named entity: dbkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dblac", 
+            "description": "Bad named entity: dblac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "˝", 
+            "description": "Named entity: dblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcaron", 
+            "description": "Bad named entity: dcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ď", 
+            "description": "Named entity: dcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u010f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dcy", 
+            "description": "Bad named entity: dcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "д", 
+            "description": "Named entity: dcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0434"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dd", 
+            "description": "Bad named entity: dd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅆ", 
+            "description": "Named entity: dd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddagger", 
+            "description": "Bad named entity: ddagger without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ddagger"
+                ]
+            ]
+        }, 
+        {
+            "input": "‡", 
+            "description": "Named entity: ddagger; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2021"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddarr", 
+            "description": "Bad named entity: ddarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ddarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇊", 
+            "description": "Named entity: ddarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ddotseq", 
+            "description": "Bad named entity: ddotseq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ddotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩷", 
+            "description": "Named entity: ddotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a77"
+                ]
+            ]
+        }, 
+        {
+            "input": "°", 
+            "description": "Named entity: deg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "°", 
+            "description": "Named entity: deg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&delta", 
+            "description": "Bad named entity: delta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&delta"
+                ]
+            ]
+        }, 
+        {
+            "input": "δ", 
+            "description": "Named entity: delta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&demptyv", 
+            "description": "Bad named entity: demptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&demptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦱", 
+            "description": "Named entity: demptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfisht", 
+            "description": "Bad named entity: dfisht without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥿", 
+            "description": "Named entity: dfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dfr", 
+            "description": "Bad named entity: dfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔡", 
+            "description": "Named entity: dfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd21"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharl", 
+            "description": "Bad named entity: dharl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dharl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇃", 
+            "description": "Named entity: dharl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dharr", 
+            "description": "Bad named entity: dharr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇂", 
+            "description": "Named entity: dharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diam", 
+            "description": "Bad named entity: diam without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&diam"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋄", 
+            "description": "Named entity: diam; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamond", 
+            "description": "Bad named entity: diamond without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&diamond"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋄", 
+            "description": "Named entity: diamond; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diamondsuit", 
+            "description": "Bad named entity: diamondsuit without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&diamondsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "♦", 
+            "description": "Named entity: diamondsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2666"
+                ]
+            ]
+        }, 
+        {
+            "input": "&diams", 
+            "description": "Bad named entity: diams without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&diams"
+                ]
+            ]
+        }, 
+        {
+            "input": "♦", 
+            "description": "Named entity: diams; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2666"
+                ]
+            ]
+        }, 
+        {
+            "input": "&die", 
+            "description": "Bad named entity: die without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&die"
+                ]
+            ]
+        }, 
+        {
+            "input": "¨", 
+            "description": "Named entity: die; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&digamma", 
+            "description": "Bad named entity: digamma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&digamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϝ", 
+            "description": "Named entity: digamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&disin", 
+            "description": "Bad named entity: disin without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&disin"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋲", 
+            "description": "Named entity: disin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&div", 
+            "description": "Bad named entity: div without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&div"
+                ]
+            ]
+        }, 
+        {
+            "input": "÷", 
+            "description": "Named entity: div; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "÷", 
+            "description": "Named entity: divide without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "÷", 
+            "description": "Named entity: divide; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋇", 
+            "description": "Named entity: divideontimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&divonx", 
+            "description": "Bad named entity: divonx without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&divonx"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋇", 
+            "description": "Named entity: divonx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&djcy", 
+            "description": "Bad named entity: djcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&djcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ђ", 
+            "description": "Named entity: djcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0452"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcorn", 
+            "description": "Bad named entity: dlcorn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dlcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌞", 
+            "description": "Named entity: dlcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dlcrop", 
+            "description": "Bad named entity: dlcrop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dlcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌍", 
+            "description": "Named entity: dlcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dollar", 
+            "description": "Bad named entity: dollar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dollar"
+                ]
+            ]
+        }, 
+        {
+            "input": "$", 
+            "description": "Named entity: dollar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "$"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dopf", 
+            "description": "Bad named entity: dopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕕", 
+            "description": "Named entity: dopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd55"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dot", 
+            "description": "Bad named entity: dot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dot"
+                ]
+            ]
+        }, 
+        {
+            "input": "˙", 
+            "description": "Named entity: dot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteq", 
+            "description": "Bad named entity: doteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&doteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≐", 
+            "description": "Named entity: doteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doteqdot", 
+            "description": "Bad named entity: doteqdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&doteqdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≑", 
+            "description": "Named entity: doteqdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2251"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotminus", 
+            "description": "Bad named entity: dotminus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dotminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∸", 
+            "description": "Named entity: dotminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2238"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotplus", 
+            "description": "Bad named entity: dotplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dotplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∔", 
+            "description": "Named entity: dotplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2214"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dotsquare", 
+            "description": "Bad named entity: dotsquare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dotsquare"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊡", 
+            "description": "Named entity: dotsquare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&doublebarwedge", 
+            "description": "Bad named entity: doublebarwedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&doublebarwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌆", 
+            "description": "Named entity: doublebarwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2306"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downarrow", 
+            "description": "Bad named entity: downarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&downarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↓", 
+            "description": "Named entity: downarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2193"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downdownarrows", 
+            "description": "Bad named entity: downdownarrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&downdownarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇊", 
+            "description": "Named entity: downdownarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonleft", 
+            "description": "Bad named entity: downharpoonleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&downharpoonleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇃", 
+            "description": "Named entity: downharpoonleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&downharpoonright", 
+            "description": "Bad named entity: downharpoonright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&downharpoonright"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇂", 
+            "description": "Named entity: downharpoonright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drbkarow", 
+            "description": "Bad named entity: drbkarow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&drbkarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤐", 
+            "description": "Named entity: drbkarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2910"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcorn", 
+            "description": "Bad named entity: drcorn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&drcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌟", 
+            "description": "Named entity: drcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&drcrop", 
+            "description": "Bad named entity: drcrop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&drcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌌", 
+            "description": "Named entity: drcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscr", 
+            "description": "Bad named entity: dscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒹", 
+            "description": "Named entity: dscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcb9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dscy", 
+            "description": "Bad named entity: dscy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dscy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ѕ", 
+            "description": "Named entity: dscy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0455"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dsol", 
+            "description": "Bad named entity: dsol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧶", 
+            "description": "Named entity: dsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dstrok", 
+            "description": "Bad named entity: dstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "đ", 
+            "description": "Named entity: dstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtdot", 
+            "description": "Bad named entity: dtdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dtdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋱", 
+            "description": "Named entity: dtdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtri", 
+            "description": "Bad named entity: dtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "▿", 
+            "description": "Named entity: dtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dtrif", 
+            "description": "Bad named entity: dtrif without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dtrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "▾", 
+            "description": "Named entity: dtrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duarr", 
+            "description": "Bad named entity: duarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&duarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇵", 
+            "description": "Named entity: duarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&duhar", 
+            "description": "Bad named entity: duhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&duhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥯", 
+            "description": "Named entity: duhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dwangle", 
+            "description": "Bad named entity: dwangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dwangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦦", 
+            "description": "Named entity: dwangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzcy", 
+            "description": "Bad named entity: dzcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dzcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "џ", 
+            "description": "Named entity: dzcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&dzigrarr", 
+            "description": "Bad named entity: dzigrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&dzigrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟿", 
+            "description": "Named entity: dzigrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDDot", 
+            "description": "Bad named entity: eDDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eDDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩷", 
+            "description": "Named entity: eDDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a77"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eDot", 
+            "description": "Bad named entity: eDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≑", 
+            "description": "Named entity: eDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2251"
+                ]
+            ]
+        }, 
+        {
+            "input": "é", 
+            "description": "Named entity: eacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "é", 
+            "description": "Named entity: eacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&easter", 
+            "description": "Bad named entity: easter without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&easter"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩮", 
+            "description": "Named entity: easter; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecaron", 
+            "description": "Bad named entity: ecaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ecaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ě", 
+            "description": "Named entity: ecaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecir", 
+            "description": "Bad named entity: ecir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ecir"
+                ]
+            ]
+        }, 
+        {
+            "input": "≖", 
+            "description": "Named entity: ecir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2256"
+                ]
+            ]
+        }, 
+        {
+            "input": "ê", 
+            "description": "Named entity: ecirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "ê", 
+            "description": "Named entity: ecirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecolon", 
+            "description": "Bad named entity: ecolon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ecolon"
+                ]
+            ]
+        }, 
+        {
+            "input": "≕", 
+            "description": "Named entity: ecolon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2255"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ecy", 
+            "description": "Bad named entity: ecy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "э", 
+            "description": "Named entity: ecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&edot", 
+            "description": "Bad named entity: edot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&edot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ė", 
+            "description": "Named entity: edot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0117"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ee", 
+            "description": "Bad named entity: ee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅇ", 
+            "description": "Named entity: ee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efDot", 
+            "description": "Bad named entity: efDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&efDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≒", 
+            "description": "Named entity: efDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2252"
+                ]
+            ]
+        }, 
+        {
+            "input": "&efr", 
+            "description": "Bad named entity: efr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&efr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔢", 
+            "description": "Named entity: efr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd22"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eg", 
+            "description": "Bad named entity: eg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪚", 
+            "description": "Named entity: eg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9a"
+                ]
+            ]
+        }, 
+        {
+            "input": "è", 
+            "description": "Named entity: egrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "è", 
+            "description": "Named entity: egrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egs", 
+            "description": "Bad named entity: egs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&egs"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪖", 
+            "description": "Named entity: egs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a96"
+                ]
+            ]
+        }, 
+        {
+            "input": "&egsdot", 
+            "description": "Bad named entity: egsdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&egsdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪘", 
+            "description": "Named entity: egsdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a98"
+                ]
+            ]
+        }, 
+        {
+            "input": "&el", 
+            "description": "Bad named entity: el without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&el"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪙", 
+            "description": "Named entity: el; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a99"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elinters", 
+            "description": "Bad named entity: elinters without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&elinters"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏧", 
+            "description": "Named entity: elinters; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ell", 
+            "description": "Bad named entity: ell without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ell"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℓ", 
+            "description": "Named entity: ell; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2113"
+                ]
+            ]
+        }, 
+        {
+            "input": "&els", 
+            "description": "Bad named entity: els without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&els"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪕", 
+            "description": "Named entity: els; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a95"
+                ]
+            ]
+        }, 
+        {
+            "input": "&elsdot", 
+            "description": "Bad named entity: elsdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&elsdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪗", 
+            "description": "Named entity: elsdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a97"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emacr", 
+            "description": "Bad named entity: emacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ē", 
+            "description": "Named entity: emacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0113"
+                ]
+            ]
+        }, 
+        {
+            "input": "&empty", 
+            "description": "Bad named entity: empty without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&empty"
+                ]
+            ]
+        }, 
+        {
+            "input": "∅", 
+            "description": "Named entity: empty; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyset", 
+            "description": "Bad named entity: emptyset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emptyset"
+                ]
+            ]
+        }, 
+        {
+            "input": "∅", 
+            "description": "Named entity: emptyset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emptyv", 
+            "description": "Bad named entity: emptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "∅", 
+            "description": "Named entity: emptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp", 
+            "description": "Bad named entity: emsp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emsp"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp13", 
+            "description": "Bad named entity: emsp13 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emsp13"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: emsp13; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2004"
+                ]
+            ]
+        }, 
+        {
+            "input": "&emsp14", 
+            "description": "Bad named entity: emsp14 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&emsp14"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: emsp14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2005"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: emsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2003"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eng", 
+            "description": "Bad named entity: eng without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eng"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŋ", 
+            "description": "Named entity: eng; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ensp", 
+            "description": "Bad named entity: ensp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ensp"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: ensp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2002"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eogon", 
+            "description": "Bad named entity: eogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ę", 
+            "description": "Named entity: eogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eopf", 
+            "description": "Bad named entity: eopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕖", 
+            "description": "Named entity: eopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd56"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epar", 
+            "description": "Bad named entity: epar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&epar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋕", 
+            "description": "Named entity: epar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eparsl", 
+            "description": "Bad named entity: eparsl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧣", 
+            "description": "Named entity: eparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eplus", 
+            "description": "Bad named entity: eplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩱", 
+            "description": "Named entity: eplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a71"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsi", 
+            "description": "Bad named entity: epsi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&epsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ε", 
+            "description": "Named entity: epsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsilon", 
+            "description": "Bad named entity: epsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&epsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ε", 
+            "description": "Named entity: epsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&epsiv", 
+            "description": "Bad named entity: epsiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&epsiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϵ", 
+            "description": "Named entity: epsiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcirc", 
+            "description": "Bad named entity: eqcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "≖", 
+            "description": "Named entity: eqcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2256"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqcolon", 
+            "description": "Bad named entity: eqcolon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqcolon"
+                ]
+            ]
+        }, 
+        {
+            "input": "≕", 
+            "description": "Named entity: eqcolon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2255"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqsim", 
+            "description": "Bad named entity: eqsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≂", 
+            "description": "Named entity: eqsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantgtr", 
+            "description": "Bad named entity: eqslantgtr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqslantgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪖", 
+            "description": "Named entity: eqslantgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a96"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqslantless", 
+            "description": "Bad named entity: eqslantless without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqslantless"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪕", 
+            "description": "Named entity: eqslantless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a95"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equals", 
+            "description": "Bad named entity: equals without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&equals"
+                ]
+            ]
+        }, 
+        {
+            "input": "=", 
+            "description": "Named entity: equals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "="
+                ]
+            ]
+        }, 
+        {
+            "input": "&equest", 
+            "description": "Bad named entity: equest without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&equest"
+                ]
+            ]
+        }, 
+        {
+            "input": "≟", 
+            "description": "Named entity: equest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equiv", 
+            "description": "Bad named entity: equiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&equiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "≡", 
+            "description": "Named entity: equiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2261"
+                ]
+            ]
+        }, 
+        {
+            "input": "&equivDD", 
+            "description": "Bad named entity: equivDD without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&equivDD"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩸", 
+            "description": "Named entity: equivDD; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a78"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eqvparsl", 
+            "description": "Bad named entity: eqvparsl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eqvparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧥", 
+            "description": "Named entity: eqvparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erDot", 
+            "description": "Bad named entity: erDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&erDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≓", 
+            "description": "Named entity: erDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2253"
+                ]
+            ]
+        }, 
+        {
+            "input": "&erarr", 
+            "description": "Bad named entity: erarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&erarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥱", 
+            "description": "Named entity: erarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2971"
+                ]
+            ]
+        }, 
+        {
+            "input": "&escr", 
+            "description": "Bad named entity: escr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&escr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℯ", 
+            "description": "Named entity: escr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u212f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esdot", 
+            "description": "Bad named entity: esdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&esdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≐", 
+            "description": "Named entity: esdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250"
+                ]
+            ]
+        }, 
+        {
+            "input": "&esim", 
+            "description": "Bad named entity: esim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&esim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≂", 
+            "description": "Named entity: esim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242"
+                ]
+            ]
+        }, 
+        {
+            "input": "&eta", 
+            "description": "Bad named entity: eta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&eta"
+                ]
+            ]
+        }, 
+        {
+            "input": "η", 
+            "description": "Named entity: eta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "ð", 
+            "description": "Named entity: eth without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "ð", 
+            "description": "Named entity: eth; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "ë", 
+            "description": "Named entity: euml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "ë", 
+            "description": "Named entity: euml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&euro", 
+            "description": "Bad named entity: euro without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&euro"
+                ]
+            ]
+        }, 
+        {
+            "input": "€", 
+            "description": "Named entity: euro; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&excl", 
+            "description": "Bad named entity: excl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&excl"
+                ]
+            ]
+        }, 
+        {
+            "input": "!", 
+            "description": "Named entity: excl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "!"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exist", 
+            "description": "Bad named entity: exist without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&exist"
+                ]
+            ]
+        }, 
+        {
+            "input": "∃", 
+            "description": "Named entity: exist; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2203"
+                ]
+            ]
+        }, 
+        {
+            "input": "&expectation", 
+            "description": "Bad named entity: expectation without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&expectation"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℰ", 
+            "description": "Named entity: expectation; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2130"
+                ]
+            ]
+        }, 
+        {
+            "input": "&exponentiale", 
+            "description": "Bad named entity: exponentiale without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&exponentiale"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅇ", 
+            "description": "Named entity: exponentiale; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2147"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fallingdotseq", 
+            "description": "Bad named entity: fallingdotseq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fallingdotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≒", 
+            "description": "Named entity: fallingdotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2252"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fcy", 
+            "description": "Bad named entity: fcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ф", 
+            "description": "Named entity: fcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0444"
+                ]
+            ]
+        }, 
+        {
+            "input": "&female", 
+            "description": "Bad named entity: female without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&female"
+                ]
+            ]
+        }, 
+        {
+            "input": "♀", 
+            "description": "Named entity: female; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2640"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffilig", 
+            "description": "Bad named entity: ffilig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ffilig"
+                ]
+            ]
+        }, 
+        {
+            "input": "ffi", 
+            "description": "Named entity: ffilig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb03"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fflig", 
+            "description": "Bad named entity: fflig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fflig"
+                ]
+            ]
+        }, 
+        {
+            "input": "ff", 
+            "description": "Named entity: fflig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffllig", 
+            "description": "Bad named entity: ffllig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ffllig"
+                ]
+            ]
+        }, 
+        {
+            "input": "ffl", 
+            "description": "Named entity: ffllig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ffr", 
+            "description": "Bad named entity: ffr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ffr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔣", 
+            "description": "Named entity: ffr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd23"
+                ]
+            ]
+        }, 
+        {
+            "input": "&filig", 
+            "description": "Bad named entity: filig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&filig"
+                ]
+            ]
+        }, 
+        {
+            "input": "fi", 
+            "description": "Named entity: filig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fjlig", 
+            "description": "Bad named entity: fjlig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fjlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "fj", 
+            "description": "Named entity: fjlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "fj"
+                ]
+            ]
+        }, 
+        {
+            "input": "&flat", 
+            "description": "Bad named entity: flat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&flat"
+                ]
+            ]
+        }, 
+        {
+            "input": "♭", 
+            "description": "Named entity: flat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fllig", 
+            "description": "Bad named entity: fllig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fllig"
+                ]
+            ]
+        }, 
+        {
+            "input": "fl", 
+            "description": "Named entity: fllig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ufb02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fltns", 
+            "description": "Bad named entity: fltns without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fltns"
+                ]
+            ]
+        }, 
+        {
+            "input": "▱", 
+            "description": "Named entity: fltns; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fnof", 
+            "description": "Bad named entity: fnof without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fnof"
+                ]
+            ]
+        }, 
+        {
+            "input": "ƒ", 
+            "description": "Named entity: fnof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fopf", 
+            "description": "Bad named entity: fopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕗", 
+            "description": "Named entity: fopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd57"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forall", 
+            "description": "Bad named entity: forall without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&forall"
+                ]
+            ]
+        }, 
+        {
+            "input": "∀", 
+            "description": "Named entity: forall; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2200"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fork", 
+            "description": "Bad named entity: fork without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fork"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋔", 
+            "description": "Named entity: fork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&forkv", 
+            "description": "Bad named entity: forkv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&forkv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫙", 
+            "description": "Named entity: forkv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fpartint", 
+            "description": "Bad named entity: fpartint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fpartint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨍", 
+            "description": "Named entity: fpartint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0d"
+                ]
+            ]
+        }, 
+        {
+            "input": "½", 
+            "description": "Named entity: frac12 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "½", 
+            "description": "Named entity: frac12; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac13", 
+            "description": "Bad named entity: frac13 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac13"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅓", 
+            "description": "Named entity: frac13; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2153"
+                ]
+            ]
+        }, 
+        {
+            "input": "¼", 
+            "description": "Named entity: frac14 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "¼", 
+            "description": "Named entity: frac14; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac15", 
+            "description": "Bad named entity: frac15 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac15"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅕", 
+            "description": "Named entity: frac15; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2155"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac16", 
+            "description": "Bad named entity: frac16 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac16"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅙", 
+            "description": "Named entity: frac16; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2159"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac18", 
+            "description": "Bad named entity: frac18 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac18"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅛", 
+            "description": "Named entity: frac18; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac23", 
+            "description": "Bad named entity: frac23 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac23"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅔", 
+            "description": "Named entity: frac23; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2154"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac25", 
+            "description": "Bad named entity: frac25 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac25"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅖", 
+            "description": "Named entity: frac25; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2156"
+                ]
+            ]
+        }, 
+        {
+            "input": "¾", 
+            "description": "Named entity: frac34 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00be"
+                ]
+            ]
+        }, 
+        {
+            "input": "¾", 
+            "description": "Named entity: frac34; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac35", 
+            "description": "Bad named entity: frac35 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac35"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅗", 
+            "description": "Named entity: frac35; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2157"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac38", 
+            "description": "Bad named entity: frac38 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac38"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅜", 
+            "description": "Named entity: frac38; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac45", 
+            "description": "Bad named entity: frac45 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac45"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅘", 
+            "description": "Named entity: frac45; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2158"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac56", 
+            "description": "Bad named entity: frac56 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac56"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅚", 
+            "description": "Named entity: frac56; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac58", 
+            "description": "Bad named entity: frac58 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac58"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅝", 
+            "description": "Named entity: frac58; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frac78", 
+            "description": "Bad named entity: frac78 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frac78"
+                ]
+            ]
+        }, 
+        {
+            "input": "⅞", 
+            "description": "Named entity: frac78; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u215e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frasl", 
+            "description": "Bad named entity: frasl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frasl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁄", 
+            "description": "Named entity: frasl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2044"
+                ]
+            ]
+        }, 
+        {
+            "input": "&frown", 
+            "description": "Bad named entity: frown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&frown"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌢", 
+            "description": "Named entity: frown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2322"
+                ]
+            ]
+        }, 
+        {
+            "input": "&fscr", 
+            "description": "Bad named entity: fscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&fscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒻", 
+            "description": "Named entity: fscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gE", 
+            "description": "Bad named entity: gE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧", 
+            "description": "Named entity: gE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gEl", 
+            "description": "Bad named entity: gEl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gEl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪌", 
+            "description": "Named entity: gEl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gacute", 
+            "description": "Bad named entity: gacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ǵ", 
+            "description": "Named entity: gacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u01f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gamma", 
+            "description": "Bad named entity: gamma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gamma"
+                ]
+            ]
+        }, 
+        {
+            "input": "γ", 
+            "description": "Named entity: gamma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gammad", 
+            "description": "Bad named entity: gammad without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gammad"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϝ", 
+            "description": "Named entity: gammad; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gap", 
+            "description": "Bad named entity: gap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪆", 
+            "description": "Named entity: gap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a86"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gbreve", 
+            "description": "Bad named entity: gbreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gbreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "ğ", 
+            "description": "Named entity: gbreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcirc", 
+            "description": "Bad named entity: gcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĝ", 
+            "description": "Named entity: gcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u011d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gcy", 
+            "description": "Bad named entity: gcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "г", 
+            "description": "Named entity: gcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0433"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gdot", 
+            "description": "Bad named entity: gdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ġ", 
+            "description": "Named entity: gdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0121"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ge", 
+            "description": "Bad named entity: ge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ge"
+                ]
+            ]
+        }, 
+        {
+            "input": "≥", 
+            "description": "Named entity: ge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gel", 
+            "description": "Bad named entity: gel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gel"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋛", 
+            "description": "Named entity: gel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geq", 
+            "description": "Bad named entity: geq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&geq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≥", 
+            "description": "Named entity: geq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqq", 
+            "description": "Bad named entity: geqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&geqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧", 
+            "description": "Named entity: geqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267"
+                ]
+            ]
+        }, 
+        {
+            "input": "&geqslant", 
+            "description": "Bad named entity: geqslant without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&geqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾", 
+            "description": "Named entity: geqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ges", 
+            "description": "Bad named entity: ges without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ges"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾", 
+            "description": "Named entity: ges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gescc", 
+            "description": "Bad named entity: gescc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gescc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪩", 
+            "description": "Named entity: gescc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdot", 
+            "description": "Bad named entity: gesdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gesdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪀", 
+            "description": "Named entity: gesdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a80"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdoto", 
+            "description": "Bad named entity: gesdoto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gesdoto"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪂", 
+            "description": "Named entity: gesdoto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a82"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesdotol", 
+            "description": "Bad named entity: gesdotol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gesdotol"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪄", 
+            "description": "Named entity: gesdotol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a84"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesl", 
+            "description": "Bad named entity: gesl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gesl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋛︀", 
+            "description": "Named entity: gesl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gesles", 
+            "description": "Bad named entity: gesles without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gesles"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪔", 
+            "description": "Named entity: gesles; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a94"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gfr", 
+            "description": "Bad named entity: gfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔤", 
+            "description": "Named entity: gfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd24"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gg", 
+            "description": "Bad named entity: gg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gg"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫", 
+            "description": "Named entity: gg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ggg", 
+            "description": "Bad named entity: ggg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ggg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋙", 
+            "description": "Named entity: ggg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gimel", 
+            "description": "Bad named entity: gimel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gimel"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℷ", 
+            "description": "Named entity: gimel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2137"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gjcy", 
+            "description": "Bad named entity: gjcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gjcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ѓ", 
+            "description": "Named entity: gjcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0453"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gl", 
+            "description": "Bad named entity: gl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gl"
+                ]
+            ]
+        }, 
+        {
+            "input": "≷", 
+            "description": "Named entity: gl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glE", 
+            "description": "Bad named entity: glE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&glE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪒", 
+            "description": "Named entity: glE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a92"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gla", 
+            "description": "Bad named entity: gla without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gla"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪥", 
+            "description": "Named entity: gla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&glj", 
+            "description": "Bad named entity: glj without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&glj"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪤", 
+            "description": "Named entity: glj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnE", 
+            "description": "Bad named entity: gnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≩", 
+            "description": "Named entity: gnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnap", 
+            "description": "Bad named entity: gnap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪊", 
+            "description": "Named entity: gnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnapprox", 
+            "description": "Bad named entity: gnapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪊", 
+            "description": "Named entity: gnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gne", 
+            "description": "Bad named entity: gne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪈", 
+            "description": "Named entity: gne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a88"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneq", 
+            "description": "Bad named entity: gneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪈", 
+            "description": "Named entity: gneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a88"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gneqq", 
+            "description": "Bad named entity: gneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≩", 
+            "description": "Named entity: gneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gnsim", 
+            "description": "Bad named entity: gnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋧", 
+            "description": "Named entity: gnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gopf", 
+            "description": "Bad named entity: gopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕘", 
+            "description": "Named entity: gopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd58"
+                ]
+            ]
+        }, 
+        {
+            "input": "&grave", 
+            "description": "Bad named entity: grave without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&grave"
+                ]
+            ]
+        }, 
+        {
+            "input": "`", 
+            "description": "Named entity: grave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "`"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gscr", 
+            "description": "Bad named entity: gscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℊ", 
+            "description": "Named entity: gscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsim", 
+            "description": "Bad named entity: gsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≳", 
+            "description": "Named entity: gsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsime", 
+            "description": "Bad named entity: gsime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪎", 
+            "description": "Named entity: gsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gsiml", 
+            "description": "Bad named entity: gsiml without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gsiml"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪐", 
+            "description": "Named entity: gsiml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a90"
+                ]
+            ]
+        }, 
+        {
+            "input": ">", 
+            "description": "Named entity: gt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": ">", 
+            "description": "Named entity: gt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪧", 
+            "description": "Named entity: gtcc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩺", 
+            "description": "Named entity: gtcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7a"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋗", 
+            "description": "Named entity: gtdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦕", 
+            "description": "Named entity: gtlPar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2995"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩼", 
+            "description": "Named entity: gtquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7c"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪆", 
+            "description": "Named entity: gtrapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a86"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥸", 
+            "description": "Named entity: gtrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2978"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋗", 
+            "description": "Named entity: gtrdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋛", 
+            "description": "Named entity: gtreqless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22db"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪌", 
+            "description": "Named entity: gtreqqless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8c"
+                ]
+            ]
+        }, 
+        {
+            "input": "≷", 
+            "description": "Named entity: gtrless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2277"
+                ]
+            ]
+        }, 
+        {
+            "input": "≳", 
+            "description": "Named entity: gtrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2273"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvertneqq", 
+            "description": "Bad named entity: gvertneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gvertneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≩︀", 
+            "description": "Named entity: gvertneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&gvnE", 
+            "description": "Bad named entity: gvnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&gvnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≩︀", 
+            "description": "Named entity: gvnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2269\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hArr", 
+            "description": "Bad named entity: hArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇔", 
+            "description": "Named entity: hArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hairsp", 
+            "description": "Bad named entity: hairsp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hairsp"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: hairsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&half", 
+            "description": "Bad named entity: half without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&half"
+                ]
+            ]
+        }, 
+        {
+            "input": "½", 
+            "description": "Named entity: half; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hamilt", 
+            "description": "Bad named entity: hamilt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hamilt"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℋ", 
+            "description": "Named entity: hamilt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hardcy", 
+            "description": "Bad named entity: hardcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hardcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ъ", 
+            "description": "Named entity: hardcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harr", 
+            "description": "Bad named entity: harr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&harr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↔", 
+            "description": "Named entity: harr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrcir", 
+            "description": "Bad named entity: harrcir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&harrcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥈", 
+            "description": "Named entity: harrcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2948"
+                ]
+            ]
+        }, 
+        {
+            "input": "&harrw", 
+            "description": "Bad named entity: harrw without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&harrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "↭", 
+            "description": "Named entity: harrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hbar", 
+            "description": "Bad named entity: hbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℏ", 
+            "description": "Named entity: hbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hcirc", 
+            "description": "Bad named entity: hcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĥ", 
+            "description": "Named entity: hcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0125"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hearts", 
+            "description": "Bad named entity: hearts without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hearts"
+                ]
+            ]
+        }, 
+        {
+            "input": "♥", 
+            "description": "Named entity: hearts; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2665"
+                ]
+            ]
+        }, 
+        {
+            "input": "&heartsuit", 
+            "description": "Bad named entity: heartsuit without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&heartsuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "♥", 
+            "description": "Named entity: heartsuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2665"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hellip", 
+            "description": "Bad named entity: hellip without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hellip"
+                ]
+            ]
+        }, 
+        {
+            "input": "…", 
+            "description": "Named entity: hellip; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2026"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hercon", 
+            "description": "Bad named entity: hercon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hercon"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊹", 
+            "description": "Named entity: hercon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hfr", 
+            "description": "Bad named entity: hfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔥", 
+            "description": "Named entity: hfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd25"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hksearow", 
+            "description": "Bad named entity: hksearow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hksearow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤥", 
+            "description": "Named entity: hksearow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2925"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hkswarow", 
+            "description": "Bad named entity: hkswarow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hkswarow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤦", 
+            "description": "Named entity: hkswarow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2926"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hoarr", 
+            "description": "Bad named entity: hoarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hoarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇿", 
+            "description": "Named entity: hoarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&homtht", 
+            "description": "Bad named entity: homtht without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&homtht"
+                ]
+            ]
+        }, 
+        {
+            "input": "∻", 
+            "description": "Named entity: homtht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookleftarrow", 
+            "description": "Bad named entity: hookleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hookleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↩", 
+            "description": "Named entity: hookleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hookrightarrow", 
+            "description": "Bad named entity: hookrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hookrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↪", 
+            "description": "Named entity: hookrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hopf", 
+            "description": "Bad named entity: hopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕙", 
+            "description": "Named entity: hopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd59"
+                ]
+            ]
+        }, 
+        {
+            "input": "&horbar", 
+            "description": "Bad named entity: horbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&horbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "―", 
+            "description": "Named entity: horbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2015"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hscr", 
+            "description": "Bad named entity: hscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒽", 
+            "description": "Named entity: hscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hslash", 
+            "description": "Bad named entity: hslash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hslash"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℏ", 
+            "description": "Named entity: hslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hstrok", 
+            "description": "Bad named entity: hstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "ħ", 
+            "description": "Named entity: hstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0127"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hybull", 
+            "description": "Bad named entity: hybull without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hybull"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁃", 
+            "description": "Named entity: hybull; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2043"
+                ]
+            ]
+        }, 
+        {
+            "input": "&hyphen", 
+            "description": "Bad named entity: hyphen without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&hyphen"
+                ]
+            ]
+        }, 
+        {
+            "input": "‐", 
+            "description": "Named entity: hyphen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2010"
+                ]
+            ]
+        }, 
+        {
+            "input": "í", 
+            "description": "Named entity: iacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "í", 
+            "description": "Named entity: iacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ic", 
+            "description": "Bad named entity: ic without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ic"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁣", 
+            "description": "Named entity: ic; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2063"
+                ]
+            ]
+        }, 
+        {
+            "input": "î", 
+            "description": "Named entity: icirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "î", 
+            "description": "Named entity: icirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&icy", 
+            "description": "Bad named entity: icy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&icy"
+                ]
+            ]
+        }, 
+        {
+            "input": "и", 
+            "description": "Named entity: icy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0438"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iecy", 
+            "description": "Bad named entity: iecy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iecy"
+                ]
+            ]
+        }, 
+        {
+            "input": "е", 
+            "description": "Named entity: iecy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0435"
+                ]
+            ]
+        }, 
+        {
+            "input": "¡", 
+            "description": "Named entity: iexcl without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "¡", 
+            "description": "Named entity: iexcl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iff", 
+            "description": "Bad named entity: iff without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iff"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇔", 
+            "description": "Named entity: iff; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ifr", 
+            "description": "Bad named entity: ifr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ifr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔦", 
+            "description": "Named entity: ifr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd26"
+                ]
+            ]
+        }, 
+        {
+            "input": "ì", 
+            "description": "Named entity: igrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "ì", 
+            "description": "Named entity: igrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ii", 
+            "description": "Bad named entity: ii without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ii"
+                ]
+            ]
+        }, 
+        {
+            "input": "ⅈ", 
+            "description": "Named entity: ii; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiiint", 
+            "description": "Bad named entity: iiiint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iiiint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨌", 
+            "description": "Named entity: iiiint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiint", 
+            "description": "Bad named entity: iiint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iiint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∭", 
+            "description": "Named entity: iiint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iinfin", 
+            "description": "Bad named entity: iinfin without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iinfin"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧜", 
+            "description": "Named entity: iinfin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iiota", 
+            "description": "Bad named entity: iiota without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iiota"
+                ]
+            ]
+        }, 
+        {
+            "input": "℩", 
+            "description": "Named entity: iiota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2129"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ijlig", 
+            "description": "Bad named entity: ijlig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ijlig"
+                ]
+            ]
+        }, 
+        {
+            "input": "ij", 
+            "description": "Named entity: ijlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imacr", 
+            "description": "Bad named entity: imacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ī", 
+            "description": "Named entity: imacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&image", 
+            "description": "Bad named entity: image without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&image"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℑ", 
+            "description": "Named entity: image; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagline", 
+            "description": "Bad named entity: imagline without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imagline"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℐ", 
+            "description": "Named entity: imagline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2110"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imagpart", 
+            "description": "Bad named entity: imagpart without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imagpart"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℑ", 
+            "description": "Named entity: imagpart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2111"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imath", 
+            "description": "Bad named entity: imath without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imath"
+                ]
+            ]
+        }, 
+        {
+            "input": "ı", 
+            "description": "Named entity: imath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imof", 
+            "description": "Bad named entity: imof without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imof"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊷", 
+            "description": "Named entity: imof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&imped", 
+            "description": "Bad named entity: imped without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&imped"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ƶ", 
+            "description": "Named entity: imped; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u01b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&in", 
+            "description": "Bad named entity: in without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&in"
+                ]
+            ]
+        }, 
+        {
+            "input": "∈", 
+            "description": "Named entity: in; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&incare", 
+            "description": "Bad named entity: incare without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&incare"
+                ]
+            ]
+        }, 
+        {
+            "input": "℅", 
+            "description": "Named entity: incare; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2105"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infin", 
+            "description": "Bad named entity: infin without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&infin"
+                ]
+            ]
+        }, 
+        {
+            "input": "∞", 
+            "description": "Named entity: infin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&infintie", 
+            "description": "Bad named entity: infintie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&infintie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧝", 
+            "description": "Named entity: infintie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&inodot", 
+            "description": "Bad named entity: inodot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&inodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ı", 
+            "description": "Named entity: inodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0131"
+                ]
+            ]
+        }, 
+        {
+            "input": "&int", 
+            "description": "Bad named entity: int without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&int"
+                ]
+            ]
+        }, 
+        {
+            "input": "∫", 
+            "description": "Named entity: int; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intcal", 
+            "description": "Bad named entity: intcal without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&intcal"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊺", 
+            "description": "Named entity: intcal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&integers", 
+            "description": "Bad named entity: integers without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&integers"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℤ", 
+            "description": "Named entity: integers; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2124"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intercal", 
+            "description": "Bad named entity: intercal without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&intercal"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊺", 
+            "description": "Named entity: intercal; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intlarhk", 
+            "description": "Bad named entity: intlarhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&intlarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨗", 
+            "description": "Named entity: intlarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a17"
+                ]
+            ]
+        }, 
+        {
+            "input": "&intprod", 
+            "description": "Bad named entity: intprod without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&intprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨼", 
+            "description": "Named entity: intprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iocy", 
+            "description": "Bad named entity: iocy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ё", 
+            "description": "Named entity: iocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0451"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iogon", 
+            "description": "Bad named entity: iogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "į", 
+            "description": "Named entity: iogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u012f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iopf", 
+            "description": "Bad named entity: iopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕚", 
+            "description": "Named entity: iopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iota", 
+            "description": "Bad named entity: iota without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iota"
+                ]
+            ]
+        }, 
+        {
+            "input": "ι", 
+            "description": "Named entity: iota; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iprod", 
+            "description": "Bad named entity: iprod without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iprod"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨼", 
+            "description": "Named entity: iprod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3c"
+                ]
+            ]
+        }, 
+        {
+            "input": "¿", 
+            "description": "Named entity: iquest without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "¿", 
+            "description": "Named entity: iquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iscr", 
+            "description": "Bad named entity: iscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒾", 
+            "description": "Named entity: iscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isin", 
+            "description": "Bad named entity: isin without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isin"
+                ]
+            ]
+        }, 
+        {
+            "input": "∈", 
+            "description": "Named entity: isin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinE", 
+            "description": "Bad named entity: isinE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isinE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋹", 
+            "description": "Named entity: isinE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isindot", 
+            "description": "Bad named entity: isindot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isindot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋵", 
+            "description": "Named entity: isindot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isins", 
+            "description": "Bad named entity: isins without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isins"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋴", 
+            "description": "Named entity: isins; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinsv", 
+            "description": "Bad named entity: isinsv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isinsv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋳", 
+            "description": "Named entity: isinsv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&isinv", 
+            "description": "Bad named entity: isinv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&isinv"
+                ]
+            ]
+        }, 
+        {
+            "input": "∈", 
+            "description": "Named entity: isinv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2208"
+                ]
+            ]
+        }, 
+        {
+            "input": "&it", 
+            "description": "Bad named entity: it without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&it"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁢", 
+            "description": "Named entity: it; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2062"
+                ]
+            ]
+        }, 
+        {
+            "input": "&itilde", 
+            "description": "Bad named entity: itilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&itilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĩ", 
+            "description": "Named entity: itilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0129"
+                ]
+            ]
+        }, 
+        {
+            "input": "&iukcy", 
+            "description": "Bad named entity: iukcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&iukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "і", 
+            "description": "Named entity: iukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0456"
+                ]
+            ]
+        }, 
+        {
+            "input": "ï", 
+            "description": "Named entity: iuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "ï", 
+            "description": "Named entity: iuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcirc", 
+            "description": "Bad named entity: jcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĵ", 
+            "description": "Named entity: jcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0135"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jcy", 
+            "description": "Bad named entity: jcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "й", 
+            "description": "Named entity: jcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0439"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jfr", 
+            "description": "Bad named entity: jfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔧", 
+            "description": "Named entity: jfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd27"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jmath", 
+            "description": "Bad named entity: jmath without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jmath"
+                ]
+            ]
+        }, 
+        {
+            "input": "ȷ", 
+            "description": "Named entity: jmath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0237"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jopf", 
+            "description": "Bad named entity: jopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕛", 
+            "description": "Named entity: jopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jscr", 
+            "description": "Bad named entity: jscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝒿", 
+            "description": "Named entity: jscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcbf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jsercy", 
+            "description": "Bad named entity: jsercy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jsercy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ј", 
+            "description": "Named entity: jsercy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0458"
+                ]
+            ]
+        }, 
+        {
+            "input": "&jukcy", 
+            "description": "Bad named entity: jukcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&jukcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "є", 
+            "description": "Named entity: jukcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0454"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappa", 
+            "description": "Bad named entity: kappa without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "κ", 
+            "description": "Named entity: kappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kappav", 
+            "description": "Bad named entity: kappav without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kappav"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϰ", 
+            "description": "Named entity: kappav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcedil", 
+            "description": "Bad named entity: kcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ķ", 
+            "description": "Named entity: kcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0137"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kcy", 
+            "description": "Bad named entity: kcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "к", 
+            "description": "Named entity: kcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kfr", 
+            "description": "Bad named entity: kfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔨", 
+            "description": "Named entity: kfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd28"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kgreen", 
+            "description": "Bad named entity: kgreen without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kgreen"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĸ", 
+            "description": "Named entity: kgreen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0138"
+                ]
+            ]
+        }, 
+        {
+            "input": "&khcy", 
+            "description": "Bad named entity: khcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&khcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "х", 
+            "description": "Named entity: khcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0445"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kjcy", 
+            "description": "Bad named entity: kjcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kjcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ќ", 
+            "description": "Named entity: kjcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kopf", 
+            "description": "Bad named entity: kopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕜", 
+            "description": "Named entity: kopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&kscr", 
+            "description": "Bad named entity: kscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&kscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓀", 
+            "description": "Named entity: kscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAarr", 
+            "description": "Bad named entity: lAarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lAarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇚", 
+            "description": "Named entity: lAarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lArr", 
+            "description": "Bad named entity: lArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇐", 
+            "description": "Named entity: lArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lAtail", 
+            "description": "Bad named entity: lAtail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lAtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤛", 
+            "description": "Named entity: lAtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lBarr", 
+            "description": "Bad named entity: lBarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤎", 
+            "description": "Named entity: lBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lE", 
+            "description": "Bad named entity: lE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≦", 
+            "description": "Named entity: lE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lEg", 
+            "description": "Bad named entity: lEg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lEg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪋", 
+            "description": "Named entity: lEg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lHar", 
+            "description": "Bad named entity: lHar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥢", 
+            "description": "Named entity: lHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2962"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lacute", 
+            "description": "Bad named entity: lacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ĺ", 
+            "description": "Named entity: lacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&laemptyv", 
+            "description": "Bad named entity: laemptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&laemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦴", 
+            "description": "Named entity: laemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lagran", 
+            "description": "Bad named entity: lagran without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lagran"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℒ", 
+            "description": "Named entity: lagran; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2112"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lambda", 
+            "description": "Bad named entity: lambda without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lambda"
+                ]
+            ]
+        }, 
+        {
+            "input": "λ", 
+            "description": "Named entity: lambda; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lang", 
+            "description": "Bad named entity: lang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟨", 
+            "description": "Named entity: lang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langd", 
+            "description": "Bad named entity: langd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&langd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦑", 
+            "description": "Named entity: langd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2991"
+                ]
+            ]
+        }, 
+        {
+            "input": "&langle", 
+            "description": "Bad named entity: langle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&langle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟨", 
+            "description": "Named entity: langle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lap", 
+            "description": "Bad named entity: lap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪅", 
+            "description": "Named entity: lap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a85"
+                ]
+            ]
+        }, 
+        {
+            "input": "«", 
+            "description": "Named entity: laquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "«", 
+            "description": "Named entity: laquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larr", 
+            "description": "Bad named entity: larr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larr"
+                ]
+            ]
+        }, 
+        {
+            "input": "←", 
+            "description": "Named entity: larr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrb", 
+            "description": "Bad named entity: larrb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇤", 
+            "description": "Named entity: larrb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrbfs", 
+            "description": "Bad named entity: larrbfs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrbfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤟", 
+            "description": "Named entity: larrbfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrfs", 
+            "description": "Bad named entity: larrfs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤝", 
+            "description": "Named entity: larrfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrhk", 
+            "description": "Bad named entity: larrhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "↩", 
+            "description": "Named entity: larrhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrlp", 
+            "description": "Bad named entity: larrlp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrlp"
+                ]
+            ]
+        }, 
+        {
+            "input": "↫", 
+            "description": "Named entity: larrlp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrpl", 
+            "description": "Bad named entity: larrpl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrpl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤹", 
+            "description": "Named entity: larrpl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2939"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrsim", 
+            "description": "Bad named entity: larrsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥳", 
+            "description": "Named entity: larrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2973"
+                ]
+            ]
+        }, 
+        {
+            "input": "&larrtl", 
+            "description": "Bad named entity: larrtl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&larrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "↢", 
+            "description": "Named entity: larrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lat", 
+            "description": "Bad named entity: lat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lat"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪫", 
+            "description": "Named entity: lat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&latail", 
+            "description": "Bad named entity: latail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&latail"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤙", 
+            "description": "Named entity: latail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2919"
+                ]
+            ]
+        }, 
+        {
+            "input": "&late", 
+            "description": "Bad named entity: late without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&late"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪭", 
+            "description": "Named entity: late; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lates", 
+            "description": "Bad named entity: lates without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lates"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪭︀", 
+            "description": "Named entity: lates; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aad\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbarr", 
+            "description": "Bad named entity: lbarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤌", 
+            "description": "Named entity: lbarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbbrk", 
+            "description": "Bad named entity: lbbrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "❲", 
+            "description": "Named entity: lbbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2772"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrace", 
+            "description": "Bad named entity: lbrace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "{", 
+            "description": "Named entity: lbrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "{"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrack", 
+            "description": "Bad named entity: lbrack without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbrack"
+                ]
+            ]
+        }, 
+        {
+            "input": "[", 
+            "description": "Named entity: lbrack; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "["
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrke", 
+            "description": "Bad named entity: lbrke without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbrke"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦋", 
+            "description": "Named entity: lbrke; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrksld", 
+            "description": "Bad named entity: lbrksld without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbrksld"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦏", 
+            "description": "Named entity: lbrksld; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lbrkslu", 
+            "description": "Bad named entity: lbrkslu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lbrkslu"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦍", 
+            "description": "Named entity: lbrkslu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcaron", 
+            "description": "Bad named entity: lcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ľ", 
+            "description": "Named entity: lcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcedil", 
+            "description": "Bad named entity: lcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ļ", 
+            "description": "Named entity: lcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u013c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lceil", 
+            "description": "Bad named entity: lceil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lceil"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌈", 
+            "description": "Named entity: lceil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2308"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcub", 
+            "description": "Bad named entity: lcub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lcub"
+                ]
+            ]
+        }, 
+        {
+            "input": "{", 
+            "description": "Named entity: lcub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "{"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lcy", 
+            "description": "Bad named entity: lcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "л", 
+            "description": "Named entity: lcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldca", 
+            "description": "Bad named entity: ldca without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldca"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤶", 
+            "description": "Named entity: ldca; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2936"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquo", 
+            "description": "Bad named entity: ldquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "“", 
+            "description": "Named entity: ldquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldquor", 
+            "description": "Bad named entity: ldquor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "„", 
+            "description": "Named entity: ldquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrdhar", 
+            "description": "Bad named entity: ldrdhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldrdhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥧", 
+            "description": "Named entity: ldrdhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2967"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldrushar", 
+            "description": "Bad named entity: ldrushar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldrushar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥋", 
+            "description": "Named entity: ldrushar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ldsh", 
+            "description": "Bad named entity: ldsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ldsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↲", 
+            "description": "Named entity: ldsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&le", 
+            "description": "Bad named entity: le without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&le"
+                ]
+            ]
+        }, 
+        {
+            "input": "≤", 
+            "description": "Named entity: le; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrow", 
+            "description": "Bad named entity: leftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "←", 
+            "description": "Named entity: leftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftarrowtail", 
+            "description": "Bad named entity: leftarrowtail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftarrowtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "↢", 
+            "description": "Named entity: leftarrowtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoondown", 
+            "description": "Bad named entity: leftharpoondown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftharpoondown"
+                ]
+            ]
+        }, 
+        {
+            "input": "↽", 
+            "description": "Named entity: leftharpoondown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftharpoonup", 
+            "description": "Bad named entity: leftharpoonup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftharpoonup"
+                ]
+            ]
+        }, 
+        {
+            "input": "↼", 
+            "description": "Named entity: leftharpoonup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftleftarrows", 
+            "description": "Bad named entity: leftleftarrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftleftarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇇", 
+            "description": "Named entity: leftleftarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrow", 
+            "description": "Bad named entity: leftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↔", 
+            "description": "Named entity: leftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2194"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightarrows", 
+            "description": "Bad named entity: leftrightarrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftrightarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇆", 
+            "description": "Named entity: leftrightarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightharpoons", 
+            "description": "Bad named entity: leftrightharpoons without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftrightharpoons"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇋", 
+            "description": "Named entity: leftrightharpoons; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftrightsquigarrow", 
+            "description": "Bad named entity: leftrightsquigarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftrightsquigarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↭", 
+            "description": "Named entity: leftrightsquigarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leftthreetimes", 
+            "description": "Bad named entity: leftthreetimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leftthreetimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋋", 
+            "description": "Named entity: leftthreetimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leg", 
+            "description": "Bad named entity: leg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋚", 
+            "description": "Named entity: leg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leq", 
+            "description": "Bad named entity: leq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≤", 
+            "description": "Named entity: leq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqq", 
+            "description": "Bad named entity: leqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≦", 
+            "description": "Named entity: leqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266"
+                ]
+            ]
+        }, 
+        {
+            "input": "&leqslant", 
+            "description": "Bad named entity: leqslant without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&leqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽", 
+            "description": "Named entity: leqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&les", 
+            "description": "Bad named entity: les without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&les"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽", 
+            "description": "Named entity: les; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lescc", 
+            "description": "Bad named entity: lescc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lescc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪨", 
+            "description": "Named entity: lescc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdot", 
+            "description": "Bad named entity: lesdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩿", 
+            "description": "Named entity: lesdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdoto", 
+            "description": "Bad named entity: lesdoto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesdoto"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪁", 
+            "description": "Named entity: lesdoto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a81"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesdotor", 
+            "description": "Bad named entity: lesdotor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesdotor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪃", 
+            "description": "Named entity: lesdotor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a83"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesg", 
+            "description": "Bad named entity: lesg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋚︀", 
+            "description": "Named entity: lesg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesges", 
+            "description": "Bad named entity: lesges without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesges"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪓", 
+            "description": "Named entity: lesges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a93"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessapprox", 
+            "description": "Bad named entity: lessapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lessapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪅", 
+            "description": "Named entity: lessapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a85"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessdot", 
+            "description": "Bad named entity: lessdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lessdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋖", 
+            "description": "Named entity: lessdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqgtr", 
+            "description": "Bad named entity: lesseqgtr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesseqgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋚", 
+            "description": "Named entity: lesseqgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesseqqgtr", 
+            "description": "Bad named entity: lesseqqgtr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesseqqgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪋", 
+            "description": "Named entity: lesseqqgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lessgtr", 
+            "description": "Bad named entity: lessgtr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lessgtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "≶", 
+            "description": "Named entity: lessgtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lesssim", 
+            "description": "Bad named entity: lesssim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lesssim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≲", 
+            "description": "Named entity: lesssim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfisht", 
+            "description": "Bad named entity: lfisht without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥼", 
+            "description": "Named entity: lfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfloor", 
+            "description": "Bad named entity: lfloor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lfloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌊", 
+            "description": "Named entity: lfloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lfr", 
+            "description": "Bad named entity: lfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔩", 
+            "description": "Named entity: lfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd29"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lg", 
+            "description": "Bad named entity: lg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lg"
+                ]
+            ]
+        }, 
+        {
+            "input": "≶", 
+            "description": "Named entity: lg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2276"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lgE", 
+            "description": "Bad named entity: lgE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lgE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪑", 
+            "description": "Named entity: lgE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a91"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhard", 
+            "description": "Bad named entity: lhard without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "↽", 
+            "description": "Named entity: lhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharu", 
+            "description": "Bad named entity: lharu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lharu"
+                ]
+            ]
+        }, 
+        {
+            "input": "↼", 
+            "description": "Named entity: lharu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lharul", 
+            "description": "Bad named entity: lharul without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lharul"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥪", 
+            "description": "Named entity: lharul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lhblk", 
+            "description": "Bad named entity: lhblk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lhblk"
+                ]
+            ]
+        }, 
+        {
+            "input": "▄", 
+            "description": "Named entity: lhblk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2584"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ljcy", 
+            "description": "Bad named entity: ljcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ljcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "љ", 
+            "description": "Named entity: ljcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0459"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ll", 
+            "description": "Bad named entity: ll without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ll"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪", 
+            "description": "Named entity: ll; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llarr", 
+            "description": "Bad named entity: llarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&llarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇇", 
+            "description": "Named entity: llarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llcorner", 
+            "description": "Bad named entity: llcorner without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&llcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌞", 
+            "description": "Named entity: llcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&llhard", 
+            "description": "Bad named entity: llhard without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&llhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥫", 
+            "description": "Named entity: llhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lltri", 
+            "description": "Bad named entity: lltri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "◺", 
+            "description": "Named entity: lltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmidot", 
+            "description": "Bad named entity: lmidot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lmidot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŀ", 
+            "description": "Named entity: lmidot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0140"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoust", 
+            "description": "Bad named entity: lmoust without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lmoust"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎰", 
+            "description": "Named entity: lmoust; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lmoustache", 
+            "description": "Bad named entity: lmoustache without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lmoustache"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎰", 
+            "description": "Named entity: lmoustache; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnE", 
+            "description": "Bad named entity: lnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≨", 
+            "description": "Named entity: lnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnap", 
+            "description": "Bad named entity: lnap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪉", 
+            "description": "Named entity: lnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a89"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnapprox", 
+            "description": "Bad named entity: lnapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪉", 
+            "description": "Named entity: lnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a89"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lne", 
+            "description": "Bad named entity: lne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪇", 
+            "description": "Named entity: lne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a87"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneq", 
+            "description": "Bad named entity: lneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪇", 
+            "description": "Named entity: lneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a87"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lneqq", 
+            "description": "Bad named entity: lneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≨", 
+            "description": "Named entity: lneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lnsim", 
+            "description": "Bad named entity: lnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋦", 
+            "description": "Named entity: lnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loang", 
+            "description": "Bad named entity: loang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&loang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟬", 
+            "description": "Named entity: loang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loarr", 
+            "description": "Bad named entity: loarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&loarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇽", 
+            "description": "Named entity: loarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lobrk", 
+            "description": "Bad named entity: lobrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lobrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟦", 
+            "description": "Named entity: lobrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftarrow", 
+            "description": "Bad named entity: longleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&longleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟵", 
+            "description": "Named entity: longleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longleftrightarrow", 
+            "description": "Bad named entity: longleftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&longleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟷", 
+            "description": "Named entity: longleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longmapsto", 
+            "description": "Bad named entity: longmapsto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&longmapsto"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟼", 
+            "description": "Named entity: longmapsto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&longrightarrow", 
+            "description": "Bad named entity: longrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&longrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟶", 
+            "description": "Named entity: longrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowleft", 
+            "description": "Bad named entity: looparrowleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&looparrowleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "↫", 
+            "description": "Named entity: looparrowleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ab"
+                ]
+            ]
+        }, 
+        {
+            "input": "&looparrowright", 
+            "description": "Bad named entity: looparrowright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&looparrowright"
+                ]
+            ]
+        }, 
+        {
+            "input": "↬", 
+            "description": "Named entity: looparrowright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopar", 
+            "description": "Bad named entity: lopar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lopar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦅", 
+            "description": "Named entity: lopar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2985"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lopf", 
+            "description": "Bad named entity: lopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕝", 
+            "description": "Named entity: lopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loplus", 
+            "description": "Bad named entity: loplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&loplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨭", 
+            "description": "Named entity: loplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lotimes", 
+            "description": "Bad named entity: lotimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨴", 
+            "description": "Named entity: lotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a34"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowast", 
+            "description": "Bad named entity: lowast without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lowast"
+                ]
+            ]
+        }, 
+        {
+            "input": "∗", 
+            "description": "Named entity: lowast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2217"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lowbar", 
+            "description": "Bad named entity: lowbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lowbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "_", 
+            "description": "Named entity: lowbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "_"
+                ]
+            ]
+        }, 
+        {
+            "input": "&loz", 
+            "description": "Bad named entity: loz without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&loz"
+                ]
+            ]
+        }, 
+        {
+            "input": "◊", 
+            "description": "Named entity: loz; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozenge", 
+            "description": "Bad named entity: lozenge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lozenge"
+                ]
+            ]
+        }, 
+        {
+            "input": "◊", 
+            "description": "Named entity: lozenge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lozf", 
+            "description": "Bad named entity: lozf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lozf"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧫", 
+            "description": "Named entity: lozf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lpar", 
+            "description": "Bad named entity: lpar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lpar"
+                ]
+            ]
+        }, 
+        {
+            "input": "(", 
+            "description": "Named entity: lpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "("
+                ]
+            ]
+        }, 
+        {
+            "input": "&lparlt", 
+            "description": "Bad named entity: lparlt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lparlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦓", 
+            "description": "Named entity: lparlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2993"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrarr", 
+            "description": "Bad named entity: lrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇆", 
+            "description": "Named entity: lrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrcorner", 
+            "description": "Bad named entity: lrcorner without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌟", 
+            "description": "Named entity: lrcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhar", 
+            "description": "Bad named entity: lrhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇋", 
+            "description": "Named entity: lrhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrhard", 
+            "description": "Bad named entity: lrhard without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥭", 
+            "description": "Named entity: lrhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrm", 
+            "description": "Bad named entity: lrm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrm"
+                ]
+            ]
+        }, 
+        {
+            "input": "‎", 
+            "description": "Named entity: lrm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lrtri", 
+            "description": "Bad named entity: lrtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊿", 
+            "description": "Named entity: lrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsaquo", 
+            "description": "Bad named entity: lsaquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsaquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "‹", 
+            "description": "Named entity: lsaquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2039"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lscr", 
+            "description": "Bad named entity: lscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓁", 
+            "description": "Named entity: lscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsh", 
+            "description": "Bad named entity: lsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↰", 
+            "description": "Named entity: lsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsim", 
+            "description": "Bad named entity: lsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≲", 
+            "description": "Named entity: lsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2272"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsime", 
+            "description": "Bad named entity: lsime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪍", 
+            "description": "Named entity: lsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsimg", 
+            "description": "Bad named entity: lsimg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsimg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪏", 
+            "description": "Named entity: lsimg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a8f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsqb", 
+            "description": "Bad named entity: lsqb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsqb"
+                ]
+            ]
+        }, 
+        {
+            "input": "[", 
+            "description": "Named entity: lsqb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "["
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquo", 
+            "description": "Bad named entity: lsquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "‘", 
+            "description": "Named entity: lsquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2018"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lsquor", 
+            "description": "Bad named entity: lsquor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lsquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "‚", 
+            "description": "Named entity: lsquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lstrok", 
+            "description": "Bad named entity: lstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "ł", 
+            "description": "Named entity: lstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0142"
+                ]
+            ]
+        }, 
+        {
+            "input": "<", 
+            "description": "Named entity: lt without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "<", 
+            "description": "Named entity: lt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪦", 
+            "description": "Named entity: ltcc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa6"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩹", 
+            "description": "Named entity: ltcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a79"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋖", 
+            "description": "Named entity: ltdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋋", 
+            "description": "Named entity: lthree; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋉", 
+            "description": "Named entity: ltimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥶", 
+            "description": "Named entity: ltlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2976"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩻", 
+            "description": "Named entity: ltquest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7b"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦖", 
+            "description": "Named entity: ltrPar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2996"
+                ]
+            ]
+        }, 
+        {
+            "input": "◃", 
+            "description": "Named entity: ltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊴", 
+            "description": "Named entity: ltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "◂", 
+            "description": "Named entity: ltrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lurdshar", 
+            "description": "Bad named entity: lurdshar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lurdshar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥊", 
+            "description": "Named entity: lurdshar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u294a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&luruhar", 
+            "description": "Bad named entity: luruhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&luruhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥦", 
+            "description": "Named entity: luruhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2966"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvertneqq", 
+            "description": "Bad named entity: lvertneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lvertneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≨︀", 
+            "description": "Named entity: lvertneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&lvnE", 
+            "description": "Bad named entity: lvnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&lvnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≨︀", 
+            "description": "Named entity: lvnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2268\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mDDot", 
+            "description": "Bad named entity: mDDot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mDDot"
+                ]
+            ]
+        }, 
+        {
+            "input": "∺", 
+            "description": "Named entity: mDDot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223a"
+                ]
+            ]
+        }, 
+        {
+            "input": "¯", 
+            "description": "Named entity: macr without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "¯", 
+            "description": "Named entity: macr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&male", 
+            "description": "Bad named entity: male without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&male"
+                ]
+            ]
+        }, 
+        {
+            "input": "♂", 
+            "description": "Named entity: male; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2642"
+                ]
+            ]
+        }, 
+        {
+            "input": "&malt", 
+            "description": "Bad named entity: malt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&malt"
+                ]
+            ]
+        }, 
+        {
+            "input": "✠", 
+            "description": "Named entity: malt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2720"
+                ]
+            ]
+        }, 
+        {
+            "input": "&maltese", 
+            "description": "Bad named entity: maltese without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&maltese"
+                ]
+            ]
+        }, 
+        {
+            "input": "✠", 
+            "description": "Named entity: maltese; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2720"
+                ]
+            ]
+        }, 
+        {
+            "input": "&map", 
+            "description": "Bad named entity: map without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&map"
+                ]
+            ]
+        }, 
+        {
+            "input": "↦", 
+            "description": "Named entity: map; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapsto", 
+            "description": "Bad named entity: mapsto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mapsto"
+                ]
+            ]
+        }, 
+        {
+            "input": "↦", 
+            "description": "Named entity: mapsto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstodown", 
+            "description": "Bad named entity: mapstodown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mapstodown"
+                ]
+            ]
+        }, 
+        {
+            "input": "↧", 
+            "description": "Named entity: mapstodown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoleft", 
+            "description": "Bad named entity: mapstoleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mapstoleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "↤", 
+            "description": "Named entity: mapstoleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mapstoup", 
+            "description": "Bad named entity: mapstoup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mapstoup"
+                ]
+            ]
+        }, 
+        {
+            "input": "↥", 
+            "description": "Named entity: mapstoup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&marker", 
+            "description": "Bad named entity: marker without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&marker"
+                ]
+            ]
+        }, 
+        {
+            "input": "▮", 
+            "description": "Named entity: marker; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcomma", 
+            "description": "Bad named entity: mcomma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mcomma"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨩", 
+            "description": "Named entity: mcomma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a29"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mcy", 
+            "description": "Bad named entity: mcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "м", 
+            "description": "Named entity: mcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mdash", 
+            "description": "Bad named entity: mdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "—", 
+            "description": "Named entity: mdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2014"
+                ]
+            ]
+        }, 
+        {
+            "input": "&measuredangle", 
+            "description": "Bad named entity: measuredangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&measuredangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "∡", 
+            "description": "Named entity: measuredangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2221"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mfr", 
+            "description": "Bad named entity: mfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔪", 
+            "description": "Named entity: mfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mho", 
+            "description": "Bad named entity: mho without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mho"
+                ]
+            ]
+        }, 
+        {
+            "input": "℧", 
+            "description": "Named entity: mho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2127"
+                ]
+            ]
+        }, 
+        {
+            "input": "µ", 
+            "description": "Named entity: micro without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "µ", 
+            "description": "Named entity: micro; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mid", 
+            "description": "Bad named entity: mid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∣", 
+            "description": "Named entity: mid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midast", 
+            "description": "Bad named entity: midast without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&midast"
+                ]
+            ]
+        }, 
+        {
+            "input": "*", 
+            "description": "Named entity: midast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "*"
+                ]
+            ]
+        }, 
+        {
+            "input": "&midcir", 
+            "description": "Bad named entity: midcir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&midcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫰", 
+            "description": "Named entity: midcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af0"
+                ]
+            ]
+        }, 
+        {
+            "input": "·", 
+            "description": "Named entity: middot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "·", 
+            "description": "Named entity: middot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minus", 
+            "description": "Bad named entity: minus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&minus"
+                ]
+            ]
+        }, 
+        {
+            "input": "−", 
+            "description": "Named entity: minus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2212"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusb", 
+            "description": "Bad named entity: minusb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&minusb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊟", 
+            "description": "Named entity: minusb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusd", 
+            "description": "Bad named entity: minusd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&minusd"
+                ]
+            ]
+        }, 
+        {
+            "input": "∸", 
+            "description": "Named entity: minusd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2238"
+                ]
+            ]
+        }, 
+        {
+            "input": "&minusdu", 
+            "description": "Bad named entity: minusdu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&minusdu"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨪", 
+            "description": "Named entity: minusdu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mlcp", 
+            "description": "Bad named entity: mlcp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mlcp"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫛", 
+            "description": "Named entity: mlcp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2adb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mldr", 
+            "description": "Bad named entity: mldr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mldr"
+                ]
+            ]
+        }, 
+        {
+            "input": "…", 
+            "description": "Named entity: mldr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2026"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mnplus", 
+            "description": "Bad named entity: mnplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mnplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∓", 
+            "description": "Named entity: mnplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&models", 
+            "description": "Bad named entity: models without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&models"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊧", 
+            "description": "Named entity: models; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mopf", 
+            "description": "Bad named entity: mopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕞", 
+            "description": "Named entity: mopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mp", 
+            "description": "Bad named entity: mp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mp"
+                ]
+            ]
+        }, 
+        {
+            "input": "∓", 
+            "description": "Named entity: mp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2213"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mscr", 
+            "description": "Bad named entity: mscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓂", 
+            "description": "Named entity: mscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mstpos", 
+            "description": "Bad named entity: mstpos without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mstpos"
+                ]
+            ]
+        }, 
+        {
+            "input": "∾", 
+            "description": "Named entity: mstpos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mu", 
+            "description": "Bad named entity: mu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mu"
+                ]
+            ]
+        }, 
+        {
+            "input": "μ", 
+            "description": "Named entity: mu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&multimap", 
+            "description": "Bad named entity: multimap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&multimap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊸", 
+            "description": "Named entity: multimap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&mumap", 
+            "description": "Bad named entity: mumap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&mumap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊸", 
+            "description": "Named entity: mumap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGg", 
+            "description": "Bad named entity: nGg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nGg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋙̸", 
+            "description": "Named entity: nGg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d9\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGt", 
+            "description": "Bad named entity: nGt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nGt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫⃒", 
+            "description": "Named entity: nGt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nGtv", 
+            "description": "Bad named entity: nGtv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nGtv"
+                ]
+            ]
+        }, 
+        {
+            "input": "≫̸", 
+            "description": "Named entity: nGtv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftarrow", 
+            "description": "Bad named entity: nLeftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nLeftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇍", 
+            "description": "Named entity: nLeftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLeftrightarrow", 
+            "description": "Bad named entity: nLeftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nLeftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇎", 
+            "description": "Named entity: nLeftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLl", 
+            "description": "Bad named entity: nLl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nLl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋘̸", 
+            "description": "Named entity: nLl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d8\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLt", 
+            "description": "Bad named entity: nLt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nLt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪⃒", 
+            "description": "Named entity: nLt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nLtv", 
+            "description": "Bad named entity: nLtv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nLtv"
+                ]
+            ]
+        }, 
+        {
+            "input": "≪̸", 
+            "description": "Named entity: nLtv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226a\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nRightarrow", 
+            "description": "Bad named entity: nRightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nRightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇏", 
+            "description": "Named entity: nRightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVDash", 
+            "description": "Bad named entity: nVDash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nVDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊯", 
+            "description": "Named entity: nVDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nVdash", 
+            "description": "Bad named entity: nVdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nVdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊮", 
+            "description": "Named entity: nVdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nabla", 
+            "description": "Bad named entity: nabla without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nabla"
+                ]
+            ]
+        }, 
+        {
+            "input": "∇", 
+            "description": "Named entity: nabla; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2207"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nacute", 
+            "description": "Bad named entity: nacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ń", 
+            "description": "Named entity: nacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0144"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nang", 
+            "description": "Bad named entity: nang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nang"
+                ]
+            ]
+        }, 
+        {
+            "input": "∠⃒", 
+            "description": "Named entity: nang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2220\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nap", 
+            "description": "Bad named entity: nap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≉", 
+            "description": "Named entity: nap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napE", 
+            "description": "Bad named entity: napE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&napE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩰̸", 
+            "description": "Named entity: napE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a70\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napid", 
+            "description": "Bad named entity: napid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&napid"
+                ]
+            ]
+        }, 
+        {
+            "input": "≋̸", 
+            "description": "Named entity: napid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224b\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napos", 
+            "description": "Bad named entity: napos without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&napos"
+                ]
+            ]
+        }, 
+        {
+            "input": "ʼn", 
+            "description": "Named entity: napos; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0149"
+                ]
+            ]
+        }, 
+        {
+            "input": "&napprox", 
+            "description": "Bad named entity: napprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&napprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "≉", 
+            "description": "Named entity: napprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2249"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natur", 
+            "description": "Bad named entity: natur without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&natur"
+                ]
+            ]
+        }, 
+        {
+            "input": "♮", 
+            "description": "Named entity: natur; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&natural", 
+            "description": "Bad named entity: natural without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&natural"
+                ]
+            ]
+        }, 
+        {
+            "input": "♮", 
+            "description": "Named entity: natural; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&naturals", 
+            "description": "Bad named entity: naturals without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&naturals"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℕ", 
+            "description": "Named entity: naturals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2115"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: nbsp without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: nbsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbump", 
+            "description": "Bad named entity: nbump without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nbump"
+                ]
+            ]
+        }, 
+        {
+            "input": "≎̸", 
+            "description": "Named entity: nbump; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nbumpe", 
+            "description": "Bad named entity: nbumpe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nbumpe"
+                ]
+            ]
+        }, 
+        {
+            "input": "≏̸", 
+            "description": "Named entity: nbumpe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224f\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncap", 
+            "description": "Bad named entity: ncap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩃", 
+            "description": "Named entity: ncap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a43"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncaron", 
+            "description": "Bad named entity: ncaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ň", 
+            "description": "Named entity: ncaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0148"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncedil", 
+            "description": "Bad named entity: ncedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ņ", 
+            "description": "Named entity: ncedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0146"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncong", 
+            "description": "Bad named entity: ncong without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncong"
+                ]
+            ]
+        }, 
+        {
+            "input": "≇", 
+            "description": "Named entity: ncong; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2247"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncongdot", 
+            "description": "Bad named entity: ncongdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncongdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩭̸", 
+            "description": "Named entity: ncongdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncup", 
+            "description": "Bad named entity: ncup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩂", 
+            "description": "Named entity: ncup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a42"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ncy", 
+            "description": "Bad named entity: ncy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ncy"
+                ]
+            ]
+        }, 
+        {
+            "input": "н", 
+            "description": "Named entity: ncy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ndash", 
+            "description": "Bad named entity: ndash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ndash"
+                ]
+            ]
+        }, 
+        {
+            "input": "–", 
+            "description": "Named entity: ndash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2013"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ne", 
+            "description": "Bad named entity: ne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ne"
+                ]
+            ]
+        }, 
+        {
+            "input": "≠", 
+            "description": "Named entity: ne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2260"
+                ]
+            ]
+        }, 
+        {
+            "input": "&neArr", 
+            "description": "Bad named entity: neArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&neArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇗", 
+            "description": "Named entity: neArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearhk", 
+            "description": "Bad named entity: nearhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nearhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤤", 
+            "description": "Named entity: nearhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2924"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearr", 
+            "description": "Bad named entity: nearr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nearr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↗", 
+            "description": "Named entity: nearr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nearrow", 
+            "description": "Bad named entity: nearrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nearrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↗", 
+            "description": "Named entity: nearrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2197"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nedot", 
+            "description": "Bad named entity: nedot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "≐̸", 
+            "description": "Named entity: nedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2250\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nequiv", 
+            "description": "Bad named entity: nequiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nequiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "≢", 
+            "description": "Named entity: nequiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2262"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesear", 
+            "description": "Bad named entity: nesear without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nesear"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤨", 
+            "description": "Named entity: nesear; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2928"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nesim", 
+            "description": "Bad named entity: nesim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nesim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≂̸", 
+            "description": "Named entity: nesim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2242\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexist", 
+            "description": "Bad named entity: nexist without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nexist"
+                ]
+            ]
+        }, 
+        {
+            "input": "∄", 
+            "description": "Named entity: nexist; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nexists", 
+            "description": "Bad named entity: nexists without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nexists"
+                ]
+            ]
+        }, 
+        {
+            "input": "∄", 
+            "description": "Named entity: nexists; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2204"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nfr", 
+            "description": "Bad named entity: nfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔫", 
+            "description": "Named entity: nfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngE", 
+            "description": "Bad named entity: ngE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧̸", 
+            "description": "Named entity: ngE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nge", 
+            "description": "Bad named entity: nge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nge"
+                ]
+            ]
+        }, 
+        {
+            "input": "≱", 
+            "description": "Named entity: nge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeq", 
+            "description": "Bad named entity: ngeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≱", 
+            "description": "Named entity: ngeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2271"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqq", 
+            "description": "Bad named entity: ngeqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngeqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≧̸", 
+            "description": "Named entity: ngeqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2267\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngeqslant", 
+            "description": "Bad named entity: ngeqslant without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngeqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾̸", 
+            "description": "Named entity: ngeqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nges", 
+            "description": "Bad named entity: nges without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nges"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩾̸", 
+            "description": "Named entity: nges; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7e\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngsim", 
+            "description": "Bad named entity: ngsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≵", 
+            "description": "Named entity: ngsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2275"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngt", 
+            "description": "Bad named entity: ngt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≯", 
+            "description": "Named entity: ngt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ngtr", 
+            "description": "Bad named entity: ngtr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ngtr"
+                ]
+            ]
+        }, 
+        {
+            "input": "≯", 
+            "description": "Named entity: ngtr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhArr", 
+            "description": "Bad named entity: nhArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nhArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇎", 
+            "description": "Named entity: nhArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nharr", 
+            "description": "Bad named entity: nharr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↮", 
+            "description": "Named entity: nharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nhpar", 
+            "description": "Bad named entity: nhpar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nhpar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫲", 
+            "description": "Named entity: nhpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ni", 
+            "description": "Bad named entity: ni without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ni"
+                ]
+            ]
+        }, 
+        {
+            "input": "∋", 
+            "description": "Named entity: ni; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nis", 
+            "description": "Bad named entity: nis without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nis"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋼", 
+            "description": "Named entity: nis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nisd", 
+            "description": "Bad named entity: nisd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nisd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋺", 
+            "description": "Named entity: nisd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&niv", 
+            "description": "Bad named entity: niv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&niv"
+                ]
+            ]
+        }, 
+        {
+            "input": "∋", 
+            "description": "Named entity: niv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&njcy", 
+            "description": "Bad named entity: njcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&njcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "њ", 
+            "description": "Named entity: njcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlArr", 
+            "description": "Bad named entity: nlArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇍", 
+            "description": "Named entity: nlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlE", 
+            "description": "Bad named entity: nlE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nlE"
+                ]
+            ]
+        }, 
+        {
+            "input": "≦̸", 
+            "description": "Named entity: nlE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlarr", 
+            "description": "Bad named entity: nlarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↚", 
+            "description": "Named entity: nlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nldr", 
+            "description": "Bad named entity: nldr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nldr"
+                ]
+            ]
+        }, 
+        {
+            "input": "‥", 
+            "description": "Named entity: nldr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2025"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nle", 
+            "description": "Bad named entity: nle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nle"
+                ]
+            ]
+        }, 
+        {
+            "input": "≰", 
+            "description": "Named entity: nle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftarrow", 
+            "description": "Bad named entity: nleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↚", 
+            "description": "Named entity: nleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleftrightarrow", 
+            "description": "Bad named entity: nleftrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nleftrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↮", 
+            "description": "Named entity: nleftrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleq", 
+            "description": "Bad named entity: nleq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nleq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≰", 
+            "description": "Named entity: nleq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2270"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqq", 
+            "description": "Bad named entity: nleqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nleqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≦̸", 
+            "description": "Named entity: nleqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2266\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nleqslant", 
+            "description": "Bad named entity: nleqslant without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nleqslant"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽̸", 
+            "description": "Named entity: nleqslant; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nles", 
+            "description": "Bad named entity: nles without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nles"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩽̸", 
+            "description": "Named entity: nles; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a7d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nless", 
+            "description": "Bad named entity: nless without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nless"
+                ]
+            ]
+        }, 
+        {
+            "input": "≮", 
+            "description": "Named entity: nless; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlsim", 
+            "description": "Bad named entity: nlsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nlsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≴", 
+            "description": "Named entity: nlsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2274"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nlt", 
+            "description": "Bad named entity: nlt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≮", 
+            "description": "Named entity: nlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltri", 
+            "description": "Bad named entity: nltri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋪", 
+            "description": "Named entity: nltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nltrie", 
+            "description": "Bad named entity: nltrie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nltrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋬", 
+            "description": "Named entity: nltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nmid", 
+            "description": "Bad named entity: nmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∤", 
+            "description": "Named entity: nmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nopf", 
+            "description": "Bad named entity: nopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕟", 
+            "description": "Named entity: nopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd5f"
+                ]
+            ]
+        }, 
+        {
+            "input": "¬", 
+            "description": "Named entity: not without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "¬", 
+            "description": "Named entity: not; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "∉", 
+            "description": "Named entity: notin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋹̸", 
+            "description": "Named entity: notinE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f9\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋵̸", 
+            "description": "Named entity: notindot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "∉", 
+            "description": "Named entity: notinva; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2209"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋷", 
+            "description": "Named entity: notinvb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋶", 
+            "description": "Named entity: notinvc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "∌", 
+            "description": "Named entity: notni; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "∌", 
+            "description": "Named entity: notniva; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220c"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋾", 
+            "description": "Named entity: notnivb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋽", 
+            "description": "Named entity: notnivc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npar", 
+            "description": "Bad named entity: npar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∦", 
+            "description": "Named entity: npar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparallel", 
+            "description": "Bad named entity: nparallel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "∦", 
+            "description": "Named entity: nparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nparsl", 
+            "description": "Bad named entity: nparsl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫽⃥", 
+            "description": "Named entity: nparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2afd\u20e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npart", 
+            "description": "Bad named entity: npart without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npart"
+                ]
+            ]
+        }, 
+        {
+            "input": "∂̸", 
+            "description": "Named entity: npart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npolint", 
+            "description": "Bad named entity: npolint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨔", 
+            "description": "Named entity: npolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a14"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npr", 
+            "description": "Bad named entity: npr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊀", 
+            "description": "Named entity: npr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprcue", 
+            "description": "Bad named entity: nprcue without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nprcue"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋠", 
+            "description": "Named entity: nprcue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npre", 
+            "description": "Bad named entity: npre without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npre"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯̸", 
+            "description": "Named entity: npre; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nprec", 
+            "description": "Bad named entity: nprec without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nprec"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊀", 
+            "description": "Named entity: nprec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2280"
+                ]
+            ]
+        }, 
+        {
+            "input": "&npreceq", 
+            "description": "Bad named entity: npreceq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&npreceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯̸", 
+            "description": "Named entity: npreceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrArr", 
+            "description": "Bad named entity: nrArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇏", 
+            "description": "Named entity: nrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarr", 
+            "description": "Bad named entity: nrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↛", 
+            "description": "Named entity: nrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrc", 
+            "description": "Bad named entity: nrarrc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrarrc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤳̸", 
+            "description": "Named entity: nrarrc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2933\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrarrw", 
+            "description": "Bad named entity: nrarrw without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrarrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "↝̸", 
+            "description": "Named entity: nrarrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrightarrow", 
+            "description": "Bad named entity: nrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↛", 
+            "description": "Named entity: nrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtri", 
+            "description": "Bad named entity: nrtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋫", 
+            "description": "Named entity: nrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nrtrie", 
+            "description": "Bad named entity: nrtrie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nrtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋭", 
+            "description": "Named entity: nrtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsc", 
+            "description": "Bad named entity: nsc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊁", 
+            "description": "Named entity: nsc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsccue", 
+            "description": "Bad named entity: nsccue without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsccue"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋡", 
+            "description": "Named entity: nsccue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsce", 
+            "description": "Bad named entity: nsce without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsce"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰̸", 
+            "description": "Named entity: nsce; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nscr", 
+            "description": "Bad named entity: nscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓃", 
+            "description": "Named entity: nscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortmid", 
+            "description": "Bad named entity: nshortmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nshortmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∤", 
+            "description": "Named entity: nshortmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nshortparallel", 
+            "description": "Bad named entity: nshortparallel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nshortparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "∦", 
+            "description": "Named entity: nshortparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsim", 
+            "description": "Bad named entity: nsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≁", 
+            "description": "Named entity: nsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2241"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsime", 
+            "description": "Bad named entity: nsime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsime"
+                ]
+            ]
+        }, 
+        {
+            "input": "≄", 
+            "description": "Named entity: nsime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsimeq", 
+            "description": "Bad named entity: nsimeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsimeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≄", 
+            "description": "Named entity: nsimeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2244"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsmid", 
+            "description": "Bad named entity: nsmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∤", 
+            "description": "Named entity: nsmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2224"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nspar", 
+            "description": "Bad named entity: nspar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nspar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∦", 
+            "description": "Named entity: nspar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2226"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsube", 
+            "description": "Bad named entity: nsqsube without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsqsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋢", 
+            "description": "Named entity: nsqsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsqsupe", 
+            "description": "Bad named entity: nsqsupe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsqsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋣", 
+            "description": "Named entity: nsqsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsub", 
+            "description": "Bad named entity: nsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊄", 
+            "description": "Named entity: nsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2284"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubE", 
+            "description": "Bad named entity: nsubE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsubE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫅̸", 
+            "description": "Named entity: nsubE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsube", 
+            "description": "Bad named entity: nsube without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊈", 
+            "description": "Named entity: nsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubset", 
+            "description": "Bad named entity: nsubset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊂⃒", 
+            "description": "Named entity: nsubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteq", 
+            "description": "Bad named entity: nsubseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsubseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊈", 
+            "description": "Named entity: nsubseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2288"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsubseteqq", 
+            "description": "Bad named entity: nsubseteqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsubseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫅̸", 
+            "description": "Named entity: nsubseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucc", 
+            "description": "Bad named entity: nsucc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsucc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊁", 
+            "description": "Named entity: nsucc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2281"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsucceq", 
+            "description": "Bad named entity: nsucceq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsucceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰̸", 
+            "description": "Named entity: nsucceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsup", 
+            "description": "Bad named entity: nsup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊅", 
+            "description": "Named entity: nsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2285"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupE", 
+            "description": "Bad named entity: nsupE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsupE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫆̸", 
+            "description": "Named entity: nsupE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupe", 
+            "description": "Bad named entity: nsupe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊉", 
+            "description": "Named entity: nsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupset", 
+            "description": "Bad named entity: nsupset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsupset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃⃒", 
+            "description": "Named entity: nsupset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteq", 
+            "description": "Bad named entity: nsupseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsupseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊉", 
+            "description": "Named entity: nsupseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2289"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nsupseteqq", 
+            "description": "Bad named entity: nsupseteqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nsupseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫆̸", 
+            "description": "Named entity: nsupseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6\u0338"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntgl", 
+            "description": "Bad named entity: ntgl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntgl"
+                ]
+            ]
+        }, 
+        {
+            "input": "≹", 
+            "description": "Named entity: ntgl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2279"
+                ]
+            ]
+        }, 
+        {
+            "input": "ñ", 
+            "description": "Named entity: ntilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "ñ", 
+            "description": "Named entity: ntilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntlg", 
+            "description": "Bad named entity: ntlg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntlg"
+                ]
+            ]
+        }, 
+        {
+            "input": "≸", 
+            "description": "Named entity: ntlg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2278"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleleft", 
+            "description": "Bad named entity: ntriangleleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋪", 
+            "description": "Named entity: ntriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ea"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglelefteq", 
+            "description": "Bad named entity: ntrianglelefteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntrianglelefteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋬", 
+            "description": "Named entity: ntrianglelefteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntriangleright", 
+            "description": "Bad named entity: ntriangleright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋫", 
+            "description": "Named entity: ntriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22eb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ntrianglerighteq", 
+            "description": "Bad named entity: ntrianglerighteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ntrianglerighteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋭", 
+            "description": "Named entity: ntrianglerighteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nu", 
+            "description": "Bad named entity: nu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nu"
+                ]
+            ]
+        }, 
+        {
+            "input": "ν", 
+            "description": "Named entity: nu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&num", 
+            "description": "Bad named entity: num without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&num"
+                ]
+            ]
+        }, 
+        {
+            "input": "#", 
+            "description": "Named entity: num; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "#"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numero", 
+            "description": "Bad named entity: numero without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&numero"
+                ]
+            ]
+        }, 
+        {
+            "input": "№", 
+            "description": "Named entity: numero; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2116"
+                ]
+            ]
+        }, 
+        {
+            "input": "&numsp", 
+            "description": "Bad named entity: numsp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&numsp"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: numsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2007"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvDash", 
+            "description": "Bad named entity: nvDash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊭", 
+            "description": "Named entity: nvDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvHarr", 
+            "description": "Bad named entity: nvHarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvHarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤄", 
+            "description": "Named entity: nvHarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2904"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvap", 
+            "description": "Bad named entity: nvap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≍⃒", 
+            "description": "Named entity: nvap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u224d\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvdash", 
+            "description": "Bad named entity: nvdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊬", 
+            "description": "Named entity: nvdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvge", 
+            "description": "Bad named entity: nvge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvge"
+                ]
+            ]
+        }, 
+        {
+            "input": "≥⃒", 
+            "description": "Named entity: nvge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2265\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvgt", 
+            "description": "Bad named entity: nvgt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvgt"
+                ]
+            ]
+        }, 
+        {
+            "input": ">⃒", 
+            "description": "Named entity: nvgt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ">\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvinfin", 
+            "description": "Bad named entity: nvinfin without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvinfin"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧞", 
+            "description": "Named entity: nvinfin; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29de"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlArr", 
+            "description": "Bad named entity: nvlArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤂", 
+            "description": "Named entity: nvlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2902"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvle", 
+            "description": "Bad named entity: nvle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvle"
+                ]
+            ]
+        }, 
+        {
+            "input": "≤⃒", 
+            "description": "Named entity: nvle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2264\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvlt", 
+            "description": "Bad named entity: nvlt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvlt"
+                ]
+            ]
+        }, 
+        {
+            "input": "<⃒", 
+            "description": "Named entity: nvlt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "<\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvltrie", 
+            "description": "Bad named entity: nvltrie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvltrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊴⃒", 
+            "description": "Named entity: nvltrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrArr", 
+            "description": "Bad named entity: nvrArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤃", 
+            "description": "Named entity: nvrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2903"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvrtrie", 
+            "description": "Bad named entity: nvrtrie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvrtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊵⃒", 
+            "description": "Named entity: nvrtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nvsim", 
+            "description": "Bad named entity: nvsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nvsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∼⃒", 
+            "description": "Named entity: nvsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwArr", 
+            "description": "Bad named entity: nwArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nwArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇖", 
+            "description": "Named entity: nwArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarhk", 
+            "description": "Bad named entity: nwarhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nwarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤣", 
+            "description": "Named entity: nwarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2923"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarr", 
+            "description": "Bad named entity: nwarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nwarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↖", 
+            "description": "Named entity: nwarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwarrow", 
+            "description": "Bad named entity: nwarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nwarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↖", 
+            "description": "Named entity: nwarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2196"
+                ]
+            ]
+        }, 
+        {
+            "input": "&nwnear", 
+            "description": "Bad named entity: nwnear without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&nwnear"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤧", 
+            "description": "Named entity: nwnear; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2927"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oS", 
+            "description": "Bad named entity: oS without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oS"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ⓢ", 
+            "description": "Named entity: oS; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u24c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "ó", 
+            "description": "Named entity: oacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "ó", 
+            "description": "Named entity: oacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oast", 
+            "description": "Bad named entity: oast without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oast"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊛", 
+            "description": "Named entity: oast; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocir", 
+            "description": "Bad named entity: ocir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ocir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊚", 
+            "description": "Named entity: ocir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229a"
+                ]
+            ]
+        }, 
+        {
+            "input": "ô", 
+            "description": "Named entity: ocirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "ô", 
+            "description": "Named entity: ocirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ocy", 
+            "description": "Bad named entity: ocy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ocy"
+                ]
+            ]
+        }, 
+        {
+            "input": "о", 
+            "description": "Named entity: ocy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odash", 
+            "description": "Bad named entity: odash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&odash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊝", 
+            "description": "Named entity: odash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odblac", 
+            "description": "Bad named entity: odblac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&odblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "ő", 
+            "description": "Named entity: odblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0151"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odiv", 
+            "description": "Bad named entity: odiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&odiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨸", 
+            "description": "Named entity: odiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a38"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odot", 
+            "description": "Bad named entity: odot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&odot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊙", 
+            "description": "Named entity: odot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2299"
+                ]
+            ]
+        }, 
+        {
+            "input": "&odsold", 
+            "description": "Bad named entity: odsold without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&odsold"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦼", 
+            "description": "Named entity: odsold; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oelig", 
+            "description": "Bad named entity: oelig without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oelig"
+                ]
+            ]
+        }, 
+        {
+            "input": "œ", 
+            "description": "Named entity: oelig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0153"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofcir", 
+            "description": "Bad named entity: ofcir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ofcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦿", 
+            "description": "Named entity: ofcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ofr", 
+            "description": "Bad named entity: ofr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ofr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔬", 
+            "description": "Named entity: ofr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogon", 
+            "description": "Bad named entity: ogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "˛", 
+            "description": "Named entity: ogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02db"
+                ]
+            ]
+        }, 
+        {
+            "input": "ò", 
+            "description": "Named entity: ograve without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "ò", 
+            "description": "Named entity: ograve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ogt", 
+            "description": "Bad named entity: ogt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ogt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧁", 
+            "description": "Named entity: ogt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohbar", 
+            "description": "Bad named entity: ohbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ohbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦵", 
+            "description": "Named entity: ohbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ohm", 
+            "description": "Bad named entity: ohm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ohm"
+                ]
+            ]
+        }, 
+        {
+            "input": "Ω", 
+            "description": "Named entity: ohm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03a9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oint", 
+            "description": "Bad named entity: oint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∮", 
+            "description": "Named entity: oint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olarr", 
+            "description": "Bad named entity: olarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&olarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↺", 
+            "description": "Named entity: olarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcir", 
+            "description": "Bad named entity: olcir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&olcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦾", 
+            "description": "Named entity: olcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olcross", 
+            "description": "Bad named entity: olcross without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&olcross"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦻", 
+            "description": "Named entity: olcross; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oline", 
+            "description": "Bad named entity: oline without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oline"
+                ]
+            ]
+        }, 
+        {
+            "input": "‾", 
+            "description": "Named entity: oline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&olt", 
+            "description": "Bad named entity: olt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&olt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧀", 
+            "description": "Named entity: olt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omacr", 
+            "description": "Bad named entity: omacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&omacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ō", 
+            "description": "Named entity: omacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u014d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omega", 
+            "description": "Bad named entity: omega without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&omega"
+                ]
+            ]
+        }, 
+        {
+            "input": "ω", 
+            "description": "Named entity: omega; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omicron", 
+            "description": "Bad named entity: omicron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&omicron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ο", 
+            "description": "Named entity: omicron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&omid", 
+            "description": "Bad named entity: omid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&omid"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦶", 
+            "description": "Named entity: omid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ominus", 
+            "description": "Bad named entity: ominus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ominus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊖", 
+            "description": "Named entity: ominus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2296"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oopf", 
+            "description": "Bad named entity: oopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕠", 
+            "description": "Named entity: oopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd60"
+                ]
+            ]
+        }, 
+        {
+            "input": "&opar", 
+            "description": "Bad named entity: opar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&opar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦷", 
+            "description": "Named entity: opar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&operp", 
+            "description": "Bad named entity: operp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&operp"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦹", 
+            "description": "Named entity: operp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oplus", 
+            "description": "Bad named entity: oplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊕", 
+            "description": "Named entity: oplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2295"
+                ]
+            ]
+        }, 
+        {
+            "input": "&or", 
+            "description": "Bad named entity: or without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&or"
+                ]
+            ]
+        }, 
+        {
+            "input": "∨", 
+            "description": "Named entity: or; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2228"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orarr", 
+            "description": "Bad named entity: orarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&orarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↻", 
+            "description": "Named entity: orarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ord", 
+            "description": "Bad named entity: ord without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ord"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩝", 
+            "description": "Named entity: ord; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&order", 
+            "description": "Bad named entity: order without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&order"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℴ", 
+            "description": "Named entity: order; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orderof", 
+            "description": "Bad named entity: orderof without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&orderof"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℴ", 
+            "description": "Named entity: orderof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "ª", 
+            "description": "Named entity: ordf without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "ª", 
+            "description": "Named entity: ordf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "º", 
+            "description": "Named entity: ordm without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "º", 
+            "description": "Named entity: ordm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&origof", 
+            "description": "Bad named entity: origof without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&origof"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊶", 
+            "description": "Named entity: origof; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oror", 
+            "description": "Bad named entity: oror without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oror"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩖", 
+            "description": "Named entity: oror; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a56"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orslope", 
+            "description": "Bad named entity: orslope without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&orslope"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩗", 
+            "description": "Named entity: orslope; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a57"
+                ]
+            ]
+        }, 
+        {
+            "input": "&orv", 
+            "description": "Bad named entity: orv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&orv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩛", 
+            "description": "Named entity: orv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&oscr", 
+            "description": "Bad named entity: oscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&oscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℴ", 
+            "description": "Named entity: oscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2134"
+                ]
+            ]
+        }, 
+        {
+            "input": "ø", 
+            "description": "Named entity: oslash without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "ø", 
+            "description": "Named entity: oslash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&osol", 
+            "description": "Bad named entity: osol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&osol"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊘", 
+            "description": "Named entity: osol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2298"
+                ]
+            ]
+        }, 
+        {
+            "input": "õ", 
+            "description": "Named entity: otilde without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "õ", 
+            "description": "Named entity: otilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimes", 
+            "description": "Bad named entity: otimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&otimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊗", 
+            "description": "Named entity: otimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2297"
+                ]
+            ]
+        }, 
+        {
+            "input": "&otimesas", 
+            "description": "Bad named entity: otimesas without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&otimesas"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨶", 
+            "description": "Named entity: otimesas; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a36"
+                ]
+            ]
+        }, 
+        {
+            "input": "ö", 
+            "description": "Named entity: ouml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "ö", 
+            "description": "Named entity: ouml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ovbar", 
+            "description": "Bad named entity: ovbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ovbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌽", 
+            "description": "Named entity: ovbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u233d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&par", 
+            "description": "Bad named entity: par without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&par"
+                ]
+            ]
+        }, 
+        {
+            "input": "∥", 
+            "description": "Named entity: par; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "¶", 
+            "description": "Named entity: para without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "¶", 
+            "description": "Named entity: para; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "∥", 
+            "description": "Named entity: parallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsim", 
+            "description": "Bad named entity: parsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&parsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫳", 
+            "description": "Named entity: parsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&parsl", 
+            "description": "Bad named entity: parsl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&parsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫽", 
+            "description": "Named entity: parsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2afd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&part", 
+            "description": "Bad named entity: part without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&part"
+                ]
+            ]
+        }, 
+        {
+            "input": "∂", 
+            "description": "Named entity: part; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2202"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pcy", 
+            "description": "Bad named entity: pcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "п", 
+            "description": "Named entity: pcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u043f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&percnt", 
+            "description": "Bad named entity: percnt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&percnt"
+                ]
+            ]
+        }, 
+        {
+            "input": "%", 
+            "description": "Named entity: percnt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "%"
+                ]
+            ]
+        }, 
+        {
+            "input": "&period", 
+            "description": "Bad named entity: period without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&period"
+                ]
+            ]
+        }, 
+        {
+            "input": ".", 
+            "description": "Named entity: period; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "."
+                ]
+            ]
+        }, 
+        {
+            "input": "&permil", 
+            "description": "Bad named entity: permil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&permil"
+                ]
+            ]
+        }, 
+        {
+            "input": "‰", 
+            "description": "Named entity: permil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2030"
+                ]
+            ]
+        }, 
+        {
+            "input": "&perp", 
+            "description": "Bad named entity: perp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&perp"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊥", 
+            "description": "Named entity: perp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pertenk", 
+            "description": "Bad named entity: pertenk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pertenk"
+                ]
+            ]
+        }, 
+        {
+            "input": "‱", 
+            "description": "Named entity: pertenk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2031"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pfr", 
+            "description": "Bad named entity: pfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔭", 
+            "description": "Named entity: pfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phi", 
+            "description": "Bad named entity: phi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&phi"
+                ]
+            ]
+        }, 
+        {
+            "input": "φ", 
+            "description": "Named entity: phi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phiv", 
+            "description": "Bad named entity: phiv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&phiv"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϕ", 
+            "description": "Named entity: phiv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phmmat", 
+            "description": "Bad named entity: phmmat without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&phmmat"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℳ", 
+            "description": "Named entity: phmmat; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2133"
+                ]
+            ]
+        }, 
+        {
+            "input": "&phone", 
+            "description": "Bad named entity: phone without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&phone"
+                ]
+            ]
+        }, 
+        {
+            "input": "☎", 
+            "description": "Named entity: phone; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u260e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pi", 
+            "description": "Bad named entity: pi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pi"
+                ]
+            ]
+        }, 
+        {
+            "input": "π", 
+            "description": "Named entity: pi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pitchfork", 
+            "description": "Bad named entity: pitchfork without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pitchfork"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋔", 
+            "description": "Named entity: pitchfork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22d4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&piv", 
+            "description": "Bad named entity: piv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&piv"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϖ", 
+            "description": "Named entity: piv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planck", 
+            "description": "Bad named entity: planck without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&planck"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℏ", 
+            "description": "Named entity: planck; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&planckh", 
+            "description": "Bad named entity: planckh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&planckh"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℎ", 
+            "description": "Named entity: planckh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plankv", 
+            "description": "Bad named entity: plankv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plankv"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℏ", 
+            "description": "Named entity: plankv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plus", 
+            "description": "Bad named entity: plus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plus"
+                ]
+            ]
+        }, 
+        {
+            "input": "+", 
+            "description": "Named entity: plus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "+"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusacir", 
+            "description": "Bad named entity: plusacir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plusacir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨣", 
+            "description": "Named entity: plusacir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a23"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusb", 
+            "description": "Bad named entity: plusb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plusb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊞", 
+            "description": "Named entity: plusb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u229e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluscir", 
+            "description": "Bad named entity: pluscir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pluscir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨢", 
+            "description": "Named entity: pluscir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a22"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdo", 
+            "description": "Bad named entity: plusdo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plusdo"
+                ]
+            ]
+        }, 
+        {
+            "input": "∔", 
+            "description": "Named entity: plusdo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2214"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plusdu", 
+            "description": "Bad named entity: plusdu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plusdu"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨥", 
+            "description": "Named entity: plusdu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a25"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pluse", 
+            "description": "Bad named entity: pluse without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pluse"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩲", 
+            "description": "Named entity: pluse; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a72"
+                ]
+            ]
+        }, 
+        {
+            "input": "±", 
+            "description": "Named entity: plusmn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "±", 
+            "description": "Named entity: plusmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plussim", 
+            "description": "Bad named entity: plussim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plussim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨦", 
+            "description": "Named entity: plussim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a26"
+                ]
+            ]
+        }, 
+        {
+            "input": "&plustwo", 
+            "description": "Bad named entity: plustwo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&plustwo"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨧", 
+            "description": "Named entity: plustwo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a27"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pm", 
+            "description": "Bad named entity: pm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pm"
+                ]
+            ]
+        }, 
+        {
+            "input": "±", 
+            "description": "Named entity: pm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pointint", 
+            "description": "Bad named entity: pointint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pointint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨕", 
+            "description": "Named entity: pointint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a15"
+                ]
+            ]
+        }, 
+        {
+            "input": "&popf", 
+            "description": "Bad named entity: popf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&popf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕡", 
+            "description": "Named entity: popf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd61"
+                ]
+            ]
+        }, 
+        {
+            "input": "£", 
+            "description": "Named entity: pound without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "£", 
+            "description": "Named entity: pound; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pr", 
+            "description": "Bad named entity: pr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pr"
+                ]
+            ]
+        }, 
+        {
+            "input": "≺", 
+            "description": "Named entity: pr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prE", 
+            "description": "Bad named entity: prE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪳", 
+            "description": "Named entity: prE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prap", 
+            "description": "Bad named entity: prap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪷", 
+            "description": "Named entity: prap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prcue", 
+            "description": "Bad named entity: prcue without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prcue"
+                ]
+            ]
+        }, 
+        {
+            "input": "≼", 
+            "description": "Named entity: prcue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pre", 
+            "description": "Bad named entity: pre without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pre"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯", 
+            "description": "Named entity: pre; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prec", 
+            "description": "Bad named entity: prec without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prec"
+                ]
+            ]
+        }, 
+        {
+            "input": "≺", 
+            "description": "Named entity: prec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precapprox", 
+            "description": "Bad named entity: precapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&precapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪷", 
+            "description": "Named entity: precapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preccurlyeq", 
+            "description": "Bad named entity: preccurlyeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&preccurlyeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≼", 
+            "description": "Named entity: preccurlyeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&preceq", 
+            "description": "Bad named entity: preceq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&preceq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪯", 
+            "description": "Named entity: preceq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnapprox", 
+            "description": "Bad named entity: precnapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&precnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪹", 
+            "description": "Named entity: precnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precneqq", 
+            "description": "Bad named entity: precneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&precneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪵", 
+            "description": "Named entity: precneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precnsim", 
+            "description": "Bad named entity: precnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&precnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋨", 
+            "description": "Named entity: precnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&precsim", 
+            "description": "Bad named entity: precsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&precsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≾", 
+            "description": "Named entity: precsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prime", 
+            "description": "Bad named entity: prime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prime"
+                ]
+            ]
+        }, 
+        {
+            "input": "′", 
+            "description": "Named entity: prime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2032"
+                ]
+            ]
+        }, 
+        {
+            "input": "&primes", 
+            "description": "Bad named entity: primes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&primes"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℙ", 
+            "description": "Named entity: primes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2119"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnE", 
+            "description": "Bad named entity: prnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪵", 
+            "description": "Named entity: prnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnap", 
+            "description": "Bad named entity: prnap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪹", 
+            "description": "Named entity: prnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prnsim", 
+            "description": "Bad named entity: prnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋨", 
+            "description": "Named entity: prnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prod", 
+            "description": "Bad named entity: prod without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prod"
+                ]
+            ]
+        }, 
+        {
+            "input": "∏", 
+            "description": "Named entity: prod; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u220f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profalar", 
+            "description": "Bad named entity: profalar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&profalar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌮", 
+            "description": "Named entity: profalar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u232e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profline", 
+            "description": "Bad named entity: profline without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&profline"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌒", 
+            "description": "Named entity: profline; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2312"
+                ]
+            ]
+        }, 
+        {
+            "input": "&profsurf", 
+            "description": "Bad named entity: profsurf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&profsurf"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌓", 
+            "description": "Named entity: profsurf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2313"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prop", 
+            "description": "Bad named entity: prop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prop"
+                ]
+            ]
+        }, 
+        {
+            "input": "∝", 
+            "description": "Named entity: prop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&propto", 
+            "description": "Bad named entity: propto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&propto"
+                ]
+            ]
+        }, 
+        {
+            "input": "∝", 
+            "description": "Named entity: propto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prsim", 
+            "description": "Bad named entity: prsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≾", 
+            "description": "Named entity: prsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&prurel", 
+            "description": "Bad named entity: prurel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&prurel"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊰", 
+            "description": "Named entity: prurel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&pscr", 
+            "description": "Bad named entity: pscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&pscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓅", 
+            "description": "Named entity: pscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&psi", 
+            "description": "Bad named entity: psi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&psi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ψ", 
+            "description": "Named entity: psi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&puncsp", 
+            "description": "Bad named entity: puncsp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&puncsp"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: puncsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2008"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qfr", 
+            "description": "Bad named entity: qfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&qfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔮", 
+            "description": "Named entity: qfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qint", 
+            "description": "Bad named entity: qint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&qint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨌", 
+            "description": "Named entity: qint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a0c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qopf", 
+            "description": "Bad named entity: qopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&qopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕢", 
+            "description": "Named entity: qopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd62"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qprime", 
+            "description": "Bad named entity: qprime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&qprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⁗", 
+            "description": "Named entity: qprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2057"
+                ]
+            ]
+        }, 
+        {
+            "input": "&qscr", 
+            "description": "Bad named entity: qscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&qscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓆", 
+            "description": "Named entity: qscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quaternions", 
+            "description": "Bad named entity: quaternions without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&quaternions"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℍ", 
+            "description": "Named entity: quaternions; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u210d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quatint", 
+            "description": "Bad named entity: quatint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&quatint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨖", 
+            "description": "Named entity: quatint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a16"
+                ]
+            ]
+        }, 
+        {
+            "input": "&quest", 
+            "description": "Bad named entity: quest without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&quest"
+                ]
+            ]
+        }, 
+        {
+            "input": "?", 
+            "description": "Named entity: quest; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "?"
+                ]
+            ]
+        }, 
+        {
+            "input": "&questeq", 
+            "description": "Bad named entity: questeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&questeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≟", 
+            "description": "Named entity: questeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225f"
+                ]
+            ]
+        }, 
+        {
+            "input": """, 
+            "description": "Named entity: quot without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": """, 
+            "description": "Named entity: quot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\""
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAarr", 
+            "description": "Bad named entity: rAarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rAarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇛", 
+            "description": "Named entity: rAarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rArr", 
+            "description": "Bad named entity: rArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇒", 
+            "description": "Named entity: rArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rAtail", 
+            "description": "Bad named entity: rAtail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rAtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤜", 
+            "description": "Named entity: rAtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rBarr", 
+            "description": "Bad named entity: rBarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rBarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤏", 
+            "description": "Named entity: rBarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rHar", 
+            "description": "Bad named entity: rHar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥤", 
+            "description": "Named entity: rHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2964"
+                ]
+            ]
+        }, 
+        {
+            "input": "&race", 
+            "description": "Bad named entity: race without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&race"
+                ]
+            ]
+        }, 
+        {
+            "input": "∽̱", 
+            "description": "Named entity: race; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223d\u0331"
+                ]
+            ]
+        }, 
+        {
+            "input": "&racute", 
+            "description": "Bad named entity: racute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&racute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŕ", 
+            "description": "Named entity: racute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0155"
+                ]
+            ]
+        }, 
+        {
+            "input": "&radic", 
+            "description": "Bad named entity: radic without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&radic"
+                ]
+            ]
+        }, 
+        {
+            "input": "√", 
+            "description": "Named entity: radic; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&raemptyv", 
+            "description": "Bad named entity: raemptyv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&raemptyv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦳", 
+            "description": "Named entity: raemptyv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rang", 
+            "description": "Bad named entity: rang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟩", 
+            "description": "Named entity: rang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangd", 
+            "description": "Bad named entity: rangd without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rangd"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦒", 
+            "description": "Named entity: rangd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2992"
+                ]
+            ]
+        }, 
+        {
+            "input": "&range", 
+            "description": "Bad named entity: range without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&range"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦥", 
+            "description": "Named entity: range; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rangle", 
+            "description": "Bad named entity: rangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟩", 
+            "description": "Named entity: rangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "»", 
+            "description": "Named entity: raquo without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "»", 
+            "description": "Named entity: raquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarr", 
+            "description": "Bad named entity: rarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "→", 
+            "description": "Named entity: rarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrap", 
+            "description": "Bad named entity: rarrap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥵", 
+            "description": "Named entity: rarrap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2975"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrb", 
+            "description": "Bad named entity: rarrb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇥", 
+            "description": "Named entity: rarrb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21e5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrbfs", 
+            "description": "Bad named entity: rarrbfs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrbfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤠", 
+            "description": "Named entity: rarrbfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2920"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrc", 
+            "description": "Bad named entity: rarrc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrc"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤳", 
+            "description": "Named entity: rarrc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2933"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrfs", 
+            "description": "Bad named entity: rarrfs without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrfs"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤞", 
+            "description": "Named entity: rarrfs; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrhk", 
+            "description": "Bad named entity: rarrhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "↪", 
+            "description": "Named entity: rarrhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrlp", 
+            "description": "Bad named entity: rarrlp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrlp"
+                ]
+            ]
+        }, 
+        {
+            "input": "↬", 
+            "description": "Named entity: rarrlp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21ac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrpl", 
+            "description": "Bad named entity: rarrpl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrpl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥅", 
+            "description": "Named entity: rarrpl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2945"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrsim", 
+            "description": "Bad named entity: rarrsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥴", 
+            "description": "Named entity: rarrsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2974"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrtl", 
+            "description": "Bad named entity: rarrtl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrtl"
+                ]
+            ]
+        }, 
+        {
+            "input": "↣", 
+            "description": "Named entity: rarrtl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rarrw", 
+            "description": "Bad named entity: rarrw without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rarrw"
+                ]
+            ]
+        }, 
+        {
+            "input": "↝", 
+            "description": "Named entity: rarrw; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratail", 
+            "description": "Bad named entity: ratail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ratail"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤚", 
+            "description": "Named entity: ratail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u291a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ratio", 
+            "description": "Bad named entity: ratio without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ratio"
+                ]
+            ]
+        }, 
+        {
+            "input": "∶", 
+            "description": "Named entity: ratio; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2236"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rationals", 
+            "description": "Bad named entity: rationals without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rationals"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℚ", 
+            "description": "Named entity: rationals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbarr", 
+            "description": "Bad named entity: rbarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤍", 
+            "description": "Named entity: rbarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u290d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbbrk", 
+            "description": "Bad named entity: rbbrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "❳", 
+            "description": "Named entity: rbbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2773"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrace", 
+            "description": "Bad named entity: rbrace without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbrace"
+                ]
+            ]
+        }, 
+        {
+            "input": "}", 
+            "description": "Named entity: rbrace; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "}"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrack", 
+            "description": "Bad named entity: rbrack without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbrack"
+                ]
+            ]
+        }, 
+        {
+            "input": "]", 
+            "description": "Named entity: rbrack; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "]"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrke", 
+            "description": "Bad named entity: rbrke without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbrke"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦌", 
+            "description": "Named entity: rbrke; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrksld", 
+            "description": "Bad named entity: rbrksld without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbrksld"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦎", 
+            "description": "Named entity: rbrksld; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u298e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rbrkslu", 
+            "description": "Bad named entity: rbrkslu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rbrkslu"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦐", 
+            "description": "Named entity: rbrkslu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2990"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcaron", 
+            "description": "Bad named entity: rcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ř", 
+            "description": "Named entity: rcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0159"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcedil", 
+            "description": "Bad named entity: rcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŗ", 
+            "description": "Named entity: rcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0157"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rceil", 
+            "description": "Bad named entity: rceil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rceil"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌉", 
+            "description": "Named entity: rceil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2309"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcub", 
+            "description": "Bad named entity: rcub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rcub"
+                ]
+            ]
+        }, 
+        {
+            "input": "}", 
+            "description": "Named entity: rcub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "}"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rcy", 
+            "description": "Bad named entity: rcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "р", 
+            "description": "Named entity: rcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0440"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdca", 
+            "description": "Bad named entity: rdca without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rdca"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤷", 
+            "description": "Named entity: rdca; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2937"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdldhar", 
+            "description": "Bad named entity: rdldhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rdldhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥩", 
+            "description": "Named entity: rdldhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2969"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquo", 
+            "description": "Bad named entity: rdquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rdquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "”", 
+            "description": "Named entity: rdquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdquor", 
+            "description": "Bad named entity: rdquor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rdquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "”", 
+            "description": "Named entity: rdquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rdsh", 
+            "description": "Bad named entity: rdsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rdsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↳", 
+            "description": "Named entity: rdsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&real", 
+            "description": "Bad named entity: real without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&real"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℜ", 
+            "description": "Named entity: real; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realine", 
+            "description": "Bad named entity: realine without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&realine"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℛ", 
+            "description": "Named entity: realine; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&realpart", 
+            "description": "Bad named entity: realpart without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&realpart"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℜ", 
+            "description": "Named entity: realpart; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&reals", 
+            "description": "Bad named entity: reals without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&reals"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℝ", 
+            "description": "Named entity: reals; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rect", 
+            "description": "Bad named entity: rect without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rect"
+                ]
+            ]
+        }, 
+        {
+            "input": "▭", 
+            "description": "Named entity: rect; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "®", 
+            "description": "Named entity: reg without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "®", 
+            "description": "Named entity: reg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ae"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfisht", 
+            "description": "Bad named entity: rfisht without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rfisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥽", 
+            "description": "Named entity: rfisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfloor", 
+            "description": "Bad named entity: rfloor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rfloor"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌋", 
+            "description": "Named entity: rfloor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rfr", 
+            "description": "Bad named entity: rfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔯", 
+            "description": "Named entity: rfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd2f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhard", 
+            "description": "Bad named entity: rhard without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rhard"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇁", 
+            "description": "Named entity: rhard; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharu", 
+            "description": "Bad named entity: rharu without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rharu"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇀", 
+            "description": "Named entity: rharu; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rharul", 
+            "description": "Bad named entity: rharul without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rharul"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥬", 
+            "description": "Named entity: rharul; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rho", 
+            "description": "Bad named entity: rho without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rho"
+                ]
+            ]
+        }, 
+        {
+            "input": "ρ", 
+            "description": "Named entity: rho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rhov", 
+            "description": "Bad named entity: rhov without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rhov"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϱ", 
+            "description": "Named entity: rhov; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrow", 
+            "description": "Bad named entity: rightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "→", 
+            "description": "Named entity: rightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightarrowtail", 
+            "description": "Bad named entity: rightarrowtail without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightarrowtail"
+                ]
+            ]
+        }, 
+        {
+            "input": "↣", 
+            "description": "Named entity: rightarrowtail; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoondown", 
+            "description": "Bad named entity: rightharpoondown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightharpoondown"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇁", 
+            "description": "Named entity: rightharpoondown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightharpoonup", 
+            "description": "Bad named entity: rightharpoonup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightharpoonup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇀", 
+            "description": "Named entity: rightharpoonup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftarrows", 
+            "description": "Bad named entity: rightleftarrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightleftarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇄", 
+            "description": "Named entity: rightleftarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightleftharpoons", 
+            "description": "Bad named entity: rightleftharpoons without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightleftharpoons"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇌", 
+            "description": "Named entity: rightleftharpoons; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightrightarrows", 
+            "description": "Bad named entity: rightrightarrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightrightarrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇉", 
+            "description": "Named entity: rightrightarrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightsquigarrow", 
+            "description": "Bad named entity: rightsquigarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightsquigarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↝", 
+            "description": "Named entity: rightsquigarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rightthreetimes", 
+            "description": "Bad named entity: rightthreetimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rightthreetimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋌", 
+            "description": "Named entity: rightthreetimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ring", 
+            "description": "Bad named entity: ring without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ring"
+                ]
+            ]
+        }, 
+        {
+            "input": "˚", 
+            "description": "Named entity: ring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02da"
+                ]
+            ]
+        }, 
+        {
+            "input": "&risingdotseq", 
+            "description": "Bad named entity: risingdotseq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&risingdotseq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≓", 
+            "description": "Named entity: risingdotseq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2253"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlarr", 
+            "description": "Bad named entity: rlarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇄", 
+            "description": "Named entity: rlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlhar", 
+            "description": "Bad named entity: rlhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rlhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇌", 
+            "description": "Named entity: rlhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rlm", 
+            "description": "Bad named entity: rlm without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rlm"
+                ]
+            ]
+        }, 
+        {
+            "input": "‏", 
+            "description": "Named entity: rlm; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoust", 
+            "description": "Bad named entity: rmoust without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rmoust"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎱", 
+            "description": "Named entity: rmoust; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rmoustache", 
+            "description": "Bad named entity: rmoustache without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rmoustache"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎱", 
+            "description": "Named entity: rmoustache; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rnmid", 
+            "description": "Bad named entity: rnmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rnmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫮", 
+            "description": "Named entity: rnmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roang", 
+            "description": "Bad named entity: roang without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&roang"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟭", 
+            "description": "Named entity: roang; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27ed"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roarr", 
+            "description": "Bad named entity: roarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&roarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇾", 
+            "description": "Named entity: roarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&robrk", 
+            "description": "Bad named entity: robrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&robrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟧", 
+            "description": "Named entity: robrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27e7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropar", 
+            "description": "Bad named entity: ropar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ropar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦆", 
+            "description": "Named entity: ropar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2986"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ropf", 
+            "description": "Bad named entity: ropf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ropf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕣", 
+            "description": "Named entity: ropf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd63"
+                ]
+            ]
+        }, 
+        {
+            "input": "&roplus", 
+            "description": "Bad named entity: roplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&roplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨮", 
+            "description": "Named entity: roplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a2e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rotimes", 
+            "description": "Bad named entity: rotimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rotimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨵", 
+            "description": "Named entity: rotimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a35"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpar", 
+            "description": "Bad named entity: rpar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rpar"
+                ]
+            ]
+        }, 
+        {
+            "input": ")", 
+            "description": "Named entity: rpar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ")"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rpargt", 
+            "description": "Bad named entity: rpargt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rpargt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦔", 
+            "description": "Named entity: rpargt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2994"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rppolint", 
+            "description": "Bad named entity: rppolint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rppolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨒", 
+            "description": "Named entity: rppolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a12"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rrarr", 
+            "description": "Bad named entity: rrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇉", 
+            "description": "Named entity: rrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsaquo", 
+            "description": "Bad named entity: rsaquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rsaquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "›", 
+            "description": "Named entity: rsaquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u203a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rscr", 
+            "description": "Bad named entity: rscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓇", 
+            "description": "Named entity: rscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsh", 
+            "description": "Bad named entity: rsh without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rsh"
+                ]
+            ]
+        }, 
+        {
+            "input": "↱", 
+            "description": "Named entity: rsh; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21b1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsqb", 
+            "description": "Bad named entity: rsqb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rsqb"
+                ]
+            ]
+        }, 
+        {
+            "input": "]", 
+            "description": "Named entity: rsqb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "]"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquo", 
+            "description": "Bad named entity: rsquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rsquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "’", 
+            "description": "Named entity: rsquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rsquor", 
+            "description": "Bad named entity: rsquor without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rsquor"
+                ]
+            ]
+        }, 
+        {
+            "input": "’", 
+            "description": "Named entity: rsquor; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2019"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rthree", 
+            "description": "Bad named entity: rthree without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rthree"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋌", 
+            "description": "Named entity: rthree; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22cc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtimes", 
+            "description": "Bad named entity: rtimes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rtimes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋊", 
+            "description": "Named entity: rtimes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtri", 
+            "description": "Bad named entity: rtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "▹", 
+            "description": "Named entity: rtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrie", 
+            "description": "Bad named entity: rtrie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rtrie"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊵", 
+            "description": "Named entity: rtrie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtrif", 
+            "description": "Bad named entity: rtrif without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rtrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "▸", 
+            "description": "Named entity: rtrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rtriltri", 
+            "description": "Bad named entity: rtriltri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rtriltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧎", 
+            "description": "Named entity: rtriltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29ce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ruluhar", 
+            "description": "Bad named entity: ruluhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ruluhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥨", 
+            "description": "Named entity: ruluhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2968"
+                ]
+            ]
+        }, 
+        {
+            "input": "&rx", 
+            "description": "Bad named entity: rx without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&rx"
+                ]
+            ]
+        }, 
+        {
+            "input": "℞", 
+            "description": "Named entity: rx; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u211e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sacute", 
+            "description": "Bad named entity: sacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ś", 
+            "description": "Named entity: sacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sbquo", 
+            "description": "Bad named entity: sbquo without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sbquo"
+                ]
+            ]
+        }, 
+        {
+            "input": "‚", 
+            "description": "Named entity: sbquo; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u201a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sc", 
+            "description": "Bad named entity: sc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sc"
+                ]
+            ]
+        }, 
+        {
+            "input": "≻", 
+            "description": "Named entity: sc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scE", 
+            "description": "Bad named entity: scE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪴", 
+            "description": "Named entity: scE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scap", 
+            "description": "Bad named entity: scap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪸", 
+            "description": "Named entity: scap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scaron", 
+            "description": "Bad named entity: scaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "š", 
+            "description": "Named entity: scaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0161"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sccue", 
+            "description": "Bad named entity: sccue without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sccue"
+                ]
+            ]
+        }, 
+        {
+            "input": "≽", 
+            "description": "Named entity: sccue; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sce", 
+            "description": "Bad named entity: sce without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sce"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰", 
+            "description": "Named entity: sce; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scedil", 
+            "description": "Bad named entity: scedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ş", 
+            "description": "Named entity: scedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scirc", 
+            "description": "Bad named entity: scirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŝ", 
+            "description": "Named entity: scirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u015d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnE", 
+            "description": "Bad named entity: scnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪶", 
+            "description": "Named entity: scnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnap", 
+            "description": "Bad named entity: scnap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scnap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪺", 
+            "description": "Named entity: scnap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scnsim", 
+            "description": "Bad named entity: scnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋩", 
+            "description": "Named entity: scnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scpolint", 
+            "description": "Bad named entity: scpolint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scpolint"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨓", 
+            "description": "Named entity: scpolint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a13"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scsim", 
+            "description": "Bad named entity: scsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≿", 
+            "description": "Named entity: scsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&scy", 
+            "description": "Bad named entity: scy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&scy"
+                ]
+            ]
+        }, 
+        {
+            "input": "с", 
+            "description": "Named entity: scy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0441"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdot", 
+            "description": "Bad named entity: sdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋅", 
+            "description": "Named entity: sdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdotb", 
+            "description": "Bad named entity: sdotb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sdotb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊡", 
+            "description": "Named entity: sdotb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sdote", 
+            "description": "Bad named entity: sdote without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sdote"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩦", 
+            "description": "Named entity: sdote; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a66"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seArr", 
+            "description": "Bad named entity: seArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&seArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇘", 
+            "description": "Named entity: seArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searhk", 
+            "description": "Bad named entity: searhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&searhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤥", 
+            "description": "Named entity: searhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2925"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searr", 
+            "description": "Bad named entity: searr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&searr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↘", 
+            "description": "Named entity: searr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "&searrow", 
+            "description": "Bad named entity: searrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&searrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↘", 
+            "description": "Named entity: searrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2198"
+                ]
+            ]
+        }, 
+        {
+            "input": "§", 
+            "description": "Named entity: sect without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "§", 
+            "description": "Named entity: sect; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&semi", 
+            "description": "Bad named entity: semi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&semi"
+                ]
+            ]
+        }, 
+        {
+            "input": ";", 
+            "description": "Named entity: semi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    ";"
+                ]
+            ]
+        }, 
+        {
+            "input": "&seswar", 
+            "description": "Bad named entity: seswar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&seswar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤩", 
+            "description": "Named entity: seswar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2929"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setminus", 
+            "description": "Bad named entity: setminus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&setminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∖", 
+            "description": "Named entity: setminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&setmn", 
+            "description": "Bad named entity: setmn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&setmn"
+                ]
+            ]
+        }, 
+        {
+            "input": "∖", 
+            "description": "Named entity: setmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sext", 
+            "description": "Bad named entity: sext without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sext"
+                ]
+            ]
+        }, 
+        {
+            "input": "✶", 
+            "description": "Named entity: sext; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2736"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfr", 
+            "description": "Bad named entity: sfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔰", 
+            "description": "Named entity: sfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd30"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sfrown", 
+            "description": "Bad named entity: sfrown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sfrown"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌢", 
+            "description": "Named entity: sfrown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2322"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sharp", 
+            "description": "Bad named entity: sharp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sharp"
+                ]
+            ]
+        }, 
+        {
+            "input": "♯", 
+            "description": "Named entity: sharp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shchcy", 
+            "description": "Bad named entity: shchcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&shchcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "щ", 
+            "description": "Named entity: shchcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0449"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shcy", 
+            "description": "Bad named entity: shcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&shcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ш", 
+            "description": "Named entity: shcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0448"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortmid", 
+            "description": "Bad named entity: shortmid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&shortmid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∣", 
+            "description": "Named entity: shortmid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&shortparallel", 
+            "description": "Bad named entity: shortparallel without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&shortparallel"
+                ]
+            ]
+        }, 
+        {
+            "input": "∥", 
+            "description": "Named entity: shortparallel; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "­", 
+            "description": "Named entity: shy without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "­", 
+            "description": "Named entity: shy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ad"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigma", 
+            "description": "Bad named entity: sigma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "σ", 
+            "description": "Named entity: sigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmaf", 
+            "description": "Bad named entity: sigmaf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sigmaf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ς", 
+            "description": "Named entity: sigmaf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sigmav", 
+            "description": "Bad named entity: sigmav without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sigmav"
+                ]
+            ]
+        }, 
+        {
+            "input": "ς", 
+            "description": "Named entity: sigmav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sim", 
+            "description": "Bad named entity: sim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∼", 
+            "description": "Named entity: sim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simdot", 
+            "description": "Bad named entity: simdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩪", 
+            "description": "Named entity: simdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a6a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sime", 
+            "description": "Bad named entity: sime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sime"
+                ]
+            ]
+        }, 
+        {
+            "input": "≃", 
+            "description": "Named entity: sime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simeq", 
+            "description": "Bad named entity: simeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≃", 
+            "description": "Named entity: simeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2243"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simg", 
+            "description": "Bad named entity: simg without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simg"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪞", 
+            "description": "Named entity: simg; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simgE", 
+            "description": "Bad named entity: simgE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simgE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪠", 
+            "description": "Named entity: simgE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aa0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&siml", 
+            "description": "Bad named entity: siml without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&siml"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪝", 
+            "description": "Named entity: siml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simlE", 
+            "description": "Bad named entity: simlE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simlE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪟", 
+            "description": "Named entity: simlE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a9f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simne", 
+            "description": "Bad named entity: simne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simne"
+                ]
+            ]
+        }, 
+        {
+            "input": "≆", 
+            "description": "Named entity: simne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2246"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simplus", 
+            "description": "Bad named entity: simplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨤", 
+            "description": "Named entity: simplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a24"
+                ]
+            ]
+        }, 
+        {
+            "input": "&simrarr", 
+            "description": "Bad named entity: simrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&simrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥲", 
+            "description": "Named entity: simrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2972"
+                ]
+            ]
+        }, 
+        {
+            "input": "&slarr", 
+            "description": "Bad named entity: slarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&slarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "←", 
+            "description": "Named entity: slarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2190"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smallsetminus", 
+            "description": "Bad named entity: smallsetminus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smallsetminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "∖", 
+            "description": "Named entity: smallsetminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smashp", 
+            "description": "Bad named entity: smashp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smashp"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨳", 
+            "description": "Named entity: smashp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a33"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smeparsl", 
+            "description": "Bad named entity: smeparsl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smeparsl"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧤", 
+            "description": "Named entity: smeparsl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29e4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smid", 
+            "description": "Bad named entity: smid without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smid"
+                ]
+            ]
+        }, 
+        {
+            "input": "∣", 
+            "description": "Named entity: smid; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2223"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smile", 
+            "description": "Bad named entity: smile without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smile"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌣", 
+            "description": "Named entity: smile; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2323"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smt", 
+            "description": "Bad named entity: smt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪪", 
+            "description": "Named entity: smt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aaa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smte", 
+            "description": "Bad named entity: smte without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smte"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪬", 
+            "description": "Named entity: smte; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aac"
+                ]
+            ]
+        }, 
+        {
+            "input": "&smtes", 
+            "description": "Bad named entity: smtes without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&smtes"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪬︀", 
+            "description": "Named entity: smtes; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aac\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&softcy", 
+            "description": "Bad named entity: softcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&softcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ь", 
+            "description": "Named entity: softcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sol", 
+            "description": "Bad named entity: sol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sol"
+                ]
+            ]
+        }, 
+        {
+            "input": "/", 
+            "description": "Named entity: sol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "/"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solb", 
+            "description": "Bad named entity: solb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&solb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧄", 
+            "description": "Named entity: solb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&solbar", 
+            "description": "Bad named entity: solbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&solbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌿", 
+            "description": "Named entity: solbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u233f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sopf", 
+            "description": "Bad named entity: sopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕤", 
+            "description": "Named entity: sopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd64"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spades", 
+            "description": "Bad named entity: spades without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&spades"
+                ]
+            ]
+        }, 
+        {
+            "input": "♠", 
+            "description": "Named entity: spades; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2660"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spadesuit", 
+            "description": "Bad named entity: spadesuit without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&spadesuit"
+                ]
+            ]
+        }, 
+        {
+            "input": "♠", 
+            "description": "Named entity: spadesuit; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2660"
+                ]
+            ]
+        }, 
+        {
+            "input": "&spar", 
+            "description": "Bad named entity: spar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&spar"
+                ]
+            ]
+        }, 
+        {
+            "input": "∥", 
+            "description": "Named entity: spar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2225"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcap", 
+            "description": "Bad named entity: sqcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊓", 
+            "description": "Named entity: sqcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcaps", 
+            "description": "Bad named entity: sqcaps without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqcaps"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊓︀", 
+            "description": "Named entity: sqcaps; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2293\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcup", 
+            "description": "Bad named entity: sqcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊔", 
+            "description": "Named entity: sqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqcups", 
+            "description": "Bad named entity: sqcups without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqcups"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊔︀", 
+            "description": "Named entity: sqcups; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2294\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsub", 
+            "description": "Bad named entity: sqsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊏", 
+            "description": "Named entity: sqsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsube", 
+            "description": "Bad named entity: sqsube without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsube"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊑", 
+            "description": "Named entity: sqsube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubset", 
+            "description": "Bad named entity: sqsubset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsubset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊏", 
+            "description": "Named entity: sqsubset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsubseteq", 
+            "description": "Bad named entity: sqsubseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsubseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊑", 
+            "description": "Named entity: sqsubseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2291"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsup", 
+            "description": "Bad named entity: sqsup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊐", 
+            "description": "Named entity: sqsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupe", 
+            "description": "Bad named entity: sqsupe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsupe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊒", 
+            "description": "Named entity: sqsupe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupset", 
+            "description": "Bad named entity: sqsupset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsupset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊐", 
+            "description": "Named entity: sqsupset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2290"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sqsupseteq", 
+            "description": "Bad named entity: sqsupseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sqsupseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊒", 
+            "description": "Named entity: sqsupseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2292"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squ", 
+            "description": "Bad named entity: squ without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&squ"
+                ]
+            ]
+        }, 
+        {
+            "input": "□", 
+            "description": "Named entity: squ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&square", 
+            "description": "Bad named entity: square without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&square"
+                ]
+            ]
+        }, 
+        {
+            "input": "□", 
+            "description": "Named entity: square; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25a1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squarf", 
+            "description": "Bad named entity: squarf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&squarf"
+                ]
+            ]
+        }, 
+        {
+            "input": "▪", 
+            "description": "Named entity: squarf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&squf", 
+            "description": "Bad named entity: squf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&squf"
+                ]
+            ]
+        }, 
+        {
+            "input": "▪", 
+            "description": "Named entity: squf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25aa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&srarr", 
+            "description": "Bad named entity: srarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&srarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "→", 
+            "description": "Named entity: srarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2192"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sscr", 
+            "description": "Bad named entity: sscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓈", 
+            "description": "Named entity: sscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssetmn", 
+            "description": "Bad named entity: ssetmn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ssetmn"
+                ]
+            ]
+        }, 
+        {
+            "input": "∖", 
+            "description": "Named entity: ssetmn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2216"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ssmile", 
+            "description": "Bad named entity: ssmile without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ssmile"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌣", 
+            "description": "Named entity: ssmile; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2323"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sstarf", 
+            "description": "Bad named entity: sstarf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sstarf"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋆", 
+            "description": "Named entity: sstarf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&star", 
+            "description": "Bad named entity: star without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&star"
+                ]
+            ]
+        }, 
+        {
+            "input": "☆", 
+            "description": "Named entity: star; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2606"
+                ]
+            ]
+        }, 
+        {
+            "input": "&starf", 
+            "description": "Bad named entity: starf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&starf"
+                ]
+            ]
+        }, 
+        {
+            "input": "★", 
+            "description": "Named entity: starf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2605"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightepsilon", 
+            "description": "Bad named entity: straightepsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&straightepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϵ", 
+            "description": "Named entity: straightepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&straightphi", 
+            "description": "Bad named entity: straightphi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&straightphi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϕ", 
+            "description": "Named entity: straightphi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&strns", 
+            "description": "Bad named entity: strns without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&strns"
+                ]
+            ]
+        }, 
+        {
+            "input": "¯", 
+            "description": "Named entity: strns; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00af"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sub", 
+            "description": "Bad named entity: sub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊂", 
+            "description": "Named entity: sub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subE", 
+            "description": "Bad named entity: subE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫅", 
+            "description": "Named entity: subE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subdot", 
+            "description": "Bad named entity: subdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪽", 
+            "description": "Named entity: subdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sube", 
+            "description": "Bad named entity: sube without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sube"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊆", 
+            "description": "Named entity: sube; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subedot", 
+            "description": "Bad named entity: subedot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫃", 
+            "description": "Named entity: subedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&submult", 
+            "description": "Bad named entity: submult without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&submult"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫁", 
+            "description": "Named entity: submult; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subnE", 
+            "description": "Bad named entity: subnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫋", 
+            "description": "Named entity: subnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subne", 
+            "description": "Bad named entity: subne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊊", 
+            "description": "Named entity: subne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subplus", 
+            "description": "Bad named entity: subplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪿", 
+            "description": "Named entity: subplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subrarr", 
+            "description": "Bad named entity: subrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥹", 
+            "description": "Named entity: subrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2979"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subset", 
+            "description": "Bad named entity: subset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊂", 
+            "description": "Named entity: subset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteq", 
+            "description": "Bad named entity: subseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊆", 
+            "description": "Named entity: subseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2286"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subseteqq", 
+            "description": "Bad named entity: subseteqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫅", 
+            "description": "Named entity: subseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneq", 
+            "description": "Bad named entity: subsetneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊊", 
+            "description": "Named entity: subsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsetneqq", 
+            "description": "Bad named entity: subsetneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫋", 
+            "description": "Named entity: subsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsim", 
+            "description": "Bad named entity: subsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫇", 
+            "description": "Named entity: subsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsub", 
+            "description": "Bad named entity: subsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫕", 
+            "description": "Named entity: subsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&subsup", 
+            "description": "Bad named entity: subsup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&subsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫓", 
+            "description": "Named entity: subsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succ", 
+            "description": "Bad named entity: succ without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succ"
+                ]
+            ]
+        }, 
+        {
+            "input": "≻", 
+            "description": "Named entity: succ; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succapprox", 
+            "description": "Bad named entity: succapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪸", 
+            "description": "Named entity: succapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succcurlyeq", 
+            "description": "Bad named entity: succcurlyeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succcurlyeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≽", 
+            "description": "Named entity: succcurlyeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succeq", 
+            "description": "Bad named entity: succeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪰", 
+            "description": "Named entity: succeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnapprox", 
+            "description": "Bad named entity: succnapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succnapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪺", 
+            "description": "Named entity: succnapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2aba"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succneqq", 
+            "description": "Bad named entity: succneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪶", 
+            "description": "Named entity: succneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ab6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succnsim", 
+            "description": "Bad named entity: succnsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succnsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋩", 
+            "description": "Named entity: succnsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22e9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&succsim", 
+            "description": "Bad named entity: succsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&succsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "≿", 
+            "description": "Named entity: succsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u227f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sum", 
+            "description": "Bad named entity: sum without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sum"
+                ]
+            ]
+        }, 
+        {
+            "input": "∑", 
+            "description": "Named entity: sum; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2211"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sung", 
+            "description": "Bad named entity: sung without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sung"
+                ]
+            ]
+        }, 
+        {
+            "input": "♪", 
+            "description": "Named entity: sung; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u266a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&sup", 
+            "description": "Bad named entity: sup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&sup"
+                ]
+            ]
+        }, 
+        {
+            "input": "¹", 
+            "description": "Named entity: sup1 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "¹", 
+            "description": "Named entity: sup1; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "²", 
+            "description": "Named entity: sup2 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "²", 
+            "description": "Named entity: sup2; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "³", 
+            "description": "Named entity: sup3 without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "³", 
+            "description": "Named entity: sup3; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃", 
+            "description": "Named entity: sup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supE", 
+            "description": "Bad named entity: supE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫆", 
+            "description": "Named entity: supE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdot", 
+            "description": "Bad named entity: supdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⪾", 
+            "description": "Named entity: supdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2abe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supdsub", 
+            "description": "Bad named entity: supdsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supdsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫘", 
+            "description": "Named entity: supdsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supe", 
+            "description": "Bad named entity: supe without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supe"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊇", 
+            "description": "Named entity: supe; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supedot", 
+            "description": "Bad named entity: supedot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supedot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫄", 
+            "description": "Named entity: supedot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsol", 
+            "description": "Bad named entity: suphsol without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&suphsol"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟉", 
+            "description": "Named entity: suphsol; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27c9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suphsub", 
+            "description": "Bad named entity: suphsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&suphsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫗", 
+            "description": "Named entity: suphsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&suplarr", 
+            "description": "Bad named entity: suplarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&suplarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥻", 
+            "description": "Named entity: suplarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supmult", 
+            "description": "Bad named entity: supmult without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supmult"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫂", 
+            "description": "Named entity: supmult; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supnE", 
+            "description": "Bad named entity: supnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫌", 
+            "description": "Named entity: supnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supne", 
+            "description": "Bad named entity: supne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊋", 
+            "description": "Named entity: supne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supplus", 
+            "description": "Bad named entity: supplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫀", 
+            "description": "Named entity: supplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supset", 
+            "description": "Bad named entity: supset without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supset"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃", 
+            "description": "Named entity: supset; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteq", 
+            "description": "Bad named entity: supseteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supseteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊇", 
+            "description": "Named entity: supseteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2287"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supseteqq", 
+            "description": "Bad named entity: supseteqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supseteqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫆", 
+            "description": "Named entity: supseteqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneq", 
+            "description": "Bad named entity: supsetneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊋", 
+            "description": "Named entity: supsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsetneqq", 
+            "description": "Bad named entity: supsetneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫌", 
+            "description": "Named entity: supsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsim", 
+            "description": "Bad named entity: supsim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supsim"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫈", 
+            "description": "Named entity: supsim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ac8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsub", 
+            "description": "Bad named entity: supsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫔", 
+            "description": "Named entity: supsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&supsup", 
+            "description": "Bad named entity: supsup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&supsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫖", 
+            "description": "Named entity: supsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ad6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swArr", 
+            "description": "Bad named entity: swArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&swArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇙", 
+            "description": "Named entity: swArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarhk", 
+            "description": "Bad named entity: swarhk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&swarhk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤦", 
+            "description": "Named entity: swarhk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2926"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarr", 
+            "description": "Bad named entity: swarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&swarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↙", 
+            "description": "Named entity: swarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swarrow", 
+            "description": "Bad named entity: swarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&swarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↙", 
+            "description": "Named entity: swarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2199"
+                ]
+            ]
+        }, 
+        {
+            "input": "&swnwar", 
+            "description": "Bad named entity: swnwar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&swnwar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤪", 
+            "description": "Named entity: swnwar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u292a"
+                ]
+            ]
+        }, 
+        {
+            "input": "ß", 
+            "description": "Named entity: szlig without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00df"
+                ]
+            ]
+        }, 
+        {
+            "input": "ß", 
+            "description": "Named entity: szlig; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00df"
+                ]
+            ]
+        }, 
+        {
+            "input": "&target", 
+            "description": "Bad named entity: target without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&target"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌖", 
+            "description": "Named entity: target; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2316"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tau", 
+            "description": "Bad named entity: tau without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tau"
+                ]
+            ]
+        }, 
+        {
+            "input": "τ", 
+            "description": "Named entity: tau; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tbrk", 
+            "description": "Bad named entity: tbrk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tbrk"
+                ]
+            ]
+        }, 
+        {
+            "input": "⎴", 
+            "description": "Named entity: tbrk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcaron", 
+            "description": "Bad named entity: tcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ť", 
+            "description": "Named entity: tcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0165"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcedil", 
+            "description": "Bad named entity: tcedil without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tcedil"
+                ]
+            ]
+        }, 
+        {
+            "input": "ţ", 
+            "description": "Named entity: tcedil; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0163"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tcy", 
+            "description": "Bad named entity: tcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "т", 
+            "description": "Named entity: tcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0442"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tdot", 
+            "description": "Bad named entity: tdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⃛", 
+            "description": "Named entity: tdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u20db"
+                ]
+            ]
+        }, 
+        {
+            "input": "&telrec", 
+            "description": "Bad named entity: telrec without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&telrec"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌕", 
+            "description": "Named entity: telrec; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2315"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tfr", 
+            "description": "Bad named entity: tfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔱", 
+            "description": "Named entity: tfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd31"
+                ]
+            ]
+        }, 
+        {
+            "input": "&there4", 
+            "description": "Bad named entity: there4 without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&there4"
+                ]
+            ]
+        }, 
+        {
+            "input": "∴", 
+            "description": "Named entity: there4; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&therefore", 
+            "description": "Bad named entity: therefore without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&therefore"
+                ]
+            ]
+        }, 
+        {
+            "input": "∴", 
+            "description": "Named entity: therefore; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2234"
+                ]
+            ]
+        }, 
+        {
+            "input": "&theta", 
+            "description": "Bad named entity: theta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&theta"
+                ]
+            ]
+        }, 
+        {
+            "input": "θ", 
+            "description": "Named entity: theta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetasym", 
+            "description": "Bad named entity: thetasym without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thetasym"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϑ", 
+            "description": "Named entity: thetasym; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thetav", 
+            "description": "Bad named entity: thetav without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thetav"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϑ", 
+            "description": "Named entity: thetav; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thickapprox", 
+            "description": "Bad named entity: thickapprox without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thickapprox"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: thickapprox; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thicksim", 
+            "description": "Bad named entity: thicksim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thicksim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∼", 
+            "description": "Named entity: thicksim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thinsp", 
+            "description": "Bad named entity: thinsp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thinsp"
+                ]
+            ]
+        }, 
+        {
+            "input": " ", 
+            "description": "Named entity: thinsp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2009"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thkap", 
+            "description": "Bad named entity: thkap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thkap"
+                ]
+            ]
+        }, 
+        {
+            "input": "≈", 
+            "description": "Named entity: thkap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2248"
+                ]
+            ]
+        }, 
+        {
+            "input": "&thksim", 
+            "description": "Bad named entity: thksim without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&thksim"
+                ]
+            ]
+        }, 
+        {
+            "input": "∼", 
+            "description": "Named entity: thksim; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u223c"
+                ]
+            ]
+        }, 
+        {
+            "input": "þ", 
+            "description": "Named entity: thorn without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "þ", 
+            "description": "Named entity: thorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fe"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tilde", 
+            "description": "Bad named entity: tilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "˜", 
+            "description": "Named entity: tilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u02dc"
+                ]
+            ]
+        }, 
+        {
+            "input": "×", 
+            "description": "Named entity: times without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "×", 
+            "description": "Named entity: times; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00d7"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊠", 
+            "description": "Named entity: timesb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨱", 
+            "description": "Named entity: timesbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a31"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨰", 
+            "description": "Named entity: timesd; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a30"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tint", 
+            "description": "Bad named entity: tint without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tint"
+                ]
+            ]
+        }, 
+        {
+            "input": "∭", 
+            "description": "Named entity: tint; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u222d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&toea", 
+            "description": "Bad named entity: toea without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&toea"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤨", 
+            "description": "Named entity: toea; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2928"
+                ]
+            ]
+        }, 
+        {
+            "input": "&top", 
+            "description": "Bad named entity: top without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&top"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊤", 
+            "description": "Named entity: top; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topbot", 
+            "description": "Bad named entity: topbot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&topbot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌶", 
+            "description": "Named entity: topbot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2336"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topcir", 
+            "description": "Bad named entity: topcir without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&topcir"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫱", 
+            "description": "Named entity: topcir; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2af1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topf", 
+            "description": "Bad named entity: topf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&topf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕥", 
+            "description": "Named entity: topf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd65"
+                ]
+            ]
+        }, 
+        {
+            "input": "&topfork", 
+            "description": "Bad named entity: topfork without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&topfork"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫚", 
+            "description": "Named entity: topfork; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ada"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tosa", 
+            "description": "Bad named entity: tosa without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tosa"
+                ]
+            ]
+        }, 
+        {
+            "input": "⤩", 
+            "description": "Named entity: tosa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2929"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tprime", 
+            "description": "Bad named entity: tprime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tprime"
+                ]
+            ]
+        }, 
+        {
+            "input": "‴", 
+            "description": "Named entity: tprime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2034"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trade", 
+            "description": "Bad named entity: trade without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trade"
+                ]
+            ]
+        }, 
+        {
+            "input": "™", 
+            "description": "Named entity: trade; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2122"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangle", 
+            "description": "Bad named entity: triangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "▵", 
+            "description": "Named entity: triangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangledown", 
+            "description": "Bad named entity: triangledown without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triangledown"
+                ]
+            ]
+        }, 
+        {
+            "input": "▿", 
+            "description": "Named entity: triangledown; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleleft", 
+            "description": "Bad named entity: triangleleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "◃", 
+            "description": "Named entity: triangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglelefteq", 
+            "description": "Bad named entity: trianglelefteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trianglelefteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊴", 
+            "description": "Named entity: trianglelefteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleq", 
+            "description": "Bad named entity: triangleq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triangleq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≜", 
+            "description": "Named entity: triangleq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triangleright", 
+            "description": "Bad named entity: triangleright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "▹", 
+            "description": "Named entity: triangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trianglerighteq", 
+            "description": "Bad named entity: trianglerighteq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trianglerighteq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊵", 
+            "description": "Named entity: trianglerighteq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tridot", 
+            "description": "Bad named entity: tridot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tridot"
+                ]
+            ]
+        }, 
+        {
+            "input": "◬", 
+            "description": "Named entity: tridot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ec"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trie", 
+            "description": "Bad named entity: trie without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trie"
+                ]
+            ]
+        }, 
+        {
+            "input": "≜", 
+            "description": "Named entity: trie; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triminus", 
+            "description": "Bad named entity: triminus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triminus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨺", 
+            "description": "Named entity: triminus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&triplus", 
+            "description": "Bad named entity: triplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&triplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨹", 
+            "description": "Named entity: triplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a39"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trisb", 
+            "description": "Bad named entity: trisb without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trisb"
+                ]
+            ]
+        }, 
+        {
+            "input": "⧍", 
+            "description": "Named entity: trisb; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29cd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tritime", 
+            "description": "Bad named entity: tritime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tritime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨻", 
+            "description": "Named entity: tritime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a3b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&trpezium", 
+            "description": "Bad named entity: trpezium without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&trpezium"
+                ]
+            ]
+        }, 
+        {
+            "input": "⏢", 
+            "description": "Named entity: trpezium; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u23e2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscr", 
+            "description": "Bad named entity: tscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓉", 
+            "description": "Named entity: tscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcc9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tscy", 
+            "description": "Bad named entity: tscy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tscy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ц", 
+            "description": "Named entity: tscy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0446"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tshcy", 
+            "description": "Bad named entity: tshcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tshcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ћ", 
+            "description": "Named entity: tshcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&tstrok", 
+            "description": "Bad named entity: tstrok without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&tstrok"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŧ", 
+            "description": "Named entity: tstrok; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0167"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twixt", 
+            "description": "Bad named entity: twixt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&twixt"
+                ]
+            ]
+        }, 
+        {
+            "input": "≬", 
+            "description": "Named entity: twixt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u226c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadleftarrow", 
+            "description": "Bad named entity: twoheadleftarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&twoheadleftarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↞", 
+            "description": "Named entity: twoheadleftarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u219e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&twoheadrightarrow", 
+            "description": "Bad named entity: twoheadrightarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&twoheadrightarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↠", 
+            "description": "Named entity: twoheadrightarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21a0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uArr", 
+            "description": "Bad named entity: uArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇑", 
+            "description": "Named entity: uArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uHar", 
+            "description": "Bad named entity: uHar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uHar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥣", 
+            "description": "Named entity: uHar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2963"
+                ]
+            ]
+        }, 
+        {
+            "input": "ú", 
+            "description": "Named entity: uacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "ú", 
+            "description": "Named entity: uacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uarr", 
+            "description": "Bad named entity: uarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↑", 
+            "description": "Named entity: uarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubrcy", 
+            "description": "Bad named entity: ubrcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ubrcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ў", 
+            "description": "Named entity: ubrcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u045e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ubreve", 
+            "description": "Bad named entity: ubreve without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ubreve"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŭ", 
+            "description": "Named entity: ubreve; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016d"
+                ]
+            ]
+        }, 
+        {
+            "input": "û", 
+            "description": "Named entity: ucirc without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "û", 
+            "description": "Named entity: ucirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ucy", 
+            "description": "Bad named entity: ucy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "у", 
+            "description": "Named entity: ucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0443"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udarr", 
+            "description": "Bad named entity: udarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&udarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇅", 
+            "description": "Named entity: udarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udblac", 
+            "description": "Bad named entity: udblac without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&udblac"
+                ]
+            ]
+        }, 
+        {
+            "input": "ű", 
+            "description": "Named entity: udblac; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0171"
+                ]
+            ]
+        }, 
+        {
+            "input": "&udhar", 
+            "description": "Bad named entity: udhar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&udhar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥮", 
+            "description": "Named entity: udhar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u296e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufisht", 
+            "description": "Bad named entity: ufisht without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ufisht"
+                ]
+            ]
+        }, 
+        {
+            "input": "⥾", 
+            "description": "Named entity: ufisht; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u297e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ufr", 
+            "description": "Bad named entity: ufr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ufr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔲", 
+            "description": "Named entity: ufr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd32"
+                ]
+            ]
+        }, 
+        {
+            "input": "ù", 
+            "description": "Named entity: ugrave without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "ù", 
+            "description": "Named entity: ugrave; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharl", 
+            "description": "Bad named entity: uharl without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uharl"
+                ]
+            ]
+        }, 
+        {
+            "input": "↿", 
+            "description": "Named entity: uharl; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uharr", 
+            "description": "Bad named entity: uharr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↾", 
+            "description": "Named entity: uharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uhblk", 
+            "description": "Bad named entity: uhblk without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uhblk"
+                ]
+            ]
+        }, 
+        {
+            "input": "▀", 
+            "description": "Named entity: uhblk; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2580"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorn", 
+            "description": "Bad named entity: ulcorn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ulcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌜", 
+            "description": "Named entity: ulcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcorner", 
+            "description": "Bad named entity: ulcorner without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ulcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌜", 
+            "description": "Named entity: ulcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ulcrop", 
+            "description": "Bad named entity: ulcrop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ulcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌏", 
+            "description": "Named entity: ulcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ultri", 
+            "description": "Bad named entity: ultri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ultri"
+                ]
+            ]
+        }, 
+        {
+            "input": "◸", 
+            "description": "Named entity: ultri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&umacr", 
+            "description": "Bad named entity: umacr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&umacr"
+                ]
+            ]
+        }, 
+        {
+            "input": "ū", 
+            "description": "Named entity: umacr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016b"
+                ]
+            ]
+        }, 
+        {
+            "input": "¨", 
+            "description": "Named entity: uml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "¨", 
+            "description": "Named entity: uml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uogon", 
+            "description": "Bad named entity: uogon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uogon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ų", 
+            "description": "Named entity: uogon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0173"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uopf", 
+            "description": "Bad named entity: uopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕦", 
+            "description": "Named entity: uopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd66"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uparrow", 
+            "description": "Bad named entity: uparrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uparrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↑", 
+            "description": "Named entity: uparrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2191"
+                ]
+            ]
+        }, 
+        {
+            "input": "&updownarrow", 
+            "description": "Bad named entity: updownarrow without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&updownarrow"
+                ]
+            ]
+        }, 
+        {
+            "input": "↕", 
+            "description": "Named entity: updownarrow; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonleft", 
+            "description": "Bad named entity: upharpoonleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upharpoonleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "↿", 
+            "description": "Named entity: upharpoonleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21bf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upharpoonright", 
+            "description": "Bad named entity: upharpoonright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upharpoonright"
+                ]
+            ]
+        }, 
+        {
+            "input": "↾", 
+            "description": "Named entity: upharpoonright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uplus", 
+            "description": "Bad named entity: uplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊎", 
+            "description": "Named entity: uplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsi", 
+            "description": "Bad named entity: upsi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upsi"
+                ]
+            ]
+        }, 
+        {
+            "input": "υ", 
+            "description": "Named entity: upsi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsih", 
+            "description": "Bad named entity: upsih without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upsih"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϒ", 
+            "description": "Named entity: upsih; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upsilon", 
+            "description": "Bad named entity: upsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "υ", 
+            "description": "Named entity: upsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&upuparrows", 
+            "description": "Bad named entity: upuparrows without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&upuparrows"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇈", 
+            "description": "Named entity: upuparrows; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorn", 
+            "description": "Bad named entity: urcorn without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&urcorn"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌝", 
+            "description": "Named entity: urcorn; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcorner", 
+            "description": "Bad named entity: urcorner without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&urcorner"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌝", 
+            "description": "Named entity: urcorner; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u231d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urcrop", 
+            "description": "Bad named entity: urcrop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&urcrop"
+                ]
+            ]
+        }, 
+        {
+            "input": "⌎", 
+            "description": "Named entity: urcrop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u230e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uring", 
+            "description": "Bad named entity: uring without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uring"
+                ]
+            ]
+        }, 
+        {
+            "input": "ů", 
+            "description": "Named entity: uring; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u016f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&urtri", 
+            "description": "Bad named entity: urtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&urtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "◹", 
+            "description": "Named entity: urtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uscr", 
+            "description": "Bad named entity: uscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓊", 
+            "description": "Named entity: uscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcca"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utdot", 
+            "description": "Bad named entity: utdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&utdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋰", 
+            "description": "Named entity: utdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utilde", 
+            "description": "Bad named entity: utilde without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&utilde"
+                ]
+            ]
+        }, 
+        {
+            "input": "ũ", 
+            "description": "Named entity: utilde; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0169"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utri", 
+            "description": "Bad named entity: utri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&utri"
+                ]
+            ]
+        }, 
+        {
+            "input": "▵", 
+            "description": "Named entity: utri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&utrif", 
+            "description": "Bad named entity: utrif without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&utrif"
+                ]
+            ]
+        }, 
+        {
+            "input": "▴", 
+            "description": "Named entity: utrif; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b4"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uuarr", 
+            "description": "Bad named entity: uuarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uuarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇈", 
+            "description": "Named entity: uuarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21c8"
+                ]
+            ]
+        }, 
+        {
+            "input": "ü", 
+            "description": "Named entity: uuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ü", 
+            "description": "Named entity: uuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&uwangle", 
+            "description": "Bad named entity: uwangle without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&uwangle"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦧", 
+            "description": "Named entity: uwangle; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u29a7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vArr", 
+            "description": "Bad named entity: vArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇕", 
+            "description": "Named entity: vArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBar", 
+            "description": "Bad named entity: vBar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vBar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫨", 
+            "description": "Named entity: vBar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vBarv", 
+            "description": "Bad named entity: vBarv without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vBarv"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫩", 
+            "description": "Named entity: vBarv; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2ae9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vDash", 
+            "description": "Bad named entity: vDash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vDash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊨", 
+            "description": "Named entity: vDash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vangrt", 
+            "description": "Bad named entity: vangrt without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vangrt"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦜", 
+            "description": "Named entity: vangrt; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varepsilon", 
+            "description": "Bad named entity: varepsilon without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varepsilon"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϵ", 
+            "description": "Named entity: varepsilon; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varkappa", 
+            "description": "Bad named entity: varkappa without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varkappa"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϰ", 
+            "description": "Named entity: varkappa; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f0"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varnothing", 
+            "description": "Bad named entity: varnothing without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varnothing"
+                ]
+            ]
+        }, 
+        {
+            "input": "∅", 
+            "description": "Named entity: varnothing; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2205"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varphi", 
+            "description": "Bad named entity: varphi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varphi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϕ", 
+            "description": "Named entity: varphi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpi", 
+            "description": "Bad named entity: varpi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varpi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϖ", 
+            "description": "Named entity: varpi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varpropto", 
+            "description": "Bad named entity: varpropto without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varpropto"
+                ]
+            ]
+        }, 
+        {
+            "input": "∝", 
+            "description": "Named entity: varpropto; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varr", 
+            "description": "Bad named entity: varr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varr"
+                ]
+            ]
+        }, 
+        {
+            "input": "↕", 
+            "description": "Named entity: varr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2195"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varrho", 
+            "description": "Bad named entity: varrho without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varrho"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϱ", 
+            "description": "Named entity: varrho; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03f1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsigma", 
+            "description": "Bad named entity: varsigma without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varsigma"
+                ]
+            ]
+        }, 
+        {
+            "input": "ς", 
+            "description": "Named entity: varsigma; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneq", 
+            "description": "Bad named entity: varsubsetneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varsubsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊊︀", 
+            "description": "Named entity: varsubsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsubsetneqq", 
+            "description": "Bad named entity: varsubsetneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varsubsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫋︀", 
+            "description": "Named entity: varsubsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneq", 
+            "description": "Bad named entity: varsupsetneq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varsupsetneq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊋︀", 
+            "description": "Named entity: varsupsetneq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&varsupsetneqq", 
+            "description": "Bad named entity: varsupsetneqq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&varsupsetneqq"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫌︀", 
+            "description": "Named entity: varsupsetneqq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartheta", 
+            "description": "Bad named entity: vartheta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vartheta"
+                ]
+            ]
+        }, 
+        {
+            "input": "ϑ", 
+            "description": "Named entity: vartheta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03d1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleleft", 
+            "description": "Bad named entity: vartriangleleft without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vartriangleleft"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊲", 
+            "description": "Named entity: vartriangleleft; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vartriangleright", 
+            "description": "Bad named entity: vartriangleright without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vartriangleright"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊳", 
+            "description": "Named entity: vartriangleright; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vcy", 
+            "description": "Bad named entity: vcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "в", 
+            "description": "Named entity: vcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0432"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vdash", 
+            "description": "Bad named entity: vdash without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vdash"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊢", 
+            "description": "Named entity: vdash; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22a2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vee", 
+            "description": "Bad named entity: vee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vee"
+                ]
+            ]
+        }, 
+        {
+            "input": "∨", 
+            "description": "Named entity: vee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2228"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veebar", 
+            "description": "Bad named entity: veebar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&veebar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊻", 
+            "description": "Named entity: veebar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22bb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&veeeq", 
+            "description": "Bad named entity: veeeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&veeeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≚", 
+            "description": "Named entity: veeeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u225a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vellip", 
+            "description": "Bad named entity: vellip without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vellip"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋮", 
+            "description": "Named entity: vellip; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22ee"
+                ]
+            ]
+        }, 
+        {
+            "input": "&verbar", 
+            "description": "Bad named entity: verbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&verbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "|", 
+            "description": "Named entity: verbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vert", 
+            "description": "Bad named entity: vert without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vert"
+                ]
+            ]
+        }, 
+        {
+            "input": "|", 
+            "description": "Named entity: vert; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "|"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vfr", 
+            "description": "Bad named entity: vfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔳", 
+            "description": "Named entity: vfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd33"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vltri", 
+            "description": "Bad named entity: vltri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vltri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊲", 
+            "description": "Named entity: vltri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsub", 
+            "description": "Bad named entity: vnsub without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vnsub"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊂⃒", 
+            "description": "Named entity: vnsub; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2282\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vnsup", 
+            "description": "Bad named entity: vnsup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vnsup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊃⃒", 
+            "description": "Named entity: vnsup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2283\u20d2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vopf", 
+            "description": "Bad named entity: vopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕧", 
+            "description": "Named entity: vopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd67"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vprop", 
+            "description": "Bad named entity: vprop without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vprop"
+                ]
+            ]
+        }, 
+        {
+            "input": "∝", 
+            "description": "Named entity: vprop; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u221d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vrtri", 
+            "description": "Bad named entity: vrtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vrtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊳", 
+            "description": "Named entity: vrtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vscr", 
+            "description": "Bad named entity: vscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓋", 
+            "description": "Named entity: vscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubnE", 
+            "description": "Bad named entity: vsubnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vsubnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫋︀", 
+            "description": "Named entity: vsubnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acb\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsubne", 
+            "description": "Bad named entity: vsubne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vsubne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊊︀", 
+            "description": "Named entity: vsubne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228a\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupnE", 
+            "description": "Bad named entity: vsupnE without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vsupnE"
+                ]
+            ]
+        }, 
+        {
+            "input": "⫌︀", 
+            "description": "Named entity: vsupnE; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2acc\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vsupne", 
+            "description": "Bad named entity: vsupne without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vsupne"
+                ]
+            ]
+        }, 
+        {
+            "input": "⊋︀", 
+            "description": "Named entity: vsupne; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u228b\ufe00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&vzigzag", 
+            "description": "Bad named entity: vzigzag without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&vzigzag"
+                ]
+            ]
+        }, 
+        {
+            "input": "⦚", 
+            "description": "Named entity: vzigzag; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u299a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wcirc", 
+            "description": "Bad named entity: wcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŵ", 
+            "description": "Named entity: wcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0175"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedbar", 
+            "description": "Bad named entity: wedbar without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wedbar"
+                ]
+            ]
+        }, 
+        {
+            "input": "⩟", 
+            "description": "Named entity: wedbar; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a5f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedge", 
+            "description": "Bad named entity: wedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "∧", 
+            "description": "Named entity: wedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2227"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wedgeq", 
+            "description": "Bad named entity: wedgeq without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wedgeq"
+                ]
+            ]
+        }, 
+        {
+            "input": "≙", 
+            "description": "Named entity: wedgeq; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2259"
+                ]
+            ]
+        }, 
+        {
+            "input": "&weierp", 
+            "description": "Bad named entity: weierp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&weierp"
+                ]
+            ]
+        }, 
+        {
+            "input": "℘", 
+            "description": "Named entity: weierp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wfr", 
+            "description": "Bad named entity: wfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔴", 
+            "description": "Named entity: wfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd34"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wopf", 
+            "description": "Bad named entity: wopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕨", 
+            "description": "Named entity: wopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd68"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wp", 
+            "description": "Bad named entity: wp without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wp"
+                ]
+            ]
+        }, 
+        {
+            "input": "℘", 
+            "description": "Named entity: wp; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2118"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wr", 
+            "description": "Bad named entity: wr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wr"
+                ]
+            ]
+        }, 
+        {
+            "input": "≀", 
+            "description": "Named entity: wr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wreath", 
+            "description": "Bad named entity: wreath without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wreath"
+                ]
+            ]
+        }, 
+        {
+            "input": "≀", 
+            "description": "Named entity: wreath; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2240"
+                ]
+            ]
+        }, 
+        {
+            "input": "&wscr", 
+            "description": "Bad named entity: wscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&wscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓌", 
+            "description": "Named entity: wscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcap", 
+            "description": "Bad named entity: xcap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xcap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋂", 
+            "description": "Named entity: xcap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c2"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcirc", 
+            "description": "Bad named entity: xcirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xcirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "◯", 
+            "description": "Named entity: xcirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25ef"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xcup", 
+            "description": "Bad named entity: xcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋃", 
+            "description": "Named entity: xcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xdtri", 
+            "description": "Bad named entity: xdtri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xdtri"
+                ]
+            ]
+        }, 
+        {
+            "input": "▽", 
+            "description": "Named entity: xdtri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25bd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xfr", 
+            "description": "Bad named entity: xfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔵", 
+            "description": "Named entity: xfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd35"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xhArr", 
+            "description": "Bad named entity: xhArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xhArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟺", 
+            "description": "Named entity: xhArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fa"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xharr", 
+            "description": "Bad named entity: xharr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xharr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟷", 
+            "description": "Named entity: xharr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f7"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xi", 
+            "description": "Bad named entity: xi without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xi"
+                ]
+            ]
+        }, 
+        {
+            "input": "ξ", 
+            "description": "Named entity: xi; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03be"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlArr", 
+            "description": "Bad named entity: xlArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xlArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟸", 
+            "description": "Named entity: xlArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f8"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xlarr", 
+            "description": "Bad named entity: xlarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xlarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟵", 
+            "description": "Named entity: xlarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xmap", 
+            "description": "Bad named entity: xmap without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xmap"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟼", 
+            "description": "Named entity: xmap; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27fc"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xnis", 
+            "description": "Bad named entity: xnis without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xnis"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋻", 
+            "description": "Named entity: xnis; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22fb"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xodot", 
+            "description": "Bad named entity: xodot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xodot"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨀", 
+            "description": "Named entity: xodot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a00"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xopf", 
+            "description": "Bad named entity: xopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕩", 
+            "description": "Named entity: xopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd69"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xoplus", 
+            "description": "Bad named entity: xoplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xoplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨁", 
+            "description": "Named entity: xoplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a01"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xotime", 
+            "description": "Bad named entity: xotime without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xotime"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨂", 
+            "description": "Named entity: xotime; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a02"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrArr", 
+            "description": "Bad named entity: xrArr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xrArr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟹", 
+            "description": "Named entity: xrArr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f9"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xrarr", 
+            "description": "Bad named entity: xrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⟶", 
+            "description": "Named entity: xrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u27f6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xscr", 
+            "description": "Bad named entity: xscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓍", 
+            "description": "Named entity: xscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xsqcup", 
+            "description": "Bad named entity: xsqcup without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xsqcup"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨆", 
+            "description": "Named entity: xsqcup; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a06"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xuplus", 
+            "description": "Bad named entity: xuplus without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xuplus"
+                ]
+            ]
+        }, 
+        {
+            "input": "⨄", 
+            "description": "Named entity: xuplus; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2a04"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xutri", 
+            "description": "Bad named entity: xutri without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xutri"
+                ]
+            ]
+        }, 
+        {
+            "input": "△", 
+            "description": "Named entity: xutri; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u25b3"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xvee", 
+            "description": "Bad named entity: xvee without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xvee"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋁", 
+            "description": "Named entity: xvee; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c1"
+                ]
+            ]
+        }, 
+        {
+            "input": "&xwedge", 
+            "description": "Bad named entity: xwedge without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&xwedge"
+                ]
+            ]
+        }, 
+        {
+            "input": "⋀", 
+            "description": "Named entity: xwedge; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u22c0"
+                ]
+            ]
+        }, 
+        {
+            "input": "ý", 
+            "description": "Named entity: yacute without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "ý", 
+            "description": "Named entity: yacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00fd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yacy", 
+            "description": "Bad named entity: yacy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yacy"
+                ]
+            ]
+        }, 
+        {
+            "input": "я", 
+            "description": "Named entity: yacy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044f"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycirc", 
+            "description": "Bad named entity: ycirc without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ycirc"
+                ]
+            ]
+        }, 
+        {
+            "input": "ŷ", 
+            "description": "Named entity: ycirc; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0177"
+                ]
+            ]
+        }, 
+        {
+            "input": "&ycy", 
+            "description": "Bad named entity: ycy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&ycy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ы", 
+            "description": "Named entity: ycy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044b"
+                ]
+            ]
+        }, 
+        {
+            "input": "¥", 
+            "description": "Named entity: yen without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "¥", 
+            "description": "Named entity: yen; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00a5"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yfr", 
+            "description": "Bad named entity: yfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔶", 
+            "description": "Named entity: yfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd36"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yicy", 
+            "description": "Bad named entity: yicy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yicy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ї", 
+            "description": "Named entity: yicy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0457"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yopf", 
+            "description": "Bad named entity: yopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕪", 
+            "description": "Named entity: yopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd6a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yscr", 
+            "description": "Bad named entity: yscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓎", 
+            "description": "Named entity: yscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udcce"
+                ]
+            ]
+        }, 
+        {
+            "input": "&yucy", 
+            "description": "Bad named entity: yucy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&yucy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ю", 
+            "description": "Named entity: yucy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u044e"
+                ]
+            ]
+        }, 
+        {
+            "input": "ÿ", 
+            "description": "Named entity: yuml without a semi-colon", 
+            "output": [
+                "ParseError", 
+                [
+                    "Character", 
+                    "\u00ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "ÿ", 
+            "description": "Named entity: yuml; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u00ff"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zacute", 
+            "description": "Bad named entity: zacute without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zacute"
+                ]
+            ]
+        }, 
+        {
+            "input": "ź", 
+            "description": "Named entity: zacute; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017a"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcaron", 
+            "description": "Bad named entity: zcaron without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zcaron"
+                ]
+            ]
+        }, 
+        {
+            "input": "ž", 
+            "description": "Named entity: zcaron; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017e"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zcy", 
+            "description": "Bad named entity: zcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "з", 
+            "description": "Named entity: zcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0437"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zdot", 
+            "description": "Bad named entity: zdot without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zdot"
+                ]
+            ]
+        }, 
+        {
+            "input": "ż", 
+            "description": "Named entity: zdot; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u017c"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeetrf", 
+            "description": "Bad named entity: zeetrf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zeetrf"
+                ]
+            ]
+        }, 
+        {
+            "input": "ℨ", 
+            "description": "Named entity: zeetrf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u2128"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zeta", 
+            "description": "Bad named entity: zeta without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zeta"
+                ]
+            ]
+        }, 
+        {
+            "input": "ζ", 
+            "description": "Named entity: zeta; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u03b6"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zfr", 
+            "description": "Bad named entity: zfr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zfr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝔷", 
+            "description": "Named entity: zfr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd37"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zhcy", 
+            "description": "Bad named entity: zhcy without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zhcy"
+                ]
+            ]
+        }, 
+        {
+            "input": "ж", 
+            "description": "Named entity: zhcy; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u0436"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zigrarr", 
+            "description": "Bad named entity: zigrarr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zigrarr"
+                ]
+            ]
+        }, 
+        {
+            "input": "⇝", 
+            "description": "Named entity: zigrarr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u21dd"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zopf", 
+            "description": "Bad named entity: zopf without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zopf"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝕫", 
+            "description": "Named entity: zopf; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udd6b"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zscr", 
+            "description": "Bad named entity: zscr without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zscr"
+                ]
+            ]
+        }, 
+        {
+            "input": "𝓏", 
+            "description": "Named entity: zscr; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\ud835\udccf"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwj", 
+            "description": "Bad named entity: zwj without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zwj"
+                ]
+            ]
+        }, 
+        {
+            "input": "‍", 
+            "description": "Named entity: zwj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200d"
+                ]
+            ]
+        }, 
+        {
+            "input": "&zwnj", 
+            "description": "Bad named entity: zwnj without a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "&zwnj"
+                ]
+            ]
+        }, 
+        {
+            "input": "‌", 
+            "description": "Named entity: zwnj; with a semi-colon", 
+            "output": [
+                [
+                    "Character", 
+                    "\u200c"
+                ]
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/libs/html5lib/tests/testdata/tokenizer/numericEntities.test b/libs/html5lib/tests/testdata/tokenizer/numericEntities.test
new file mode 100644
index 000000000..43de84b0f
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/numericEntities.test
@@ -0,0 +1,1349 @@
+{"tests": [
+
+{"description": "Invalid unterminated numeric entity character overflow before EOF",
+"input": "�",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid unterminated numeric entity character overflow before EOF",
+"input": "�",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid unterminated numeric entity character overflow before EOF",
+"input": "�",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid unterminated numeric entity character overflow",
+"input": "�x",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFDx"]]},
+
+{"description": "Invalid unterminated numeric entity character overflow",
+"input": "�x",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFDx"]]},
+
+{"description": "Invalid unterminated numeric entity character overflow",
+"input": "�x",
+"output": ["ParseError", "ParseError", ["Character", "\uFFFDx"]]},
+
+{"description": "Invalid numeric entity character overflow",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character overflow",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character overflow",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+0000",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+0001",
+"input": "",
+"output": ["ParseError", ["Character", "\u0001"]]},
+
+{"description": "Invalid numeric entity character U+0002",
+"input": "",
+"output": ["ParseError", ["Character", "\u0002"]]},
+
+{"description": "Invalid numeric entity character U+0003",
+"input": "",
+"output": ["ParseError", ["Character", "\u0003"]]},
+
+{"description": "Invalid numeric entity character U+0004",
+"input": "",
+"output": ["ParseError", ["Character", "\u0004"]]},
+
+{"description": "Invalid numeric entity character U+0005",
+"input": "",
+"output": ["ParseError", ["Character", "\u0005"]]},
+
+{"description": "Invalid numeric entity character U+0006",
+"input": "",
+"output": ["ParseError", ["Character", "\u0006"]]},
+
+{"description": "Invalid numeric entity character U+0007",
+"input": "",
+"output": ["ParseError", ["Character", "\u0007"]]},
+
+{"description": "Invalid numeric entity character U+0008",
+"input": "",
+"output": ["ParseError", ["Character", "\u0008"]]},
+
+{"description": "Invalid numeric entity character U+000B",
+"input": "",
+"output": ["ParseError", ["Character", "\u000b"]]},
+
+{"description": "Invalid numeric entity character U+000E",
+"input": "",
+"output": ["ParseError", ["Character", "\u000e"]]},
+
+{"description": "Invalid numeric entity character U+000F",
+"input": "",
+"output": ["ParseError", ["Character", "\u000f"]]},
+
+{"description": "Invalid numeric entity character U+0010",
+"input": "",
+"output": ["ParseError", ["Character", "\u0010"]]},
+
+{"description": "Invalid numeric entity character U+0011",
+"input": "",
+"output": ["ParseError", ["Character", "\u0011"]]},
+
+{"description": "Invalid numeric entity character U+0012",
+"input": "",
+"output": ["ParseError", ["Character", "\u0012"]]},
+
+{"description": "Invalid numeric entity character U+0013",
+"input": "",
+"output": ["ParseError", ["Character", "\u0013"]]},
+
+{"description": "Invalid numeric entity character U+0014",
+"input": "",
+"output": ["ParseError", ["Character", "\u0014"]]},
+
+{"description": "Invalid numeric entity character U+0015",
+"input": "",
+"output": ["ParseError", ["Character", "\u0015"]]},
+
+{"description": "Invalid numeric entity character U+0016",
+"input": "",
+"output": ["ParseError", ["Character", "\u0016"]]},
+
+{"description": "Invalid numeric entity character U+0017",
+"input": "",
+"output": ["ParseError", ["Character", "\u0017"]]},
+
+{"description": "Invalid numeric entity character U+0018",
+"input": "",
+"output": ["ParseError", ["Character", "\u0018"]]},
+
+{"description": "Invalid numeric entity character U+0019",
+"input": "",
+"output": ["ParseError", ["Character", "\u0019"]]},
+
+{"description": "Invalid numeric entity character U+001A",
+"input": "",
+"output": ["ParseError", ["Character", "\u001a"]]},
+
+{"description": "Invalid numeric entity character U+001B",
+"input": "",
+"output": ["ParseError", ["Character", "\u001b"]]},
+
+{"description": "Invalid numeric entity character U+001C",
+"input": "",
+"output": ["ParseError", ["Character", "\u001c"]]},
+
+{"description": "Invalid numeric entity character U+001D",
+"input": "",
+"output": ["ParseError", ["Character", "\u001d"]]},
+
+{"description": "Invalid numeric entity character U+001E",
+"input": "",
+"output": ["ParseError", ["Character", "\u001e"]]},
+
+{"description": "Invalid numeric entity character U+001F",
+"input": "",
+"output": ["ParseError", ["Character", "\u001f"]]},
+
+{"description": "Invalid numeric entity character U+007F",
+"input": "",
+"output": ["ParseError", ["Character", "\u007f"]]},
+
+{"description": "Invalid numeric entity character U+D800",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+DFFF",
+"input": "�",
+"output": ["ParseError", ["Character", "\uFFFD"]]},
+
+{"description": "Invalid numeric entity character U+FDD0",
+"input": "﷐",
+"output": ["ParseError", ["Character", "\ufdd0"]]},
+
+{"description": "Invalid numeric entity character U+FDD1",
+"input": "﷑",
+"output": ["ParseError", ["Character", "\ufdd1"]]},
+
+{"description": "Invalid numeric entity character U+FDD2",
+"input": "﷒",
+"output": ["ParseError", ["Character", "\ufdd2"]]},
+
+{"description": "Invalid numeric entity character U+FDD3",
+"input": "﷓",
+"output": ["ParseError", ["Character", "\ufdd3"]]},
+
+{"description": "Invalid numeric entity character U+FDD4",
+"input": "﷔",
+"output": ["ParseError", ["Character", "\ufdd4"]]},
+
+{"description": "Invalid numeric entity character U+FDD5",
+"input": "﷕",
+"output": ["ParseError", ["Character", "\ufdd5"]]},
+
+{"description": "Invalid numeric entity character U+FDD6",
+"input": "﷖",
+"output": ["ParseError", ["Character", "\ufdd6"]]},
+
+{"description": "Invalid numeric entity character U+FDD7",
+"input": "﷗",
+"output": ["ParseError", ["Character", "\ufdd7"]]},
+
+{"description": "Invalid numeric entity character U+FDD8",
+"input": "﷘",
+"output": ["ParseError", ["Character", "\ufdd8"]]},
+
+{"description": "Invalid numeric entity character U+FDD9",
+"input": "﷙",
+"output": ["ParseError", ["Character", "\ufdd9"]]},
+
+{"description": "Invalid numeric entity character U+FDDA",
+"input": "﷚",
+"output": ["ParseError", ["Character", "\ufdda"]]},
+
+{"description": "Invalid numeric entity character U+FDDB",
+"input": "﷛",
+"output": ["ParseError", ["Character", "\ufddb"]]},
+
+{"description": "Invalid numeric entity character U+FDDC",
+"input": "﷜",
+"output": ["ParseError", ["Character", "\ufddc"]]},
+
+{"description": "Invalid numeric entity character U+FDDD",
+"input": "﷝",
+"output": ["ParseError", ["Character", "\ufddd"]]},
+
+{"description": "Invalid numeric entity character U+FDDE",
+"input": "﷞",
+"output": ["ParseError", ["Character", "\ufdde"]]},
+
+{"description": "Invalid numeric entity character U+FDDF",
+"input": "﷟",
+"output": ["ParseError", ["Character", "\ufddf"]]},
+
+{"description": "Invalid numeric entity character U+FDE0",
+"input": "﷠",
+"output": ["ParseError", ["Character", "\ufde0"]]},
+
+{"description": "Invalid numeric entity character U+FDE1",
+"input": "﷡",
+"output": ["ParseError", ["Character", "\ufde1"]]},
+
+{"description": "Invalid numeric entity character U+FDE2",
+"input": "﷢",
+"output": ["ParseError", ["Character", "\ufde2"]]},
+
+{"description": "Invalid numeric entity character U+FDE3",
+"input": "﷣",
+"output": ["ParseError", ["Character", "\ufde3"]]},
+
+{"description": "Invalid numeric entity character U+FDE4",
+"input": "﷤",
+"output": ["ParseError", ["Character", "\ufde4"]]},
+
+{"description": "Invalid numeric entity character U+FDE5",
+"input": "﷥",
+"output": ["ParseError", ["Character", "\ufde5"]]},
+
+{"description": "Invalid numeric entity character U+FDE6",
+"input": "﷦",
+"output": ["ParseError", ["Character", "\ufde6"]]},
+
+{"description": "Invalid numeric entity character U+FDE7",
+"input": "﷧",
+"output": ["ParseError", ["Character", "\ufde7"]]},
+
+{"description": "Invalid numeric entity character U+FDE8",
+"input": "﷨",
+"output": ["ParseError", ["Character", "\ufde8"]]},
+
+{"description": "Invalid numeric entity character U+FDE9",
+"input": "﷩",
+"output": ["ParseError", ["Character", "\ufde9"]]},
+
+{"description": "Invalid numeric entity character U+FDEA",
+"input": "﷪",
+"output": ["ParseError", ["Character", "\ufdea"]]},
+
+{"description": "Invalid numeric entity character U+FDEB",
+"input": "﷫",
+"output": ["ParseError", ["Character", "\ufdeb"]]},
+
+{"description": "Invalid numeric entity character U+FDEC",
+"input": "﷬",
+"output": ["ParseError", ["Character", "\ufdec"]]},
+
+{"description": "Invalid numeric entity character U+FDED",
+"input": "﷭",
+"output": ["ParseError", ["Character", "\ufded"]]},
+
+{"description": "Invalid numeric entity character U+FDEE",
+"input": "﷮",
+"output": ["ParseError", ["Character", "\ufdee"]]},
+
+{"description": "Invalid numeric entity character U+FDEF",
+"input": "﷯",
+"output": ["ParseError", ["Character", "\ufdef"]]},
+
+{"description": "Invalid numeric entity character U+FFFE",
+"input": "￾",
+"output": ["ParseError", ["Character", "\ufffe"]]},
+
+{"description": "Invalid numeric entity character U+FFFF",
+"input": "￿",
+"output": ["ParseError", ["Character", "\uffff"]]},
+
+{"description": "Invalid numeric entity character U+1FFFE",
+"input": "🿾",
+"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+1FFFF",
+"input": "🿿",
+"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+2FFFE",
+"input": "𯿾",
+"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+2FFFF",
+"input": "𯿿",
+"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+3FFFE",
+"input": "𿿾",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+3FFFF",
+"input": "𿿿",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+4FFFE",
+"input": "񏿾",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+4FFFF",
+"input": "񏿿",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+5FFFE",
+"input": "񟿾",
+"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+5FFFF",
+"input": "񟿿",
+"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+6FFFE",
+"input": "񯿾",
+"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+6FFFF",
+"input": "񯿿",
+"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+7FFFE",
+"input": "񿿾",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+7FFFF",
+"input": "񿿿",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+8FFFE",
+"input": "򏿾",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+8FFFF",
+"input": "򏿿",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+9FFFE",
+"input": "򟿾",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+9FFFF",
+"input": "򟿿",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+AFFFE",
+"input": "򯿾",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+AFFFF",
+"input": "򯿿",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+BFFFE",
+"input": "򿿾",
+"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+BFFFF",
+"input": "򿿿",
+"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+CFFFE",
+"input": "󏿾",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+CFFFF",
+"input": "󏿿",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+DFFFE",
+"input": "󟿾",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+DFFFF",
+"input": "󟿿",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+EFFFE",
+"input": "󯿾",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+EFFFF",
+"input": "󯿿",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+FFFFE",
+"input": "󿿾",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+FFFFF",
+"input": "󿿿",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]},
+
+{"description": "Invalid numeric entity character U+10FFFE",
+"input": "􏿾",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]},
+
+{"description": "Invalid numeric entity character U+10FFFF",
+"input": "􏿿",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description": "Valid numeric entity character U+0009",
+"input": "	",
+"output": [["Character", "\u0009"]]},
+
+{"description": "Valid numeric entity character U+000A",
+"input": "
",
+"output": [["Character", "\u000A"]]},
+
+{"description": "Valid numeric entity character U+0020",
+"input": " ",
+"output": [["Character", "\u0020"]]},
+
+{"description": "Valid numeric entity character U+0021",
+"input": "!",
+"output": [["Character", "\u0021"]]},
+
+{"description": "Valid numeric entity character U+0022",
+"input": """,
+"output": [["Character", "\u0022"]]},
+
+{"description": "Valid numeric entity character U+0023",
+"input": "#",
+"output": [["Character", "\u0023"]]},
+
+{"description": "Valid numeric entity character U+0024",
+"input": "$",
+"output": [["Character", "\u0024"]]},
+
+{"description": "Valid numeric entity character U+0025",
+"input": "%",
+"output": [["Character", "\u0025"]]},
+
+{"description": "Valid numeric entity character U+0026",
+"input": "&",
+"output": [["Character", "\u0026"]]},
+
+{"description": "Valid numeric entity character U+0027",
+"input": "'",
+"output": [["Character", "\u0027"]]},
+
+{"description": "Valid numeric entity character U+0028",
+"input": "(",
+"output": [["Character", "\u0028"]]},
+
+{"description": "Valid numeric entity character U+0029",
+"input": ")",
+"output": [["Character", "\u0029"]]},
+
+{"description": "Valid numeric entity character U+002A",
+"input": "*",
+"output": [["Character", "\u002A"]]},
+
+{"description": "Valid numeric entity character U+002B",
+"input": "+",
+"output": [["Character", "\u002B"]]},
+
+{"description": "Valid numeric entity character U+002C",
+"input": ",",
+"output": [["Character", "\u002C"]]},
+
+{"description": "Valid numeric entity character U+002D",
+"input": "-",
+"output": [["Character", "\u002D"]]},
+
+{"description": "Valid numeric entity character U+002E",
+"input": ".",
+"output": [["Character", "\u002E"]]},
+
+{"description": "Valid numeric entity character U+002F",
+"input": "/",
+"output": [["Character", "\u002F"]]},
+
+{"description": "Valid numeric entity character U+0030",
+"input": "0",
+"output": [["Character", "\u0030"]]},
+
+{"description": "Valid numeric entity character U+0031",
+"input": "1",
+"output": [["Character", "\u0031"]]},
+
+{"description": "Valid numeric entity character U+0032",
+"input": "2",
+"output": [["Character", "\u0032"]]},
+
+{"description": "Valid numeric entity character U+0033",
+"input": "3",
+"output": [["Character", "\u0033"]]},
+
+{"description": "Valid numeric entity character U+0034",
+"input": "4",
+"output": [["Character", "\u0034"]]},
+
+{"description": "Valid numeric entity character U+0035",
+"input": "5",
+"output": [["Character", "\u0035"]]},
+
+{"description": "Valid numeric entity character U+0036",
+"input": "6",
+"output": [["Character", "\u0036"]]},
+
+{"description": "Valid numeric entity character U+0037",
+"input": "7",
+"output": [["Character", "\u0037"]]},
+
+{"description": "Valid numeric entity character U+0038",
+"input": "8",
+"output": [["Character", "\u0038"]]},
+
+{"description": "Valid numeric entity character U+0039",
+"input": "9",
+"output": [["Character", "\u0039"]]},
+
+{"description": "Valid numeric entity character U+003A",
+"input": ":",
+"output": [["Character", "\u003A"]]},
+
+{"description": "Valid numeric entity character U+003B",
+"input": ";",
+"output": [["Character", "\u003B"]]},
+
+{"description": "Valid numeric entity character U+003C",
+"input": "<",
+"output": [["Character", "\u003C"]]},
+
+{"description": "Valid numeric entity character U+003D",
+"input": "=",
+"output": [["Character", "\u003D"]]},
+
+{"description": "Valid numeric entity character U+003E",
+"input": ">",
+"output": [["Character", "\u003E"]]},
+
+{"description": "Valid numeric entity character U+003F",
+"input": "?",
+"output": [["Character", "\u003F"]]},
+
+{"description": "Valid numeric entity character U+0040",
+"input": "@",
+"output": [["Character", "\u0040"]]},
+
+{"description": "Valid numeric entity character U+0041",
+"input": "A",
+"output": [["Character", "\u0041"]]},
+
+{"description": "Valid numeric entity character U+0042",
+"input": "B",
+"output": [["Character", "\u0042"]]},
+
+{"description": "Valid numeric entity character U+0043",
+"input": "C",
+"output": [["Character", "\u0043"]]},
+
+{"description": "Valid numeric entity character U+0044",
+"input": "D",
+"output": [["Character", "\u0044"]]},
+
+{"description": "Valid numeric entity character U+0045",
+"input": "E",
+"output": [["Character", "\u0045"]]},
+
+{"description": "Valid numeric entity character U+0046",
+"input": "F",
+"output": [["Character", "\u0046"]]},
+
+{"description": "Valid numeric entity character U+0047",
+"input": "G",
+"output": [["Character", "\u0047"]]},
+
+{"description": "Valid numeric entity character U+0048",
+"input": "H",
+"output": [["Character", "\u0048"]]},
+
+{"description": "Valid numeric entity character U+0049",
+"input": "I",
+"output": [["Character", "\u0049"]]},
+
+{"description": "Valid numeric entity character U+004A",
+"input": "J",
+"output": [["Character", "\u004A"]]},
+
+{"description": "Valid numeric entity character U+004B",
+"input": "K",
+"output": [["Character", "\u004B"]]},
+
+{"description": "Valid numeric entity character U+004C",
+"input": "L",
+"output": [["Character", "\u004C"]]},
+
+{"description": "Valid numeric entity character U+004D",
+"input": "M",
+"output": [["Character", "\u004D"]]},
+
+{"description": "Valid numeric entity character U+004E",
+"input": "N",
+"output": [["Character", "\u004E"]]},
+
+{"description": "Valid numeric entity character U+004F",
+"input": "O",
+"output": [["Character", "\u004F"]]},
+
+{"description": "Valid numeric entity character U+0050",
+"input": "P",
+"output": [["Character", "\u0050"]]},
+
+{"description": "Valid numeric entity character U+0051",
+"input": "Q",
+"output": [["Character", "\u0051"]]},
+
+{"description": "Valid numeric entity character U+0052",
+"input": "R",
+"output": [["Character", "\u0052"]]},
+
+{"description": "Valid numeric entity character U+0053",
+"input": "S",
+"output": [["Character", "\u0053"]]},
+
+{"description": "Valid numeric entity character U+0054",
+"input": "T",
+"output": [["Character", "\u0054"]]},
+
+{"description": "Valid numeric entity character U+0055",
+"input": "U",
+"output": [["Character", "\u0055"]]},
+
+{"description": "Valid numeric entity character U+0056",
+"input": "V",
+"output": [["Character", "\u0056"]]},
+
+{"description": "Valid numeric entity character U+0057",
+"input": "W",
+"output": [["Character", "\u0057"]]},
+
+{"description": "Valid numeric entity character U+0058",
+"input": "X",
+"output": [["Character", "\u0058"]]},
+
+{"description": "Valid numeric entity character U+0059",
+"input": "Y",
+"output": [["Character", "\u0059"]]},
+
+{"description": "Valid numeric entity character U+005A",
+"input": "Z",
+"output": [["Character", "\u005A"]]},
+
+{"description": "Valid numeric entity character U+005B",
+"input": "[",
+"output": [["Character", "\u005B"]]},
+
+{"description": "Valid numeric entity character U+005C",
+"input": "\",
+"output": [["Character", "\u005C"]]},
+
+{"description": "Valid numeric entity character U+005D",
+"input": "]",
+"output": [["Character", "\u005D"]]},
+
+{"description": "Valid numeric entity character U+005E",
+"input": "^",
+"output": [["Character", "\u005E"]]},
+
+{"description": "Valid numeric entity character U+005F",
+"input": "_",
+"output": [["Character", "\u005F"]]},
+
+{"description": "Valid numeric entity character U+0060",
+"input": "`",
+"output": [["Character", "\u0060"]]},
+
+{"description": "Valid numeric entity character U+0061",
+"input": "a",
+"output": [["Character", "\u0061"]]},
+
+{"description": "Valid numeric entity character U+0062",
+"input": "b",
+"output": [["Character", "\u0062"]]},
+
+{"description": "Valid numeric entity character U+0063",
+"input": "c",
+"output": [["Character", "\u0063"]]},
+
+{"description": "Valid numeric entity character U+0064",
+"input": "d",
+"output": [["Character", "\u0064"]]},
+
+{"description": "Valid numeric entity character U+0065",
+"input": "e",
+"output": [["Character", "\u0065"]]},
+
+{"description": "Valid numeric entity character U+0066",
+"input": "f",
+"output": [["Character", "\u0066"]]},
+
+{"description": "Valid numeric entity character U+0067",
+"input": "g",
+"output": [["Character", "\u0067"]]},
+
+{"description": "Valid numeric entity character U+0068",
+"input": "h",
+"output": [["Character", "\u0068"]]},
+
+{"description": "Valid numeric entity character U+0069",
+"input": "i",
+"output": [["Character", "\u0069"]]},
+
+{"description": "Valid numeric entity character U+006A",
+"input": "j",
+"output": [["Character", "\u006A"]]},
+
+{"description": "Valid numeric entity character U+006B",
+"input": "k",
+"output": [["Character", "\u006B"]]},
+
+{"description": "Valid numeric entity character U+006C",
+"input": "l",
+"output": [["Character", "\u006C"]]},
+
+{"description": "Valid numeric entity character U+006D",
+"input": "m",
+"output": [["Character", "\u006D"]]},
+
+{"description": "Valid numeric entity character U+006E",
+"input": "n",
+"output": [["Character", "\u006E"]]},
+
+{"description": "Valid numeric entity character U+006F",
+"input": "o",
+"output": [["Character", "\u006F"]]},
+
+{"description": "Valid numeric entity character U+0070",
+"input": "p",
+"output": [["Character", "\u0070"]]},
+
+{"description": "Valid numeric entity character U+0071",
+"input": "q",
+"output": [["Character", "\u0071"]]},
+
+{"description": "Valid numeric entity character U+0072",
+"input": "r",
+"output": [["Character", "\u0072"]]},
+
+{"description": "Valid numeric entity character U+0073",
+"input": "s",
+"output": [["Character", "\u0073"]]},
+
+{"description": "Valid numeric entity character U+0074",
+"input": "t",
+"output": [["Character", "\u0074"]]},
+
+{"description": "Valid numeric entity character U+0075",
+"input": "u",
+"output": [["Character", "\u0075"]]},
+
+{"description": "Valid numeric entity character U+0076",
+"input": "v",
+"output": [["Character", "\u0076"]]},
+
+{"description": "Valid numeric entity character U+0077",
+"input": "w",
+"output": [["Character", "\u0077"]]},
+
+{"description": "Valid numeric entity character U+0078",
+"input": "x",
+"output": [["Character", "\u0078"]]},
+
+{"description": "Valid numeric entity character U+0079",
+"input": "y",
+"output": [["Character", "\u0079"]]},
+
+{"description": "Valid numeric entity character U+007A",
+"input": "z",
+"output": [["Character", "\u007A"]]},
+
+{"description": "Valid numeric entity character U+007B",
+"input": "{",
+"output": [["Character", "\u007B"]]},
+
+{"description": "Valid numeric entity character U+007C",
+"input": "|",
+"output": [["Character", "\u007C"]]},
+
+{"description": "Valid numeric entity character U+007D",
+"input": "}",
+"output": [["Character", "\u007D"]]},
+
+{"description": "Valid numeric entity character U+007E",
+"input": "~",
+"output": [["Character", "\u007E"]]},
+
+{"description": "Valid numeric entity character U+00A0",
+"input": " ",
+"output": [["Character", "\u00A0"]]},
+
+{"description": "Valid numeric entity character U+00A1",
+"input": "¡",
+"output": [["Character", "\u00A1"]]},
+
+{"description": "Valid numeric entity character U+00A2",
+"input": "¢",
+"output": [["Character", "\u00A2"]]},
+
+{"description": "Valid numeric entity character U+00A3",
+"input": "£",
+"output": [["Character", "\u00A3"]]},
+
+{"description": "Valid numeric entity character U+00A4",
+"input": "¤",
+"output": [["Character", "\u00A4"]]},
+
+{"description": "Valid numeric entity character U+00A5",
+"input": "¥",
+"output": [["Character", "\u00A5"]]},
+
+{"description": "Valid numeric entity character U+00A6",
+"input": "¦",
+"output": [["Character", "\u00A6"]]},
+
+{"description": "Valid numeric entity character U+00A7",
+"input": "§",
+"output": [["Character", "\u00A7"]]},
+
+{"description": "Valid numeric entity character U+00A8",
+"input": "¨",
+"output": [["Character", "\u00A8"]]},
+
+{"description": "Valid numeric entity character U+00A9",
+"input": "©",
+"output": [["Character", "\u00A9"]]},
+
+{"description": "Valid numeric entity character U+00AA",
+"input": "ª",
+"output": [["Character", "\u00AA"]]},
+
+{"description": "Valid numeric entity character U+00AB",
+"input": "«",
+"output": [["Character", "\u00AB"]]},
+
+{"description": "Valid numeric entity character U+00AC",
+"input": "¬",
+"output": [["Character", "\u00AC"]]},
+
+{"description": "Valid numeric entity character U+00AD",
+"input": "­",
+"output": [["Character", "\u00AD"]]},
+
+{"description": "Valid numeric entity character U+00AE",
+"input": "®",
+"output": [["Character", "\u00AE"]]},
+
+{"description": "Valid numeric entity character U+00AF",
+"input": "¯",
+"output": [["Character", "\u00AF"]]},
+
+{"description": "Valid numeric entity character U+00B0",
+"input": "°",
+"output": [["Character", "\u00B0"]]},
+
+{"description": "Valid numeric entity character U+00B1",
+"input": "±",
+"output": [["Character", "\u00B1"]]},
+
+{"description": "Valid numeric entity character U+00B2",
+"input": "²",
+"output": [["Character", "\u00B2"]]},
+
+{"description": "Valid numeric entity character U+00B3",
+"input": "³",
+"output": [["Character", "\u00B3"]]},
+
+{"description": "Valid numeric entity character U+00B4",
+"input": "´",
+"output": [["Character", "\u00B4"]]},
+
+{"description": "Valid numeric entity character U+00B5",
+"input": "µ",
+"output": [["Character", "\u00B5"]]},
+
+{"description": "Valid numeric entity character U+00B6",
+"input": "¶",
+"output": [["Character", "\u00B6"]]},
+
+{"description": "Valid numeric entity character U+00B7",
+"input": "·",
+"output": [["Character", "\u00B7"]]},
+
+{"description": "Valid numeric entity character U+00B8",
+"input": "¸",
+"output": [["Character", "\u00B8"]]},
+
+{"description": "Valid numeric entity character U+00B9",
+"input": "¹",
+"output": [["Character", "\u00B9"]]},
+
+{"description": "Valid numeric entity character U+00BA",
+"input": "º",
+"output": [["Character", "\u00BA"]]},
+
+{"description": "Valid numeric entity character U+00BB",
+"input": "»",
+"output": [["Character", "\u00BB"]]},
+
+{"description": "Valid numeric entity character U+00BC",
+"input": "¼",
+"output": [["Character", "\u00BC"]]},
+
+{"description": "Valid numeric entity character U+00BD",
+"input": "½",
+"output": [["Character", "\u00BD"]]},
+
+{"description": "Valid numeric entity character U+00BE",
+"input": "¾",
+"output": [["Character", "\u00BE"]]},
+
+{"description": "Valid numeric entity character U+00BF",
+"input": "¿",
+"output": [["Character", "\u00BF"]]},
+
+{"description": "Valid numeric entity character U+00C0",
+"input": "À",
+"output": [["Character", "\u00C0"]]},
+
+{"description": "Valid numeric entity character U+00C1",
+"input": "Á",
+"output": [["Character", "\u00C1"]]},
+
+{"description": "Valid numeric entity character U+00C2",
+"input": "Â",
+"output": [["Character", "\u00C2"]]},
+
+{"description": "Valid numeric entity character U+00C3",
+"input": "Ã",
+"output": [["Character", "\u00C3"]]},
+
+{"description": "Valid numeric entity character U+00C4",
+"input": "Ä",
+"output": [["Character", "\u00C4"]]},
+
+{"description": "Valid numeric entity character U+00C5",
+"input": "Å",
+"output": [["Character", "\u00C5"]]},
+
+{"description": "Valid numeric entity character U+00C6",
+"input": "Æ",
+"output": [["Character", "\u00C6"]]},
+
+{"description": "Valid numeric entity character U+00C7",
+"input": "Ç",
+"output": [["Character", "\u00C7"]]},
+
+{"description": "Valid numeric entity character U+00C8",
+"input": "È",
+"output": [["Character", "\u00C8"]]},
+
+{"description": "Valid numeric entity character U+00C9",
+"input": "É",
+"output": [["Character", "\u00C9"]]},
+
+{"description": "Valid numeric entity character U+00CA",
+"input": "Ê",
+"output": [["Character", "\u00CA"]]},
+
+{"description": "Valid numeric entity character U+00CB",
+"input": "Ë",
+"output": [["Character", "\u00CB"]]},
+
+{"description": "Valid numeric entity character U+00CC",
+"input": "Ì",
+"output": [["Character", "\u00CC"]]},
+
+{"description": "Valid numeric entity character U+00CD",
+"input": "Í",
+"output": [["Character", "\u00CD"]]},
+
+{"description": "Valid numeric entity character U+00CE",
+"input": "Î",
+"output": [["Character", "\u00CE"]]},
+
+{"description": "Valid numeric entity character U+00CF",
+"input": "Ï",
+"output": [["Character", "\u00CF"]]},
+
+{"description": "Valid numeric entity character U+00D0",
+"input": "Ð",
+"output": [["Character", "\u00D0"]]},
+
+{"description": "Valid numeric entity character U+00D1",
+"input": "Ñ",
+"output": [["Character", "\u00D1"]]},
+
+{"description": "Valid numeric entity character U+00D2",
+"input": "Ò",
+"output": [["Character", "\u00D2"]]},
+
+{"description": "Valid numeric entity character U+00D3",
+"input": "Ó",
+"output": [["Character", "\u00D3"]]},
+
+{"description": "Valid numeric entity character U+00D4",
+"input": "Ô",
+"output": [["Character", "\u00D4"]]},
+
+{"description": "Valid numeric entity character U+00D5",
+"input": "Õ",
+"output": [["Character", "\u00D5"]]},
+
+{"description": "Valid numeric entity character U+00D6",
+"input": "Ö",
+"output": [["Character", "\u00D6"]]},
+
+{"description": "Valid numeric entity character U+00D7",
+"input": "×",
+"output": [["Character", "\u00D7"]]},
+
+{"description": "Valid numeric entity character U+00D8",
+"input": "Ø",
+"output": [["Character", "\u00D8"]]},
+
+{"description": "Valid numeric entity character U+00D9",
+"input": "Ù",
+"output": [["Character", "\u00D9"]]},
+
+{"description": "Valid numeric entity character U+00DA",
+"input": "Ú",
+"output": [["Character", "\u00DA"]]},
+
+{"description": "Valid numeric entity character U+00DB",
+"input": "Û",
+"output": [["Character", "\u00DB"]]},
+
+{"description": "Valid numeric entity character U+00DC",
+"input": "Ü",
+"output": [["Character", "\u00DC"]]},
+
+{"description": "Valid numeric entity character U+00DD",
+"input": "Ý",
+"output": [["Character", "\u00DD"]]},
+
+{"description": "Valid numeric entity character U+00DE",
+"input": "Þ",
+"output": [["Character", "\u00DE"]]},
+
+{"description": "Valid numeric entity character U+00DF",
+"input": "ß",
+"output": [["Character", "\u00DF"]]},
+
+{"description": "Valid numeric entity character U+00E0",
+"input": "à",
+"output": [["Character", "\u00E0"]]},
+
+{"description": "Valid numeric entity character U+00E1",
+"input": "á",
+"output": [["Character", "\u00E1"]]},
+
+{"description": "Valid numeric entity character U+00E2",
+"input": "â",
+"output": [["Character", "\u00E2"]]},
+
+{"description": "Valid numeric entity character U+00E3",
+"input": "ã",
+"output": [["Character", "\u00E3"]]},
+
+{"description": "Valid numeric entity character U+00E4",
+"input": "ä",
+"output": [["Character", "\u00E4"]]},
+
+{"description": "Valid numeric entity character U+00E5",
+"input": "å",
+"output": [["Character", "\u00E5"]]},
+
+{"description": "Valid numeric entity character U+00E6",
+"input": "æ",
+"output": [["Character", "\u00E6"]]},
+
+{"description": "Valid numeric entity character U+00E7",
+"input": "ç",
+"output": [["Character", "\u00E7"]]},
+
+{"description": "Valid numeric entity character U+00E8",
+"input": "è",
+"output": [["Character", "\u00E8"]]},
+
+{"description": "Valid numeric entity character U+00E9",
+"input": "é",
+"output": [["Character", "\u00E9"]]},
+
+{"description": "Valid numeric entity character U+00EA",
+"input": "ê",
+"output": [["Character", "\u00EA"]]},
+
+{"description": "Valid numeric entity character U+00EB",
+"input": "ë",
+"output": [["Character", "\u00EB"]]},
+
+{"description": "Valid numeric entity character U+00EC",
+"input": "ì",
+"output": [["Character", "\u00EC"]]},
+
+{"description": "Valid numeric entity character U+00ED",
+"input": "í",
+"output": [["Character", "\u00ED"]]},
+
+{"description": "Valid numeric entity character U+00EE",
+"input": "î",
+"output": [["Character", "\u00EE"]]},
+
+{"description": "Valid numeric entity character U+00EF",
+"input": "ï",
+"output": [["Character", "\u00EF"]]},
+
+{"description": "Valid numeric entity character U+00F0",
+"input": "ð",
+"output": [["Character", "\u00F0"]]},
+
+{"description": "Valid numeric entity character U+00F1",
+"input": "ñ",
+"output": [["Character", "\u00F1"]]},
+
+{"description": "Valid numeric entity character U+00F2",
+"input": "ò",
+"output": [["Character", "\u00F2"]]},
+
+{"description": "Valid numeric entity character U+00F3",
+"input": "ó",
+"output": [["Character", "\u00F3"]]},
+
+{"description": "Valid numeric entity character U+00F4",
+"input": "ô",
+"output": [["Character", "\u00F4"]]},
+
+{"description": "Valid numeric entity character U+00F5",
+"input": "õ",
+"output": [["Character", "\u00F5"]]},
+
+{"description": "Valid numeric entity character U+00F6",
+"input": "ö",
+"output": [["Character", "\u00F6"]]},
+
+{"description": "Valid numeric entity character U+00F7",
+"input": "÷",
+"output": [["Character", "\u00F7"]]},
+
+{"description": "Valid numeric entity character U+00F8",
+"input": "ø",
+"output": [["Character", "\u00F8"]]},
+
+{"description": "Valid numeric entity character U+00F9",
+"input": "ù",
+"output": [["Character", "\u00F9"]]},
+
+{"description": "Valid numeric entity character U+00FA",
+"input": "ú",
+"output": [["Character", "\u00FA"]]},
+
+{"description": "Valid numeric entity character U+00FB",
+"input": "û",
+"output": [["Character", "\u00FB"]]},
+
+{"description": "Valid numeric entity character U+00FC",
+"input": "ü",
+"output": [["Character", "\u00FC"]]},
+
+{"description": "Valid numeric entity character U+00FD",
+"input": "ý",
+"output": [["Character", "\u00FD"]]},
+
+{"description": "Valid numeric entity character U+00FE",
+"input": "þ",
+"output": [["Character", "\u00FE"]]},
+
+{"description": "Valid numeric entity character U+00FF",
+"input": "ÿ",
+"output": [["Character", "\u00FF"]]},
+
+{"description": "Valid numeric entity character U+D7FF",
+"input": "퟿",
+"output": [["Character", "\uD7FF"]]},
+
+{"description": "Valid numeric entity character U+E000",
+"input": "",
+"output": [["Character", "\uE000"]]},
+
+{"description": "Valid numeric entity character U+FDCF",
+"input": "﷏",
+"output": [["Character", "\uFDCF"]]},
+
+{"description": "Valid numeric entity character U+FDF0",
+"input": "ﷰ",
+"output": [["Character", "\uFDF0"]]},
+
+{"description": "Valid numeric entity character U+FFFD",
+"input": "�",
+"output": [["Character", "\uFFFD"]]},
+
+{"description": "Valid numeric entity character U+10000",
+"input": "𐀀",
+"output": [["Character", "\uD800\uDC00"]]},
+
+{"description": "Valid numeric entity character U+1FFFD",
+"input": "🿽",
+"output": [["Character", "\uD83F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+20000",
+"input": "𠀀",
+"output": [["Character", "\uD840\uDC00"]]},
+
+{"description": "Valid numeric entity character U+2FFFD",
+"input": "𯿽",
+"output": [["Character", "\uD87F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+30000",
+"input": "𰀀",
+"output": [["Character", "\uD880\uDC00"]]},
+
+{"description": "Valid numeric entity character U+3FFFD",
+"input": "𿿽",
+"output": [["Character", "\uD8BF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+40000",
+"input": "񀀀",
+"output": [["Character", "\uD8C0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+4FFFD",
+"input": "񏿽",
+"output": [["Character", "\uD8FF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+50000",
+"input": "񐀀",
+"output": [["Character", "\uD900\uDC00"]]},
+
+{"description": "Valid numeric entity character U+5FFFD",
+"input": "񟿽",
+"output": [["Character", "\uD93F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+60000",
+"input": "񠀀",
+"output": [["Character", "\uD940\uDC00"]]},
+
+{"description": "Valid numeric entity character U+6FFFD",
+"input": "񯿽",
+"output": [["Character", "\uD97F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+70000",
+"input": "񰀀",
+"output": [["Character", "\uD980\uDC00"]]},
+
+{"description": "Valid numeric entity character U+7FFFD",
+"input": "񿿽",
+"output": [["Character", "\uD9BF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+80000",
+"input": "򀀀",
+"output": [["Character", "\uD9C0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+8FFFD",
+"input": "򏿽",
+"output": [["Character", "\uD9FF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+90000",
+"input": "򐀀",
+"output": [["Character", "\uDA00\uDC00"]]},
+
+{"description": "Valid numeric entity character U+9FFFD",
+"input": "򟿽",
+"output": [["Character", "\uDA3F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+A0000",
+"input": "򠀀",
+"output": [["Character", "\uDA40\uDC00"]]},
+
+{"description": "Valid numeric entity character U+AFFFD",
+"input": "򯿽",
+"output": [["Character", "\uDA7F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+B0000",
+"input": "򰀀",
+"output": [["Character", "\uDA80\uDC00"]]},
+
+{"description": "Valid numeric entity character U+BFFFD",
+"input": "򿿽",
+"output": [["Character", "\uDABF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+C0000",
+"input": "󀀀",
+"output": [["Character", "\uDAC0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+CFFFD",
+"input": "󏿽",
+"output": [["Character", "\uDAFF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+D0000",
+"input": "󐀀",
+"output": [["Character", "\uDB00\uDC00"]]},
+
+{"description": "Valid numeric entity character U+DFFFD",
+"input": "󟿽",
+"output": [["Character", "\uDB3F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+E0000",
+"input": "󠀀",
+"output": [["Character", "\uDB40\uDC00"]]},
+
+{"description": "Valid numeric entity character U+EFFFD",
+"input": "󯿽",
+"output": [["Character", "\uDB7F\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+F0000",
+"input": "󰀀",
+"output": [["Character", "\uDB80\uDC00"]]},
+
+{"description": "Valid numeric entity character U+FFFFD",
+"input": "󿿽",
+"output": [["Character", "\uDBBF\uDFFD"]]},
+
+{"description": "Valid numeric entity character U+100000",
+"input": "􀀀",
+"output": [["Character", "\uDBC0\uDC00"]]},
+
+{"description": "Valid numeric entity character U+10FFFD",
+"input": "􏿽",
+"output": [["Character", "\uDBFF\uDFFD"]]}
+
+]}
+
+
diff --git a/libs/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test b/libs/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test
new file mode 100644
index 000000000..1b7dc3c72
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/pendingSpecChanges.test
@@ -0,0 +1,7 @@
+{"tests": [
+
+{"description":"",
+ "output":[["Comment", "comment"]]},
+
+{"description":"Comment, Central dash no space",
+ "input":"",
+ "output":["ParseError", ["Comment", "-"]]},
+
+{"description":"Comment, two central dashes",
+"input":"",
+"output":["ParseError", ["Comment", " --comment "]]},
+
+{"description":"Unfinished comment",
+"input":"",
+ "output":["ParseError", ["Comment", ""]]},
+
+{"description":"Short comment two",
+ "input":"",
+ "output":["ParseError", ["Comment", ""]]},
+
+{"description":"Short comment three",
+ "input":"",
+ "output":[["Comment", ""]]},
+
+
+{"description":"Ampersand EOF",
+"input":"&",
+"output":[["Character", "&"]]},
+
+{"description":"Ampersand ampersand EOF",
+"input":"&&",
+"output":[["Character", "&&"]]},
+
+{"description":"Ampersand space EOF",
+"input":"& ",
+"output":[["Character", "& "]]},
+
+{"description":"Unfinished entity",
+"input":"&f",
+"output":[["Character", "&f"]]},
+
+{"description":"Ampersand, number sign",
+"input":"&#",
+"output":["ParseError", ["Character", "&#"]]},
+
+{"description":"Unfinished numeric entity",
+"input":"&#x",
+"output":["ParseError", ["Character", "&#x"]]},
+
+{"description":"Entity with trailing semicolon (1)",
+"input":"I'm ¬it",
+"output":[["Character","I'm \u00ACit"]]},
+
+{"description":"Entity with trailing semicolon (2)",
+"input":"I'm ∉",
+"output":[["Character","I'm \u2209"]]},
+
+{"description":"Entity without trailing semicolon (1)",
+"input":"I'm ¬it",
+"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACit"]]},
+
+{"description":"Entity without trailing semicolon (2)",
+"input":"I'm ¬in",
+"output":[["Character","I'm "], "ParseError", ["Character", "\u00ACin"]]},
+
+{"description":"Partial entity match at end of file",
+"input":"I'm &no",
+"output":[["Character","I'm &no"]]},
+
+{"description":"Non-ASCII character reference name",
+"input":"&\u00AC;",
+"output":[["Character", "&\u00AC;"]]},
+
+{"description":"ASCII decimal entity",
+"input":"$",
+"output":[["Character","$"]]},
+
+{"description":"ASCII hexadecimal entity",
+"input":"?",
+"output":[["Character","?"]]},
+
+{"description":"Hexadecimal entity in attribute",
+"input":"",
+"output":[["StartTag", "h", {"a":"?"}], ["EndTag", "h"]]},
+
+{"description":"Entity in attribute without semicolon ending in x",
+"input":"",
+"output":[["StartTag", "h", {"a":"¬x"}]]},
+
+{"description":"Entity in attribute without semicolon ending in 1",
+"input":"",
+"output":[["StartTag", "h", {"a":"¬1"}]]},
+
+{"description":"Entity in attribute without semicolon ending in i",
+"input":"",
+"output":[["StartTag", "h", {"a":"¬i"}]]},
+
+{"description":"Entity in attribute without semicolon",
+"input":"",
+"output":["ParseError", ["StartTag", "h", {"a":"\u00A9"}]]},
+
+{"description":"Unquoted attribute ending in ampersand",
+"input":"",
+"output":[["StartTag","s",{"o":"&","t":""}]]},
+
+{"description":"Unquoted attribute at end of tag with final character of &, with tag followed by characters",
+"input":"foo",
+"output":[["StartTag", "a", {"a":"a&"}], ["Character", "foo"]]},
+
+{"description":"plaintext element",
+ "input":"foobar",
+ "output":[["StartTag","plaintext",{}], ["Character","foobar"]]},
+
+{"description":"Open angled bracket in unquoted attribute value state",
+ "input":"<a a=f<>",
+ "output":["ParseError", ["StartTag", "a", {"a":"f<"}]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/test2.test b/libs/html5lib/tests/testdata/tokenizer/test2.test
new file mode 100644
index 000000000..87a8eba34
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/test2.test
@@ -0,0 +1,179 @@
+{"tests": [
+
+{"description":"DOCTYPE without name",
+"input":"<!DOCTYPE>",
+"output":["ParseError", "ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"DOCTYPE without space before name",
+"input":"<!DOCTYPEhtml>",
+"output":["ParseError", ["DOCTYPE", "html", null, null, true]]},
+
+{"description":"Incorrect DOCTYPE without a space before name",
+"input":"<!DOCTYPEfoo>",
+"output":["ParseError", ["DOCTYPE", "foo", null, null, true]]},
+
+{"description":"DOCTYPE with publicId",
+"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", null, true]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC",
+"input":"<!DOCTYPE html PUBLIC",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC '",
+"input":"<!DOCTYPE html PUBLIC '",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false]]},
+
+{"description":"DOCTYPE with EOF after PUBLIC 'x",
+"input":"<!DOCTYPE html PUBLIC 'x",
+"output":["ParseError", ["DOCTYPE", "html", "x", null, false]]},
+
+{"description":"DOCTYPE with systemId",
+"input":"<!DOCTYPE html SYSTEM \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", null, "-//W3C//DTD HTML Transitional 4.01//EN", true]]},
+
+{"description":"DOCTYPE with publicId and systemId",
+"input":"<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML Transitional 4.01//EN\" \"-//W3C//DTD HTML Transitional 4.01//EN\">",
+"output":[["DOCTYPE", "html", "-//W3C//DTD HTML Transitional 4.01//EN", "-//W3C//DTD HTML Transitional 4.01//EN", true]]},
+
+{"description":"DOCTYPE with > in double-quoted publicId",
+"input":"<!DOCTYPE html PUBLIC \">x",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in single-quoted publicId",
+"input":"<!DOCTYPE html PUBLIC '>x",
+"output":["ParseError", ["DOCTYPE", "html", "", null, false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in double-quoted systemId",
+"input":"<!DOCTYPE html PUBLIC \"foo\" \">x",
+"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]},
+
+{"description":"DOCTYPE with > in single-quoted systemId",
+"input":"<!DOCTYPE html PUBLIC 'foo' '>x",
+"output":["ParseError", ["DOCTYPE", "html", "foo", "", false], ["Character", "x"]]},
+
+{"description":"Incomplete doctype",
+"input":"<!DOCTYPE html ",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Numeric entity representing the NUL character",
+"input":"&#0000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity representing the NUL character",
+"input":"&#x0000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Numeric entity representing a codepoint after 1114111 (U+10FFFF)",
+"input":"&#2225222;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity representing a codepoint after 1114111 (U+10FFFF)",
+"input":"&#x1010FFFF;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity pair representing a surrogate pair",
+"input":"&#xD869;&#xDED6;",
+"output":["ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Hexadecimal entity with mixed uppercase and lowercase",
+"input":"&#xaBcD;",
+"output":[["Character", "\uABCD"]]},
+
+{"description":"Entity without a name",
+"input":"&;",
+"output":[["Character", "&;"]]},
+
+{"description":"Unescaped ampersand in attribute value",
+"input":"<h a='&'>",
+"output":[["StartTag", "h", { "a":"&" }]]},
+
+{"description":"StartTag containing <",
+"input":"<a<b>",
+"output":[["StartTag", "a<b", { }]]},
+
+{"description":"Non-void element containing trailing /",
+"input":"<h/>",
+"output":[["StartTag","h",{},true]]},
+
+{"description":"Void element with permitted slash",
+"input":"<br/>",
+"output":[["StartTag","br",{},true]]},
+
+{"description":"Void element with permitted slash (with attribute)",
+"input":"<br foo='bar'/>",
+"output":[["StartTag","br",{"foo":"bar"},true]]},
+
+{"description":"StartTag containing /",
+"input":"<h/a='b'>",
+"output":["ParseError", ["StartTag", "h", { "a":"b" }]]},
+
+{"description":"Double-quoted attribute value",
+"input":"<h a=\"b\">",
+"output":[["StartTag", "h", { "a":"b" }]]},
+
+{"description":"Unescaped </",
+"input":"</",
+"output":["ParseError", ["Character", "</"]]},
+
+{"description":"Illegal end tag name",
+"input":"</1>",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"Simili processing instruction",
+"input":"<?namespace>",
+"output":["ParseError", ["Comment", "?namespace"]]},
+
+{"description":"A bogus comment stops at >, even if preceeded by two dashes",
+"input":"<?foo-->",
+"output":["ParseError", ["Comment", "?foo--"]]},
+
+{"description":"Unescaped <",
+"input":"foo < bar",
+"output":[["Character", "foo "], "ParseError", ["Character", "< bar"]]},
+
+{"description":"Null Byte Replacement",
+"input":"\u0000",
+"output":["ParseError", ["Character", "\u0000"]]},
+
+{"description":"Comment with dash",
+"input":"<!---x",
+"output":["ParseError", ["Comment", "-x"]]},
+
+{"description":"Entity + newline",
+"input":"\nx\n&gt;\n",
+"output":[["Character","\nx\n>\n"]]},
+
+{"description":"Start tag with no attributes but space before the greater-than sign",
+"input":"<h >",
+"output":[["StartTag", "h", {}]]},
+
+{"description":"Empty attribute followed by uppercase attribute",
+"input":"<h a B=''>",
+"output":[["StartTag", "h", {"a":"", "b":""}]]},
+
+{"description":"Double-quote after attribute name",
+"input":"<h a \">",
+"output":["ParseError", ["StartTag", "h", {"a":"", "\"":""}]]},
+
+{"description":"Single-quote after attribute name",
+"input":"<h a '>",
+"output":["ParseError", ["StartTag", "h", {"a":"", "'":""}]]},
+
+{"description":"Empty end tag with following characters",
+"input":"a</>bc",
+"output":[["Character", "a"], "ParseError", ["Character", "bc"]]},
+
+{"description":"Empty end tag with following tag",
+"input":"a</><b>c",
+"output":[["Character", "a"], "ParseError", ["StartTag", "b", {}], ["Character", "c"]]},
+
+{"description":"Empty end tag with following comment",
+"input":"a</><!--b-->c",
+"output":[["Character", "a"], "ParseError", ["Comment", "b"], ["Character", "c"]]},
+
+{"description":"Empty end tag with following end tag",
+"input":"a</></b>c",
+"output":[["Character", "a"], "ParseError", ["EndTag", "b"], ["Character", "c"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/test3.test b/libs/html5lib/tests/testdata/tokenizer/test3.test
new file mode 100644
index 000000000..8fc529a2b
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/test3.test
@@ -0,0 +1,6047 @@
+{"tests": [
+
+{"description":"",
+"input":"",
+"output":[]},
+
+{"description":"\\u0009",
+"input":"\u0009",
+"output":[["Character", "\u0009"]]},
+
+{"description":"\\u000A",
+"input":"\u000A",
+"output":[["Character", "\u000A"]]},
+
+{"description":"\\u000B",
+"input":"\u000B",
+"output":["ParseError", ["Character", "\u000B"]]},
+
+{"description":"\\u000C",
+"input":"\u000C",
+"output":[["Character", "\u000C"]]},
+
+{"description":" ",
+"input":" ",
+"output":[["Character", " "]]},
+
+{"description":"!",
+"input":"!",
+"output":[["Character", "!"]]},
+
+{"description":"\"",
+"input":"\"",
+"output":[["Character", "\""]]},
+
+{"description":"%",
+"input":"%",
+"output":[["Character", "%"]]},
+
+{"description":"&",
+"input":"&",
+"output":[["Character", "&"]]},
+
+{"description":"'",
+"input":"'",
+"output":[["Character", "'"]]},
+
+{"description":",",
+"input":",",
+"output":[["Character", ","]]},
+
+{"description":"-",
+"input":"-",
+"output":[["Character", "-"]]},
+
+{"description":".",
+"input":".",
+"output":[["Character", "."]]},
+
+{"description":"/",
+"input":"/",
+"output":[["Character", "/"]]},
+
+{"description":"0",
+"input":"0",
+"output":[["Character", "0"]]},
+
+{"description":"1",
+"input":"1",
+"output":[["Character", "1"]]},
+
+{"description":"9",
+"input":"9",
+"output":[["Character", "9"]]},
+
+{"description":";",
+"input":";",
+"output":[["Character", ";"]]},
+
+{"description":"<",
+"input":"<",
+"output":["ParseError", ["Character", "<"]]},
+
+{"description":"<\\u0000",
+"input":"<\u0000",
+"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "\u0000"]]},
+
+{"description":"<\\u0009",
+"input":"<\u0009",
+"output":["ParseError", ["Character", "<\u0009"]]},
+
+{"description":"<\\u000A",
+"input":"<\u000A",
+"output":["ParseError", ["Character", "<\u000A"]]},
+
+{"description":"<\\u000B",
+"input":"<\u000B",
+"output":["ParseError", "ParseError", ["Character", "<\u000B"]]},
+
+{"description":"<\\u000C",
+"input":"<\u000C",
+"output":["ParseError", ["Character", "<\u000C"]]},
+
+{"description":"< ",
+"input":"< ",
+"output":["ParseError", ["Character", "< "]]},
+
+{"description":"<!",
+"input":"<!",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!\\u0000",
+"input":"<!\u0000",
+"output":["ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"<!\\u0009",
+"input":"<!\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"<!\\u000A",
+"input":"<!\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"<!\\u000B",
+"input":"<!\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"<!\\u000C",
+"input":"<!\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"<! ",
+"input":"<! ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!!",
+"input":"<!!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"<!\"",
+"input":"<!\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"<!&",
+"input":"<!&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"<!'",
+"input":"<!'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"<!-",
+"input":"<!-",
+"output":["ParseError", ["Comment", "-"]]},
+
+{"description":"<!--",
+"input":"<!--",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!--\\u0000",
+"input":"<!--\u0000",
+"output":["ParseError", "ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"<!--\\u0009",
+"input":"<!--\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"<!--\\u000A",
+"input":"<!--\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"<!--\\u000B",
+"input":"<!--\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"<!--\\u000C",
+"input":"<!--\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"<!-- ",
+"input":"<!-- ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- \\u0000",
+"input":"<!-- \u0000",
+"output":["ParseError", "ParseError", ["Comment", " \uFFFD"]]},
+
+{"description":"<!-- \\u0009",
+"input":"<!-- \u0009",
+"output":["ParseError", ["Comment", " \u0009"]]},
+
+{"description":"<!-- \\u000A",
+"input":"<!-- \u000A",
+"output":["ParseError", ["Comment", " \u000A"]]},
+
+{"description":"<!-- \\u000B",
+"input":"<!-- \u000B",
+"output":["ParseError", "ParseError", ["Comment", " \u000B"]]},
+
+{"description":"<!-- \\u000C",
+"input":"<!-- \u000C",
+"output":["ParseError", ["Comment", " \u000C"]]},
+
+{"description":"<!--  ",
+"input":"<!--  ",
+"output":["ParseError", ["Comment", "  "]]},
+
+{"description":"<!-- !",
+"input":"<!-- !",
+"output":["ParseError", ["Comment", " !"]]},
+
+{"description":"<!-- \"",
+"input":"<!-- \"",
+"output":["ParseError", ["Comment", " \""]]},
+
+{"description":"<!-- &",
+"input":"<!-- &",
+"output":["ParseError", ["Comment", " &"]]},
+
+{"description":"<!-- '",
+"input":"<!-- '",
+"output":["ParseError", ["Comment", " '"]]},
+
+{"description":"<!-- ,",
+"input":"<!-- ,",
+"output":["ParseError", ["Comment", " ,"]]},
+
+{"description":"<!-- -",
+"input":"<!-- -",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- -\\u0000",
+"input":"<!-- -\u0000",
+"output":["ParseError", "ParseError", ["Comment", " -\uFFFD"]]},
+
+{"description":"<!-- -\\u0009",
+"input":"<!-- -\u0009",
+"output":["ParseError", ["Comment", " -\u0009"]]},
+
+{"description":"<!-- -\\u000A",
+"input":"<!-- -\u000A",
+"output":["ParseError", ["Comment", " -\u000A"]]},
+
+{"description":"<!-- -\\u000B",
+"input":"<!-- -\u000B",
+"output":["ParseError", "ParseError", ["Comment", " -\u000B"]]},
+
+{"description":"<!-- -\\u000C",
+"input":"<!-- -\u000C",
+"output":["ParseError", ["Comment", " -\u000C"]]},
+
+{"description":"<!-- - ",
+"input":"<!-- - ",
+"output":["ParseError", ["Comment", " - "]]},
+
+{"description":"<!-- -!",
+"input":"<!-- -!",
+"output":["ParseError", ["Comment", " -!"]]},
+
+{"description":"<!-- -\"",
+"input":"<!-- -\"",
+"output":["ParseError", ["Comment", " -\""]]},
+
+{"description":"<!-- -&",
+"input":"<!-- -&",
+"output":["ParseError", ["Comment", " -&"]]},
+
+{"description":"<!-- -'",
+"input":"<!-- -'",
+"output":["ParseError", ["Comment", " -'"]]},
+
+{"description":"<!-- -,",
+"input":"<!-- -,",
+"output":["ParseError", ["Comment", " -,"]]},
+
+{"description":"<!-- --",
+"input":"<!-- --",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"<!-- -.",
+"input":"<!-- -.",
+"output":["ParseError", ["Comment", " -."]]},
+
+{"description":"<!-- -/",
+"input":"<!-- -/",
+"output":["ParseError", ["Comment", " -/"]]},
+
+{"description":"<!-- -0",
+"input":"<!-- -0",
+"output":["ParseError", ["Comment", " -0"]]},
+
+{"description":"<!-- -1",
+"input":"<!-- -1",
+"output":["ParseError", ["Comment", " -1"]]},
+
+{"description":"<!-- -9",
+"input":"<!-- -9",
+"output":["ParseError", ["Comment", " -9"]]},
+
+{"description":"<!-- -<",
+"input":"<!-- -<",
+"output":["ParseError", ["Comment", " -<"]]},
+
+{"description":"<!-- -=",
+"input":"<!-- -=",
+"output":["ParseError", ["Comment", " -="]]},
+
+{"description":"<!-- ->",
+"input":"<!-- ->",
+"output":["ParseError", ["Comment", " ->"]]},
+
+{"description":"<!-- -?",
+"input":"<!-- -?",
+"output":["ParseError", ["Comment", " -?"]]},
+
+{"description":"<!-- -@",
+"input":"<!-- -@",
+"output":["ParseError", ["Comment", " -@"]]},
+
+{"description":"<!-- -A",
+"input":"<!-- -A",
+"output":["ParseError", ["Comment", " -A"]]},
+
+{"description":"<!-- -B",
+"input":"<!-- -B",
+"output":["ParseError", ["Comment", " -B"]]},
+
+{"description":"<!-- -Y",
+"input":"<!-- -Y",
+"output":["ParseError", ["Comment", " -Y"]]},
+
+{"description":"<!-- -Z",
+"input":"<!-- -Z",
+"output":["ParseError", ["Comment", " -Z"]]},
+
+{"description":"<!-- -`",
+"input":"<!-- -`",
+"output":["ParseError", ["Comment", " -`"]]},
+
+{"description":"<!-- -a",
+"input":"<!-- -a",
+"output":["ParseError", ["Comment", " -a"]]},
+
+{"description":"<!-- -b",
+"input":"<!-- -b",
+"output":["ParseError", ["Comment", " -b"]]},
+
+{"description":"<!-- -y",
+"input":"<!-- -y",
+"output":["ParseError", ["Comment", " -y"]]},
+
+{"description":"<!-- -z",
+"input":"<!-- -z",
+"output":["ParseError", ["Comment", " -z"]]},
+
+{"description":"<!-- -{",
+"input":"<!-- -{",
+"output":["ParseError", ["Comment", " -{"]]},
+
+{"description":"<!-- -\\uDBC0\\uDC00",
+"input":"<!-- -\uDBC0\uDC00",
+"output":["ParseError", ["Comment", " -\uDBC0\uDC00"]]},
+
+{"description":"<!-- .",
+"input":"<!-- .",
+"output":["ParseError", ["Comment", " ."]]},
+
+{"description":"<!-- /",
+"input":"<!-- /",
+"output":["ParseError", ["Comment", " /"]]},
+
+{"description":"<!-- 0",
+"input":"<!-- 0",
+"output":["ParseError", ["Comment", " 0"]]},
+
+{"description":"<!-- 1",
+"input":"<!-- 1",
+"output":["ParseError", ["Comment", " 1"]]},
+
+{"description":"<!-- 9",
+"input":"<!-- 9",
+"output":["ParseError", ["Comment", " 9"]]},
+
+{"description":"<!-- <",
+"input":"<!-- <",
+"output":["ParseError", ["Comment", " <"]]},
+
+{"description":"<!-- =",
+"input":"<!-- =",
+"output":["ParseError", ["Comment", " ="]]},
+
+{"description":"<!-- >",
+"input":"<!-- >",
+"output":["ParseError", ["Comment", " >"]]},
+
+{"description":"<!-- ?",
+"input":"<!-- ?",
+"output":["ParseError", ["Comment", " ?"]]},
+
+{"description":"<!-- @",
+"input":"<!-- @",
+"output":["ParseError", ["Comment", " @"]]},
+
+{"description":"<!-- A",
+"input":"<!-- A",
+"output":["ParseError", ["Comment", " A"]]},
+
+{"description":"<!-- B",
+"input":"<!-- B",
+"output":["ParseError", ["Comment", " B"]]},
+
+{"description":"<!-- Y",
+"input":"<!-- Y",
+"output":["ParseError", ["Comment", " Y"]]},
+
+{"description":"<!-- Z",
+"input":"<!-- Z",
+"output":["ParseError", ["Comment", " Z"]]},
+
+{"description":"<!-- `",
+"input":"<!-- `",
+"output":["ParseError", ["Comment", " `"]]},
+
+{"description":"<!-- a",
+"input":"<!-- a",
+"output":["ParseError", ["Comment", " a"]]},
+
+{"description":"<!-- b",
+"input":"<!-- b",
+"output":["ParseError", ["Comment", " b"]]},
+
+{"description":"<!-- y",
+"input":"<!-- y",
+"output":["ParseError", ["Comment", " y"]]},
+
+{"description":"<!-- z",
+"input":"<!-- z",
+"output":["ParseError", ["Comment", " z"]]},
+
+{"description":"<!-- {",
+"input":"<!-- {",
+"output":["ParseError", ["Comment", " {"]]},
+
+{"description":"<!-- \\uDBC0\\uDC00",
+"input":"<!-- \uDBC0\uDC00",
+"output":["ParseError", ["Comment", " \uDBC0\uDC00"]]},
+
+{"description":"<!--!",
+"input":"<!--!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"<!--\"",
+"input":"<!--\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"<!--&",
+"input":"<!--&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"<!--'",
+"input":"<!--'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"<!--,",
+"input":"<!--,",
+"output":["ParseError", ["Comment", ","]]},
+
+{"description":"<!---",
+"input":"<!---",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!---\\u0000",
+"input":"<!---\u0000",
+"output":["ParseError", "ParseError", ["Comment", "-\uFFFD"]]},
+
+{"description":"<!---\\u0009",
+"input":"<!---\u0009",
+"output":["ParseError", ["Comment", "-\u0009"]]},
+
+{"description":"<!---\\u000A",
+"input":"<!---\u000A",
+"output":["ParseError", ["Comment", "-\u000A"]]},
+
+{"description":"<!---\\u000B",
+"input":"<!---\u000B",
+"output":["ParseError", "ParseError", ["Comment", "-\u000B"]]},
+
+{"description":"<!---\\u000C",
+"input":"<!---\u000C",
+"output":["ParseError", ["Comment", "-\u000C"]]},
+
+{"description":"<!--- ",
+"input":"<!--- ",
+"output":["ParseError", ["Comment", "- "]]},
+
+{"description":"<!---!",
+"input":"<!---!",
+"output":["ParseError", ["Comment", "-!"]]},
+
+{"description":"<!---\"",
+"input":"<!---\"",
+"output":["ParseError", ["Comment", "-\""]]},
+
+{"description":"<!---&",
+"input":"<!---&",
+"output":["ParseError", ["Comment", "-&"]]},
+
+{"description":"<!---'",
+"input":"<!---'",
+"output":["ParseError", ["Comment", "-'"]]},
+
+{"description":"<!---,",
+"input":"<!---,",
+"output":["ParseError", ["Comment", "-,"]]},
+
+{"description":"<!----",
+"input":"<!----",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!----\\u0000",
+"input":"<!----\u0000",
+"output":["ParseError", "ParseError", ["Comment", "--\uFFFD"]]},
+
+{"description":"<!----\\u0009",
+"input":"<!----\u0009",
+"output":["ParseError", "ParseError", ["Comment", "--\u0009"]]},
+
+{"description":"<!----\\u000A",
+"input":"<!----\u000A",
+"output":["ParseError", "ParseError", ["Comment", "--\u000A"]]},
+
+{"description":"<!----\\u000B",
+"input":"<!----\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["Comment", "--\u000B"]]},
+
+{"description":"<!----\\u000C",
+"input":"<!----\u000C",
+"output":["ParseError", "ParseError", ["Comment", "--\u000C"]]},
+
+{"description":"<!---- ",
+"input":"<!---- ",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- -",
+"input":"<!---- -",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- --",
+"input":"<!---- --",
+"output":["ParseError", "ParseError", ["Comment", "-- "]]},
+
+{"description":"<!---- -->",
+"input":"<!---- -->",
+"output":["ParseError", ["Comment", "-- "]]},
+
+{"description":"<!----  -->",
+"input":"<!----  -->",
+"output":["ParseError", ["Comment", "--  "]]},
+
+{"description":"<!---- a-->",
+"input":"<!---- a-->",
+"output":["ParseError", ["Comment", "-- a"]]},
+
+{"description":"<!----!",
+"input":"<!----!",
+"output":["ParseError", "ParseError", ["Comment", ""]]},
+
+{"description":"<!----!>",
+"input":"<!----!>",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!----!a",
+"input":"<!----!a",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a-",
+"input":"<!----!a-",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a--",
+"input":"<!----!a--",
+"output":["ParseError", "ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!a-->",
+"input":"<!----!a-->",
+"output":["ParseError", ["Comment", "--!a"]]},
+
+{"description":"<!----!-",
+"input":"<!----!-",
+"output":["ParseError", "ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----!--",
+"input":"<!----!--",
+"output":["ParseError", "ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----!-->",
+"input":"<!----!-->",
+"output":["ParseError", ["Comment", "--!"]]},
+
+{"description":"<!----\"",
+"input":"<!----\"",
+"output":["ParseError", "ParseError", ["Comment", "--\""]]},
+
+{"description":"<!----&",
+"input":"<!----&",
+"output":["ParseError", "ParseError", ["Comment", "--&"]]},
+
+{"description":"<!----'",
+"input":"<!----'",
+"output":["ParseError", "ParseError", ["Comment", "--'"]]},
+
+{"description":"<!----,",
+"input":"<!----,",
+"output":["ParseError", "ParseError", ["Comment", "--,"]]},
+
+{"description":"<!-----",
+"input":"<!-----",
+"output":["ParseError", "ParseError", ["Comment", "-"]]},
+
+{"description":"<!----.",
+"input":"<!----.",
+"output":["ParseError", "ParseError", ["Comment", "--."]]},
+
+{"description":"<!----/",
+"input":"<!----/",
+"output":["ParseError", "ParseError", ["Comment", "--/"]]},
+
+{"description":"<!----0",
+"input":"<!----0",
+"output":["ParseError", "ParseError", ["Comment", "--0"]]},
+
+{"description":"<!----1",
+"input":"<!----1",
+"output":["ParseError", "ParseError", ["Comment", "--1"]]},
+
+{"description":"<!----9",
+"input":"<!----9",
+"output":["ParseError", "ParseError", ["Comment", "--9"]]},
+
+{"description":"<!----<",
+"input":"<!----<",
+"output":["ParseError", "ParseError", ["Comment", "--<"]]},
+
+{"description":"<!----=",
+"input":"<!----=",
+"output":["ParseError", "ParseError", ["Comment", "--="]]},
+
+{"description":"<!---->",
+"input":"<!---->",
+"output":[["Comment", ""]]},
+
+{"description":"<!----?",
+"input":"<!----?",
+"output":["ParseError", "ParseError", ["Comment", "--?"]]},
+
+{"description":"<!----@",
+"input":"<!----@",
+"output":["ParseError", "ParseError", ["Comment", "--@"]]},
+
+{"description":"<!----A",
+"input":"<!----A",
+"output":["ParseError", "ParseError", ["Comment", "--A"]]},
+
+{"description":"<!----B",
+"input":"<!----B",
+"output":["ParseError", "ParseError", ["Comment", "--B"]]},
+
+{"description":"<!----Y",
+"input":"<!----Y",
+"output":["ParseError", "ParseError", ["Comment", "--Y"]]},
+
+{"description":"<!----Z",
+"input":"<!----Z",
+"output":["ParseError", "ParseError", ["Comment", "--Z"]]},
+
+{"description":"<!----`",
+"input":"<!----`",
+"output":["ParseError", "ParseError", ["Comment", "--`"]]},
+
+{"description":"<!----a",
+"input":"<!----a",
+"output":["ParseError", "ParseError", ["Comment", "--a"]]},
+
+{"description":"<!----b",
+"input":"<!----b",
+"output":["ParseError", "ParseError", ["Comment", "--b"]]},
+
+{"description":"<!----y",
+"input":"<!----y",
+"output":["ParseError", "ParseError", ["Comment", "--y"]]},
+
+{"description":"<!----z",
+"input":"<!----z",
+"output":["ParseError", "ParseError", ["Comment", "--z"]]},
+
+{"description":"<!----{",
+"input":"<!----{",
+"output":["ParseError", "ParseError", ["Comment", "--{"]]},
+
+{"description":"<!----\\uDBC0\\uDC00",
+"input":"<!----\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["Comment", "--\uDBC0\uDC00"]]},
+
+{"description":"<!---.",
+"input":"<!---.",
+"output":["ParseError", ["Comment", "-."]]},
+
+{"description":"<!---/",
+"input":"<!---/",
+"output":["ParseError", ["Comment", "-/"]]},
+
+{"description":"<!---0",
+"input":"<!---0",
+"output":["ParseError", ["Comment", "-0"]]},
+
+{"description":"<!---1",
+"input":"<!---1",
+"output":["ParseError", ["Comment", "-1"]]},
+
+{"description":"<!---9",
+"input":"<!---9",
+"output":["ParseError", ["Comment", "-9"]]},
+
+{"description":"<!---<",
+"input":"<!---<",
+"output":["ParseError", ["Comment", "-<"]]},
+
+{"description":"<!---=",
+"input":"<!---=",
+"output":["ParseError", ["Comment", "-="]]},
+
+{"description":"<!--->",
+"input":"<!--->",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!---?",
+"input":"<!---?",
+"output":["ParseError", ["Comment", "-?"]]},
+
+{"description":"<!---@",
+"input":"<!---@",
+"output":["ParseError", ["Comment", "-@"]]},
+
+{"description":"<!---A",
+"input":"<!---A",
+"output":["ParseError", ["Comment", "-A"]]},
+
+{"description":"<!---B",
+"input":"<!---B",
+"output":["ParseError", ["Comment", "-B"]]},
+
+{"description":"<!---Y",
+"input":"<!---Y",
+"output":["ParseError", ["Comment", "-Y"]]},
+
+{"description":"<!---Z",
+"input":"<!---Z",
+"output":["ParseError", ["Comment", "-Z"]]},
+
+{"description":"<!---`",
+"input":"<!---`",
+"output":["ParseError", ["Comment", "-`"]]},
+
+{"description":"<!---a",
+"input":"<!---a",
+"output":["ParseError", ["Comment", "-a"]]},
+
+{"description":"<!---b",
+"input":"<!---b",
+"output":["ParseError", ["Comment", "-b"]]},
+
+{"description":"<!---y",
+"input":"<!---y",
+"output":["ParseError", ["Comment", "-y"]]},
+
+{"description":"<!---z",
+"input":"<!---z",
+"output":["ParseError", ["Comment", "-z"]]},
+
+{"description":"<!---{",
+"input":"<!---{",
+"output":["ParseError", ["Comment", "-{"]]},
+
+{"description":"<!---\\uDBC0\\uDC00",
+"input":"<!---\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "-\uDBC0\uDC00"]]},
+
+{"description":"<!--.",
+"input":"<!--.",
+"output":["ParseError", ["Comment", "."]]},
+
+{"description":"<!--/",
+"input":"<!--/",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"<!--0",
+"input":"<!--0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"<!--1",
+"input":"<!--1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"<!--9",
+"input":"<!--9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"<!--<",
+"input":"<!--<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"<!--=",
+"input":"<!--=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"<!-->",
+"input":"<!-->",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!--?",
+"input":"<!--?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<!--@",
+"input":"<!--@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"<!--A",
+"input":"<!--A",
+"output":["ParseError", ["Comment", "A"]]},
+
+{"description":"<!--B",
+"input":"<!--B",
+"output":["ParseError", ["Comment", "B"]]},
+
+{"description":"<!--Y",
+"input":"<!--Y",
+"output":["ParseError", ["Comment", "Y"]]},
+
+{"description":"<!--Z",
+"input":"<!--Z",
+"output":["ParseError", ["Comment", "Z"]]},
+
+{"description":"<!--`",
+"input":"<!--`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"<!--a",
+"input":"<!--a",
+"output":["ParseError", ["Comment", "a"]]},
+
+{"description":"<!--b",
+"input":"<!--b",
+"output":["ParseError", ["Comment", "b"]]},
+
+{"description":"<!--y",
+"input":"<!--y",
+"output":["ParseError", ["Comment", "y"]]},
+
+{"description":"<!--z",
+"input":"<!--z",
+"output":["ParseError", ["Comment", "z"]]},
+
+{"description":"<!--{",
+"input":"<!--{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"<!--\\uDBC0\\uDC00",
+"input":"<!--\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<!/",
+"input":"<!/",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"<!0",
+"input":"<!0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"<!1",
+"input":"<!1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"<!9",
+"input":"<!9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"<!<",
+"input":"<!<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"<!=",
+"input":"<!=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"<!>",
+"input":"<!>",
+"output":["ParseError", ["Comment", ""]]},
+
+{"description":"<!?",
+"input":"<!?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<!@",
+"input":"<!@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"<!A",
+"input":"<!A",
+"output":["ParseError", ["Comment", "A"]]},
+
+{"description":"<!B",
+"input":"<!B",
+"output":["ParseError", ["Comment", "B"]]},
+
+{"description":"<!DOCTYPE",
+"input":"<!DOCTYPE",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0000",
+"input":"<!DOCTYPE\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0008",
+"input":"<!DOCTYPE\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u0009",
+"input":"<!DOCTYPE\u0009",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000A",
+"input":"<!DOCTYPE\u000A",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000B",
+"input":"<!DOCTYPE\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000C",
+"input":"<!DOCTYPE\u000C",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE\\u000D",
+"input":"<!DOCTYPE\u000D",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE\\u001F",
+"input":"<!DOCTYPE\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE ",
+"input":"<!DOCTYPE ",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0000",
+"input":"<!DOCTYPE \u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0008",
+"input":"<!DOCTYPE \u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u0009",
+"input":"<!DOCTYPE \u0009",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000A",
+"input":"<!DOCTYPE \u000A",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000B",
+"input":"<!DOCTYPE \u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000C",
+"input":"<!DOCTYPE \u000C",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE \\u000D",
+"input":"<!DOCTYPE \u000D",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE \\u001F",
+"input":"<!DOCTYPE \u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE  ",
+"input":"<!DOCTYPE  ",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE !",
+"input":"<!DOCTYPE !",
+"output":["ParseError", ["DOCTYPE", "!", null, null, false]]},
+
+{"description":"<!DOCTYPE \"",
+"input":"<!DOCTYPE \"",
+"output":["ParseError", ["DOCTYPE", "\"", null, null, false]]},
+
+{"description":"<!DOCTYPE &",
+"input":"<!DOCTYPE &",
+"output":["ParseError", ["DOCTYPE", "&", null, null, false]]},
+
+{"description":"<!DOCTYPE '",
+"input":"<!DOCTYPE '",
+"output":["ParseError", ["DOCTYPE", "'", null, null, false]]},
+
+{"description":"<!DOCTYPE -",
+"input":"<!DOCTYPE -",
+"output":["ParseError", ["DOCTYPE", "-", null, null, false]]},
+
+{"description":"<!DOCTYPE /",
+"input":"<!DOCTYPE /",
+"output":["ParseError", ["DOCTYPE", "/", null, null, false]]},
+
+{"description":"<!DOCTYPE 0",
+"input":"<!DOCTYPE 0",
+"output":["ParseError", ["DOCTYPE", "0", null, null, false]]},
+
+{"description":"<!DOCTYPE 1",
+"input":"<!DOCTYPE 1",
+"output":["ParseError", ["DOCTYPE", "1", null, null, false]]},
+
+{"description":"<!DOCTYPE 9",
+"input":"<!DOCTYPE 9",
+"output":["ParseError", ["DOCTYPE", "9", null, null, false]]},
+
+{"description":"<!DOCTYPE <",
+"input":"<!DOCTYPE <",
+"output":["ParseError", ["DOCTYPE", "<", null, null, false]]},
+
+{"description":"<!DOCTYPE =",
+"input":"<!DOCTYPE =",
+"output":["ParseError", ["DOCTYPE", "=", null, null, false]]},
+
+{"description":"<!DOCTYPE >",
+"input":"<!DOCTYPE >",
+"output":["ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE ?",
+"input":"<!DOCTYPE ?",
+"output":["ParseError", ["DOCTYPE", "?", null, null, false]]},
+
+{"description":"<!DOCTYPE @",
+"input":"<!DOCTYPE @",
+"output":["ParseError", ["DOCTYPE", "@", null, null, false]]},
+
+{"description":"<!DOCTYPE A",
+"input":"<!DOCTYPE A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE B",
+"input":"<!DOCTYPE B",
+"output":["ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPE Y",
+"input":"<!DOCTYPE Y",
+"output":["ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPE Z",
+"input":"<!DOCTYPE Z",
+"output":["ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE [",
+"input":"<!DOCTYPE [",
+"output":["ParseError", ["DOCTYPE", "[", null, null, false]]},
+
+{"description":"<!DOCTYPE `",
+"input":"<!DOCTYPE `",
+"output":["ParseError", ["DOCTYPE", "`", null, null, false]]},
+
+{"description":"<!DOCTYPE a",
+"input":"<!DOCTYPE a",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0000",
+"input":"<!DOCTYPE a\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0008",
+"input":"<!DOCTYPE a\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u0009",
+"input":"<!DOCTYPE a\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000A",
+"input":"<!DOCTYPE a\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000B",
+"input":"<!DOCTYPE a\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000C",
+"input":"<!DOCTYPE a\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u000D",
+"input":"<!DOCTYPE a\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\u001F",
+"input":"<!DOCTYPE a\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPE a ",
+"input":"<!DOCTYPE a ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0000",
+"input":"<!DOCTYPE a \u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0008",
+"input":"<!DOCTYPE a \u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u0009",
+"input":"<!DOCTYPE a \u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000A",
+"input":"<!DOCTYPE a \u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000B",
+"input":"<!DOCTYPE a \u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000C",
+"input":"<!DOCTYPE a \u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u000D",
+"input":"<!DOCTYPE a \u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\u001F",
+"input":"<!DOCTYPE a \u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a  ",
+"input":"<!DOCTYPE a  ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a !",
+"input":"<!DOCTYPE a !",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \"",
+"input":"<!DOCTYPE a \"",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a &",
+"input":"<!DOCTYPE a &",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a '",
+"input":"<!DOCTYPE a '",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a -",
+"input":"<!DOCTYPE a -",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a /",
+"input":"<!DOCTYPE a /",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 0",
+"input":"<!DOCTYPE a 0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 1",
+"input":"<!DOCTYPE a 1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a 9",
+"input":"<!DOCTYPE a 9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a <",
+"input":"<!DOCTYPE a <",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a =",
+"input":"<!DOCTYPE a =",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a >",
+"input":"<!DOCTYPE a >",
+"output":[["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPE a ?",
+"input":"<!DOCTYPE a ?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a @",
+"input":"<!DOCTYPE a @",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a A",
+"input":"<!DOCTYPE a A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a B",
+"input":"<!DOCTYPE a B",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC",
+"input":"<!DOCTYPE a PUBLIC",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0000",
+"input":"<!DOCTYPE a PUBLIC\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0008",
+"input":"<!DOCTYPE a PUBLIC\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u0009",
+"input":"<!DOCTYPE a PUBLIC\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000A",
+"input":"<!DOCTYPE a PUBLIC\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000B",
+"input":"<!DOCTYPE a PUBLIC\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000C",
+"input":"<!DOCTYPE a PUBLIC\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u000D",
+"input":"<!DOCTYPE a PUBLIC\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\u001F",
+"input":"<!DOCTYPE a PUBLIC\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC ",
+"input":"<!DOCTYPE a PUBLIC ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC!",
+"input":"<!DOCTYPE a PUBLIC!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"",
+"input":"<!DOCTYPE a PUBLIC\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u0000",
+"input":"<!DOCTYPE a PUBLIC\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u0009",
+"input":"<!DOCTYPE a PUBLIC\"\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000A",
+"input":"<!DOCTYPE a PUBLIC\"\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000B",
+"input":"<!DOCTYPE a PUBLIC\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\u000C",
+"input":"<!DOCTYPE a PUBLIC\"\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\" ",
+"input":"<!DOCTYPE a PUBLIC\" ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"!",
+"input":"<!DOCTYPE a PUBLIC\"!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\"",
+"input":"<!DOCTYPE a PUBLIC\"\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"#",
+"input":"<!DOCTYPE a PUBLIC\"#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"&",
+"input":"<!DOCTYPE a PUBLIC\"&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"'",
+"input":"<!DOCTYPE a PUBLIC\"'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"-",
+"input":"<!DOCTYPE a PUBLIC\"-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"/",
+"input":"<!DOCTYPE a PUBLIC\"/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"0",
+"input":"<!DOCTYPE a PUBLIC\"0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"1",
+"input":"<!DOCTYPE a PUBLIC\"1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"9",
+"input":"<!DOCTYPE a PUBLIC\"9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"<",
+"input":"<!DOCTYPE a PUBLIC\"<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"=",
+"input":"<!DOCTYPE a PUBLIC\"=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\">",
+"input":"<!DOCTYPE a PUBLIC\">",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"?",
+"input":"<!DOCTYPE a PUBLIC\"?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"@",
+"input":"<!DOCTYPE a PUBLIC\"@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"A",
+"input":"<!DOCTYPE a PUBLIC\"A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"B",
+"input":"<!DOCTYPE a PUBLIC\"B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"Y",
+"input":"<!DOCTYPE a PUBLIC\"Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"Z",
+"input":"<!DOCTYPE a PUBLIC\"Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"`",
+"input":"<!DOCTYPE a PUBLIC\"`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"a",
+"input":"<!DOCTYPE a PUBLIC\"a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"b",
+"input":"<!DOCTYPE a PUBLIC\"b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"y",
+"input":"<!DOCTYPE a PUBLIC\"y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"z",
+"input":"<!DOCTYPE a PUBLIC\"z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"{",
+"input":"<!DOCTYPE a PUBLIC\"{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC#",
+"input":"<!DOCTYPE a PUBLIC#",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC&",
+"input":"<!DOCTYPE a PUBLIC&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'",
+"input":"<!DOCTYPE a PUBLIC'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u0000",
+"input":"<!DOCTYPE a PUBLIC'\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u0009",
+"input":"<!DOCTYPE a PUBLIC'\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000A",
+"input":"<!DOCTYPE a PUBLIC'\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000B",
+"input":"<!DOCTYPE a PUBLIC'\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\u000C",
+"input":"<!DOCTYPE a PUBLIC'\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC' ",
+"input":"<!DOCTYPE a PUBLIC' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'!",
+"input":"<!DOCTYPE a PUBLIC'!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\"",
+"input":"<!DOCTYPE a PUBLIC'\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'&",
+"input":"<!DOCTYPE a PUBLIC'&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''",
+"input":"<!DOCTYPE a PUBLIC''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0000",
+"input":"<!DOCTYPE a PUBLIC''\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0008",
+"input":"<!DOCTYPE a PUBLIC''\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u0009",
+"input":"<!DOCTYPE a PUBLIC''\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000A",
+"input":"<!DOCTYPE a PUBLIC''\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000B",
+"input":"<!DOCTYPE a PUBLIC''\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000C",
+"input":"<!DOCTYPE a PUBLIC''\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u000D",
+"input":"<!DOCTYPE a PUBLIC''\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\u001F",
+"input":"<!DOCTYPE a PUBLIC''\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'' ",
+"input":"<!DOCTYPE a PUBLIC'' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''!",
+"input":"<!DOCTYPE a PUBLIC''!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\"",
+"input":"<!DOCTYPE a PUBLIC''\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''#",
+"input":"<!DOCTYPE a PUBLIC''#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''&",
+"input":"<!DOCTYPE a PUBLIC''&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'''",
+"input":"<!DOCTYPE a PUBLIC'''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''(",
+"input":"<!DOCTYPE a PUBLIC''(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''-",
+"input":"<!DOCTYPE a PUBLIC''-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''/",
+"input":"<!DOCTYPE a PUBLIC''/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''0",
+"input":"<!DOCTYPE a PUBLIC''0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''1",
+"input":"<!DOCTYPE a PUBLIC''1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''9",
+"input":"<!DOCTYPE a PUBLIC''9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''<",
+"input":"<!DOCTYPE a PUBLIC''<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''=",
+"input":"<!DOCTYPE a PUBLIC''=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''>",
+"input":"<!DOCTYPE a PUBLIC''>",
+"output":["ParseError", ["DOCTYPE", "a", "", null, true]]},
+
+{"description":"<!DOCTYPE a PUBLIC''?",
+"input":"<!DOCTYPE a PUBLIC''?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''@",
+"input":"<!DOCTYPE a PUBLIC''@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''A",
+"input":"<!DOCTYPE a PUBLIC''A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''B",
+"input":"<!DOCTYPE a PUBLIC''B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''Y",
+"input":"<!DOCTYPE a PUBLIC''Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''Z",
+"input":"<!DOCTYPE a PUBLIC''Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''`",
+"input":"<!DOCTYPE a PUBLIC''`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''a",
+"input":"<!DOCTYPE a PUBLIC''a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''b",
+"input":"<!DOCTYPE a PUBLIC''b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''y",
+"input":"<!DOCTYPE a PUBLIC''y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''z",
+"input":"<!DOCTYPE a PUBLIC''z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''{",
+"input":"<!DOCTYPE a PUBLIC''{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC''\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'(",
+"input":"<!DOCTYPE a PUBLIC'(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'-",
+"input":"<!DOCTYPE a PUBLIC'-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'/",
+"input":"<!DOCTYPE a PUBLIC'/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'0",
+"input":"<!DOCTYPE a PUBLIC'0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'1",
+"input":"<!DOCTYPE a PUBLIC'1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'9",
+"input":"<!DOCTYPE a PUBLIC'9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'<",
+"input":"<!DOCTYPE a PUBLIC'<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'=",
+"input":"<!DOCTYPE a PUBLIC'=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'>",
+"input":"<!DOCTYPE a PUBLIC'>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'?",
+"input":"<!DOCTYPE a PUBLIC'?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'@",
+"input":"<!DOCTYPE a PUBLIC'@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'A",
+"input":"<!DOCTYPE a PUBLIC'A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'B",
+"input":"<!DOCTYPE a PUBLIC'B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'Y",
+"input":"<!DOCTYPE a PUBLIC'Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'Z",
+"input":"<!DOCTYPE a PUBLIC'Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'`",
+"input":"<!DOCTYPE a PUBLIC'`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'a",
+"input":"<!DOCTYPE a PUBLIC'a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'b",
+"input":"<!DOCTYPE a PUBLIC'b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'y",
+"input":"<!DOCTYPE a PUBLIC'y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'z",
+"input":"<!DOCTYPE a PUBLIC'z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'{",
+"input":"<!DOCTYPE a PUBLIC'{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC'\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC(",
+"input":"<!DOCTYPE a PUBLIC(",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC-",
+"input":"<!DOCTYPE a PUBLIC-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC/",
+"input":"<!DOCTYPE a PUBLIC/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC0",
+"input":"<!DOCTYPE a PUBLIC0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC1",
+"input":"<!DOCTYPE a PUBLIC1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC9",
+"input":"<!DOCTYPE a PUBLIC9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC<",
+"input":"<!DOCTYPE a PUBLIC<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC=",
+"input":"<!DOCTYPE a PUBLIC=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC>",
+"input":"<!DOCTYPE a PUBLIC>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC?",
+"input":"<!DOCTYPE a PUBLIC?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC@",
+"input":"<!DOCTYPE a PUBLIC@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICA",
+"input":"<!DOCTYPE a PUBLICA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICB",
+"input":"<!DOCTYPE a PUBLICB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICY",
+"input":"<!DOCTYPE a PUBLICY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICZ",
+"input":"<!DOCTYPE a PUBLICZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC`",
+"input":"<!DOCTYPE a PUBLIC`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICa",
+"input":"<!DOCTYPE a PUBLICa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICb",
+"input":"<!DOCTYPE a PUBLICb",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICy",
+"input":"<!DOCTYPE a PUBLICy",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLICz",
+"input":"<!DOCTYPE a PUBLICz",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC{",
+"input":"<!DOCTYPE a PUBLIC{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a PUBLIC\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a PUBLIC\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM",
+"input":"<!DOCTYPE a SYSTEM",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0000",
+"input":"<!DOCTYPE a SYSTEM\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0008",
+"input":"<!DOCTYPE a SYSTEM\u0008",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u0009",
+"input":"<!DOCTYPE a SYSTEM\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000A",
+"input":"<!DOCTYPE a SYSTEM\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000B",
+"input":"<!DOCTYPE a SYSTEM\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000C",
+"input":"<!DOCTYPE a SYSTEM\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u000D",
+"input":"<!DOCTYPE a SYSTEM\u000D",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\u001F",
+"input":"<!DOCTYPE a SYSTEM\u001F",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM ",
+"input":"<!DOCTYPE a SYSTEM ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM!",
+"input":"<!DOCTYPE a SYSTEM!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"",
+"input":"<!DOCTYPE a SYSTEM\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u0000",
+"input":"<!DOCTYPE a SYSTEM\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u0009",
+"input":"<!DOCTYPE a SYSTEM\"\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000A",
+"input":"<!DOCTYPE a SYSTEM\"\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000B",
+"input":"<!DOCTYPE a SYSTEM\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\u000C",
+"input":"<!DOCTYPE a SYSTEM\"\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\" ",
+"input":"<!DOCTYPE a SYSTEM\" ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"!",
+"input":"<!DOCTYPE a SYSTEM\"!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\"",
+"input":"<!DOCTYPE a SYSTEM\"\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"#",
+"input":"<!DOCTYPE a SYSTEM\"#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"&",
+"input":"<!DOCTYPE a SYSTEM\"&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"'",
+"input":"<!DOCTYPE a SYSTEM\"'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"-",
+"input":"<!DOCTYPE a SYSTEM\"-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"/",
+"input":"<!DOCTYPE a SYSTEM\"/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"0",
+"input":"<!DOCTYPE a SYSTEM\"0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"1",
+"input":"<!DOCTYPE a SYSTEM\"1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"9",
+"input":"<!DOCTYPE a SYSTEM\"9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"<",
+"input":"<!DOCTYPE a SYSTEM\"<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"=",
+"input":"<!DOCTYPE a SYSTEM\"=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\">",
+"input":"<!DOCTYPE a SYSTEM\">",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"?",
+"input":"<!DOCTYPE a SYSTEM\"?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"@",
+"input":"<!DOCTYPE a SYSTEM\"@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"A",
+"input":"<!DOCTYPE a SYSTEM\"A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"B",
+"input":"<!DOCTYPE a SYSTEM\"B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"Y",
+"input":"<!DOCTYPE a SYSTEM\"Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"Z",
+"input":"<!DOCTYPE a SYSTEM\"Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"`",
+"input":"<!DOCTYPE a SYSTEM\"`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"a",
+"input":"<!DOCTYPE a SYSTEM\"a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"b",
+"input":"<!DOCTYPE a SYSTEM\"b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"y",
+"input":"<!DOCTYPE a SYSTEM\"y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"z",
+"input":"<!DOCTYPE a SYSTEM\"z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"{",
+"input":"<!DOCTYPE a SYSTEM\"{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM#",
+"input":"<!DOCTYPE a SYSTEM#",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM&",
+"input":"<!DOCTYPE a SYSTEM&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'",
+"input":"<!DOCTYPE a SYSTEM'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u0000",
+"input":"<!DOCTYPE a SYSTEM'\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u0009",
+"input":"<!DOCTYPE a SYSTEM'\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000A",
+"input":"<!DOCTYPE a SYSTEM'\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000B",
+"input":"<!DOCTYPE a SYSTEM'\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\u000C",
+"input":"<!DOCTYPE a SYSTEM'\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM' ",
+"input":"<!DOCTYPE a SYSTEM' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'!",
+"input":"<!DOCTYPE a SYSTEM'!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\"",
+"input":"<!DOCTYPE a SYSTEM'\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'&",
+"input":"<!DOCTYPE a SYSTEM'&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''",
+"input":"<!DOCTYPE a SYSTEM''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0000",
+"input":"<!DOCTYPE a SYSTEM''\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0008",
+"input":"<!DOCTYPE a SYSTEM''\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u0009",
+"input":"<!DOCTYPE a SYSTEM''\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000A",
+"input":"<!DOCTYPE a SYSTEM''\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000B",
+"input":"<!DOCTYPE a SYSTEM''\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000C",
+"input":"<!DOCTYPE a SYSTEM''\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u000D",
+"input":"<!DOCTYPE a SYSTEM''\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\u001F",
+"input":"<!DOCTYPE a SYSTEM''\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'' ",
+"input":"<!DOCTYPE a SYSTEM'' ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM''!",
+"input":"<!DOCTYPE a SYSTEM''!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\"",
+"input":"<!DOCTYPE a SYSTEM''\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''&",
+"input":"<!DOCTYPE a SYSTEM''&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'''",
+"input":"<!DOCTYPE a SYSTEM'''",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''-",
+"input":"<!DOCTYPE a SYSTEM''-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''/",
+"input":"<!DOCTYPE a SYSTEM''/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''0",
+"input":"<!DOCTYPE a SYSTEM''0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''1",
+"input":"<!DOCTYPE a SYSTEM''1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''9",
+"input":"<!DOCTYPE a SYSTEM''9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''<",
+"input":"<!DOCTYPE a SYSTEM''<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''=",
+"input":"<!DOCTYPE a SYSTEM''=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''>",
+"input":"<!DOCTYPE a SYSTEM''>",
+"output":["ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''?",
+"input":"<!DOCTYPE a SYSTEM''?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''@",
+"input":"<!DOCTYPE a SYSTEM''@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''A",
+"input":"<!DOCTYPE a SYSTEM''A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''B",
+"input":"<!DOCTYPE a SYSTEM''B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''Y",
+"input":"<!DOCTYPE a SYSTEM''Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''Z",
+"input":"<!DOCTYPE a SYSTEM''Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''`",
+"input":"<!DOCTYPE a SYSTEM''`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''a",
+"input":"<!DOCTYPE a SYSTEM''a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''b",
+"input":"<!DOCTYPE a SYSTEM''b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''y",
+"input":"<!DOCTYPE a SYSTEM''y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''z",
+"input":"<!DOCTYPE a SYSTEM''z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''{",
+"input":"<!DOCTYPE a SYSTEM''{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM''\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPE a SYSTEM'(",
+"input":"<!DOCTYPE a SYSTEM'(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'-",
+"input":"<!DOCTYPE a SYSTEM'-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'/",
+"input":"<!DOCTYPE a SYSTEM'/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'0",
+"input":"<!DOCTYPE a SYSTEM'0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'1",
+"input":"<!DOCTYPE a SYSTEM'1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'9",
+"input":"<!DOCTYPE a SYSTEM'9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'<",
+"input":"<!DOCTYPE a SYSTEM'<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'=",
+"input":"<!DOCTYPE a SYSTEM'=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'>",
+"input":"<!DOCTYPE a SYSTEM'>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'?",
+"input":"<!DOCTYPE a SYSTEM'?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'@",
+"input":"<!DOCTYPE a SYSTEM'@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'A",
+"input":"<!DOCTYPE a SYSTEM'A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'B",
+"input":"<!DOCTYPE a SYSTEM'B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'Y",
+"input":"<!DOCTYPE a SYSTEM'Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'Z",
+"input":"<!DOCTYPE a SYSTEM'Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'`",
+"input":"<!DOCTYPE a SYSTEM'`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'a",
+"input":"<!DOCTYPE a SYSTEM'a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'b",
+"input":"<!DOCTYPE a SYSTEM'b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'y",
+"input":"<!DOCTYPE a SYSTEM'y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'z",
+"input":"<!DOCTYPE a SYSTEM'z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'{",
+"input":"<!DOCTYPE a SYSTEM'{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM'\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPE a SYSTEM(",
+"input":"<!DOCTYPE a SYSTEM(",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM-",
+"input":"<!DOCTYPE a SYSTEM-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM/",
+"input":"<!DOCTYPE a SYSTEM/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM0",
+"input":"<!DOCTYPE a SYSTEM0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM1",
+"input":"<!DOCTYPE a SYSTEM1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM9",
+"input":"<!DOCTYPE a SYSTEM9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM<",
+"input":"<!DOCTYPE a SYSTEM<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM=",
+"input":"<!DOCTYPE a SYSTEM=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM>",
+"input":"<!DOCTYPE a SYSTEM>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM?",
+"input":"<!DOCTYPE a SYSTEM?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM@",
+"input":"<!DOCTYPE a SYSTEM@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMA",
+"input":"<!DOCTYPE a SYSTEMA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMB",
+"input":"<!DOCTYPE a SYSTEMB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMY",
+"input":"<!DOCTYPE a SYSTEMY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMZ",
+"input":"<!DOCTYPE a SYSTEMZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM`",
+"input":"<!DOCTYPE a SYSTEM`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMa",
+"input":"<!DOCTYPE a SYSTEMa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMb",
+"input":"<!DOCTYPE a SYSTEMb",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMy",
+"input":"<!DOCTYPE a SYSTEMy",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEMz",
+"input":"<!DOCTYPE a SYSTEMz",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM{",
+"input":"<!DOCTYPE a SYSTEM{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a SYSTEM\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a SYSTEM\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a Y",
+"input":"<!DOCTYPE a Y",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a Z",
+"input":"<!DOCTYPE a Z",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a `",
+"input":"<!DOCTYPE a `",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a",
+"input":"<!DOCTYPE a a",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u0000",
+"input":"<!DOCTYPE a a\u0000",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u0009",
+"input":"<!DOCTYPE a a\u0009",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000A",
+"input":"<!DOCTYPE a a\u000A",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000B",
+"input":"<!DOCTYPE a a\u000B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\u000C",
+"input":"<!DOCTYPE a a\u000C",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a ",
+"input":"<!DOCTYPE a a ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a!",
+"input":"<!DOCTYPE a a!",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\"",
+"input":"<!DOCTYPE a a\"",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a&",
+"input":"<!DOCTYPE a a&",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a'",
+"input":"<!DOCTYPE a a'",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a-",
+"input":"<!DOCTYPE a a-",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a/",
+"input":"<!DOCTYPE a a/",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a0",
+"input":"<!DOCTYPE a a0",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a1",
+"input":"<!DOCTYPE a a1",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a9",
+"input":"<!DOCTYPE a a9",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a<",
+"input":"<!DOCTYPE a a<",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a=",
+"input":"<!DOCTYPE a a=",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a>",
+"input":"<!DOCTYPE a a>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a?",
+"input":"<!DOCTYPE a a?",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a@",
+"input":"<!DOCTYPE a a@",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aA",
+"input":"<!DOCTYPE a aA",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aB",
+"input":"<!DOCTYPE a aB",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aY",
+"input":"<!DOCTYPE a aY",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aZ",
+"input":"<!DOCTYPE a aZ",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a`",
+"input":"<!DOCTYPE a a`",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a aa",
+"input":"<!DOCTYPE a aa",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a ab",
+"input":"<!DOCTYPE a ab",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a ay",
+"input":"<!DOCTYPE a ay",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a az",
+"input":"<!DOCTYPE a az",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a{",
+"input":"<!DOCTYPE a a{",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a a\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a a\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a b",
+"input":"<!DOCTYPE a b",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a y",
+"input":"<!DOCTYPE a y",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a z",
+"input":"<!DOCTYPE a z",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a {",
+"input":"<!DOCTYPE a {",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a \\uDBC0\\uDC00",
+"input":"<!DOCTYPE a \uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPE a!",
+"input":"<!DOCTYPE a!",
+"output":["ParseError", ["DOCTYPE", "a!", null, null, false]]},
+
+{"description":"<!DOCTYPE a\"",
+"input":"<!DOCTYPE a\"",
+"output":["ParseError", ["DOCTYPE", "a\"", null, null, false]]},
+
+{"description":"<!DOCTYPE a&",
+"input":"<!DOCTYPE a&",
+"output":["ParseError", ["DOCTYPE", "a&", null, null, false]]},
+
+{"description":"<!DOCTYPE a'",
+"input":"<!DOCTYPE a'",
+"output":["ParseError", ["DOCTYPE", "a'", null, null, false]]},
+
+{"description":"<!DOCTYPE a-",
+"input":"<!DOCTYPE a-",
+"output":["ParseError", ["DOCTYPE", "a-", null, null, false]]},
+
+{"description":"<!DOCTYPE a/",
+"input":"<!DOCTYPE a/",
+"output":["ParseError", ["DOCTYPE", "a/", null, null, false]]},
+
+{"description":"<!DOCTYPE a0",
+"input":"<!DOCTYPE a0",
+"output":["ParseError", ["DOCTYPE", "a0", null, null, false]]},
+
+{"description":"<!DOCTYPE a1",
+"input":"<!DOCTYPE a1",
+"output":["ParseError", ["DOCTYPE", "a1", null, null, false]]},
+
+{"description":"<!DOCTYPE a9",
+"input":"<!DOCTYPE a9",
+"output":["ParseError", ["DOCTYPE", "a9", null, null, false]]},
+
+{"description":"<!DOCTYPE a<",
+"input":"<!DOCTYPE a<",
+"output":["ParseError", ["DOCTYPE", "a<", null, null, false]]},
+
+{"description":"<!DOCTYPE a=",
+"input":"<!DOCTYPE a=",
+"output":["ParseError", ["DOCTYPE", "a=", null, null, false]]},
+
+{"description":"<!DOCTYPE a>",
+"input":"<!DOCTYPE a>",
+"output":[["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPE a?",
+"input":"<!DOCTYPE a?",
+"output":["ParseError", ["DOCTYPE", "a?", null, null, false]]},
+
+{"description":"<!DOCTYPE a@",
+"input":"<!DOCTYPE a@",
+"output":["ParseError", ["DOCTYPE", "a@", null, null, false]]},
+
+{"description":"<!DOCTYPE aA",
+"input":"<!DOCTYPE aA",
+"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPE aB",
+"input":"<!DOCTYPE aB",
+"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPE aY",
+"input":"<!DOCTYPE aY",
+"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPE aZ",
+"input":"<!DOCTYPE aZ",
+"output":["ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPE a[",
+"input":"<!DOCTYPE a[",
+"output":["ParseError", ["DOCTYPE", "a[", null, null, false]]},
+
+{"description":"<!DOCTYPE a`",
+"input":"<!DOCTYPE a`",
+"output":["ParseError", ["DOCTYPE", "a`", null, null, false]]},
+
+{"description":"<!DOCTYPE aa",
+"input":"<!DOCTYPE aa",
+"output":["ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPE ab",
+"input":"<!DOCTYPE ab",
+"output":["ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPE ay",
+"input":"<!DOCTYPE ay",
+"output":["ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPE az",
+"input":"<!DOCTYPE az",
+"output":["ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPE a{",
+"input":"<!DOCTYPE a{",
+"output":["ParseError", ["DOCTYPE", "a{", null, null, false]]},
+
+{"description":"<!DOCTYPE a\\uDBC0\\uDC00",
+"input":"<!DOCTYPE a\uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPE b",
+"input":"<!DOCTYPE b",
+"output":["ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPE y",
+"input":"<!DOCTYPE y",
+"output":["ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPE z",
+"input":"<!DOCTYPE z",
+"output":["ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE {",
+"input":"<!DOCTYPE {",
+"output":["ParseError", ["DOCTYPE", "{", null, null, false]]},
+
+{"description":"<!DOCTYPE \\uDBC0\\uDC00",
+"input":"<!DOCTYPE \uDBC0\uDC00",
+"output":["ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPE!",
+"input":"<!DOCTYPE!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "!", null, null, false]]},
+
+{"description":"<!DOCTYPE\"",
+"input":"<!DOCTYPE\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\"", null, null, false]]},
+
+{"description":"<!DOCTYPE&",
+"input":"<!DOCTYPE&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "&", null, null, false]]},
+
+{"description":"<!DOCTYPE'",
+"input":"<!DOCTYPE'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "'", null, null, false]]},
+
+{"description":"<!DOCTYPE-",
+"input":"<!DOCTYPE-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "-", null, null, false]]},
+
+{"description":"<!DOCTYPE/",
+"input":"<!DOCTYPE/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "/", null, null, false]]},
+
+{"description":"<!DOCTYPE0",
+"input":"<!DOCTYPE0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "0", null, null, false]]},
+
+{"description":"<!DOCTYPE1",
+"input":"<!DOCTYPE1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "1", null, null, false]]},
+
+{"description":"<!DOCTYPE9",
+"input":"<!DOCTYPE9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "9", null, null, false]]},
+
+{"description":"<!DOCTYPE<",
+"input":"<!DOCTYPE<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "<", null, null, false]]},
+
+{"description":"<!DOCTYPE=",
+"input":"<!DOCTYPE=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "=", null, null, false]]},
+
+{"description":"<!DOCTYPE>",
+"input":"<!DOCTYPE>",
+"output":["ParseError", "ParseError", ["DOCTYPE", null, null, null, false]]},
+
+{"description":"<!DOCTYPE?",
+"input":"<!DOCTYPE?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "?", null, null, false]]},
+
+{"description":"<!DOCTYPE@",
+"input":"<!DOCTYPE@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "@", null, null, false]]},
+
+{"description":"<!DOCTYPEA",
+"input":"<!DOCTYPEA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEB",
+"input":"<!DOCTYPEB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPEY",
+"input":"<!DOCTYPEY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPEZ",
+"input":"<!DOCTYPEZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE`",
+"input":"<!DOCTYPE`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "`", null, null, false]]},
+
+{"description":"<!DOCTYPEa",
+"input":"<!DOCTYPEa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0000",
+"input":"<!DOCTYPEa\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\uFFFD", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0008",
+"input":"<!DOCTYPEa\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u0008", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u0009",
+"input":"<!DOCTYPEa\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000A",
+"input":"<!DOCTYPEa\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000B",
+"input":"<!DOCTYPEa\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u000B", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000C",
+"input":"<!DOCTYPEa\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u000D",
+"input":"<!DOCTYPEa\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\u001F",
+"input":"<!DOCTYPEa\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a\u001F", null, null, false]]},
+
+{"description":"<!DOCTYPEa ",
+"input":"<!DOCTYPEa ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0000",
+"input":"<!DOCTYPEa \u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0008",
+"input":"<!DOCTYPEa \u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u0009",
+"input":"<!DOCTYPEa \u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000A",
+"input":"<!DOCTYPEa \u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000B",
+"input":"<!DOCTYPEa \u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000C",
+"input":"<!DOCTYPEa \u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u000D",
+"input":"<!DOCTYPEa \u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\u001F",
+"input":"<!DOCTYPEa \u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa  ",
+"input":"<!DOCTYPEa  ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa !",
+"input":"<!DOCTYPEa !",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \"",
+"input":"<!DOCTYPEa \"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa &",
+"input":"<!DOCTYPEa &",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa '",
+"input":"<!DOCTYPEa '",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa -",
+"input":"<!DOCTYPEa -",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa /",
+"input":"<!DOCTYPEa /",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 0",
+"input":"<!DOCTYPEa 0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 1",
+"input":"<!DOCTYPEa 1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa 9",
+"input":"<!DOCTYPEa 9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa <",
+"input":"<!DOCTYPEa <",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa =",
+"input":"<!DOCTYPEa =",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa >",
+"input":"<!DOCTYPEa >",
+"output":["ParseError", ["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPEa ?",
+"input":"<!DOCTYPEa ?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa @",
+"input":"<!DOCTYPEa @",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa A",
+"input":"<!DOCTYPEa A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa B",
+"input":"<!DOCTYPEa B",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC",
+"input":"<!DOCTYPEa PUBLIC",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0000",
+"input":"<!DOCTYPEa PUBLIC\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0008",
+"input":"<!DOCTYPEa PUBLIC\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u0009",
+"input":"<!DOCTYPEa PUBLIC\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000A",
+"input":"<!DOCTYPEa PUBLIC\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000B",
+"input":"<!DOCTYPEa PUBLIC\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000C",
+"input":"<!DOCTYPEa PUBLIC\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u000D",
+"input":"<!DOCTYPEa PUBLIC\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\u001F",
+"input":"<!DOCTYPEa PUBLIC\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC ",
+"input":"<!DOCTYPEa PUBLIC ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC!",
+"input":"<!DOCTYPEa PUBLIC!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"",
+"input":"<!DOCTYPEa PUBLIC\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u0000",
+"input":"<!DOCTYPEa PUBLIC\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u0009",
+"input":"<!DOCTYPEa PUBLIC\"\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000A",
+"input":"<!DOCTYPEa PUBLIC\"\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000B",
+"input":"<!DOCTYPEa PUBLIC\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\u000C",
+"input":"<!DOCTYPEa PUBLIC\"\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\" ",
+"input":"<!DOCTYPEa PUBLIC\" ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"!",
+"input":"<!DOCTYPEa PUBLIC\"!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\"",
+"input":"<!DOCTYPEa PUBLIC\"\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"#",
+"input":"<!DOCTYPEa PUBLIC\"#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "#", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"&",
+"input":"<!DOCTYPEa PUBLIC\"&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"'",
+"input":"<!DOCTYPEa PUBLIC\"'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "'", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"-",
+"input":"<!DOCTYPEa PUBLIC\"-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"/",
+"input":"<!DOCTYPEa PUBLIC\"/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"0",
+"input":"<!DOCTYPEa PUBLIC\"0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"1",
+"input":"<!DOCTYPEa PUBLIC\"1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"9",
+"input":"<!DOCTYPEa PUBLIC\"9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"<",
+"input":"<!DOCTYPEa PUBLIC\"<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"=",
+"input":"<!DOCTYPEa PUBLIC\"=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\">",
+"input":"<!DOCTYPEa PUBLIC\">",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"?",
+"input":"<!DOCTYPEa PUBLIC\"?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"@",
+"input":"<!DOCTYPEa PUBLIC\"@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"A",
+"input":"<!DOCTYPEa PUBLIC\"A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"B",
+"input":"<!DOCTYPEa PUBLIC\"B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"Y",
+"input":"<!DOCTYPEa PUBLIC\"Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"Z",
+"input":"<!DOCTYPEa PUBLIC\"Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"`",
+"input":"<!DOCTYPEa PUBLIC\"`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"a",
+"input":"<!DOCTYPEa PUBLIC\"a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"b",
+"input":"<!DOCTYPEa PUBLIC\"b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"y",
+"input":"<!DOCTYPEa PUBLIC\"y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"z",
+"input":"<!DOCTYPEa PUBLIC\"z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"{",
+"input":"<!DOCTYPEa PUBLIC\"{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC#",
+"input":"<!DOCTYPEa PUBLIC#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC&",
+"input":"<!DOCTYPEa PUBLIC&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'",
+"input":"<!DOCTYPEa PUBLIC'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u0000",
+"input":"<!DOCTYPEa PUBLIC'\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uFFFD", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u0009",
+"input":"<!DOCTYPEa PUBLIC'\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u0009", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000A",
+"input":"<!DOCTYPEa PUBLIC'\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000B",
+"input":"<!DOCTYPEa PUBLIC'\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\u000C",
+"input":"<!DOCTYPEa PUBLIC'\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\u000C", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC' ",
+"input":"<!DOCTYPEa PUBLIC' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", " ", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'!",
+"input":"<!DOCTYPEa PUBLIC'!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "!", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\"",
+"input":"<!DOCTYPEa PUBLIC'\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\"", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'&",
+"input":"<!DOCTYPEa PUBLIC'&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "&", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''",
+"input":"<!DOCTYPEa PUBLIC''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0000",
+"input":"<!DOCTYPEa PUBLIC''\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0008",
+"input":"<!DOCTYPEa PUBLIC''\u0008",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u0009",
+"input":"<!DOCTYPEa PUBLIC''\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000A",
+"input":"<!DOCTYPEa PUBLIC''\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000B",
+"input":"<!DOCTYPEa PUBLIC''\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000C",
+"input":"<!DOCTYPEa PUBLIC''\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u000D",
+"input":"<!DOCTYPEa PUBLIC''\u000D",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\u001F",
+"input":"<!DOCTYPEa PUBLIC''\u001F",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'' ",
+"input":"<!DOCTYPEa PUBLIC'' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''!",
+"input":"<!DOCTYPEa PUBLIC''!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\"",
+"input":"<!DOCTYPEa PUBLIC''\"",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''#",
+"input":"<!DOCTYPEa PUBLIC''#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''&",
+"input":"<!DOCTYPEa PUBLIC''&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'''",
+"input":"<!DOCTYPEa PUBLIC'''",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", "", false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''(",
+"input":"<!DOCTYPEa PUBLIC''(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''-",
+"input":"<!DOCTYPEa PUBLIC''-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''/",
+"input":"<!DOCTYPEa PUBLIC''/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''0",
+"input":"<!DOCTYPEa PUBLIC''0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''1",
+"input":"<!DOCTYPEa PUBLIC''1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''9",
+"input":"<!DOCTYPEa PUBLIC''9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''<",
+"input":"<!DOCTYPEa PUBLIC''<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''=",
+"input":"<!DOCTYPEa PUBLIC''=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''>",
+"input":"<!DOCTYPEa PUBLIC''>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", "", null, true]]},
+
+{"description":"<!DOCTYPEa PUBLIC''?",
+"input":"<!DOCTYPEa PUBLIC''?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''@",
+"input":"<!DOCTYPEa PUBLIC''@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''A",
+"input":"<!DOCTYPEa PUBLIC''A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''B",
+"input":"<!DOCTYPEa PUBLIC''B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''Y",
+"input":"<!DOCTYPEa PUBLIC''Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''Z",
+"input":"<!DOCTYPEa PUBLIC''Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''`",
+"input":"<!DOCTYPEa PUBLIC''`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''a",
+"input":"<!DOCTYPEa PUBLIC''a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''b",
+"input":"<!DOCTYPEa PUBLIC''b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''y",
+"input":"<!DOCTYPEa PUBLIC''y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''z",
+"input":"<!DOCTYPEa PUBLIC''z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''{",
+"input":"<!DOCTYPEa PUBLIC''{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC''\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'(",
+"input":"<!DOCTYPEa PUBLIC'(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "(", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'-",
+"input":"<!DOCTYPEa PUBLIC'-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "-", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'/",
+"input":"<!DOCTYPEa PUBLIC'/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "/", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'0",
+"input":"<!DOCTYPEa PUBLIC'0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "0", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'1",
+"input":"<!DOCTYPEa PUBLIC'1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "1", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'9",
+"input":"<!DOCTYPEa PUBLIC'9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "9", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'<",
+"input":"<!DOCTYPEa PUBLIC'<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "<", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'=",
+"input":"<!DOCTYPEa PUBLIC'=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "=", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'>",
+"input":"<!DOCTYPEa PUBLIC'>",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'?",
+"input":"<!DOCTYPEa PUBLIC'?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "?", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'@",
+"input":"<!DOCTYPEa PUBLIC'@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "@", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'A",
+"input":"<!DOCTYPEa PUBLIC'A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "A", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'B",
+"input":"<!DOCTYPEa PUBLIC'B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "B", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'Y",
+"input":"<!DOCTYPEa PUBLIC'Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'Z",
+"input":"<!DOCTYPEa PUBLIC'Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "Z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'`",
+"input":"<!DOCTYPEa PUBLIC'`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "`", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'a",
+"input":"<!DOCTYPEa PUBLIC'a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "a", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'b",
+"input":"<!DOCTYPEa PUBLIC'b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "b", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'y",
+"input":"<!DOCTYPEa PUBLIC'y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "y", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'z",
+"input":"<!DOCTYPEa PUBLIC'z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "z", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'{",
+"input":"<!DOCTYPEa PUBLIC'{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "{", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC'\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", "\uDBC0\uDC00", null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC(",
+"input":"<!DOCTYPEa PUBLIC(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC-",
+"input":"<!DOCTYPEa PUBLIC-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC/",
+"input":"<!DOCTYPEa PUBLIC/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC0",
+"input":"<!DOCTYPEa PUBLIC0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC1",
+"input":"<!DOCTYPEa PUBLIC1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC9",
+"input":"<!DOCTYPEa PUBLIC9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC<",
+"input":"<!DOCTYPEa PUBLIC<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC=",
+"input":"<!DOCTYPEa PUBLIC=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC>",
+"input":"<!DOCTYPEa PUBLIC>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC?",
+"input":"<!DOCTYPEa PUBLIC?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC@",
+"input":"<!DOCTYPEa PUBLIC@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICA",
+"input":"<!DOCTYPEa PUBLICA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICB",
+"input":"<!DOCTYPEa PUBLICB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICY",
+"input":"<!DOCTYPEa PUBLICY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICZ",
+"input":"<!DOCTYPEa PUBLICZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC`",
+"input":"<!DOCTYPEa PUBLIC`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICa",
+"input":"<!DOCTYPEa PUBLICa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICb",
+"input":"<!DOCTYPEa PUBLICb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICy",
+"input":"<!DOCTYPEa PUBLICy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLICz",
+"input":"<!DOCTYPEa PUBLICz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC{",
+"input":"<!DOCTYPEa PUBLIC{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa PUBLIC\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa PUBLIC\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM",
+"input":"<!DOCTYPEa SYSTEM",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0000",
+"input":"<!DOCTYPEa SYSTEM\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0008",
+"input":"<!DOCTYPEa SYSTEM\u0008",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u0009",
+"input":"<!DOCTYPEa SYSTEM\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000A",
+"input":"<!DOCTYPEa SYSTEM\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000B",
+"input":"<!DOCTYPEa SYSTEM\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000C",
+"input":"<!DOCTYPEa SYSTEM\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u000D",
+"input":"<!DOCTYPEa SYSTEM\u000D",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\u001F",
+"input":"<!DOCTYPEa SYSTEM\u001F",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM ",
+"input":"<!DOCTYPEa SYSTEM ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM!",
+"input":"<!DOCTYPEa SYSTEM!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"",
+"input":"<!DOCTYPEa SYSTEM\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u0000",
+"input":"<!DOCTYPEa SYSTEM\"\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u0009",
+"input":"<!DOCTYPEa SYSTEM\"\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000A",
+"input":"<!DOCTYPEa SYSTEM\"\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000B",
+"input":"<!DOCTYPEa SYSTEM\"\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\u000C",
+"input":"<!DOCTYPEa SYSTEM\"\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\" ",
+"input":"<!DOCTYPEa SYSTEM\" ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"!",
+"input":"<!DOCTYPEa SYSTEM\"!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\"",
+"input":"<!DOCTYPEa SYSTEM\"\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"#",
+"input":"<!DOCTYPEa SYSTEM\"#",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "#", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"&",
+"input":"<!DOCTYPEa SYSTEM\"&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"'",
+"input":"<!DOCTYPEa SYSTEM\"'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "'", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"-",
+"input":"<!DOCTYPEa SYSTEM\"-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"/",
+"input":"<!DOCTYPEa SYSTEM\"/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"0",
+"input":"<!DOCTYPEa SYSTEM\"0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"1",
+"input":"<!DOCTYPEa SYSTEM\"1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"9",
+"input":"<!DOCTYPEa SYSTEM\"9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"<",
+"input":"<!DOCTYPEa SYSTEM\"<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"=",
+"input":"<!DOCTYPEa SYSTEM\"=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\">",
+"input":"<!DOCTYPEa SYSTEM\">",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"?",
+"input":"<!DOCTYPEa SYSTEM\"?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"@",
+"input":"<!DOCTYPEa SYSTEM\"@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"A",
+"input":"<!DOCTYPEa SYSTEM\"A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"B",
+"input":"<!DOCTYPEa SYSTEM\"B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"Y",
+"input":"<!DOCTYPEa SYSTEM\"Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"Z",
+"input":"<!DOCTYPEa SYSTEM\"Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"`",
+"input":"<!DOCTYPEa SYSTEM\"`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"a",
+"input":"<!DOCTYPEa SYSTEM\"a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"b",
+"input":"<!DOCTYPEa SYSTEM\"b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"y",
+"input":"<!DOCTYPEa SYSTEM\"y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"z",
+"input":"<!DOCTYPEa SYSTEM\"z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"{",
+"input":"<!DOCTYPEa SYSTEM\"{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\"\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM\"\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM#",
+"input":"<!DOCTYPEa SYSTEM#",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM&",
+"input":"<!DOCTYPEa SYSTEM&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'",
+"input":"<!DOCTYPEa SYSTEM'",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u0000",
+"input":"<!DOCTYPEa SYSTEM'\u0000",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uFFFD", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u0009",
+"input":"<!DOCTYPEa SYSTEM'\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u0009", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000A",
+"input":"<!DOCTYPEa SYSTEM'\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000B",
+"input":"<!DOCTYPEa SYSTEM'\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\u000C",
+"input":"<!DOCTYPEa SYSTEM'\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\u000C", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM' ",
+"input":"<!DOCTYPEa SYSTEM' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, " ", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'!",
+"input":"<!DOCTYPEa SYSTEM'!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "!", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\"",
+"input":"<!DOCTYPEa SYSTEM'\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\"", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'&",
+"input":"<!DOCTYPEa SYSTEM'&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "&", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''",
+"input":"<!DOCTYPEa SYSTEM''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0000",
+"input":"<!DOCTYPEa SYSTEM''\u0000",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0008",
+"input":"<!DOCTYPEa SYSTEM''\u0008",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u0009",
+"input":"<!DOCTYPEa SYSTEM''\u0009",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000A",
+"input":"<!DOCTYPEa SYSTEM''\u000A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000B",
+"input":"<!DOCTYPEa SYSTEM''\u000B",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000C",
+"input":"<!DOCTYPEa SYSTEM''\u000C",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u000D",
+"input":"<!DOCTYPEa SYSTEM''\u000D",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\u001F",
+"input":"<!DOCTYPEa SYSTEM''\u001F",
+"output":["ParseError", "ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'' ",
+"input":"<!DOCTYPEa SYSTEM'' ",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM''!",
+"input":"<!DOCTYPEa SYSTEM''!",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\"",
+"input":"<!DOCTYPEa SYSTEM''\"",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''&",
+"input":"<!DOCTYPEa SYSTEM''&",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'''",
+"input":"<!DOCTYPEa SYSTEM'''",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''-",
+"input":"<!DOCTYPEa SYSTEM''-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''/",
+"input":"<!DOCTYPEa SYSTEM''/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''0",
+"input":"<!DOCTYPEa SYSTEM''0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''1",
+"input":"<!DOCTYPEa SYSTEM''1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''9",
+"input":"<!DOCTYPEa SYSTEM''9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''<",
+"input":"<!DOCTYPEa SYSTEM''<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''=",
+"input":"<!DOCTYPEa SYSTEM''=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''>",
+"input":"<!DOCTYPEa SYSTEM''>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''?",
+"input":"<!DOCTYPEa SYSTEM''?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''@",
+"input":"<!DOCTYPEa SYSTEM''@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''A",
+"input":"<!DOCTYPEa SYSTEM''A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''B",
+"input":"<!DOCTYPEa SYSTEM''B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''Y",
+"input":"<!DOCTYPEa SYSTEM''Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''Z",
+"input":"<!DOCTYPEa SYSTEM''Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''`",
+"input":"<!DOCTYPEa SYSTEM''`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''a",
+"input":"<!DOCTYPEa SYSTEM''a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''b",
+"input":"<!DOCTYPEa SYSTEM''b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''y",
+"input":"<!DOCTYPEa SYSTEM''y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''z",
+"input":"<!DOCTYPEa SYSTEM''z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''{",
+"input":"<!DOCTYPEa SYSTEM''{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM''\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM''\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", true]]},
+
+{"description":"<!DOCTYPEa SYSTEM'(",
+"input":"<!DOCTYPEa SYSTEM'(",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "(", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'-",
+"input":"<!DOCTYPEa SYSTEM'-",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "-", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'/",
+"input":"<!DOCTYPEa SYSTEM'/",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "/", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'0",
+"input":"<!DOCTYPEa SYSTEM'0",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "0", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'1",
+"input":"<!DOCTYPEa SYSTEM'1",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "1", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'9",
+"input":"<!DOCTYPEa SYSTEM'9",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "9", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'<",
+"input":"<!DOCTYPEa SYSTEM'<",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "<", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'=",
+"input":"<!DOCTYPEa SYSTEM'=",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "=", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'>",
+"input":"<!DOCTYPEa SYSTEM'>",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'?",
+"input":"<!DOCTYPEa SYSTEM'?",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "?", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'@",
+"input":"<!DOCTYPEa SYSTEM'@",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "@", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'A",
+"input":"<!DOCTYPEa SYSTEM'A",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "A", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'B",
+"input":"<!DOCTYPEa SYSTEM'B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "B", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'Y",
+"input":"<!DOCTYPEa SYSTEM'Y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'Z",
+"input":"<!DOCTYPEa SYSTEM'Z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "Z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'`",
+"input":"<!DOCTYPEa SYSTEM'`",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "`", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'a",
+"input":"<!DOCTYPEa SYSTEM'a",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "a", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'b",
+"input":"<!DOCTYPEa SYSTEM'b",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "b", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'y",
+"input":"<!DOCTYPEa SYSTEM'y",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "y", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'z",
+"input":"<!DOCTYPEa SYSTEM'z",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "z", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'{",
+"input":"<!DOCTYPEa SYSTEM'{",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "{", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM'\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM'\uDBC0\uDC00",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, "\uDBC0\uDC00", false]]},
+
+{"description":"<!DOCTYPEa SYSTEM(",
+"input":"<!DOCTYPEa SYSTEM(",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM-",
+"input":"<!DOCTYPEa SYSTEM-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM/",
+"input":"<!DOCTYPEa SYSTEM/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM0",
+"input":"<!DOCTYPEa SYSTEM0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM1",
+"input":"<!DOCTYPEa SYSTEM1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM9",
+"input":"<!DOCTYPEa SYSTEM9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM<",
+"input":"<!DOCTYPEa SYSTEM<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM=",
+"input":"<!DOCTYPEa SYSTEM=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM>",
+"input":"<!DOCTYPEa SYSTEM>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM?",
+"input":"<!DOCTYPEa SYSTEM?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM@",
+"input":"<!DOCTYPEa SYSTEM@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMA",
+"input":"<!DOCTYPEa SYSTEMA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMB",
+"input":"<!DOCTYPEa SYSTEMB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMY",
+"input":"<!DOCTYPEa SYSTEMY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMZ",
+"input":"<!DOCTYPEa SYSTEMZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM`",
+"input":"<!DOCTYPEa SYSTEM`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMa",
+"input":"<!DOCTYPEa SYSTEMa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMb",
+"input":"<!DOCTYPEa SYSTEMb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMy",
+"input":"<!DOCTYPEa SYSTEMy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEMz",
+"input":"<!DOCTYPEa SYSTEMz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM{",
+"input":"<!DOCTYPEa SYSTEM{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa SYSTEM\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa SYSTEM\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa Y",
+"input":"<!DOCTYPEa Y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa Z",
+"input":"<!DOCTYPEa Z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa `",
+"input":"<!DOCTYPEa `",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a",
+"input":"<!DOCTYPEa a",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u0000",
+"input":"<!DOCTYPEa a\u0000",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u0009",
+"input":"<!DOCTYPEa a\u0009",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000A",
+"input":"<!DOCTYPEa a\u000A",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000B",
+"input":"<!DOCTYPEa a\u000B",
+"output":["ParseError", "ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\u000C",
+"input":"<!DOCTYPEa a\u000C",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a ",
+"input":"<!DOCTYPEa a ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a!",
+"input":"<!DOCTYPEa a!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\"",
+"input":"<!DOCTYPEa a\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a&",
+"input":"<!DOCTYPEa a&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a'",
+"input":"<!DOCTYPEa a'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a-",
+"input":"<!DOCTYPEa a-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a/",
+"input":"<!DOCTYPEa a/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a0",
+"input":"<!DOCTYPEa a0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a1",
+"input":"<!DOCTYPEa a1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a9",
+"input":"<!DOCTYPEa a9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a<",
+"input":"<!DOCTYPEa a<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a=",
+"input":"<!DOCTYPEa a=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a>",
+"input":"<!DOCTYPEa a>",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a?",
+"input":"<!DOCTYPEa a?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a@",
+"input":"<!DOCTYPEa a@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aA",
+"input":"<!DOCTYPEa aA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aB",
+"input":"<!DOCTYPEa aB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aY",
+"input":"<!DOCTYPEa aY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aZ",
+"input":"<!DOCTYPEa aZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a`",
+"input":"<!DOCTYPEa a`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa aa",
+"input":"<!DOCTYPEa aa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa ab",
+"input":"<!DOCTYPEa ab",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa ay",
+"input":"<!DOCTYPEa ay",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa az",
+"input":"<!DOCTYPEa az",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a{",
+"input":"<!DOCTYPEa a{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa a\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa a\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa b",
+"input":"<!DOCTYPEa b",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa y",
+"input":"<!DOCTYPEa y",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa z",
+"input":"<!DOCTYPEa z",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa {",
+"input":"<!DOCTYPEa {",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa \\uDBC0\\uDC00",
+"input":"<!DOCTYPEa \uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a", null, null, false]]},
+
+{"description":"<!DOCTYPEa!",
+"input":"<!DOCTYPEa!",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a!", null, null, false]]},
+
+{"description":"<!DOCTYPEa\"",
+"input":"<!DOCTYPEa\"",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\"", null, null, false]]},
+
+{"description":"<!DOCTYPEa&",
+"input":"<!DOCTYPEa&",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a&", null, null, false]]},
+
+{"description":"<!DOCTYPEa'",
+"input":"<!DOCTYPEa'",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a'", null, null, false]]},
+
+{"description":"<!DOCTYPEa-",
+"input":"<!DOCTYPEa-",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a-", null, null, false]]},
+
+{"description":"<!DOCTYPEa/",
+"input":"<!DOCTYPEa/",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a/", null, null, false]]},
+
+{"description":"<!DOCTYPEa0",
+"input":"<!DOCTYPEa0",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a0", null, null, false]]},
+
+{"description":"<!DOCTYPEa1",
+"input":"<!DOCTYPEa1",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a1", null, null, false]]},
+
+{"description":"<!DOCTYPEa9",
+"input":"<!DOCTYPEa9",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a9", null, null, false]]},
+
+{"description":"<!DOCTYPEa<",
+"input":"<!DOCTYPEa<",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a<", null, null, false]]},
+
+{"description":"<!DOCTYPEa=",
+"input":"<!DOCTYPEa=",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a=", null, null, false]]},
+
+{"description":"<!DOCTYPEa>",
+"input":"<!DOCTYPEa>",
+"output":["ParseError", ["DOCTYPE", "a", null, null, true]]},
+
+{"description":"<!DOCTYPEa?",
+"input":"<!DOCTYPEa?",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a?", null, null, false]]},
+
+{"description":"<!DOCTYPEa@",
+"input":"<!DOCTYPEa@",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a@", null, null, false]]},
+
+{"description":"<!DOCTYPEaA",
+"input":"<!DOCTYPEaA",
+"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPEaB",
+"input":"<!DOCTYPEaB",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPEaY",
+"input":"<!DOCTYPEaY",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPEaZ",
+"input":"<!DOCTYPEaZ",
+"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPEa[",
+"input":"<!DOCTYPEa[",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a[", null, null, false]]},
+
+{"description":"<!DOCTYPEa`",
+"input":"<!DOCTYPEa`",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a`", null, null, false]]},
+
+{"description":"<!DOCTYPEaa",
+"input":"<!DOCTYPEaa",
+"output":["ParseError", "ParseError", ["DOCTYPE", "aa", null, null, false]]},
+
+{"description":"<!DOCTYPEab",
+"input":"<!DOCTYPEab",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ab", null, null, false]]},
+
+{"description":"<!DOCTYPEay",
+"input":"<!DOCTYPEay",
+"output":["ParseError", "ParseError", ["DOCTYPE", "ay", null, null, false]]},
+
+{"description":"<!DOCTYPEaz",
+"input":"<!DOCTYPEaz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "az", null, null, false]]},
+
+{"description":"<!DOCTYPEa{",
+"input":"<!DOCTYPEa{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a{", null, null, false]]},
+
+{"description":"<!DOCTYPEa\\uDBC0\\uDC00",
+"input":"<!DOCTYPEa\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "a\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!DOCTYPEb",
+"input":"<!DOCTYPEb",
+"output":["ParseError", "ParseError", ["DOCTYPE", "b", null, null, false]]},
+
+{"description":"<!DOCTYPEy",
+"input":"<!DOCTYPEy",
+"output":["ParseError", "ParseError", ["DOCTYPE", "y", null, null, false]]},
+
+{"description":"<!DOCTYPEz",
+"input":"<!DOCTYPEz",
+"output":["ParseError", "ParseError", ["DOCTYPE", "z", null, null, false]]},
+
+{"description":"<!DOCTYPE{",
+"input":"<!DOCTYPE{",
+"output":["ParseError", "ParseError", ["DOCTYPE", "{", null, null, false]]},
+
+{"description":"<!DOCTYPE\\uDBC0\\uDC00",
+"input":"<!DOCTYPE\uDBC0\uDC00",
+"output":["ParseError", "ParseError", ["DOCTYPE", "\uDBC0\uDC00", null, null, false]]},
+
+{"description":"<!Y",
+"input":"<!Y",
+"output":["ParseError", ["Comment", "Y"]]},
+
+{"description":"<!Z",
+"input":"<!Z",
+"output":["ParseError", ["Comment", "Z"]]},
+
+{"description":"<!`",
+"input":"<!`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"<!a",
+"input":"<!a",
+"output":["ParseError", ["Comment", "a"]]},
+
+{"description":"<!b",
+"input":"<!b",
+"output":["ParseError", ["Comment", "b"]]},
+
+{"description":"<!y",
+"input":"<!y",
+"output":["ParseError", ["Comment", "y"]]},
+
+{"description":"<!z",
+"input":"<!z",
+"output":["ParseError", ["Comment", "z"]]},
+
+{"description":"<!{",
+"input":"<!{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"<!\\uDBC0\\uDC00",
+"input":"<!\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<\"",
+"input":"<\"",
+"output":["ParseError", ["Character", "<\""]]},
+
+{"description":"<&",
+"input":"<&",
+"output":["ParseError", ["Character", "<&"]]},
+
+{"description":"<'",
+"input":"<'",
+"output":["ParseError", ["Character", "<'"]]},
+
+{"description":"<-",
+"input":"<-",
+"output":["ParseError", ["Character", "<-"]]},
+
+{"description":"<.",
+"input":"<.",
+"output":["ParseError", ["Character", "<."]]},
+
+{"description":"</",
+"input":"</",
+"output":["ParseError", ["Character", "</"]]},
+
+{"description":"</\\u0000",
+"input":"</\u0000",
+"output":["ParseError", ["Comment", "\uFFFD"]]},
+
+{"description":"</\\u0009",
+"input":"</\u0009",
+"output":["ParseError", ["Comment", "\u0009"]]},
+
+{"description":"</\\u000A",
+"input":"</\u000A",
+"output":["ParseError", ["Comment", "\u000A"]]},
+
+{"description":"</\\u000B",
+"input":"</\u000B",
+"output":["ParseError", "ParseError", ["Comment", "\u000B"]]},
+
+{"description":"</\\u000C",
+"input":"</\u000C",
+"output":["ParseError", ["Comment", "\u000C"]]},
+
+{"description":"</ ",
+"input":"</ ",
+"output":["ParseError", ["Comment", " "]]},
+
+{"description":"</!",
+"input":"</!",
+"output":["ParseError", ["Comment", "!"]]},
+
+{"description":"</\"",
+"input":"</\"",
+"output":["ParseError", ["Comment", "\""]]},
+
+{"description":"</&",
+"input":"</&",
+"output":["ParseError", ["Comment", "&"]]},
+
+{"description":"</'",
+"input":"</'",
+"output":["ParseError", ["Comment", "'"]]},
+
+{"description":"</-",
+"input":"</-",
+"output":["ParseError", ["Comment", "-"]]},
+
+{"description":"<//",
+"input":"<//",
+"output":["ParseError", ["Comment", "/"]]},
+
+{"description":"</0",
+"input":"</0",
+"output":["ParseError", ["Comment", "0"]]},
+
+{"description":"</1",
+"input":"</1",
+"output":["ParseError", ["Comment", "1"]]},
+
+{"description":"</9",
+"input":"</9",
+"output":["ParseError", ["Comment", "9"]]},
+
+{"description":"</<",
+"input":"</<",
+"output":["ParseError", ["Comment", "<"]]},
+
+{"description":"</=",
+"input":"</=",
+"output":["ParseError", ["Comment", "="]]},
+
+{"description":"</>",
+"input":"</>",
+"output":["ParseError"]},
+
+{"description":"</?",
+"input":"</?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"</@",
+"input":"</@",
+"output":["ParseError", ["Comment", "@"]]},
+
+{"description":"</A>",
+"input":"</A>",
+"output":[["EndTag", "a"]]},
+
+{"description":"</B>",
+"input":"</B>",
+"output":[["EndTag", "b"]]},
+
+{"description":"</Y>",
+"input":"</Y>",
+"output":[["EndTag", "y"]]},
+
+{"description":"</Z>",
+"input":"</Z>",
+"output":[["EndTag", "z"]]},
+
+{"description":"</[",
+"input":"</[",
+"output":["ParseError", ["Comment", "["]]},
+
+{"description":"</`",
+"input":"</`",
+"output":["ParseError", ["Comment", "`"]]},
+
+{"description":"</a>",
+"input":"</a>",
+"output":[["EndTag", "a"]]},
+
+{"description":"</b>",
+"input":"</b>",
+"output":[["EndTag", "b"]]},
+
+{"description":"</y>",
+"input":"</y>",
+"output":[["EndTag", "y"]]},
+
+{"description":"</z>",
+"input":"</z>",
+"output":[["EndTag", "z"]]},
+
+{"description":"</{",
+"input":"</{",
+"output":["ParseError", ["Comment", "{"]]},
+
+{"description":"</\\uDBC0\\uDC00",
+"input":"</\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "\uDBC0\uDC00"]]},
+
+{"description":"<0",
+"input":"<0",
+"output":["ParseError", ["Character", "<0"]]},
+
+{"description":"<1",
+"input":"<1",
+"output":["ParseError", ["Character", "<1"]]},
+
+{"description":"<9",
+"input":"<9",
+"output":["ParseError", ["Character", "<9"]]},
+
+{"description":"<<",
+"input":"<<",
+"output":["ParseError", ["Character", "<"], "ParseError", ["Character", "<"]]},
+
+{"description":"<=",
+"input":"<=",
+"output":["ParseError", ["Character", "<="]]},
+
+{"description":"<>",
+"input":"<>",
+"output":["ParseError", ["Character", "<>"]]},
+
+{"description":"<?",
+"input":"<?",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<?\\u0000",
+"input":"<?\u0000",
+"output":["ParseError", ["Comment", "?\uFFFD"]]},
+
+{"description":"<?\\u0009",
+"input":"<?\u0009",
+"output":["ParseError", ["Comment", "?\u0009"]]},
+
+{"description":"<?\\u000A",
+"input":"<?\u000A",
+"output":["ParseError", ["Comment", "?\u000A"]]},
+
+{"description":"<?\\u000B",
+"input":"<?\u000B",
+"output":["ParseError", "ParseError", ["Comment", "?\u000B"]]},
+
+{"description":"<?\\u000C",
+"input":"<?\u000C",
+"output":["ParseError", ["Comment", "?\u000C"]]},
+
+{"description":"<? ",
+"input":"<? ",
+"output":["ParseError", ["Comment", "? "]]},
+
+{"description":"<?!",
+"input":"<?!",
+"output":["ParseError", ["Comment", "?!"]]},
+
+{"description":"<?\"",
+"input":"<?\"",
+"output":["ParseError", ["Comment", "?\""]]},
+
+{"description":"<?&",
+"input":"<?&",
+"output":["ParseError", ["Comment", "?&"]]},
+
+{"description":"<?'",
+"input":"<?'",
+"output":["ParseError", ["Comment", "?'"]]},
+
+{"description":"<?-",
+"input":"<?-",
+"output":["ParseError", ["Comment", "?-"]]},
+
+{"description":"<?/",
+"input":"<?/",
+"output":["ParseError", ["Comment", "?/"]]},
+
+{"description":"<?0",
+"input":"<?0",
+"output":["ParseError", ["Comment", "?0"]]},
+
+{"description":"<?1",
+"input":"<?1",
+"output":["ParseError", ["Comment", "?1"]]},
+
+{"description":"<?9",
+"input":"<?9",
+"output":["ParseError", ["Comment", "?9"]]},
+
+{"description":"<?<",
+"input":"<?<",
+"output":["ParseError", ["Comment", "?<"]]},
+
+{"description":"<?=",
+"input":"<?=",
+"output":["ParseError", ["Comment", "?="]]},
+
+{"description":"<?>",
+"input":"<?>",
+"output":["ParseError", ["Comment", "?"]]},
+
+{"description":"<??",
+"input":"<??",
+"output":["ParseError", ["Comment", "??"]]},
+
+{"description":"<?@",
+"input":"<?@",
+"output":["ParseError", ["Comment", "?@"]]},
+
+{"description":"<?A",
+"input":"<?A",
+"output":["ParseError", ["Comment", "?A"]]},
+
+{"description":"<?B",
+"input":"<?B",
+"output":["ParseError", ["Comment", "?B"]]},
+
+{"description":"<?Y",
+"input":"<?Y",
+"output":["ParseError", ["Comment", "?Y"]]},
+
+{"description":"<?Z",
+"input":"<?Z",
+"output":["ParseError", ["Comment", "?Z"]]},
+
+{"description":"<?`",
+"input":"<?`",
+"output":["ParseError", ["Comment", "?`"]]},
+
+{"description":"<?a",
+"input":"<?a",
+"output":["ParseError", ["Comment", "?a"]]},
+
+{"description":"<?b",
+"input":"<?b",
+"output":["ParseError", ["Comment", "?b"]]},
+
+{"description":"<?y",
+"input":"<?y",
+"output":["ParseError", ["Comment", "?y"]]},
+
+{"description":"<?z",
+"input":"<?z",
+"output":["ParseError", ["Comment", "?z"]]},
+
+{"description":"<?{",
+"input":"<?{",
+"output":["ParseError", ["Comment", "?{"]]},
+
+{"description":"<?\\uDBC0\\uDC00",
+"input":"<?\uDBC0\uDC00",
+"output":["ParseError", ["Comment", "?\uDBC0\uDC00"]]},
+
+{"description":"<@",
+"input":"<@",
+"output":["ParseError", ["Character", "<@"]]},
+
+{"description":"<A>",
+"input":"<A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<B>",
+"input":"<B>",
+"output":[["StartTag", "b", {}]]},
+
+{"description":"<Y>",
+"input":"<Y>",
+"output":[["StartTag", "y", {}]]},
+
+{"description":"<Z>",
+"input":"<Z>",
+"output":[["StartTag", "z", {}]]},
+
+{"description":"<[",
+"input":"<[",
+"output":["ParseError", ["Character", "<["]]},
+
+{"description":"<`",
+"input":"<`",
+"output":["ParseError", ["Character", "<`"]]},
+
+{"description":"<a>",
+"input":"<a>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u0000>",
+"input":"<a\u0000>",
+"output":["ParseError", ["StartTag", "a\uFFFD", {}]]},
+
+{"description":"<a\\u0008>",
+"input":"<a\u0008>",
+"output":["ParseError", ["StartTag", "a\u0008", {}]]},
+
+{"description":"<a\\u0009>",
+"input":"<a\u0009>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000A>",
+"input":"<a\u000A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000B>",
+"input":"<a\u000B>",
+"output":["ParseError", ["StartTag", "a\u000B", {}]]},
+
+{"description":"<a\\u000C>",
+"input":"<a\u000C>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u000D>",
+"input":"<a\u000D>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a\\u001F>",
+"input":"<a\u001F>",
+"output":["ParseError", ["StartTag", "a\u001F", {}]]},
+
+{"description":"<a >",
+"input":"<a >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u0000>",
+"input":"<a \u0000>",
+"output":["ParseError", ["StartTag", "a", {"\uFFFD":""}]]},
+
+{"description":"<a \\u0008>",
+"input":"<a \u0008>",
+"output":["ParseError", ["StartTag", "a", {"\u0008":""}]]},
+
+{"description":"<a \\u0009>",
+"input":"<a \u0009>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000A>",
+"input":"<a \u000A>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000B>",
+"input":"<a \u000B>",
+"output":["ParseError", ["StartTag", "a", {"\u000B":""}]]},
+
+{"description":"<a \\u000C>",
+"input":"<a \u000C>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u000D>",
+"input":"<a \u000D>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a \\u001F>",
+"input":"<a \u001F>",
+"output":["ParseError", ["StartTag", "a", {"\u001F":""}]]},
+
+{"description":"<a  >",
+"input":"<a  >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a !>",
+"input":"<a !>",
+"output":[["StartTag", "a", {"!":""}]]},
+
+{"description":"<a \">",
+"input":"<a \">",
+"output":["ParseError", ["StartTag", "a", {"\"":""}]]},
+
+{"description":"<a #>",
+"input":"<a #>",
+"output":[["StartTag", "a", {"#":""}]]},
+
+{"description":"<a &>",
+"input":"<a &>",
+"output":[["StartTag", "a", {"&":""}]]},
+
+{"description":"<a '>",
+"input":"<a '>",
+"output":["ParseError", ["StartTag", "a", {"'":""}]]},
+
+{"description":"<a (>",
+"input":"<a (>",
+"output":[["StartTag", "a", {"(":""}]]},
+
+{"description":"<a ->",
+"input":"<a ->",
+"output":[["StartTag", "a", {"-":""}]]},
+
+{"description":"<a .>",
+"input":"<a .>",
+"output":[["StartTag", "a", {".":""}]]},
+
+{"description":"<a />",
+"input":"<a />",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a 0>",
+"input":"<a 0>",
+"output":[["StartTag", "a", {"0":""}]]},
+
+{"description":"<a 1>",
+"input":"<a 1>",
+"output":[["StartTag", "a", {"1":""}]]},
+
+{"description":"<a 9>",
+"input":"<a 9>",
+"output":[["StartTag", "a", {"9":""}]]},
+
+{"description":"<a <>",
+"input":"<a <>",
+"output":["ParseError", ["StartTag", "a", {"<":""}]]},
+
+{"description":"<a =>",
+"input":"<a =>",
+"output":["ParseError", ["StartTag", "a", {"=":""}]]},
+
+{"description":"<a >",
+"input":"<a >",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a ?>",
+"input":"<a ?>",
+"output":[["StartTag", "a", {"?":""}]]},
+
+{"description":"<a @>",
+"input":"<a @>",
+"output":[["StartTag", "a", {"@":""}]]},
+
+{"description":"<a A>",
+"input":"<a A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a B>",
+"input":"<a B>",
+"output":[["StartTag", "a", {"b":""}]]},
+
+{"description":"<a Y>",
+"input":"<a Y>",
+"output":[["StartTag", "a", {"y":""}]]},
+
+{"description":"<a Z>",
+"input":"<a Z>",
+"output":[["StartTag", "a", {"z":""}]]},
+
+{"description":"<a [>",
+"input":"<a [>",
+"output":[["StartTag", "a", {"[":""}]]},
+
+{"description":"<a `>",
+"input":"<a `>",
+"output":[["StartTag", "a", {"`":""}]]},
+
+{"description":"<a a>",
+"input":"<a a>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u0000>",
+"input":"<a a\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a\uFFFD":""}]]},
+
+{"description":"<a a\\u0008>",
+"input":"<a a\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a\u0008":""}]]},
+
+{"description":"<a a\\u0009>",
+"input":"<a a\u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000A>",
+"input":"<a a\u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000B>",
+"input":"<a a\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a\u000B":""}]]},
+
+{"description":"<a a\\u000C>",
+"input":"<a a\u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u000D>",
+"input":"<a a\u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a\\u001F>",
+"input":"<a a\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a\u001F":""}]]},
+
+{"description":"<a a >",
+"input":"<a a >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u0000>",
+"input":"<a a \u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]},
+
+{"description":"<a a \\u0008>",
+"input":"<a a \u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]},
+
+{"description":"<a a \\u0009>",
+"input":"<a a \u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000A>",
+"input":"<a a \u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000B>",
+"input":"<a a \u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]},
+
+{"description":"<a a \\u000C>",
+"input":"<a a \u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u000D>",
+"input":"<a a \u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a \\u001F>",
+"input":"<a a \u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]},
+
+{"description":"<a a  >",
+"input":"<a a  >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a !>",
+"input":"<a a !>",
+"output":[["StartTag", "a", {"a":"", "!":""}]]},
+
+{"description":"<a a \">",
+"input":"<a a \">",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\"":""}]]},
+
+{"description":"<a a #>",
+"input":"<a a #>",
+"output":[["StartTag", "a", {"a":"", "#":""}]]},
+
+{"description":"<a a &>",
+"input":"<a a &>",
+"output":[["StartTag", "a", {"a":"", "&":""}]]},
+
+{"description":"<a a '>",
+"input":"<a a '>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "'":""}]]},
+
+{"description":"<a a (>",
+"input":"<a a (>",
+"output":[["StartTag", "a", {"a":"", "(":""}]]},
+
+{"description":"<a a ->",
+"input":"<a a ->",
+"output":[["StartTag", "a", {"a":"", "-":""}]]},
+
+{"description":"<a a .>",
+"input":"<a a .>",
+"output":[["StartTag", "a", {"a":"", ".":""}]]},
+
+{"description":"<a a />",
+"input":"<a a />",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a 0>",
+"input":"<a a 0>",
+"output":[["StartTag", "a", {"a":"", "0":""}]]},
+
+{"description":"<a a 1>",
+"input":"<a a 1>",
+"output":[["StartTag", "a", {"a":"", "1":""}]]},
+
+{"description":"<a a 9>",
+"input":"<a a 9>",
+"output":[["StartTag", "a", {"a":"", "9":""}]]},
+
+{"description":"<a a <>",
+"input":"<a a <>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "<":""}]]},
+
+{"description":"<a a =>",
+"input":"<a a =>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a >",
+"input":"<a a >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a ?>",
+"input":"<a a ?>",
+"output":[["StartTag", "a", {"a":"", "?":""}]]},
+
+{"description":"<a a @>",
+"input":"<a a @>",
+"output":[["StartTag", "a", {"a":"", "@":""}]]},
+
+{"description":"<a a A>",
+"input":"<a a A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a B>",
+"input":"<a a B>",
+"output":[["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a Y>",
+"input":"<a a Y>",
+"output":[["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a Z>",
+"input":"<a a Z>",
+"output":[["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a [>",
+"input":"<a a [>",
+"output":[["StartTag", "a", {"a":"", "[":""}]]},
+
+{"description":"<a a `>",
+"input":"<a a `>",
+"output":[["StartTag", "a", {"a":"", "`":""}]]},
+
+{"description":"<a a a>",
+"input":"<a a a>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a b>",
+"input":"<a a b>",
+"output":[["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a y>",
+"input":"<a a y>",
+"output":[["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a z>",
+"input":"<a a z>",
+"output":[["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a {>",
+"input":"<a a {>",
+"output":[["StartTag", "a", {"a":"", "{":""}]]},
+
+{"description":"<a a \\uDBC0\\uDC00>",
+"input":"<a a \uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]},
+
+{"description":"<a a!>",
+"input":"<a a!>",
+"output":[["StartTag", "a", {"a!":""}]]},
+
+{"description":"<a a\">",
+"input":"<a a\">",
+"output":["ParseError", ["StartTag", "a", {"a\"":""}]]},
+
+{"description":"<a a#>",
+"input":"<a a#>",
+"output":[["StartTag", "a", {"a#":""}]]},
+
+{"description":"<a a&>",
+"input":"<a a&>",
+"output":[["StartTag", "a", {"a&":""}]]},
+
+{"description":"<a a'>",
+"input":"<a a'>",
+"output":["ParseError", ["StartTag", "a", {"a'":""}]]},
+
+{"description":"<a a(>",
+"input":"<a a(>",
+"output":[["StartTag", "a", {"a(":""}]]},
+
+{"description":"<a a->",
+"input":"<a a->",
+"output":[["StartTag", "a", {"a-":""}]]},
+
+{"description":"<a a.>",
+"input":"<a a.>",
+"output":[["StartTag", "a", {"a.":""}]]},
+
+{"description":"<a a/>",
+"input":"<a a/>",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a0>",
+"input":"<a a0>",
+"output":[["StartTag", "a", {"a0":""}]]},
+
+{"description":"<a a1>",
+"input":"<a a1>",
+"output":[["StartTag", "a", {"a1":""}]]},
+
+{"description":"<a a9>",
+"input":"<a a9>",
+"output":[["StartTag", "a", {"a9":""}]]},
+
+{"description":"<a a<>",
+"input":"<a a<>",
+"output":["ParseError", ["StartTag", "a", {"a<":""}]]},
+
+{"description":"<a a=>",
+"input":"<a a=>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u0000>",
+"input":"<a a=\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a=\\u0008>",
+"input":"<a a=\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u0008"}]]},
+
+{"description":"<a a=\\u0009>",
+"input":"<a a=\u0009>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000A>",
+"input":"<a a=\u000A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000B>",
+"input":"<a a=\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a=\\u000C>",
+"input":"<a a=\u000C>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u000D>",
+"input":"<a a=\u000D>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\\u001F>",
+"input":"<a a=\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u001F"}]]},
+
+{"description":"<a a= >",
+"input":"<a a= >",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=!>",
+"input":"<a a=!>",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a=\"\">",
+"input":"<a a=\"\">",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\"\\u0000\">",
+"input":"<a a=\"\u0000\">",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a=\"\\u0009\">",
+"input":"<a a=\"\u0009\">",
+"output":[["StartTag", "a", {"a":"\u0009"}]]},
+
+{"description":"<a a=\"\\u000A\">",
+"input":"<a a=\"\u000A\">",
+"output":[["StartTag", "a", {"a":"\u000A"}]]},
+
+{"description":"<a a=\"\\u000B\">",
+"input":"<a a=\"\u000B\">",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a=\"\\u000C\">",
+"input":"<a a=\"\u000C\">",
+"output":[["StartTag", "a", {"a":"\u000C"}]]},
+
+{"description":"<a a=\" \">",
+"input":"<a a=\" \">",
+"output":[["StartTag", "a", {"a":" "}]]},
+
+{"description":"<a a=\"!\">",
+"input":"<a a=\"!\">",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a=\"\">",
+"input":"<a a=\"\">",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=\"#\">",
+"input":"<a a=\"#\">",
+"output":[["StartTag", "a", {"a":"#"}]]},
+
+{"description":"<a a=\"%\">",
+"input":"<a a=\"%\">",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a=\"&\">",
+"input":"<a a=\"&\">",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=\"'\">",
+"input":"<a a=\"'\">",
+"output":[["StartTag", "a", {"a":"'"}]]},
+
+{"description":"<a a=\"-\">",
+"input":"<a a=\"-\">",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a=\"/\">",
+"input":"<a a=\"/\">",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a=\"0\">",
+"input":"<a a=\"0\">",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a=\"1\">",
+"input":"<a a=\"1\">",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a=\"9\">",
+"input":"<a a=\"9\">",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a=\"<\">",
+"input":"<a a=\"<\">",
+"output":[["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a=\"=\">",
+"input":"<a a=\"=\">",
+"output":[["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a=\">\">",
+"input":"<a a=\">\">",
+"output":[["StartTag", "a", {"a":">"}]]},
+
+{"description":"<a a=\"?\">",
+"input":"<a a=\"?\">",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a=\"@\">",
+"input":"<a a=\"@\">",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a=\"A\">",
+"input":"<a a=\"A\">",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a=\"B\">",
+"input":"<a a=\"B\">",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a=\"Y\">",
+"input":"<a a=\"Y\">",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a=\"Z\">",
+"input":"<a a=\"Z\">",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a=\"`\">",
+"input":"<a a=\"`\">",
+"output":[["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a=\"a\">",
+"input":"<a a=\"a\">",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=\"b\">",
+"input":"<a a=\"b\">",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a=\"y\">",
+"input":"<a a=\"y\">",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a=\"z\">",
+"input":"<a a=\"z\">",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a=\"{\">",
+"input":"<a a=\"{\">",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a=\"\\uDBC0\\uDC00\">",
+"input":"<a a=\"\uDBC0\uDC00\">",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a=#>",
+"input":"<a a=#>",
+"output":[["StartTag", "a", {"a":"#"}]]},
+
+{"description":"<a a=%>",
+"input":"<a a=%>",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a=&>",
+"input":"<a a=&>",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a='\\u0000'>",
+"input":"<a a='\u0000'>",
+"output":["ParseError", ["StartTag", "a", {"a":"\uFFFD"}]]},
+
+{"description":"<a a='\\u0009'>",
+"input":"<a a='\u0009'>",
+"output":[["StartTag", "a", {"a":"\u0009"}]]},
+
+{"description":"<a a='\\u000A'>",
+"input":"<a a='\u000A'>",
+"output":[["StartTag", "a", {"a":"\u000A"}]]},
+
+{"description":"<a a='\\u000B'>",
+"input":"<a a='\u000B'>",
+"output":["ParseError", ["StartTag", "a", {"a":"\u000B"}]]},
+
+{"description":"<a a='\\u000C'>",
+"input":"<a a='\u000C'>",
+"output":[["StartTag", "a", {"a":"\u000C"}]]},
+
+{"description":"<a a=' '>",
+"input":"<a a=' '>",
+"output":[["StartTag", "a", {"a":" "}]]},
+
+{"description":"<a a='!'>",
+"input":"<a a='!'>",
+"output":[["StartTag", "a", {"a":"!"}]]},
+
+{"description":"<a a='\"'>",
+"input":"<a a='\"'>",
+"output":[["StartTag", "a", {"a":"\""}]]},
+
+{"description":"<a a='%'>",
+"input":"<a a='%'>",
+"output":[["StartTag", "a", {"a":"%"}]]},
+
+{"description":"<a a='&'>",
+"input":"<a a='&'>",
+"output":[["StartTag", "a", {"a":"&"}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u0000>",
+"input":"<a a=''\u0000>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\uFFFD":""}]]},
+
+{"description":"<a a=''\\u0008>",
+"input":"<a a=''\u0008>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u0008":""}]]},
+
+{"description":"<a a=''\\u0009>",
+"input":"<a a=''\u0009>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000A>",
+"input":"<a a=''\u000A>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000B>",
+"input":"<a a=''\u000B>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u000B":""}]]},
+
+{"description":"<a a=''\\u000C>",
+"input":"<a a=''\u000C>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u000D>",
+"input":"<a a=''\u000D>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''\\u001F>",
+"input":"<a a=''\u001F>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\u001F":""}]]},
+
+{"description":"<a a='' >",
+"input":"<a a='' >",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''!>",
+"input":"<a a=''!>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "!":""}]]},
+
+{"description":"<a a=''\">",
+"input":"<a a=''\">",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "\"":""}]]},
+
+{"description":"<a a=''&>",
+"input":"<a a=''&>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "&":""}]]},
+
+{"description":"<a a='''>",
+"input":"<a a='''>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "'":""}]]},
+
+{"description":"<a a=''->",
+"input":"<a a=''->",
+"output":["ParseError", ["StartTag", "a", {"a":"", "-":""}]]},
+
+{"description":"<a a=''.>",
+"input":"<a a=''.>",
+"output":["ParseError", ["StartTag", "a", {"a":"", ".":""}]]},
+
+{"description":"<a a=''/>",
+"input":"<a a=''/>",
+"output":[["StartTag", "a", {"a":""}, true]]},
+
+{"description":"<a a=''0>",
+"input":"<a a=''0>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "0":""}]]},
+
+{"description":"<a a=''1>",
+"input":"<a a=''1>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "1":""}]]},
+
+{"description":"<a a=''9>",
+"input":"<a a=''9>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "9":""}]]},
+
+{"description":"<a a=''<>",
+"input":"<a a=''<>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "<":""}]]},
+
+{"description":"<a a=''=>",
+"input":"<a a=''=>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":"", "=":""}]]},
+
+{"description":"<a a=''>",
+"input":"<a a=''>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''?>",
+"input":"<a a=''?>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "?":""}]]},
+
+{"description":"<a a=''@>",
+"input":"<a a=''@>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "@":""}]]},
+
+{"description":"<a a=''A>",
+"input":"<a a=''A>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''B>",
+"input":"<a a=''B>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a=''Y>",
+"input":"<a a=''Y>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a=''Z>",
+"input":"<a a=''Z>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a=''`>",
+"input":"<a a=''`>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "`":""}]]},
+
+{"description":"<a a=''a>",
+"input":"<a a=''a>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=''b>",
+"input":"<a a=''b>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "b":""}]]},
+
+{"description":"<a a=''y>",
+"input":"<a a=''y>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "y":""}]]},
+
+{"description":"<a a=''z>",
+"input":"<a a=''z>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "z":""}]]},
+
+{"description":"<a a=''{>",
+"input":"<a a=''{>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "{":""}]]},
+
+{"description":"<a a=''\\uDBC0\\uDC00>",
+"input":"<a a=''\uDBC0\uDC00>",
+"output":["ParseError", ["StartTag", "a", {"a":"", "\uDBC0\uDC00":""}]]},
+
+{"description":"<a a='('>",
+"input":"<a a='('>",
+"output":[["StartTag", "a", {"a":"("}]]},
+
+{"description":"<a a='-'>",
+"input":"<a a='-'>",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a='/'>",
+"input":"<a a='/'>",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a='0'>",
+"input":"<a a='0'>",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a='1'>",
+"input":"<a a='1'>",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a='9'>",
+"input":"<a a='9'>",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a='<'>",
+"input":"<a a='<'>",
+"output":[["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a='='>",
+"input":"<a a='='>",
+"output":[["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a='>'>",
+"input":"<a a='>'>",
+"output":[["StartTag", "a", {"a":">"}]]},
+
+{"description":"<a a='?'>",
+"input":"<a a='?'>",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a='@'>",
+"input":"<a a='@'>",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a='A'>",
+"input":"<a a='A'>",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a='B'>",
+"input":"<a a='B'>",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a='Y'>",
+"input":"<a a='Y'>",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a='Z'>",
+"input":"<a a='Z'>",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a='`'>",
+"input":"<a a='`'>",
+"output":[["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a='a'>",
+"input":"<a a='a'>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a='b'>",
+"input":"<a a='b'>",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a='y'>",
+"input":"<a a='y'>",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a='z'>",
+"input":"<a a='z'>",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a='{'>",
+"input":"<a a='{'>",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a='\\uDBC0\\uDC00'>",
+"input":"<a a='\uDBC0\uDC00'>",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a=(>",
+"input":"<a a=(>",
+"output":[["StartTag", "a", {"a":"("}]]},
+
+{"description":"<a a=->",
+"input":"<a a=->",
+"output":[["StartTag", "a", {"a":"-"}]]},
+
+{"description":"<a a=/>",
+"input":"<a a=/>",
+"output":[["StartTag", "a", {"a":"/"}]]},
+
+{"description":"<a a=0>",
+"input":"<a a=0>",
+"output":[["StartTag", "a", {"a":"0"}]]},
+
+{"description":"<a a=1>",
+"input":"<a a=1>",
+"output":[["StartTag", "a", {"a":"1"}]]},
+
+{"description":"<a a=9>",
+"input":"<a a=9>",
+"output":[["StartTag", "a", {"a":"9"}]]},
+
+{"description":"<a a=<>",
+"input":"<a a=<>",
+"output":["ParseError", ["StartTag", "a", {"a":"<"}]]},
+
+{"description":"<a a==>",
+"input":"<a a==>",
+"output":["ParseError", ["StartTag", "a", {"a":"="}]]},
+
+{"description":"<a a=>",
+"input":"<a a=>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a=?>",
+"input":"<a a=?>",
+"output":[["StartTag", "a", {"a":"?"}]]},
+
+{"description":"<a a=@>",
+"input":"<a a=@>",
+"output":[["StartTag", "a", {"a":"@"}]]},
+
+{"description":"<a a=A>",
+"input":"<a a=A>",
+"output":[["StartTag", "a", {"a":"A"}]]},
+
+{"description":"<a a=B>",
+"input":"<a a=B>",
+"output":[["StartTag", "a", {"a":"B"}]]},
+
+{"description":"<a a=Y>",
+"input":"<a a=Y>",
+"output":[["StartTag", "a", {"a":"Y"}]]},
+
+{"description":"<a a=Z>",
+"input":"<a a=Z>",
+"output":[["StartTag", "a", {"a":"Z"}]]},
+
+{"description":"<a a=`>",
+"input":"<a a=`>",
+"output":["ParseError", ["StartTag", "a", {"a":"`"}]]},
+
+{"description":"<a a=a>",
+"input":"<a a=a>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u0000>",
+"input":"<a a=a\u0000>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\uFFFD"}]]},
+
+{"description":"<a a=a\\u0008>",
+"input":"<a a=a\u0008>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u0008"}]]},
+
+{"description":"<a a=a\\u0009>",
+"input":"<a a=a\u0009>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000A>",
+"input":"<a a=a\u000A>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000B>",
+"input":"<a a=a\u000B>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u000B"}]]},
+
+{"description":"<a a=a\\u000C>",
+"input":"<a a=a\u000C>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u000D>",
+"input":"<a a=a\u000D>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a\\u001F>",
+"input":"<a a=a\u001F>",
+"output":["ParseError", ["StartTag", "a", {"a":"a\u001F"}]]},
+
+{"description":"<a a=a >",
+"input":"<a a=a >",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a!>",
+"input":"<a a=a!>",
+"output":[["StartTag", "a", {"a":"a!"}]]},
+
+{"description":"<a a=a\">",
+"input":"<a a=a\">",
+"output":["ParseError", ["StartTag", "a", {"a":"a\""}]]},
+
+{"description":"<a a=a#>",
+"input":"<a a=a#>",
+"output":[["StartTag", "a", {"a":"a#"}]]},
+
+{"description":"<a a=a%>",
+"input":"<a a=a%>",
+"output":[["StartTag", "a", {"a":"a%"}]]},
+
+{"description":"<a a=a&>",
+"input":"<a a=a&>",
+"output":[["StartTag", "a", {"a":"a&"}]]},
+
+{"description":"<a a=a'>",
+"input":"<a a=a'>",
+"output":["ParseError", ["StartTag", "a", {"a":"a'"}]]},
+
+{"description":"<a a=a(>",
+"input":"<a a=a(>",
+"output":[["StartTag", "a", {"a":"a("}]]},
+
+{"description":"<a a=a->",
+"input":"<a a=a->",
+"output":[["StartTag", "a", {"a":"a-"}]]},
+
+{"description":"<a a=a/>",
+"input":"<a a=a/>",
+"output":[["StartTag", "a", {"a":"a/"}]]},
+
+{"description":"<a a=a0>",
+"input":"<a a=a0>",
+"output":[["StartTag", "a", {"a":"a0"}]]},
+
+{"description":"<a a=a1>",
+"input":"<a a=a1>",
+"output":[["StartTag", "a", {"a":"a1"}]]},
+
+{"description":"<a a=a9>",
+"input":"<a a=a9>",
+"output":[["StartTag", "a", {"a":"a9"}]]},
+
+{"description":"<a a=a<>",
+"input":"<a a=a<>",
+"output":["ParseError", ["StartTag", "a", {"a":"a<"}]]},
+
+{"description":"<a a=a=>",
+"input":"<a a=a=>",
+"output":["ParseError", ["StartTag", "a", {"a":"a="}]]},
+
+{"description":"<a a=a>",
+"input":"<a a=a>",
+"output":[["StartTag", "a", {"a":"a"}]]},
+
+{"description":"<a a=a?>",
+"input":"<a a=a?>",
+"output":[["StartTag", "a", {"a":"a?"}]]},
+
+{"description":"<a a=a@>",
+"input":"<a a=a@>",
+"output":[["StartTag", "a", {"a":"a@"}]]},
+
+{"description":"<a a=aA>",
+"input":"<a a=aA>",
+"output":[["StartTag", "a", {"a":"aA"}]]},
+
+{"description":"<a a=aB>",
+"input":"<a a=aB>",
+"output":[["StartTag", "a", {"a":"aB"}]]},
+
+{"description":"<a a=aY>",
+"input":"<a a=aY>",
+"output":[["StartTag", "a", {"a":"aY"}]]},
+
+{"description":"<a a=aZ>",
+"input":"<a a=aZ>",
+"output":[["StartTag", "a", {"a":"aZ"}]]},
+
+{"description":"<a a=a`>",
+"input":"<a a=a`>",
+"output":["ParseError", ["StartTag", "a", {"a":"a`"}]]},
+
+{"description":"<a a=aa>",
+"input":"<a a=aa>",
+"output":[["StartTag", "a", {"a":"aa"}]]},
+
+{"description":"<a a=ab>",
+"input":"<a a=ab>",
+"output":[["StartTag", "a", {"a":"ab"}]]},
+
+{"description":"<a a=ay>",
+"input":"<a a=ay>",
+"output":[["StartTag", "a", {"a":"ay"}]]},
+
+{"description":"<a a=az>",
+"input":"<a a=az>",
+"output":[["StartTag", "a", {"a":"az"}]]},
+
+{"description":"<a a=a{>",
+"input":"<a a=a{>",
+"output":[["StartTag", "a", {"a":"a{"}]]},
+
+{"description":"<a a=a\\uDBC0\\uDC00>",
+"input":"<a a=a\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"a\uDBC0\uDC00"}]]},
+
+{"description":"<a a=b>",
+"input":"<a a=b>",
+"output":[["StartTag", "a", {"a":"b"}]]},
+
+{"description":"<a a=y>",
+"input":"<a a=y>",
+"output":[["StartTag", "a", {"a":"y"}]]},
+
+{"description":"<a a=z>",
+"input":"<a a=z>",
+"output":[["StartTag", "a", {"a":"z"}]]},
+
+{"description":"<a a={>",
+"input":"<a a={>",
+"output":[["StartTag", "a", {"a":"{"}]]},
+
+{"description":"<a a=\\uDBC0\\uDC00>",
+"input":"<a a=\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a":"\uDBC0\uDC00"}]]},
+
+{"description":"<a a>",
+"input":"<a a>",
+"output":[["StartTag", "a", {"a":""}]]},
+
+{"description":"<a a?>",
+"input":"<a a?>",
+"output":[["StartTag", "a", {"a?":""}]]},
+
+{"description":"<a a@>",
+"input":"<a a@>",
+"output":[["StartTag", "a", {"a@":""}]]},
+
+{"description":"<a aA>",
+"input":"<a aA>",
+"output":[["StartTag", "a", {"aa":""}]]},
+
+{"description":"<a aB>",
+"input":"<a aB>",
+"output":[["StartTag", "a", {"ab":""}]]},
+
+{"description":"<a aY>",
+"input":"<a aY>",
+"output":[["StartTag", "a", {"ay":""}]]},
+
+{"description":"<a aZ>",
+"input":"<a aZ>",
+"output":[["StartTag", "a", {"az":""}]]},
+
+{"description":"<a a[>",
+"input":"<a a[>",
+"output":[["StartTag", "a", {"a[":""}]]},
+
+{"description":"<a a`>",
+"input":"<a a`>",
+"output":[["StartTag", "a", {"a`":""}]]},
+
+{"description":"<a aa>",
+"input":"<a aa>",
+"output":[["StartTag", "a", {"aa":""}]]},
+
+{"description":"<a ab>",
+"input":"<a ab>",
+"output":[["StartTag", "a", {"ab":""}]]},
+
+{"description":"<a ay>",
+"input":"<a ay>",
+"output":[["StartTag", "a", {"ay":""}]]},
+
+{"description":"<a az>",
+"input":"<a az>",
+"output":[["StartTag", "a", {"az":""}]]},
+
+{"description":"<a a{>",
+"input":"<a a{>",
+"output":[["StartTag", "a", {"a{":""}]]},
+
+{"description":"<a a\\uDBC0\\uDC00>",
+"input":"<a a\uDBC0\uDC00>",
+"output":[["StartTag", "a", {"a\uDBC0\uDC00":""}]]},
+
+{"description":"<a b>",
+"input":"<a b>",
+"output":[["StartTag", "a", {"b":""}]]},
+
+{"description":"<a y>",
+"input":"<a y>",
+"output":[["StartTag", "a", {"y":""}]]},
+
+{"description":"<a z>",
+"input":"<a z>",
+"output":[["StartTag", "a", {"z":""}]]},
+
+{"description":"<a {>",
+"input":"<a {>",
+"output":[["StartTag", "a", {"{":""}]]},
+
+{"description":"<a \\uDBC0\\uDC00>",
+"input":"<a \uDBC0\uDC00>",
+"output":[["StartTag", "a", {"\uDBC0\uDC00":""}]]},
+
+{"description":"<a!>",
+"input":"<a!>",
+"output":[["StartTag", "a!", {}]]},
+
+{"description":"<a\">",
+"input":"<a\">",
+"output":[["StartTag", "a\"", {}]]},
+
+{"description":"<a&>",
+"input":"<a&>",
+"output":[["StartTag", "a&", {}]]},
+
+{"description":"<a'>",
+"input":"<a'>",
+"output":[["StartTag", "a'", {}]]},
+
+{"description":"<a->",
+"input":"<a->",
+"output":[["StartTag", "a-", {}]]},
+
+{"description":"<a.>",
+"input":"<a.>",
+"output":[["StartTag", "a.", {}]]},
+
+{"description":"<a/>",
+"input":"<a/>",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a/\\u0000>",
+"input":"<a/\u0000>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\uFFFD":""}]]},
+
+{"description":"<a/\\u0009>",
+"input":"<a/\u0009>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/\\u000A>",
+"input":"<a/\u000A>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/\\u000B>",
+"input":"<a/\u000B>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\u000B":""}]]},
+
+{"description":"<a/\\u000C>",
+"input":"<a/\u000C>",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/ >",
+"input":"<a/ >",
+"output":["ParseError", ["StartTag", "a", {}]]},
+
+{"description":"<a/!>",
+"input":"<a/!>",
+"output":["ParseError", ["StartTag", "a", {"!":""}]]},
+
+{"description":"<a/\">",
+"input":"<a/\">",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"\"":""}]]},
+
+{"description":"<a/&>",
+"input":"<a/&>",
+"output":["ParseError", ["StartTag", "a", {"&":""}]]},
+
+{"description":"<a/'>",
+"input":"<a/'>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"'":""}]]},
+
+{"description":"<a/->",
+"input":"<a/->",
+"output":["ParseError", ["StartTag", "a", {"-":""}]]},
+
+{"description":"<a//>",
+"input":"<a//>",
+"output":["ParseError", ["StartTag", "a", {}, true]]},
+
+{"description":"<a/0>",
+"input":"<a/0>",
+"output":["ParseError", ["StartTag", "a", {"0":""}]]},
+
+{"description":"<a/1>",
+"input":"<a/1>",
+"output":["ParseError", ["StartTag", "a", {"1":""}]]},
+
+{"description":"<a/9>",
+"input":"<a/9>",
+"output":["ParseError", ["StartTag", "a", {"9":""}]]},
+
+{"description":"<a/<>",
+"input":"<a/<>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"<":""}]]},
+
+{"description":"<a/=>",
+"input":"<a/=>",
+"output":["ParseError", "ParseError", ["StartTag", "a", {"=":""}]]},
+
+{"description":"<a/>",
+"input":"<a/>",
+"output":[["StartTag", "a", {}, true]]},
+
+{"description":"<a/?>",
+"input":"<a/?>",
+"output":["ParseError", ["StartTag", "a", {"?":""}]]},
+
+{"description":"<a/@>",
+"input":"<a/@>",
+"output":["ParseError", ["StartTag", "a", {"@":""}]]},
+
+{"description":"<a/A>",
+"input":"<a/A>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a/B>",
+"input":"<a/B>",
+"output":["ParseError", ["StartTag", "a", {"b":""}]]},
+
+{"description":"<a/Y>",
+"input":"<a/Y>",
+"output":["ParseError", ["StartTag", "a", {"y":""}]]},
+
+{"description":"<a/Z>",
+"input":"<a/Z>",
+"output":["ParseError", ["StartTag", "a", {"z":""}]]},
+
+{"description":"<a/`>",
+"input":"<a/`>",
+"output":["ParseError", ["StartTag", "a", {"`":""}]]},
+
+{"description":"<a/a>",
+"input":"<a/a>",
+"output":["ParseError", ["StartTag", "a", {"a":""}]]},
+
+{"description":"<a/b>",
+"input":"<a/b>",
+"output":["ParseError", ["StartTag", "a", {"b":""}]]},
+
+{"description":"<a/y>",
+"input":"<a/y>",
+"output":["ParseError", ["StartTag", "a", {"y":""}]]},
+
+{"description":"<a/z>",
+"input":"<a/z>",
+"output":["ParseError", ["StartTag", "a", {"z":""}]]},
+
+{"description":"<a/{>",
+"input":"<a/{>",
+"output":["ParseError", ["StartTag", "a", {"{":""}]]},
+
+{"description":"<a/\\uDBC0\\uDC00>",
+"input":"<a/\uDBC0\uDC00>",
+"output":["ParseError", ["StartTag", "a", {"\uDBC0\uDC00":""}]]},
+
+{"description":"<a0>",
+"input":"<a0>",
+"output":[["StartTag", "a0", {}]]},
+
+{"description":"<a1>",
+"input":"<a1>",
+"output":[["StartTag", "a1", {}]]},
+
+{"description":"<a9>",
+"input":"<a9>",
+"output":[["StartTag", "a9", {}]]},
+
+{"description":"<a<>",
+"input":"<a<>",
+"output":[["StartTag", "a<", {}]]},
+
+{"description":"<a=>",
+"input":"<a=>",
+"output":[["StartTag", "a=", {}]]},
+
+{"description":"<a>",
+"input":"<a>",
+"output":[["StartTag", "a", {}]]},
+
+{"description":"<a?>",
+"input":"<a?>",
+"output":[["StartTag", "a?", {}]]},
+
+{"description":"<a@>",
+"input":"<a@>",
+"output":[["StartTag", "a@", {}]]},
+
+{"description":"<aA>",
+"input":"<aA>",
+"output":[["StartTag", "aa", {}]]},
+
+{"description":"<aB>",
+"input":"<aB>",
+"output":[["StartTag", "ab", {}]]},
+
+{"description":"<aY>",
+"input":"<aY>",
+"output":[["StartTag", "ay", {}]]},
+
+{"description":"<aZ>",
+"input":"<aZ>",
+"output":[["StartTag", "az", {}]]},
+
+{"description":"<a[>",
+"input":"<a[>",
+"output":[["StartTag", "a[", {}]]},
+
+{"description":"<a`>",
+"input":"<a`>",
+"output":[["StartTag", "a`", {}]]},
+
+{"description":"<aa>",
+"input":"<aa>",
+"output":[["StartTag", "aa", {}]]},
+
+{"description":"<ab>",
+"input":"<ab>",
+"output":[["StartTag", "ab", {}]]},
+
+{"description":"<ay>",
+"input":"<ay>",
+"output":[["StartTag", "ay", {}]]},
+
+{"description":"<az>",
+"input":"<az>",
+"output":[["StartTag", "az", {}]]},
+
+{"description":"<a{>",
+"input":"<a{>",
+"output":[["StartTag", "a{", {}]]},
+
+{"description":"<a\\uDBC0\\uDC00>",
+"input":"<a\uDBC0\uDC00>",
+"output":[["StartTag", "a\uDBC0\uDC00", {}]]},
+
+{"description":"<b>",
+"input":"<b>",
+"output":[["StartTag", "b", {}]]},
+
+{"description":"<y>",
+"input":"<y>",
+"output":[["StartTag", "y", {}]]},
+
+{"description":"<z>",
+"input":"<z>",
+"output":[["StartTag", "z", {}]]},
+
+{"description":"<{",
+"input":"<{",
+"output":["ParseError", ["Character", "<{"]]},
+
+{"description":"<\\uDBC0\\uDC00",
+"input":"<\uDBC0\uDC00",
+"output":["ParseError", ["Character", "<\uDBC0\uDC00"]]},
+
+{"description":"=",
+"input":"=",
+"output":[["Character", "="]]},
+
+{"description":">",
+"input":">",
+"output":[["Character", ">"]]},
+
+{"description":"?",
+"input":"?",
+"output":[["Character", "?"]]},
+
+{"description":"@",
+"input":"@",
+"output":[["Character", "@"]]},
+
+{"description":"A",
+"input":"A",
+"output":[["Character", "A"]]},
+
+{"description":"B",
+"input":"B",
+"output":[["Character", "B"]]},
+
+{"description":"Y",
+"input":"Y",
+"output":[["Character", "Y"]]},
+
+{"description":"Z",
+"input":"Z",
+"output":[["Character", "Z"]]},
+
+{"description":"`",
+"input":"`",
+"output":[["Character", "`"]]},
+
+{"description":"a",
+"input":"a",
+"output":[["Character", "a"]]},
+
+{"description":"b",
+"input":"b",
+"output":[["Character", "b"]]},
+
+{"description":"y",
+"input":"y",
+"output":[["Character", "y"]]},
+
+{"description":"z",
+"input":"z",
+"output":[["Character", "z"]]},
+
+{"description":"{",
+"input":"{",
+"output":[["Character", "{"]]},
+
+{"description":"\\uDBC0\\uDC00",
+"input":"\uDBC0\uDC00",
+"output":[["Character", "\uDBC0\uDC00"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/test4.test b/libs/html5lib/tests/testdata/tokenizer/test4.test
new file mode 100644
index 000000000..4be94b0c7
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/test4.test
@@ -0,0 +1,344 @@
+{"tests": [
+
+{"description":"< in attribute name",
+"input":"<z/0  <>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"0": "", "<": ""}]]},
+
+{"description":"< in attribute value",
+"input":"<z x=<>",
+"output":["ParseError", ["StartTag", "z", {"x": "<"}]]},
+
+{"description":"= in unquoted attribute value",
+"input":"<z z=z=z>",
+"output":["ParseError", ["StartTag", "z", {"z": "z=z"}]]},
+
+{"description":"= attribute",
+"input":"<z =>",
+"output":["ParseError", ["StartTag", "z", {"=": ""}]]},
+
+{"description":"== attribute",
+"input":"<z ==>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"=": ""}]]},
+
+{"description":"=== attribute",
+"input":"<z ===>",
+"output":["ParseError", "ParseError", ["StartTag", "z", {"=": "="}]]},
+
+{"description":"==== attribute",
+"input":"<z ====>",
+"output":["ParseError", "ParseError", "ParseError", ["StartTag", "z", {"=": "=="}]]},
+
+{"description":"\" after ampersand in double-quoted attribute value",
+"input":"<z z=\"&\">",
+"output":[["StartTag", "z", {"z": "&"}]]},
+
+{"description":"' after ampersand in double-quoted attribute value",
+"input":"<z z=\"&'\">",
+"output":[["StartTag", "z", {"z": "&'"}]]},
+
+{"description":"' after ampersand in single-quoted attribute value",
+"input":"<z z='&'>",
+"output":[["StartTag", "z", {"z": "&"}]]},
+
+{"description":"\" after ampersand in single-quoted attribute value",
+"input":"<z z='&\"'>",
+"output":[["StartTag", "z", {"z": "&\""}]]},
+
+{"description":"Text after bogus character reference",
+"input":"<z z='&xlink_xmlns;'>bar<z>",
+"output":[["StartTag","z",{"z":"&xlink_xmlns;"}],["Character","bar"],["StartTag","z",{}]]},
+
+{"description":"Text after hex character reference",
+"input":"<z z='&#x0020; foo'>bar<z>",
+"output":[["StartTag","z",{"z":"  foo"}],["Character","bar"],["StartTag","z",{}]]},
+
+{"description":"Attribute name starting with \"",
+"input":"<foo \"='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"\"": "bar"}]]},
+
+{"description":"Attribute name starting with '",
+"input":"<foo '='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"'": "bar"}]]},
+
+{"description":"Attribute name containing \"",
+"input":"<foo a\"b='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"a\"b": "bar"}]]},
+
+{"description":"Attribute name containing '",
+"input":"<foo a'b='bar'>",
+"output":["ParseError", ["StartTag", "foo", {"a'b": "bar"}]]},
+
+{"description":"Unquoted attribute value containing '",
+"input":"<foo a=b'c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b'c"}]]},
+
+{"description":"Unquoted attribute value containing \"",
+"input":"<foo a=b\"c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b\"c"}]]},
+
+{"description":"Double-quoted attribute value not followed by whitespace",
+"input":"<foo a=\"b\"c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]},
+
+{"description":"Single-quoted attribute value not followed by whitespace",
+"input":"<foo a='b'c>",
+"output":["ParseError", ["StartTag", "foo", {"a": "b", "c": ""}]]},
+
+{"description":"Quoted attribute followed by permitted /",
+"input":"<br a='b'/>",
+"output":[["StartTag","br",{"a":"b"},true]]},
+
+{"description":"Quoted attribute followed by non-permitted /",
+"input":"<bar a='b'/>",
+"output":[["StartTag","bar",{"a":"b"},true]]},
+
+{"description":"CR EOF after doctype name",
+"input":"<!doctype html \r",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"CR EOF in tag name",
+"input":"<z\r",
+"output":["ParseError"]},
+
+{"description":"Slash EOF in tag name",
+"input":"<z/",
+"output":["ParseError"]},
+
+{"description":"Zero hex numeric entity",
+"input":"&#x0",
+"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Zero decimal numeric entity",
+"input":"&#0",
+"output":["ParseError", "ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Zero-prefixed hex numeric entity",
+"input":"&#x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041;",
+"output":[["Character", "A"]]},
+
+{"description":"Zero-prefixed decimal numeric entity",
+"input":"&#000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000065;",
+"output":[["Character", "A"]]},
+
+{"description":"Empty hex numeric entities",
+"input":"&#x &#X ",
+"output":["ParseError", ["Character", "&#x "], "ParseError", ["Character", "&#X "]]},
+
+{"description":"Empty decimal numeric entities",
+"input":"&# &#; ",
+"output":["ParseError", ["Character", "&# "], "ParseError", ["Character", "&#; "]]},
+
+{"description":"Non-BMP numeric entity",
+"input":"&#x10000;",
+"output":[["Character", "\uD800\uDC00"]]},
+
+{"description":"Maximum non-BMP numeric entity",
+"input":"&#X10FFFF;",
+"output":["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description":"Above maximum numeric entity",
+"input":"&#x110000;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"32-bit hex numeric entity",
+"input":"&#x80000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"33-bit hex numeric entity",
+"input":"&#x100000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"33-bit decimal numeric entity",
+"input":"&#4294967361;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"65-bit hex numeric entity",
+"input":"&#x10000000000000041;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"65-bit decimal numeric entity",
+"input":"&#18446744073709551681;",
+"output":["ParseError", ["Character", "\uFFFD"]]},
+
+{"description":"Surrogate code point edge cases",
+"input":"&#xD7FF;&#xD800;&#xD801;&#xDFFE;&#xDFFF;&#xE000;",
+"output":[["Character", "\uD7FF"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD"], "ParseError", ["Character", "\uFFFD\uE000"]]},
+
+{"description":"Uppercase start tag name",
+"input":"<X>",
+"output":[["StartTag", "x", {}]]},
+
+{"description":"Uppercase end tag name",
+"input":"</X>",
+"output":[["EndTag", "x"]]},
+
+{"description":"Uppercase attribute name",
+"input":"<x X>",
+"output":[["StartTag", "x", { "x":"" }]]},
+
+{"description":"Tag/attribute name case edge values",
+"input":"<x@AZ[`az{ @AZ[`az{>",
+"output":[["StartTag", "x@az[`az{", { "@az[`az{":"" }]]},
+
+{"description":"Duplicate different-case attributes",
+"input":"<x x=1 x=2 X=3>",
+"output":["ParseError", "ParseError", ["StartTag", "x", { "x":"1" }]]},
+
+{"description":"Uppercase close tag attributes",
+"input":"</x X>",
+"output":["ParseError", ["EndTag", "x"]]},
+
+{"description":"Duplicate close tag attributes",
+"input":"</x x x>",
+"output":["ParseError", "ParseError", ["EndTag", "x"]]},
+
+{"description":"Permitted slash",
+"input":"<br/>",
+"output":[["StartTag","br",{},true]]},
+
+{"description":"Non-permitted slash",
+"input":"<xr/>",
+"output":[["StartTag","xr",{},true]]},
+
+{"description":"Permitted slash but in close tag",
+"input":"</br/>",
+"output":["ParseError", ["EndTag", "br"]]},
+
+{"description":"Doctype public case-sensitivity (1)",
+"input":"<!DoCtYpE HtMl PuBlIc \"AbC\" \"XyZ\">",
+"output":[["DOCTYPE", "html", "AbC", "XyZ", true]]},
+
+{"description":"Doctype public case-sensitivity (2)",
+"input":"<!dOcTyPe hTmL pUbLiC \"aBc\" \"xYz\">",
+"output":[["DOCTYPE", "html", "aBc", "xYz", true]]},
+
+{"description":"Doctype system case-sensitivity (1)",
+"input":"<!DoCtYpE HtMl SyStEm \"XyZ\">",
+"output":[["DOCTYPE", "html", null, "XyZ", true]]},
+
+{"description":"Doctype system case-sensitivity (2)",
+"input":"<!dOcTyPe hTmL sYsTeM \"xYz\">",
+"output":[["DOCTYPE", "html", null, "xYz", true]]},
+
+{"description":"U+0000 in lookahead region after non-matching character",
+"input":"<!doc>\u0000",
+"output":["ParseError", ["Comment", "doc"], "ParseError", ["Character", "\u0000"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+0000 in lookahead region",
+"input":"<!doc\u0000",
+"output":["ParseError", ["Comment", "doc\uFFFD"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+0080 in lookahead region",
+"input":"<!doc\u0080",
+"output":["ParseError", "ParseError", ["Comment", "doc\u0080"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+FDD1 in lookahead region",
+"input":"<!doc\uFDD1",
+"output":["ParseError", "ParseError", ["Comment", "doc\uFDD1"]],
+"ignoreErrorOrder":true},
+
+{"description":"U+1FFFF in lookahead region",
+"input":"<!doc\uD83F\uDFFF",
+"output":["ParseError", "ParseError", ["Comment", "doc\uD83F\uDFFF"]],
+"ignoreErrorOrder":true},
+
+{"description":"CR followed by non-LF",
+"input":"\r?",
+"output":[["Character", "\n?"]]},
+
+{"description":"CR at EOF",
+"input":"\r",
+"output":[["Character", "\n"]]},
+
+{"description":"LF at EOF",
+"input":"\n",
+"output":[["Character", "\n"]]},
+
+{"description":"CR LF",
+"input":"\r\n",
+"output":[["Character", "\n"]]},
+
+{"description":"CR CR",
+"input":"\r\r",
+"output":[["Character", "\n\n"]]},
+
+{"description":"LF LF",
+"input":"\n\n",
+"output":[["Character", "\n\n"]]},
+
+{"description":"LF CR",
+"input":"\n\r",
+"output":[["Character", "\n\n"]]},
+
+{"description":"text CR CR CR text",
+"input":"text\r\r\rtext",
+"output":[["Character", "text\n\n\ntext"]]},
+
+{"description":"Doctype publik",
+"input":"<!DOCTYPE html PUBLIK \"AbC\" \"XyZ\">",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype publi",
+"input":"<!DOCTYPE html PUBLI",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype sistem",
+"input":"<!DOCTYPE html SISTEM \"AbC\">",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype sys",
+"input":"<!DOCTYPE html SYS",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false]]},
+
+{"description":"Doctype html x>text",
+"input":"<!DOCTYPE html x>text",
+"output":["ParseError", ["DOCTYPE", "html", null, null, false], ["Character", "text"]]},
+
+{"description":"Grave accent in unquoted attribute",
+"input":"<a a=aa`>",
+"output":["ParseError", ["StartTag", "a", {"a":"aa`"}]]},
+
+{"description":"EOF in tag name state ",
+"input":"<a",
+"output":["ParseError"]},
+
+{"description":"EOF in tag name state",
+"input":"<a",
+"output":["ParseError"]},
+
+{"description":"EOF in before attribute name state",
+"input":"<a ",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute name state",
+"input":"<a a",
+"output":["ParseError"]},
+
+{"description":"EOF in after attribute name state",
+"input":"<a a ",
+"output":["ParseError"]},
+
+{"description":"EOF in before attribute value state",
+"input":"<a a =",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (double quoted) state",
+"input":"<a a =\"a",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (single quoted) state",
+"input":"<a a ='a",
+"output":["ParseError"]},
+
+{"description":"EOF in attribute value (unquoted) state",
+"input":"<a a =a",
+"output":["ParseError"]},
+
+{"description":"EOF in after attribute value state",
+"input":"<a a ='a'",
+"output":["ParseError"]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/unicodeChars.test b/libs/html5lib/tests/testdata/tokenizer/unicodeChars.test
new file mode 100644
index 000000000..c7786682c
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/unicodeChars.test
@@ -0,0 +1,1295 @@
+{"tests": [
+
+{"description": "Invalid Unicode character U+0001",
+"input": "\u0001",
+"output": ["ParseError", ["Character", "\u0001"]]},
+
+{"description": "Invalid Unicode character U+0002",
+"input": "\u0002",
+"output": ["ParseError", ["Character", "\u0002"]]},
+
+{"description": "Invalid Unicode character U+0003",
+"input": "\u0003",
+"output": ["ParseError", ["Character", "\u0003"]]},
+
+{"description": "Invalid Unicode character U+0004",
+"input": "\u0004",
+"output": ["ParseError", ["Character", "\u0004"]]},
+
+{"description": "Invalid Unicode character U+0005",
+"input": "\u0005",
+"output": ["ParseError", ["Character", "\u0005"]]},
+
+{"description": "Invalid Unicode character U+0006",
+"input": "\u0006",
+"output": ["ParseError", ["Character", "\u0006"]]},
+
+{"description": "Invalid Unicode character U+0007",
+"input": "\u0007",
+"output": ["ParseError", ["Character", "\u0007"]]},
+
+{"description": "Invalid Unicode character U+0008",
+"input": "\u0008",
+"output": ["ParseError", ["Character", "\u0008"]]},
+
+{"description": "Invalid Unicode character U+000B",
+"input": "\u000B",
+"output": ["ParseError", ["Character", "\u000B"]]},
+
+{"description": "Invalid Unicode character U+000E",
+"input": "\u000E",
+"output": ["ParseError", ["Character", "\u000E"]]},
+
+{"description": "Invalid Unicode character U+000F",
+"input": "\u000F",
+"output": ["ParseError", ["Character", "\u000F"]]},
+
+{"description": "Invalid Unicode character U+0010",
+"input": "\u0010",
+"output": ["ParseError", ["Character", "\u0010"]]},
+
+{"description": "Invalid Unicode character U+0011",
+"input": "\u0011",
+"output": ["ParseError", ["Character", "\u0011"]]},
+
+{"description": "Invalid Unicode character U+0012",
+"input": "\u0012",
+"output": ["ParseError", ["Character", "\u0012"]]},
+
+{"description": "Invalid Unicode character U+0013",
+"input": "\u0013",
+"output": ["ParseError", ["Character", "\u0013"]]},
+
+{"description": "Invalid Unicode character U+0014",
+"input": "\u0014",
+"output": ["ParseError", ["Character", "\u0014"]]},
+
+{"description": "Invalid Unicode character U+0015",
+"input": "\u0015",
+"output": ["ParseError", ["Character", "\u0015"]]},
+
+{"description": "Invalid Unicode character U+0016",
+"input": "\u0016",
+"output": ["ParseError", ["Character", "\u0016"]]},
+
+{"description": "Invalid Unicode character U+0017",
+"input": "\u0017",
+"output": ["ParseError", ["Character", "\u0017"]]},
+
+{"description": "Invalid Unicode character U+0018",
+"input": "\u0018",
+"output": ["ParseError", ["Character", "\u0018"]]},
+
+{"description": "Invalid Unicode character U+0019",
+"input": "\u0019",
+"output": ["ParseError", ["Character", "\u0019"]]},
+
+{"description": "Invalid Unicode character U+001A",
+"input": "\u001A",
+"output": ["ParseError", ["Character", "\u001A"]]},
+
+{"description": "Invalid Unicode character U+001B",
+"input": "\u001B",
+"output": ["ParseError", ["Character", "\u001B"]]},
+
+{"description": "Invalid Unicode character U+001C",
+"input": "\u001C",
+"output": ["ParseError", ["Character", "\u001C"]]},
+
+{"description": "Invalid Unicode character U+001D",
+"input": "\u001D",
+"output": ["ParseError", ["Character", "\u001D"]]},
+
+{"description": "Invalid Unicode character U+001E",
+"input": "\u001E",
+"output": ["ParseError", ["Character", "\u001E"]]},
+
+{"description": "Invalid Unicode character U+001F",
+"input": "\u001F",
+"output": ["ParseError", ["Character", "\u001F"]]},
+
+{"description": "Invalid Unicode character U+007F",
+"input": "\u007F",
+"output": ["ParseError", ["Character", "\u007F"]]},
+
+{"description": "Invalid Unicode character U+FDD0",
+"input": "\uFDD0",
+"output": ["ParseError", ["Character", "\uFDD0"]]},
+
+{"description": "Invalid Unicode character U+FDD1",
+"input": "\uFDD1",
+"output": ["ParseError", ["Character", "\uFDD1"]]},
+
+{"description": "Invalid Unicode character U+FDD2",
+"input": "\uFDD2",
+"output": ["ParseError", ["Character", "\uFDD2"]]},
+
+{"description": "Invalid Unicode character U+FDD3",
+"input": "\uFDD3",
+"output": ["ParseError", ["Character", "\uFDD3"]]},
+
+{"description": "Invalid Unicode character U+FDD4",
+"input": "\uFDD4",
+"output": ["ParseError", ["Character", "\uFDD4"]]},
+
+{"description": "Invalid Unicode character U+FDD5",
+"input": "\uFDD5",
+"output": ["ParseError", ["Character", "\uFDD5"]]},
+
+{"description": "Invalid Unicode character U+FDD6",
+"input": "\uFDD6",
+"output": ["ParseError", ["Character", "\uFDD6"]]},
+
+{"description": "Invalid Unicode character U+FDD7",
+"input": "\uFDD7",
+"output": ["ParseError", ["Character", "\uFDD7"]]},
+
+{"description": "Invalid Unicode character U+FDD8",
+"input": "\uFDD8",
+"output": ["ParseError", ["Character", "\uFDD8"]]},
+
+{"description": "Invalid Unicode character U+FDD9",
+"input": "\uFDD9",
+"output": ["ParseError", ["Character", "\uFDD9"]]},
+
+{"description": "Invalid Unicode character U+FDDA",
+"input": "\uFDDA",
+"output": ["ParseError", ["Character", "\uFDDA"]]},
+
+{"description": "Invalid Unicode character U+FDDB",
+"input": "\uFDDB",
+"output": ["ParseError", ["Character", "\uFDDB"]]},
+
+{"description": "Invalid Unicode character U+FDDC",
+"input": "\uFDDC",
+"output": ["ParseError", ["Character", "\uFDDC"]]},
+
+{"description": "Invalid Unicode character U+FDDD",
+"input": "\uFDDD",
+"output": ["ParseError", ["Character", "\uFDDD"]]},
+
+{"description": "Invalid Unicode character U+FDDE",
+"input": "\uFDDE",
+"output": ["ParseError", ["Character", "\uFDDE"]]},
+
+{"description": "Invalid Unicode character U+FDDF",
+"input": "\uFDDF",
+"output": ["ParseError", ["Character", "\uFDDF"]]},
+
+{"description": "Invalid Unicode character U+FDE0",
+"input": "\uFDE0",
+"output": ["ParseError", ["Character", "\uFDE0"]]},
+
+{"description": "Invalid Unicode character U+FDE1",
+"input": "\uFDE1",
+"output": ["ParseError", ["Character", "\uFDE1"]]},
+
+{"description": "Invalid Unicode character U+FDE2",
+"input": "\uFDE2",
+"output": ["ParseError", ["Character", "\uFDE2"]]},
+
+{"description": "Invalid Unicode character U+FDE3",
+"input": "\uFDE3",
+"output": ["ParseError", ["Character", "\uFDE3"]]},
+
+{"description": "Invalid Unicode character U+FDE4",
+"input": "\uFDE4",
+"output": ["ParseError", ["Character", "\uFDE4"]]},
+
+{"description": "Invalid Unicode character U+FDE5",
+"input": "\uFDE5",
+"output": ["ParseError", ["Character", "\uFDE5"]]},
+
+{"description": "Invalid Unicode character U+FDE6",
+"input": "\uFDE6",
+"output": ["ParseError", ["Character", "\uFDE6"]]},
+
+{"description": "Invalid Unicode character U+FDE7",
+"input": "\uFDE7",
+"output": ["ParseError", ["Character", "\uFDE7"]]},
+
+{"description": "Invalid Unicode character U+FDE8",
+"input": "\uFDE8",
+"output": ["ParseError", ["Character", "\uFDE8"]]},
+
+{"description": "Invalid Unicode character U+FDE9",
+"input": "\uFDE9",
+"output": ["ParseError", ["Character", "\uFDE9"]]},
+
+{"description": "Invalid Unicode character U+FDEA",
+"input": "\uFDEA",
+"output": ["ParseError", ["Character", "\uFDEA"]]},
+
+{"description": "Invalid Unicode character U+FDEB",
+"input": "\uFDEB",
+"output": ["ParseError", ["Character", "\uFDEB"]]},
+
+{"description": "Invalid Unicode character U+FDEC",
+"input": "\uFDEC",
+"output": ["ParseError", ["Character", "\uFDEC"]]},
+
+{"description": "Invalid Unicode character U+FDED",
+"input": "\uFDED",
+"output": ["ParseError", ["Character", "\uFDED"]]},
+
+{"description": "Invalid Unicode character U+FDEE",
+"input": "\uFDEE",
+"output": ["ParseError", ["Character", "\uFDEE"]]},
+
+{"description": "Invalid Unicode character U+FDEF",
+"input": "\uFDEF",
+"output": ["ParseError", ["Character", "\uFDEF"]]},
+
+{"description": "Invalid Unicode character U+FFFE",
+"input": "\uFFFE",
+"output": ["ParseError", ["Character", "\uFFFE"]]},
+
+{"description": "Invalid Unicode character U+FFFF",
+"input": "\uFFFF",
+"output": ["ParseError", ["Character", "\uFFFF"]]},
+
+{"description": "Invalid Unicode character U+1FFFE",
+"input": "\uD83F\uDFFE",
+"output": ["ParseError", ["Character", "\uD83F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+1FFFF",
+"input": "\uD83F\uDFFF",
+"output": ["ParseError", ["Character", "\uD83F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+2FFFE",
+"input": "\uD87F\uDFFE",
+"output": ["ParseError", ["Character", "\uD87F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+2FFFF",
+"input": "\uD87F\uDFFF",
+"output": ["ParseError", ["Character", "\uD87F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+3FFFE",
+"input": "\uD8BF\uDFFE",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+3FFFF",
+"input": "\uD8BF\uDFFF",
+"output": ["ParseError", ["Character", "\uD8BF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+4FFFE",
+"input": "\uD8FF\uDFFE",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+4FFFF",
+"input": "\uD8FF\uDFFF",
+"output": ["ParseError", ["Character", "\uD8FF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+5FFFE",
+"input": "\uD93F\uDFFE",
+"output": ["ParseError", ["Character", "\uD93F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+5FFFF",
+"input": "\uD93F\uDFFF",
+"output": ["ParseError", ["Character", "\uD93F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+6FFFE",
+"input": "\uD97F\uDFFE",
+"output": ["ParseError", ["Character", "\uD97F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+6FFFF",
+"input": "\uD97F\uDFFF",
+"output": ["ParseError", ["Character", "\uD97F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+7FFFE",
+"input": "\uD9BF\uDFFE",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+7FFFF",
+"input": "\uD9BF\uDFFF",
+"output": ["ParseError", ["Character", "\uD9BF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+8FFFE",
+"input": "\uD9FF\uDFFE",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+8FFFF",
+"input": "\uD9FF\uDFFF",
+"output": ["ParseError", ["Character", "\uD9FF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+9FFFE",
+"input": "\uDA3F\uDFFE",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+9FFFF",
+"input": "\uDA3F\uDFFF",
+"output": ["ParseError", ["Character", "\uDA3F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+AFFFE",
+"input": "\uDA7F\uDFFE",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+AFFFF",
+"input": "\uDA7F\uDFFF",
+"output": ["ParseError", ["Character", "\uDA7F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+BFFFE",
+"input": "\uDABF\uDFFE",
+"output": ["ParseError", ["Character", "\uDABF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+BFFFF",
+"input": "\uDABF\uDFFF",
+"output": ["ParseError", ["Character", "\uDABF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+CFFFE",
+"input": "\uDAFF\uDFFE",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+CFFFF",
+"input": "\uDAFF\uDFFF",
+"output": ["ParseError", ["Character", "\uDAFF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+DFFFE",
+"input": "\uDB3F\uDFFE",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+DFFFF",
+"input": "\uDB3F\uDFFF",
+"output": ["ParseError", ["Character", "\uDB3F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+EFFFE",
+"input": "\uDB7F\uDFFE",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+EFFFF",
+"input": "\uDB7F\uDFFF",
+"output": ["ParseError", ["Character", "\uDB7F\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+FFFFE",
+"input": "\uDBBF\uDFFE",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+FFFFF",
+"input": "\uDBBF\uDFFF",
+"output": ["ParseError", ["Character", "\uDBBF\uDFFF"]]},
+
+{"description": "Invalid Unicode character U+10FFFE",
+"input": "\uDBFF\uDFFE",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFE"]]},
+
+{"description": "Invalid Unicode character U+10FFFF",
+"input": "\uDBFF\uDFFF",
+"output": ["ParseError", ["Character", "\uDBFF\uDFFF"]]},
+
+{"description": "Valid Unicode character U+0009",
+"input": "\u0009",
+"output": [["Character", "\u0009"]]},
+
+{"description": "Valid Unicode character U+000A",
+"input": "\u000A",
+"output": [["Character", "\u000A"]]},
+
+{"description": "Valid Unicode character U+0020",
+"input": "\u0020",
+"output": [["Character", "\u0020"]]},
+
+{"description": "Valid Unicode character U+0021",
+"input": "\u0021",
+"output": [["Character", "\u0021"]]},
+
+{"description": "Valid Unicode character U+0022",
+"input": "\u0022",
+"output": [["Character", "\u0022"]]},
+
+{"description": "Valid Unicode character U+0023",
+"input": "\u0023",
+"output": [["Character", "\u0023"]]},
+
+{"description": "Valid Unicode character U+0024",
+"input": "\u0024",
+"output": [["Character", "\u0024"]]},
+
+{"description": "Valid Unicode character U+0025",
+"input": "\u0025",
+"output": [["Character", "\u0025"]]},
+
+{"description": "Valid Unicode character U+0026",
+"input": "\u0026",
+"output": [["Character", "\u0026"]]},
+
+{"description": "Valid Unicode character U+0027",
+"input": "\u0027",
+"output": [["Character", "\u0027"]]},
+
+{"description": "Valid Unicode character U+0028",
+"input": "\u0028",
+"output": [["Character", "\u0028"]]},
+
+{"description": "Valid Unicode character U+0029",
+"input": "\u0029",
+"output": [["Character", "\u0029"]]},
+
+{"description": "Valid Unicode character U+002A",
+"input": "\u002A",
+"output": [["Character", "\u002A"]]},
+
+{"description": "Valid Unicode character U+002B",
+"input": "\u002B",
+"output": [["Character", "\u002B"]]},
+
+{"description": "Valid Unicode character U+002C",
+"input": "\u002C",
+"output": [["Character", "\u002C"]]},
+
+{"description": "Valid Unicode character U+002D",
+"input": "\u002D",
+"output": [["Character", "\u002D"]]},
+
+{"description": "Valid Unicode character U+002E",
+"input": "\u002E",
+"output": [["Character", "\u002E"]]},
+
+{"description": "Valid Unicode character U+002F",
+"input": "\u002F",
+"output": [["Character", "\u002F"]]},
+
+{"description": "Valid Unicode character U+0030",
+"input": "\u0030",
+"output": [["Character", "\u0030"]]},
+
+{"description": "Valid Unicode character U+0031",
+"input": "\u0031",
+"output": [["Character", "\u0031"]]},
+
+{"description": "Valid Unicode character U+0032",
+"input": "\u0032",
+"output": [["Character", "\u0032"]]},
+
+{"description": "Valid Unicode character U+0033",
+"input": "\u0033",
+"output": [["Character", "\u0033"]]},
+
+{"description": "Valid Unicode character U+0034",
+"input": "\u0034",
+"output": [["Character", "\u0034"]]},
+
+{"description": "Valid Unicode character U+0035",
+"input": "\u0035",
+"output": [["Character", "\u0035"]]},
+
+{"description": "Valid Unicode character U+0036",
+"input": "\u0036",
+"output": [["Character", "\u0036"]]},
+
+{"description": "Valid Unicode character U+0037",
+"input": "\u0037",
+"output": [["Character", "\u0037"]]},
+
+{"description": "Valid Unicode character U+0038",
+"input": "\u0038",
+"output": [["Character", "\u0038"]]},
+
+{"description": "Valid Unicode character U+0039",
+"input": "\u0039",
+"output": [["Character", "\u0039"]]},
+
+{"description": "Valid Unicode character U+003A",
+"input": "\u003A",
+"output": [["Character", "\u003A"]]},
+
+{"description": "Valid Unicode character U+003B",
+"input": "\u003B",
+"output": [["Character", "\u003B"]]},
+
+{"description": "Valid Unicode character U+003D",
+"input": "\u003D",
+"output": [["Character", "\u003D"]]},
+
+{"description": "Valid Unicode character U+003E",
+"input": "\u003E",
+"output": [["Character", "\u003E"]]},
+
+{"description": "Valid Unicode character U+003F",
+"input": "\u003F",
+"output": [["Character", "\u003F"]]},
+
+{"description": "Valid Unicode character U+0040",
+"input": "\u0040",
+"output": [["Character", "\u0040"]]},
+
+{"description": "Valid Unicode character U+0041",
+"input": "\u0041",
+"output": [["Character", "\u0041"]]},
+
+{"description": "Valid Unicode character U+0042",
+"input": "\u0042",
+"output": [["Character", "\u0042"]]},
+
+{"description": "Valid Unicode character U+0043",
+"input": "\u0043",
+"output": [["Character", "\u0043"]]},
+
+{"description": "Valid Unicode character U+0044",
+"input": "\u0044",
+"output": [["Character", "\u0044"]]},
+
+{"description": "Valid Unicode character U+0045",
+"input": "\u0045",
+"output": [["Character", "\u0045"]]},
+
+{"description": "Valid Unicode character U+0046",
+"input": "\u0046",
+"output": [["Character", "\u0046"]]},
+
+{"description": "Valid Unicode character U+0047",
+"input": "\u0047",
+"output": [["Character", "\u0047"]]},
+
+{"description": "Valid Unicode character U+0048",
+"input": "\u0048",
+"output": [["Character", "\u0048"]]},
+
+{"description": "Valid Unicode character U+0049",
+"input": "\u0049",
+"output": [["Character", "\u0049"]]},
+
+{"description": "Valid Unicode character U+004A",
+"input": "\u004A",
+"output": [["Character", "\u004A"]]},
+
+{"description": "Valid Unicode character U+004B",
+"input": "\u004B",
+"output": [["Character", "\u004B"]]},
+
+{"description": "Valid Unicode character U+004C",
+"input": "\u004C",
+"output": [["Character", "\u004C"]]},
+
+{"description": "Valid Unicode character U+004D",
+"input": "\u004D",
+"output": [["Character", "\u004D"]]},
+
+{"description": "Valid Unicode character U+004E",
+"input": "\u004E",
+"output": [["Character", "\u004E"]]},
+
+{"description": "Valid Unicode character U+004F",
+"input": "\u004F",
+"output": [["Character", "\u004F"]]},
+
+{"description": "Valid Unicode character U+0050",
+"input": "\u0050",
+"output": [["Character", "\u0050"]]},
+
+{"description": "Valid Unicode character U+0051",
+"input": "\u0051",
+"output": [["Character", "\u0051"]]},
+
+{"description": "Valid Unicode character U+0052",
+"input": "\u0052",
+"output": [["Character", "\u0052"]]},
+
+{"description": "Valid Unicode character U+0053",
+"input": "\u0053",
+"output": [["Character", "\u0053"]]},
+
+{"description": "Valid Unicode character U+0054",
+"input": "\u0054",
+"output": [["Character", "\u0054"]]},
+
+{"description": "Valid Unicode character U+0055",
+"input": "\u0055",
+"output": [["Character", "\u0055"]]},
+
+{"description": "Valid Unicode character U+0056",
+"input": "\u0056",
+"output": [["Character", "\u0056"]]},
+
+{"description": "Valid Unicode character U+0057",
+"input": "\u0057",
+"output": [["Character", "\u0057"]]},
+
+{"description": "Valid Unicode character U+0058",
+"input": "\u0058",
+"output": [["Character", "\u0058"]]},
+
+{"description": "Valid Unicode character U+0059",
+"input": "\u0059",
+"output": [["Character", "\u0059"]]},
+
+{"description": "Valid Unicode character U+005A",
+"input": "\u005A",
+"output": [["Character", "\u005A"]]},
+
+{"description": "Valid Unicode character U+005B",
+"input": "\u005B",
+"output": [["Character", "\u005B"]]},
+
+{"description": "Valid Unicode character U+005C",
+"input": "\u005C",
+"output": [["Character", "\u005C"]]},
+
+{"description": "Valid Unicode character U+005D",
+"input": "\u005D",
+"output": [["Character", "\u005D"]]},
+
+{"description": "Valid Unicode character U+005E",
+"input": "\u005E",
+"output": [["Character", "\u005E"]]},
+
+{"description": "Valid Unicode character U+005F",
+"input": "\u005F",
+"output": [["Character", "\u005F"]]},
+
+{"description": "Valid Unicode character U+0060",
+"input": "\u0060",
+"output": [["Character", "\u0060"]]},
+
+{"description": "Valid Unicode character U+0061",
+"input": "\u0061",
+"output": [["Character", "\u0061"]]},
+
+{"description": "Valid Unicode character U+0062",
+"input": "\u0062",
+"output": [["Character", "\u0062"]]},
+
+{"description": "Valid Unicode character U+0063",
+"input": "\u0063",
+"output": [["Character", "\u0063"]]},
+
+{"description": "Valid Unicode character U+0064",
+"input": "\u0064",
+"output": [["Character", "\u0064"]]},
+
+{"description": "Valid Unicode character U+0065",
+"input": "\u0065",
+"output": [["Character", "\u0065"]]},
+
+{"description": "Valid Unicode character U+0066",
+"input": "\u0066",
+"output": [["Character", "\u0066"]]},
+
+{"description": "Valid Unicode character U+0067",
+"input": "\u0067",
+"output": [["Character", "\u0067"]]},
+
+{"description": "Valid Unicode character U+0068",
+"input": "\u0068",
+"output": [["Character", "\u0068"]]},
+
+{"description": "Valid Unicode character U+0069",
+"input": "\u0069",
+"output": [["Character", "\u0069"]]},
+
+{"description": "Valid Unicode character U+006A",
+"input": "\u006A",
+"output": [["Character", "\u006A"]]},
+
+{"description": "Valid Unicode character U+006B",
+"input": "\u006B",
+"output": [["Character", "\u006B"]]},
+
+{"description": "Valid Unicode character U+006C",
+"input": "\u006C",
+"output": [["Character", "\u006C"]]},
+
+{"description": "Valid Unicode character U+006D",
+"input": "\u006D",
+"output": [["Character", "\u006D"]]},
+
+{"description": "Valid Unicode character U+006E",
+"input": "\u006E",
+"output": [["Character", "\u006E"]]},
+
+{"description": "Valid Unicode character U+006F",
+"input": "\u006F",
+"output": [["Character", "\u006F"]]},
+
+{"description": "Valid Unicode character U+0070",
+"input": "\u0070",
+"output": [["Character", "\u0070"]]},
+
+{"description": "Valid Unicode character U+0071",
+"input": "\u0071",
+"output": [["Character", "\u0071"]]},
+
+{"description": "Valid Unicode character U+0072",
+"input": "\u0072",
+"output": [["Character", "\u0072"]]},
+
+{"description": "Valid Unicode character U+0073",
+"input": "\u0073",
+"output": [["Character", "\u0073"]]},
+
+{"description": "Valid Unicode character U+0074",
+"input": "\u0074",
+"output": [["Character", "\u0074"]]},
+
+{"description": "Valid Unicode character U+0075",
+"input": "\u0075",
+"output": [["Character", "\u0075"]]},
+
+{"description": "Valid Unicode character U+0076",
+"input": "\u0076",
+"output": [["Character", "\u0076"]]},
+
+{"description": "Valid Unicode character U+0077",
+"input": "\u0077",
+"output": [["Character", "\u0077"]]},
+
+{"description": "Valid Unicode character U+0078",
+"input": "\u0078",
+"output": [["Character", "\u0078"]]},
+
+{"description": "Valid Unicode character U+0079",
+"input": "\u0079",
+"output": [["Character", "\u0079"]]},
+
+{"description": "Valid Unicode character U+007A",
+"input": "\u007A",
+"output": [["Character", "\u007A"]]},
+
+{"description": "Valid Unicode character U+007B",
+"input": "\u007B",
+"output": [["Character", "\u007B"]]},
+
+{"description": "Valid Unicode character U+007C",
+"input": "\u007C",
+"output": [["Character", "\u007C"]]},
+
+{"description": "Valid Unicode character U+007D",
+"input": "\u007D",
+"output": [["Character", "\u007D"]]},
+
+{"description": "Valid Unicode character U+007E",
+"input": "\u007E",
+"output": [["Character", "\u007E"]]},
+
+{"description": "Valid Unicode character U+00A0",
+"input": "\u00A0",
+"output": [["Character", "\u00A0"]]},
+
+{"description": "Valid Unicode character U+00A1",
+"input": "\u00A1",
+"output": [["Character", "\u00A1"]]},
+
+{"description": "Valid Unicode character U+00A2",
+"input": "\u00A2",
+"output": [["Character", "\u00A2"]]},
+
+{"description": "Valid Unicode character U+00A3",
+"input": "\u00A3",
+"output": [["Character", "\u00A3"]]},
+
+{"description": "Valid Unicode character U+00A4",
+"input": "\u00A4",
+"output": [["Character", "\u00A4"]]},
+
+{"description": "Valid Unicode character U+00A5",
+"input": "\u00A5",
+"output": [["Character", "\u00A5"]]},
+
+{"description": "Valid Unicode character U+00A6",
+"input": "\u00A6",
+"output": [["Character", "\u00A6"]]},
+
+{"description": "Valid Unicode character U+00A7",
+"input": "\u00A7",
+"output": [["Character", "\u00A7"]]},
+
+{"description": "Valid Unicode character U+00A8",
+"input": "\u00A8",
+"output": [["Character", "\u00A8"]]},
+
+{"description": "Valid Unicode character U+00A9",
+"input": "\u00A9",
+"output": [["Character", "\u00A9"]]},
+
+{"description": "Valid Unicode character U+00AA",
+"input": "\u00AA",
+"output": [["Character", "\u00AA"]]},
+
+{"description": "Valid Unicode character U+00AB",
+"input": "\u00AB",
+"output": [["Character", "\u00AB"]]},
+
+{"description": "Valid Unicode character U+00AC",
+"input": "\u00AC",
+"output": [["Character", "\u00AC"]]},
+
+{"description": "Valid Unicode character U+00AD",
+"input": "\u00AD",
+"output": [["Character", "\u00AD"]]},
+
+{"description": "Valid Unicode character U+00AE",
+"input": "\u00AE",
+"output": [["Character", "\u00AE"]]},
+
+{"description": "Valid Unicode character U+00AF",
+"input": "\u00AF",
+"output": [["Character", "\u00AF"]]},
+
+{"description": "Valid Unicode character U+00B0",
+"input": "\u00B0",
+"output": [["Character", "\u00B0"]]},
+
+{"description": "Valid Unicode character U+00B1",
+"input": "\u00B1",
+"output": [["Character", "\u00B1"]]},
+
+{"description": "Valid Unicode character U+00B2",
+"input": "\u00B2",
+"output": [["Character", "\u00B2"]]},
+
+{"description": "Valid Unicode character U+00B3",
+"input": "\u00B3",
+"output": [["Character", "\u00B3"]]},
+
+{"description": "Valid Unicode character U+00B4",
+"input": "\u00B4",
+"output": [["Character", "\u00B4"]]},
+
+{"description": "Valid Unicode character U+00B5",
+"input": "\u00B5",
+"output": [["Character", "\u00B5"]]},
+
+{"description": "Valid Unicode character U+00B6",
+"input": "\u00B6",
+"output": [["Character", "\u00B6"]]},
+
+{"description": "Valid Unicode character U+00B7",
+"input": "\u00B7",
+"output": [["Character", "\u00B7"]]},
+
+{"description": "Valid Unicode character U+00B8",
+"input": "\u00B8",
+"output": [["Character", "\u00B8"]]},
+
+{"description": "Valid Unicode character U+00B9",
+"input": "\u00B9",
+"output": [["Character", "\u00B9"]]},
+
+{"description": "Valid Unicode character U+00BA",
+"input": "\u00BA",
+"output": [["Character", "\u00BA"]]},
+
+{"description": "Valid Unicode character U+00BB",
+"input": "\u00BB",
+"output": [["Character", "\u00BB"]]},
+
+{"description": "Valid Unicode character U+00BC",
+"input": "\u00BC",
+"output": [["Character", "\u00BC"]]},
+
+{"description": "Valid Unicode character U+00BD",
+"input": "\u00BD",
+"output": [["Character", "\u00BD"]]},
+
+{"description": "Valid Unicode character U+00BE",
+"input": "\u00BE",
+"output": [["Character", "\u00BE"]]},
+
+{"description": "Valid Unicode character U+00BF",
+"input": "\u00BF",
+"output": [["Character", "\u00BF"]]},
+
+{"description": "Valid Unicode character U+00C0",
+"input": "\u00C0",
+"output": [["Character", "\u00C0"]]},
+
+{"description": "Valid Unicode character U+00C1",
+"input": "\u00C1",
+"output": [["Character", "\u00C1"]]},
+
+{"description": "Valid Unicode character U+00C2",
+"input": "\u00C2",
+"output": [["Character", "\u00C2"]]},
+
+{"description": "Valid Unicode character U+00C3",
+"input": "\u00C3",
+"output": [["Character", "\u00C3"]]},
+
+{"description": "Valid Unicode character U+00C4",
+"input": "\u00C4",
+"output": [["Character", "\u00C4"]]},
+
+{"description": "Valid Unicode character U+00C5",
+"input": "\u00C5",
+"output": [["Character", "\u00C5"]]},
+
+{"description": "Valid Unicode character U+00C6",
+"input": "\u00C6",
+"output": [["Character", "\u00C6"]]},
+
+{"description": "Valid Unicode character U+00C7",
+"input": "\u00C7",
+"output": [["Character", "\u00C7"]]},
+
+{"description": "Valid Unicode character U+00C8",
+"input": "\u00C8",
+"output": [["Character", "\u00C8"]]},
+
+{"description": "Valid Unicode character U+00C9",
+"input": "\u00C9",
+"output": [["Character", "\u00C9"]]},
+
+{"description": "Valid Unicode character U+00CA",
+"input": "\u00CA",
+"output": [["Character", "\u00CA"]]},
+
+{"description": "Valid Unicode character U+00CB",
+"input": "\u00CB",
+"output": [["Character", "\u00CB"]]},
+
+{"description": "Valid Unicode character U+00CC",
+"input": "\u00CC",
+"output": [["Character", "\u00CC"]]},
+
+{"description": "Valid Unicode character U+00CD",
+"input": "\u00CD",
+"output": [["Character", "\u00CD"]]},
+
+{"description": "Valid Unicode character U+00CE",
+"input": "\u00CE",
+"output": [["Character", "\u00CE"]]},
+
+{"description": "Valid Unicode character U+00CF",
+"input": "\u00CF",
+"output": [["Character", "\u00CF"]]},
+
+{"description": "Valid Unicode character U+00D0",
+"input": "\u00D0",
+"output": [["Character", "\u00D0"]]},
+
+{"description": "Valid Unicode character U+00D1",
+"input": "\u00D1",
+"output": [["Character", "\u00D1"]]},
+
+{"description": "Valid Unicode character U+00D2",
+"input": "\u00D2",
+"output": [["Character", "\u00D2"]]},
+
+{"description": "Valid Unicode character U+00D3",
+"input": "\u00D3",
+"output": [["Character", "\u00D3"]]},
+
+{"description": "Valid Unicode character U+00D4",
+"input": "\u00D4",
+"output": [["Character", "\u00D4"]]},
+
+{"description": "Valid Unicode character U+00D5",
+"input": "\u00D5",
+"output": [["Character", "\u00D5"]]},
+
+{"description": "Valid Unicode character U+00D6",
+"input": "\u00D6",
+"output": [["Character", "\u00D6"]]},
+
+{"description": "Valid Unicode character U+00D7",
+"input": "\u00D7",
+"output": [["Character", "\u00D7"]]},
+
+{"description": "Valid Unicode character U+00D8",
+"input": "\u00D8",
+"output": [["Character", "\u00D8"]]},
+
+{"description": "Valid Unicode character U+00D9",
+"input": "\u00D9",
+"output": [["Character", "\u00D9"]]},
+
+{"description": "Valid Unicode character U+00DA",
+"input": "\u00DA",
+"output": [["Character", "\u00DA"]]},
+
+{"description": "Valid Unicode character U+00DB",
+"input": "\u00DB",
+"output": [["Character", "\u00DB"]]},
+
+{"description": "Valid Unicode character U+00DC",
+"input": "\u00DC",
+"output": [["Character", "\u00DC"]]},
+
+{"description": "Valid Unicode character U+00DD",
+"input": "\u00DD",
+"output": [["Character", "\u00DD"]]},
+
+{"description": "Valid Unicode character U+00DE",
+"input": "\u00DE",
+"output": [["Character", "\u00DE"]]},
+
+{"description": "Valid Unicode character U+00DF",
+"input": "\u00DF",
+"output": [["Character", "\u00DF"]]},
+
+{"description": "Valid Unicode character U+00E0",
+"input": "\u00E0",
+"output": [["Character", "\u00E0"]]},
+
+{"description": "Valid Unicode character U+00E1",
+"input": "\u00E1",
+"output": [["Character", "\u00E1"]]},
+
+{"description": "Valid Unicode character U+00E2",
+"input": "\u00E2",
+"output": [["Character", "\u00E2"]]},
+
+{"description": "Valid Unicode character U+00E3",
+"input": "\u00E3",
+"output": [["Character", "\u00E3"]]},
+
+{"description": "Valid Unicode character U+00E4",
+"input": "\u00E4",
+"output": [["Character", "\u00E4"]]},
+
+{"description": "Valid Unicode character U+00E5",
+"input": "\u00E5",
+"output": [["Character", "\u00E5"]]},
+
+{"description": "Valid Unicode character U+00E6",
+"input": "\u00E6",
+"output": [["Character", "\u00E6"]]},
+
+{"description": "Valid Unicode character U+00E7",
+"input": "\u00E7",
+"output": [["Character", "\u00E7"]]},
+
+{"description": "Valid Unicode character U+00E8",
+"input": "\u00E8",
+"output": [["Character", "\u00E8"]]},
+
+{"description": "Valid Unicode character U+00E9",
+"input": "\u00E9",
+"output": [["Character", "\u00E9"]]},
+
+{"description": "Valid Unicode character U+00EA",
+"input": "\u00EA",
+"output": [["Character", "\u00EA"]]},
+
+{"description": "Valid Unicode character U+00EB",
+"input": "\u00EB",
+"output": [["Character", "\u00EB"]]},
+
+{"description": "Valid Unicode character U+00EC",
+"input": "\u00EC",
+"output": [["Character", "\u00EC"]]},
+
+{"description": "Valid Unicode character U+00ED",
+"input": "\u00ED",
+"output": [["Character", "\u00ED"]]},
+
+{"description": "Valid Unicode character U+00EE",
+"input": "\u00EE",
+"output": [["Character", "\u00EE"]]},
+
+{"description": "Valid Unicode character U+00EF",
+"input": "\u00EF",
+"output": [["Character", "\u00EF"]]},
+
+{"description": "Valid Unicode character U+00F0",
+"input": "\u00F0",
+"output": [["Character", "\u00F0"]]},
+
+{"description": "Valid Unicode character U+00F1",
+"input": "\u00F1",
+"output": [["Character", "\u00F1"]]},
+
+{"description": "Valid Unicode character U+00F2",
+"input": "\u00F2",
+"output": [["Character", "\u00F2"]]},
+
+{"description": "Valid Unicode character U+00F3",
+"input": "\u00F3",
+"output": [["Character", "\u00F3"]]},
+
+{"description": "Valid Unicode character U+00F4",
+"input": "\u00F4",
+"output": [["Character", "\u00F4"]]},
+
+{"description": "Valid Unicode character U+00F5",
+"input": "\u00F5",
+"output": [["Character", "\u00F5"]]},
+
+{"description": "Valid Unicode character U+00F6",
+"input": "\u00F6",
+"output": [["Character", "\u00F6"]]},
+
+{"description": "Valid Unicode character U+00F7",
+"input": "\u00F7",
+"output": [["Character", "\u00F7"]]},
+
+{"description": "Valid Unicode character U+00F8",
+"input": "\u00F8",
+"output": [["Character", "\u00F8"]]},
+
+{"description": "Valid Unicode character U+00F9",
+"input": "\u00F9",
+"output": [["Character", "\u00F9"]]},
+
+{"description": "Valid Unicode character U+00FA",
+"input": "\u00FA",
+"output": [["Character", "\u00FA"]]},
+
+{"description": "Valid Unicode character U+00FB",
+"input": "\u00FB",
+"output": [["Character", "\u00FB"]]},
+
+{"description": "Valid Unicode character U+00FC",
+"input": "\u00FC",
+"output": [["Character", "\u00FC"]]},
+
+{"description": "Valid Unicode character U+00FD",
+"input": "\u00FD",
+"output": [["Character", "\u00FD"]]},
+
+{"description": "Valid Unicode character U+00FE",
+"input": "\u00FE",
+"output": [["Character", "\u00FE"]]},
+
+{"description": "Valid Unicode character U+00FF",
+"input": "\u00FF",
+"output": [["Character", "\u00FF"]]},
+
+{"description": "Valid Unicode character U+D7FF",
+"input": "\uD7FF",
+"output": [["Character", "\uD7FF"]]},
+
+{"description": "Valid Unicode character U+E000",
+"input": "\uE000",
+"output": [["Character", "\uE000"]]},
+
+{"description": "Valid Unicode character U+FDCF",
+"input": "\uFDCF",
+"output": [["Character", "\uFDCF"]]},
+
+{"description": "Valid Unicode character U+FDF0",
+"input": "\uFDF0",
+"output": [["Character", "\uFDF0"]]},
+
+{"description": "Valid Unicode character U+FFFD",
+"input": "\uFFFD",
+"output": [["Character", "\uFFFD"]]},
+
+{"description": "Valid Unicode character U+10000",
+"input": "\uD800\uDC00",
+"output": [["Character", "\uD800\uDC00"]]},
+
+{"description": "Valid Unicode character U+1FFFD",
+"input": "\uD83F\uDFFD",
+"output": [["Character", "\uD83F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+20000",
+"input": "\uD840\uDC00",
+"output": [["Character", "\uD840\uDC00"]]},
+
+{"description": "Valid Unicode character U+2FFFD",
+"input": "\uD87F\uDFFD",
+"output": [["Character", "\uD87F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+30000",
+"input": "\uD880\uDC00",
+"output": [["Character", "\uD880\uDC00"]]},
+
+{"description": "Valid Unicode character U+3FFFD",
+"input": "\uD8BF\uDFFD",
+"output": [["Character", "\uD8BF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+40000",
+"input": "\uD8C0\uDC00",
+"output": [["Character", "\uD8C0\uDC00"]]},
+
+{"description": "Valid Unicode character U+4FFFD",
+"input": "\uD8FF\uDFFD",
+"output": [["Character", "\uD8FF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+50000",
+"input": "\uD900\uDC00",
+"output": [["Character", "\uD900\uDC00"]]},
+
+{"description": "Valid Unicode character U+5FFFD",
+"input": "\uD93F\uDFFD",
+"output": [["Character", "\uD93F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+60000",
+"input": "\uD940\uDC00",
+"output": [["Character", "\uD940\uDC00"]]},
+
+{"description": "Valid Unicode character U+6FFFD",
+"input": "\uD97F\uDFFD",
+"output": [["Character", "\uD97F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+70000",
+"input": "\uD980\uDC00",
+"output": [["Character", "\uD980\uDC00"]]},
+
+{"description": "Valid Unicode character U+7FFFD",
+"input": "\uD9BF\uDFFD",
+"output": [["Character", "\uD9BF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+80000",
+"input": "\uD9C0\uDC00",
+"output": [["Character", "\uD9C0\uDC00"]]},
+
+{"description": "Valid Unicode character U+8FFFD",
+"input": "\uD9FF\uDFFD",
+"output": [["Character", "\uD9FF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+90000",
+"input": "\uDA00\uDC00",
+"output": [["Character", "\uDA00\uDC00"]]},
+
+{"description": "Valid Unicode character U+9FFFD",
+"input": "\uDA3F\uDFFD",
+"output": [["Character", "\uDA3F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+A0000",
+"input": "\uDA40\uDC00",
+"output": [["Character", "\uDA40\uDC00"]]},
+
+{"description": "Valid Unicode character U+AFFFD",
+"input": "\uDA7F\uDFFD",
+"output": [["Character", "\uDA7F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+B0000",
+"input": "\uDA80\uDC00",
+"output": [["Character", "\uDA80\uDC00"]]},
+
+{"description": "Valid Unicode character U+BFFFD",
+"input": "\uDABF\uDFFD",
+"output": [["Character", "\uDABF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+C0000",
+"input": "\uDAC0\uDC00",
+"output": [["Character", "\uDAC0\uDC00"]]},
+
+{"description": "Valid Unicode character U+CFFFD",
+"input": "\uDAFF\uDFFD",
+"output": [["Character", "\uDAFF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+D0000",
+"input": "\uDB00\uDC00",
+"output": [["Character", "\uDB00\uDC00"]]},
+
+{"description": "Valid Unicode character U+DFFFD",
+"input": "\uDB3F\uDFFD",
+"output": [["Character", "\uDB3F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+E0000",
+"input": "\uDB40\uDC00",
+"output": [["Character", "\uDB40\uDC00"]]},
+
+{"description": "Valid Unicode character U+EFFFD",
+"input": "\uDB7F\uDFFD",
+"output": [["Character", "\uDB7F\uDFFD"]]},
+
+{"description": "Valid Unicode character U+F0000",
+"input": "\uDB80\uDC00",
+"output": [["Character", "\uDB80\uDC00"]]},
+
+{"description": "Valid Unicode character U+FFFFD",
+"input": "\uDBBF\uDFFD",
+"output": [["Character", "\uDBBF\uDFFD"]]},
+
+{"description": "Valid Unicode character U+100000",
+"input": "\uDBC0\uDC00",
+"output": [["Character", "\uDBC0\uDC00"]]},
+
+{"description": "Valid Unicode character U+10FFFD",
+"input": "\uDBFF\uDFFD",
+"output": [["Character", "\uDBFF\uDFFD"]]}
+
+]}
diff --git a/libs/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test b/libs/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test
new file mode 100644
index 000000000..2980ce229
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/unicodeCharsProblematic.test
@@ -0,0 +1,31 @@
+{"tests" : [
+{"description": "Invalid Unicode character U+DFFF",
+"doubleEscaped":true,
+"input": "\\uDFFF",
+"output":["ParseError", ["Character", "\\uDFFF"]],
+"ignoreErrorOrder":true},
+
+{"description": "Invalid Unicode character U+D800",
+"doubleEscaped":true,
+"input": "\\uD800",
+"output":["ParseError", ["Character", "\\uD800"]],
+"ignoreErrorOrder":true},
+
+{"description": "Invalid Unicode character U+DFFF with valid preceding character",
+"doubleEscaped":true,
+"input": "a\\uDFFF",
+"output":[["Character", "a"], "ParseError", ["Character", "\\uDFFF"]],
+"ignoreErrorOrder":true},
+
+{"description": "Invalid Unicode character U+D800 with valid following character",
+"doubleEscaped":true,
+"input": "\\uD800a",
+"output":["ParseError", ["Character", "\\uD800a"]],
+"ignoreErrorOrder":true},
+
+{"description":"CR followed by U+0000",
+"input":"\r\u0000",
+"output":[["Character", "\n"], "ParseError", ["Character", "\u0000"]],
+"ignoreErrorOrder":true}
+]
+}
\ No newline at end of file
diff --git a/libs/html5lib/tests/testdata/tokenizer/xmlViolation.test b/libs/html5lib/tests/testdata/tokenizer/xmlViolation.test
new file mode 100644
index 000000000..137d96429
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tokenizer/xmlViolation.test
@@ -0,0 +1,22 @@
+{"xmlViolationTests": [
+
+{"description":"Non-XML character",
+"input":"a\uFFFFb",
+"ignoreErrorOrder":true,
+"output":["ParseError",["Character","a\uFFFDb"]]},
+
+{"description":"Non-XML space",
+"input":"a\u000Cb",
+"ignoreErrorOrder":true,
+"output":[["Character","a b"]]},
+
+{"description":"Double hyphen in comment",
+"input":"<!-- foo -- bar -->",
+"output":["ParseError",["Comment"," foo - - bar "]]},
+
+{"description":"FF between attributes",
+"input":"<a b=''\u000Cc=''>",
+"output":[["StartTag","a",{"b":"","c":""}]]}
+]}
+
+
diff --git a/libs/html5lib/tests/testdata/tree-construction/README.md b/libs/html5lib/tests/testdata/tree-construction/README.md
new file mode 100644
index 000000000..18a85ecff
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/README.md
@@ -0,0 +1,104 @@
+Tree Construction Tests
+=======================
+
+Each file containing tree construction tests consists of any number of
+tests separated by two newlines (LF) and a single newline before the end
+of the file. For instance:
+
+    [TEST]LF
+    LF
+    [TEST]LF
+    LF
+    [TEST]LF
+
+Where [TEST] is the following format:
+
+Each test must begin with a string "\#data" followed by a newline (LF).
+All subsequent lines until a line that says "\#errors" are the test data
+and must be passed to the system being tested unchanged, except with the
+final newline (on the last line) removed.
+
+Then there must be a line that says "\#errors". It must be followed by
+one line per parse error that a conformant checker would return. It
+doesn't matter what those lines are, although they can't be
+"\#document-fragment", "\#document", "\#script-off", "\#script-on", or
+empty, the only thing that matters is that there be the right number
+of parse errors.
+
+Then there \*may\* be a line that says "\#document-fragment", which must
+be followed by a newline (LF), followed by a string of characters that
+indicates the context element, followed by a newline (LF). If the string 
+of characters starts with "svg ", the context element is in the SVG
+namespace and the substring after "svg " is the local name. If the
+string of characters starts with "math ", the context element is in the
+MathML namespace and the substring after "math " is the local name.
+Otherwise, the context element is in the HTML namespace and the string
+is the local name. If this line is present the "\#data" must be parsed
+using the HTML fragment parsing algorithm with the context element as
+context.
+
+Then there \*may\* be a line that says "\#script-off" or
+"\#script-on". If a line that says "\#script-off" is present, the
+parser must set the scripting flag to disabled. If a line that says
+"\#script-on" is present, it must set it to enabled. Otherwise, the
+test should be run in both modes.
+
+Then there must be a line that says "\#document", which must be followed
+by a dump of the tree of the parsed DOM. Each node must be represented
+by a single line. Each line must start with "| ", followed by two spaces
+per parent node that the node has before the root document node.
+
+-   Element nodes must be represented by a "`<`" then the *tag name
+    string* "`>`", and all the attributes must be given, sorted
+    lexicographically by UTF-16 code unit according to their *attribute
+    name string*, on subsequent lines, as if they were children of the
+    element node.
+-   Attribute nodes must have the *attribute name string*, then an "="
+    sign, then the attribute value in double quotes (").
+-   Text nodes must be the string, in double quotes. Newlines aren't
+    escaped.
+-   Comments must be "`<`" then "`!-- `" then the data then "` -->`".
+-   DOCTYPEs must be "`<!DOCTYPE `" then the name then if either of the
+    system id or public id is non-empty a space, public id in
+    double-quotes, another space an the system id in double-quotes, and
+    then in any case "`>`".
+-   Processing instructions must be "`<?`", then the target, then a
+    space, then the data and then "`>`". (The HTML parser cannot emit
+    processing instructions, but scripts can, and the WebVTT to DOM
+    rules can emit them.)
+-   Template contents are represented by the string "content" with the
+    children below it.
+
+The *tag name string* is the local name prefixed by a namespace
+designator. For the HTML namespace, the namespace designator is the
+empty string, i.e. there's no prefix. For the SVG namespace, the
+namespace designator is "svg ". For the MathML namespace, the namespace
+designator is "math ".
+
+The *attribute name string* is the local name prefixed by a namespace
+designator. For no namespace, the namespace designator is the empty
+string, i.e. there's no prefix. For the XLink namespace, the namespace
+designator is "xlink ". For the XML namespace, the namespace designator
+is "xml ". For the XMLNS namespace, the namespace designator is "xmlns
+". Note the difference between "xlink:href" which is an attribute in no
+namespace with the local name "xlink:href" and "xlink href" which is an
+attribute in the xlink namespace with the local name "href".
+
+If there is also a "\#document-fragment" the bit following "\#document"
+must be a representation of the HTML fragment serialization for the
+context element given by "\#document-fragment".
+
+For example:
+
+    #data
+    <p>One<p>Two
+    #errors
+    3: Missing document type declaration
+    #document
+    | <html>
+    |   <head>
+    |   <body>
+    |     <p>
+    |       "One"
+    |     <p>
+    |       "Two"
diff --git a/libs/html5lib/tests/testdata/tree-construction/adoption01.dat b/libs/html5lib/tests/testdata/tree-construction/adoption01.dat
new file mode 100644
index 000000000..38f98efde
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/adoption01.dat
@@ -0,0 +1,354 @@
+#data
+<a><p></a></p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,10): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+
+#data
+<a>1<p>2</a>3</p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,12): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <p>
+|       <a>
+|         "2"
+|       "3"
+
+#data
+<a>1<button>2</a>3</button>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,17): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <button>
+|       <a>
+|         "2"
+|       "3"
+
+#data
+<a>1<b>2</a>3</b>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,12): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|       <b>
+|         "2"
+|     <b>
+|       "3"
+
+#data
+<a>1<div>2<div>3</a>4</div>5</div>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,20): adoption-agency-1.3
+(1,20): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <div>
+|       <a>
+|         "2"
+|       <div>
+|         <a>
+|           "3"
+|         "4"
+|       "5"
+
+#data
+<table><a>1<p>2</a>3</p>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,10): unexpected-start-tag-implies-table-voodoo
+(1,11): unexpected-character-implies-table-voodoo
+(1,14): unexpected-start-tag-implies-table-voodoo
+(1,15): unexpected-character-implies-table-voodoo
+(1,19): unexpected-end-tag-implies-table-voodoo
+(1,19): adoption-agency-1.3
+(1,20): unexpected-character-implies-table-voodoo
+(1,24): unexpected-end-tag-implies-table-voodoo
+(1,24): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <p>
+|       <a>
+|         "2"
+|       "3"
+|     <table>
+
+#data
+<b><b><a><p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,16): adoption-agency-1.3
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <b>
+|         <a>
+|         <p>
+|           <a>
+
+#data
+<b><a><b><p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,16): adoption-agency-1.3
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <a>
+|         <b>
+|       <b>
+|         <p>
+|           <a>
+
+#data
+<a><b><b><p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,16): adoption-agency-1.3
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|         <b>
+|     <b>
+|       <b>
+|         <p>
+|           <a>
+
+#data
+<p>1<s id="A">2<b id="B">3</p>4</s>5</b>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,30): unexpected-end-tag
+(1,35): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "1"
+|       <s>
+|         id="A"
+|         "2"
+|         <b>
+|           id="B"
+|           "3"
+|     <s>
+|       id="A"
+|       <b>
+|         id="B"
+|         "4"
+|     <b>
+|       id="B"
+|       "5"
+
+#data
+<table><a>1<td>2</td>3</table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,10): unexpected-start-tag-implies-table-voodoo
+(1,11): unexpected-character-implies-table-voodoo
+(1,15): unexpected-cell-in-table-body
+(1,30): unexpected-implied-end-tag-in-table-view
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "1"
+|     <a>
+|       "3"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "2"
+
+#data
+<table>A<td>B</td>C</table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,8): unexpected-character-implies-table-voodoo
+(1,12): unexpected-cell-in-table-body
+(1,22): unexpected-character-implies-table-voodoo
+#document
+| <html>
+|   <head>
+|   <body>
+|     "AC"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "B"
+
+#data
+<a><svg><tr><input></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,23): unexpected-end-tag
+(1,23): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <svg svg>
+|         <svg tr>
+|           <svg input>
+
+#data
+<div><a><b><div><div><div><div><div><div><div><div><div><div></a>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): adoption-agency-1.3
+(1,65): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <a>
+|         <b>
+|       <b>
+|         <div>
+|           <a>
+|           <div>
+|             <a>
+|             <div>
+|               <a>
+|               <div>
+|                 <a>
+|                 <div>
+|                   <a>
+|                   <div>
+|                     <a>
+|                     <div>
+|                       <a>
+|                       <div>
+|                         <a>
+|                           <div>
+|                             <div>
+
+#data
+<div><a><b><u><i><code><div></a>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,32): adoption-agency-1.3
+(1,32): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <a>
+|         <b>
+|           <u>
+|             <i>
+|               <code>
+|       <u>
+|         <i>
+|           <code>
+|             <div>
+|               <a>
+
+#data
+<b><b><b><b>x</b></b></b></b>y
+#errors
+(1,3): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <b>
+|         <b>
+|           <b>
+|             "x"
+|     "y"
+
+#data
+<p><b><b><b><b><p>x
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,18): unexpected-end-tag
+(1,19): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <b>
+|           <b>
+|             <b>
+|     <p>
+|       <b>
+|         <b>
+|           <b>
+|             "x"
+
+#data
+<b><em><foo><foob><fooc><aside></b></em>
+#errors
+(1,35): adoption-agency-1.3
+(1,40): adoption-agency-1.3
+(1,40): expected-closing-tag-but-got-eof
+#document-fragment
+div
+#document
+| <b>
+|   <em>
+|     <foo>
+|       <foob>
+|         <fooc>
+| <aside>
+|   <b>
diff --git a/libs/html5lib/tests/testdata/tree-construction/adoption02.dat b/libs/html5lib/tests/testdata/tree-construction/adoption02.dat
new file mode 100644
index 000000000..e54d8033b
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/adoption02.dat
@@ -0,0 +1,39 @@
+#data
+<b>1<i>2<p>3</b>4
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,16): adoption-agency-1.3
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "1"
+|       <i>
+|         "2"
+|     <i>
+|       <p>
+|         <b>
+|           "3"
+|         "4"
+
+#data
+<a><div><style></style><address><a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,35): unexpected-start-tag-implies-end-tag
+(1,35): adoption-agency-1.3
+(1,35): adoption-agency-1.3
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <div>
+|       <a>
+|         <style>
+|       <address>
+|         <a>
+|         <a>
diff --git a/libs/html5lib/tests/testdata/tree-construction/comments01.dat b/libs/html5lib/tests/testdata/tree-construction/comments01.dat
new file mode 100644
index 000000000..35ec6cced
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/comments01.dat
@@ -0,0 +1,178 @@
+#data
+FOO<!-- BAR -->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR --!>BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): unexpected-bang-after-double-dash-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR --   >BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): unexpected-char-in-comment
+(1,21): eof-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR --   >BAZ -->
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX -->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): unexpected-char-in-comment
+(1,24): unexpected-char-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX --!>BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): unexpected-char-in-comment
+(1,24): unexpected-char-in-comment
+(1,31): unexpected-bang-after-double-dash-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX  -->
+|     "BAZ"
+
+#data
+FOO<!-- BAR -- <QUX> -- MUX -- >BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): unexpected-char-in-comment
+(1,24): unexpected-char-in-comment
+(1,31): unexpected-char-in-comment
+(1,35): eof-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  BAR -- <QUX> -- MUX -- >BAZ -->
+
+#data
+FOO<!---->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+FOO<!--->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,9): incorrect-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+FOO<!-->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,8): incorrect-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!--  -->
+|     "BAZ"
+
+#data
+<?xml version="1.0">Hi
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,22): expected-doctype-but-got-chars
+#document
+| <!-- ?xml version="1.0" -->
+| <html>
+|   <head>
+|   <body>
+|     "Hi"
+
+#data
+<?xml version="1.0">
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,20): expected-doctype-but-got-eof
+#document
+| <!-- ?xml version="1.0" -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?xml version
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,13): expected-doctype-but-got-eof
+#document
+| <!-- ?xml version -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+FOO<!----->BAZ
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,10): unexpected-dash-after-double-dash-in-comment
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <!-- - -->
+|     "BAZ"
+
+#data
+<html><!-- comment --><title>Comment before head</title>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <!--  comment  -->
+|   <head>
+|     <title>
+|       "Comment before head"
+|   <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/doctype01.dat b/libs/html5lib/tests/testdata/tree-construction/doctype01.dat
new file mode 100644
index 000000000..cec663897
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/doctype01.dat
@@ -0,0 +1,424 @@
+#data
+<!DOCTYPE html>Hello
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!dOctYpE HtMl>Hello
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPEhtml>Hello
+#errors
+(1,9): need-space-after-doctype
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE>Hello
+#errors
+(1,9): need-space-after-doctype
+(1,10): expected-doctype-name-but-got-right-bracket
+(1,10): unknown-doctype
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE >Hello
+#errors
+(1,11): expected-doctype-name-but-got-right-bracket
+(1,11): unknown-doctype
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato>Hello
+#errors
+(1,17): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato >Hello
+#errors
+(1,18): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato taco>Hello
+#errors
+(1,17): expected-space-or-right-bracket-in-doctype
+(1,22): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato taco "ddd>Hello
+#errors
+(1,17): expected-space-or-right-bracket-in-doctype
+(1,27): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato sYstEM>Hello
+#errors
+(1,24): unexpected-char-in-doctype
+(1,24): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato sYstEM    >Hello
+#errors
+(1,28): unexpected-char-in-doctype
+(1,28): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE   potato       sYstEM  ggg>Hello
+#errors
+(1,34): unexpected-char-in-doctype
+(1,37): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM taco  >Hello
+#errors
+(1,25): unexpected-char-in-doctype
+(1,31): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM 'taco"'>Hello
+#errors
+(1,32): unknown-doctype
+#document
+| <!DOCTYPE potato "" "taco"">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM "taco">Hello
+#errors
+(1,31): unknown-doctype
+#document
+| <!DOCTYPE potato "" "taco">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEM "tai'co">Hello
+#errors
+(1,33): unknown-doctype
+#document
+| <!DOCTYPE potato "" "tai'co">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato SYSTEMtaco "ddd">Hello
+#errors
+(1,24): unexpected-char-in-doctype
+(1,34): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato grass SYSTEM taco>Hello
+#errors
+(1,17): expected-space-or-right-bracket-in-doctype
+(1,35): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIc>Hello
+#errors
+(1,24): unexpected-end-of-doctype
+(1,24): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIc >Hello
+#errors
+(1,25): unexpected-end-of-doctype
+(1,25): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato pUbLIcgoof>Hello
+#errors
+(1,24): unexpected-char-in-doctype
+(1,28): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC goof>Hello
+#errors
+(1,25): unexpected-char-in-doctype
+(1,29): unknown-doctype
+#document
+| <!DOCTYPE potato>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC "go'of">Hello
+#errors
+(1,32): unknown-doctype
+#document
+| <!DOCTYPE potato "go'of" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC 'go'of'>Hello
+#errors
+(1,29): unexpected-char-in-doctype
+(1,32): unknown-doctype
+#document
+| <!DOCTYPE potato "go" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC 'go:hh   of' >Hello
+#errors
+(1,38): unknown-doctype
+#document
+| <!DOCTYPE potato "go:hh   of" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE potato PUBLIC "W3C-//dfdf" SYSTEM ggg>Hello
+#errors
+(1,38): unexpected-char-in-doctype
+(1,48): unknown-doctype
+#document
+| <!DOCTYPE potato "W3C-//dfdf" "">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
+   "http://www.w3.org/TR/html4/strict.dtd">Hello
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE ...>Hello
+#errors
+(1,14): unknown-doctype
+#document
+| <!DOCTYPE ...>
+| <html>
+|   <head>
+|   <body>
+|     "Hello"
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+#errors
+(2,58): unknown-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"
+"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+#errors
+(2,54): unknown-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] "uri" [ 
+<!-- internal declarations -->
+]>
+#errors
+(1,23): expected-space-or-right-bracket-in-doctype
+(2,30): unknown-doctype
+#document
+| <!DOCTYPE root-element>
+| <html>
+|   <head>
+|   <body>
+|     "]>"
+
+#data
+<!DOCTYPE html PUBLIC
+  "-//WAPFORUM//DTD XHTML Mobile 1.0//EN"
+    "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
+#errors
+(3,53): unknown-doctype
+#document
+| <!DOCTYPE html "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML SYSTEM "http://www.w3.org/DTD/HTML4-strict.dtd"><body><b>Mine!</b></body>
+#errors
+(1,63): unknown-doctype
+#document
+| <!DOCTYPE html "" "http://www.w3.org/DTD/HTML4-strict.dtd">
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "Mine!"
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
+#errors
+(1,50): unexpected-char-in-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+(1,50): unexpected-char-in-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01//EN"'http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+(1,21): unexpected-char-in-doctype
+(1,49): unexpected-char-in-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'>
+#errors
+(1,21): unexpected-char-in-doctype
+(1,49): unexpected-char-in-doctype
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
+| <html>
+|   <head>
+|   <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat b/libs/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat
new file mode 100644
index 000000000..34b4e6271
Binary files /dev/null and b/libs/html5lib/tests/testdata/tree-construction/domjs-unsafe.dat differ
diff --git a/libs/html5lib/tests/testdata/tree-construction/entities01.dat b/libs/html5lib/tests/testdata/tree-construction/entities01.dat
new file mode 100644
index 000000000..642c6f2fd
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/entities01.dat
@@ -0,0 +1,795 @@
+#data
+FOO&gt;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>BAR"
+
+#data
+FOO&gtBAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,6): named-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>BAR"
+
+#data
+FOO&gt BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,6): named-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO> BAR"
+
+#data
+FOO&gt;;;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO>;;BAR"
+
+#data
+I'm &notit; I tell you
+#errors
+(1,4): expected-doctype-but-got-chars
+(1,9): named-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "I'm ¬it; I tell you"
+
+#data
+I'm &notin; I tell you
+#errors
+(1,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "I'm ≠I tell you"
+
+#data
+FOO& BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO& BAR"
+
+#data
+FOO&<BAR>
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,9): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&"
+|     <bar>
+
+#data
+FOO&&&&gt;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&&&>BAR"
+
+#data
+FOO&#41;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO)BAR"
+
+#data
+FOO&#x41;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOABAR"
+
+#data
+FOO&#X41;BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOABAR"
+
+#data
+FOO&#BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,5): expected-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#BAR"
+
+#data
+FOO&#ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,5): expected-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#ZOO"
+
+#data
+FOO&#xBAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,7): expected-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂşR"
+
+#data
+FOO&#xZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,6): expected-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#xZOO"
+
+#data
+FOO&#XZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,6): expected-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO&#XZOO"
+
+#data
+FOO&#41BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,7): numeric-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO)BAR"
+
+#data
+FOO&#x41BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,10): numeric-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO䆺R"
+
+#data
+FOO&#x41ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,8): numeric-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOAZOO"
+
+#data
+FOO&#x0000;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#x0078;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOxZOO"
+
+#data
+FOO&#x0079;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOyZOO"
+
+#data
+FOO&#x0080;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO€ZOO"
+
+#data
+FOO&#x0081;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂZOO"
+
+#data
+FOO&#x0082;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‚ZOO"
+
+#data
+FOO&#x0083;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOĆ’ZOO"
+
+#data
+FOO&#x0084;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO„ZOO"
+
+#data
+FOO&#x0085;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO…ZOO"
+
+#data
+FOO&#x0086;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO†ZOO"
+
+#data
+FOO&#x0087;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‡ZOO"
+
+#data
+FOO&#x0088;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOˆZOO"
+
+#data
+FOO&#x0089;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‰ZOO"
+
+#data
+FOO&#x008A;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOĹ ZOO"
+
+#data
+FOO&#x008B;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO‹ZOO"
+
+#data
+FOO&#x008C;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOĹ’ZOO"
+
+#data
+FOO&#x008D;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂŤZOO"
+
+#data
+FOO&#x008E;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŽZOO"
+
+#data
+FOO&#x008F;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂŹZOO"
+
+#data
+FOO&#x0090;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂZOO"
+
+#data
+FOO&#x0091;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOâ€ZOO"
+
+#data
+FOO&#x0092;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO’ZOO"
+
+#data
+FOO&#x0093;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO“ZOO"
+
+#data
+FOO&#x0094;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO”ZOO"
+
+#data
+FOO&#x0095;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO•ZOO"
+
+#data
+FOO&#x0096;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO–ZOO"
+
+#data
+FOO&#x0097;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO—ZOO"
+
+#data
+FOO&#x0098;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOËśZOO"
+
+#data
+FOO&#x0099;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO™ZOO"
+
+#data
+FOO&#x009A;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOšZOO"
+
+#data
+FOO&#x009B;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO›ZOO"
+
+#data
+FOO&#x009C;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOĹ“ZOO"
+
+#data
+FOO&#x009D;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOÂťZOO"
+
+#data
+FOO&#x009E;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOĹľZOO"
+
+#data
+FOO&#x009F;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOŸZOO"
+
+#data
+FOO&#x00A0;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO ZOO"
+
+#data
+FOO&#xD7FF;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOíźżZOO"
+
+#data
+FOO&#xD800;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xD801;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xDFFE;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xDFFF;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,11): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xE000;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOZOO"
+
+#data
+FOO&#x10FFFE;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOôŹżľZOO"
+
+#data
+FOO&#x1087D4;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOôź”ZOO"
+
+#data
+FOO&#x10FFFF;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOôŹżżZOO"
+
+#data
+FOO&#x110000;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#xFFFFFF;ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#11111111111
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+(1,13): eof-in-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOďż˝"
+
+#data
+FOO&#1111111111
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+(1,13): eof-in-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOďż˝"
+
+#data
+FOO&#111111111111
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,13): illegal-codepoint-for-numeric-entity
+(1,13): eof-in-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOOďż˝"
+
+#data
+FOO&#11111111111ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,16): numeric-entity-without-semicolon
+(1,16): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#1111111111ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,15): numeric-entity-without-semicolon
+(1,15): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
+
+#data
+FOO&#111111111111ZOO
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,17): numeric-entity-without-semicolon
+(1,17): illegal-codepoint-for-numeric-entity
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO�ZOO"
diff --git a/libs/html5lib/tests/testdata/tree-construction/entities02.dat b/libs/html5lib/tests/testdata/tree-construction/entities02.dat
new file mode 100644
index 000000000..22365c988
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/entities02.dat
@@ -0,0 +1,293 @@
+#data
+<div bar="ZZ&gt;YY"></div>
+#errors
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>YY"
+
+#data
+<div bar="ZZ&"></div>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar='ZZ&'></div>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar=ZZ&></div>
+#errors
+(1,13): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&"
+
+#data
+<div bar="ZZ&gt=YY"></div>
+#errors
+(1,15): named-entity-without-semicolon
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt=YY"
+
+#data
+<div bar="ZZ&gt0YY"></div>
+#errors
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt0YY"
+
+#data
+<div bar="ZZ&gt9YY"></div>
+#errors
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gt9YY"
+
+#data
+<div bar="ZZ&gtaYY"></div>
+#errors
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gtaYY"
+
+#data
+<div bar="ZZ&gtZYY"></div>
+#errors
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&gtZYY"
+
+#data
+<div bar="ZZ&gt YY"></div>
+#errors
+(1,15): named-entity-without-semicolon
+(1,20): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ> YY"
+
+#data
+<div bar="ZZ&gt"></div>
+#errors
+(1,15): named-entity-without-semicolon
+(1,17): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar='ZZ&gt'></div>
+#errors
+(1,15): named-entity-without-semicolon
+(1,17): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar=ZZ&gt></div>
+#errors
+(1,14): named-entity-without-semicolon
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ>"
+
+#data
+<div bar="ZZ&pound_id=23"></div>
+#errors
+(1,18): named-entity-without-semicolon
+(1,26): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZÂŁ_id=23"
+
+#data
+<div bar="ZZ&prod_id=23"></div>
+#errors
+(1,25): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&prod_id=23"
+
+#data
+<div bar="ZZ&pound;_id=23"></div>
+#errors
+(1,27): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZÂŁ_id=23"
+
+#data
+<div bar="ZZ&prod;_id=23"></div>
+#errors
+(1,26): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZâŹ_id=23"
+
+#data
+<div bar="ZZ&pound=23"></div>
+#errors
+(1,18): named-entity-without-semicolon
+(1,23): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&pound=23"
+
+#data
+<div bar="ZZ&prod=23"></div>
+#errors
+(1,22): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       bar="ZZ&prod=23"
+
+#data
+<div>ZZ&pound_id=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,13): named-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZÂŁ_id=23"
+
+#data
+<div>ZZ&prod_id=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ&prod_id=23"
+
+#data
+<div>ZZ&pound;_id=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZÂŁ_id=23"
+
+#data
+<div>ZZ&prod;_id=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZâŹ_id=23"
+
+#data
+<div>ZZ&pound=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,13): named-entity-without-semicolon
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZÂŁ=23"
+
+#data
+<div>ZZ&prod=23</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZ&prod=23"
+
+#data
+<div>ZZ&AElig=</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "ZZÆ="
diff --git a/libs/html5lib/tests/testdata/tree-construction/foreign-fragment.dat b/libs/html5lib/tests/testdata/tree-construction/foreign-fragment.dat
new file mode 100644
index 000000000..1f72b7a9b
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/foreign-fragment.dat
@@ -0,0 +1,549 @@
+#data
+<nobr>X
+#errors
+6: HTML start tag “nobr” in a foreign namespace context.
+7: End of file seen and there were open elements.
+6: Unclosed element “nobr”.
+#document-fragment
+svg path
+#document
+| <svg nobr>
+|   "X"
+
+#data
+<font color></font>X
+#errors
+12: HTML start tag “font” in a foreign namespace context.
+#document-fragment
+svg path
+#document
+| <svg font>
+|   color=""
+| "X"
+
+#data
+<font></font>X
+#errors
+#document-fragment
+svg path
+#document
+| <svg font>
+| "X"
+
+#data
+<g></path>X
+#errors
+10: End tag “path” did not match the name of the current open element (“g”).
+11: End of file seen and there were open elements.
+3: Unclosed element “g”.
+#document-fragment
+svg path
+#document
+| <svg g>
+|   "X"
+
+#data
+</path>X
+#errors
+5: Stray end tag “path”.
+#document-fragment
+svg path
+#document
+| "X"
+
+#data
+</foreignObject>X
+#errors
+5: Stray end tag “foreignobject”.
+#document-fragment
+svg foreignObject
+#document
+| "X"
+
+#data
+</desc>X
+#errors
+5: Stray end tag “desc”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+</title>X
+#errors
+5: Stray end tag “title”.
+#document-fragment
+svg title
+#document
+| "X"
+
+#data
+</svg>X
+#errors
+5: Stray end tag “svg”.
+#document-fragment
+svg svg
+#document
+| "X"
+
+#data
+</mfenced>X
+#errors
+5: Stray end tag “mfenced”.
+#document-fragment
+math mfenced
+#document
+| "X"
+
+#data
+</malignmark>X
+#errors
+5: Stray end tag “malignmark”.
+#document-fragment
+math malignmark
+#document
+| "X"
+
+#data
+</math>X
+#errors
+5: Stray end tag “math”.
+#document-fragment
+math math
+#document
+| "X"
+
+#data
+</annotation-xml>X
+#errors
+5: Stray end tag “annotation-xml”.
+#document-fragment
+math annotation-xml
+#document
+| "X"
+
+#data
+</mtext>X
+#errors
+5: Stray end tag “mtext”.
+#document-fragment
+math mtext
+#document
+| "X"
+
+#data
+</mi>X
+#errors
+5: Stray end tag “mi”.
+#document-fragment
+math mi
+#document
+| "X"
+
+#data
+</mo>X
+#errors
+5: Stray end tag “mo”.
+#document-fragment
+math mo
+#document
+| "X"
+
+#data
+</mn>X
+#errors
+5: Stray end tag “mn”.
+#document-fragment
+math mn
+#document
+| "X"
+
+#data
+</ms>X
+#errors
+5: Stray end tag “ms”.
+#document-fragment
+math ms
+#document
+| "X"
+
+#data
+<b></b><mglyph/><i></i><malignmark/><u></u><ms/>X
+#errors
+51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
+52: End of file seen and there were open elements.
+51: Unclosed element “ms”.
+#document-fragment
+math ms
+#document
+| <b>
+| <math mglyph>
+| <i>
+| <math malignmark>
+| <u>
+| <ms>
+|   "X"
+
+#data
+<malignmark></malignmark>
+#errors
+#document-fragment
+math ms
+#document
+| <math malignmark>
+
+#data
+<div></div>
+#errors
+#document-fragment
+math ms
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math ms
+#document
+| <figure>
+
+#data
+<b></b><mglyph/><i></i><malignmark/><u></u><mn/>X
+#errors
+51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
+52: End of file seen and there were open elements.
+51: Unclosed element “mn”.
+#document-fragment
+math mn
+#document
+| <b>
+| <math mglyph>
+| <i>
+| <math malignmark>
+| <u>
+| <mn>
+|   "X"
+
+#data
+<malignmark></malignmark>
+#errors
+#document-fragment
+math mn
+#document
+| <math malignmark>
+
+#data
+<div></div>
+#errors
+#document-fragment
+math mn
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math mn
+#document
+| <figure>
+
+#data
+<b></b><mglyph/><i></i><malignmark/><u></u><mo/>X
+#errors
+51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
+52: End of file seen and there were open elements.
+51: Unclosed element “mo”.
+#document-fragment
+math mo
+#document
+| <b>
+| <math mglyph>
+| <i>
+| <math malignmark>
+| <u>
+| <mo>
+|   "X"
+
+#data
+<malignmark></malignmark>
+#errors
+#document-fragment
+math mo
+#document
+| <math malignmark>
+
+#data
+<div></div>
+#errors
+#document-fragment
+math mo
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math mo
+#document
+| <figure>
+
+#data
+<b></b><mglyph/><i></i><malignmark/><u></u><mi/>X
+#errors
+51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
+52: End of file seen and there were open elements.
+51: Unclosed element “mi”.
+#document-fragment
+math mi
+#document
+| <b>
+| <math mglyph>
+| <i>
+| <math malignmark>
+| <u>
+| <mi>
+|   "X"
+
+#data
+<malignmark></malignmark>
+#errors
+#document-fragment
+math mi
+#document
+| <math malignmark>
+
+#data
+<div></div>
+#errors
+#document-fragment
+math mi
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math mi
+#document
+| <figure>
+
+#data
+<b></b><mglyph/><i></i><malignmark/><u></u><mtext/>X
+#errors
+51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.
+52: End of file seen and there were open elements.
+51: Unclosed element “mtext”.
+#document-fragment
+math mtext
+#document
+| <b>
+| <math mglyph>
+| <i>
+| <math malignmark>
+| <u>
+| <mtext>
+|   "X"
+
+#data
+<malignmark></malignmark>
+#errors
+#document-fragment
+math mtext
+#document
+| <math malignmark>
+
+#data
+<div></div>
+#errors
+#document-fragment
+math mtext
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math mtext
+#document
+| <figure>
+
+#data
+<div></div>
+#errors
+5: HTML start tag “div” in a foreign namespace context.
+#document-fragment
+math annotation-xml
+#document
+| <math div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math annotation-xml
+#document
+| <math figure>
+
+#data
+<div></div>
+#errors
+5: HTML start tag “div” in a foreign namespace context.
+#document-fragment
+math math
+#document
+| <math div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+math math
+#document
+| <math figure>
+
+#data
+<div></div>
+#errors
+#document-fragment
+svg foreignObject
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+svg foreignObject
+#document
+| <figure>
+
+#data
+<div></div>
+#errors
+#document-fragment
+svg title
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+svg title
+#document
+| <figure>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+svg desc
+#document
+| <figure>
+
+#data
+<div><h1>X</h1></div>
+#errors
+5: HTML start tag “div” in a foreign namespace context.
+9: HTML start tag “h1” in a foreign namespace context.
+#document-fragment
+svg svg
+#document
+| <svg div>
+|   <svg h1>
+|     "X"
+
+#data
+<div></div>
+#errors
+5: HTML start tag “div” in a foreign namespace context.
+#document-fragment
+svg svg
+#document
+| <svg div>
+
+#data
+<div></div>
+#errors
+#document-fragment
+svg desc
+#document
+| <div>
+
+#data
+<figure></figure>
+#errors
+#document-fragment
+svg desc
+#document
+| <figure>
+
+#data
+<plaintext><foo>
+#errors
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+svg desc
+#document
+| <plaintext>
+|   "<foo>"
+
+#data
+<frameset>X
+#errors
+6: Stray start tag “frameset”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+<head>X
+#errors
+6: Stray start tag “head”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+<body>X
+#errors
+6: Stray start tag “body”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+<html>X
+#errors
+6: Stray start tag “html”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+<html class="foo">X
+#errors
+6: Stray start tag “html”.
+#document-fragment
+svg desc
+#document
+| "X"
+
+#data
+<body class="foo">X
+#errors
+6: Stray start tag “body”.
+#document-fragment
+svg desc
+#document
+| "X"
diff --git a/libs/html5lib/tests/testdata/tree-construction/html5test-com.dat b/libs/html5lib/tests/testdata/tree-construction/html5test-com.dat
new file mode 100644
index 000000000..8c6ec40cd
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/html5test-com.dat
@@ -0,0 +1,291 @@
+#data
+<div<div>
+#errors
+(1,9): expected-doctype-but-got-start-tag
+(1,9): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div<div>
+
+#data
+<div foo<bar=''>
+#errors
+(1,9): invalid-character-in-attribute-name
+(1,16): expected-doctype-but-got-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo<bar=""
+
+#data
+<div foo=`bar`>
+#errors
+(1,10): equals-in-unquoted-attribute-value
+(1,14): unexpected-character-in-unquoted-attribute-value
+(1,15): expected-doctype-but-got-start-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo="`bar`"
+
+#data
+<div \"foo=''>
+#errors
+(1,7): invalid-character-in-attribute-name
+(1,14): expected-doctype-but-got-start-tag
+(1,14): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       \"foo=""
+
+#data
+<a href='\nbar'></a>
+#errors
+(1,16): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="\nbar"
+
+#data
+<!DOCTYPE html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+&lang;&rang;
+#errors
+(1,6): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "⟨⟩"
+
+#data
+&apos;
+#errors
+(1,6): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "'"
+
+#data
+&ImaginaryI;
+#errors
+(1,12): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "â…"
+
+#data
+&Kopf;
+#errors
+(1,6): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "đť•‚"
+
+#data
+&notinva;
+#errors
+(1,9): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "â‰"
+
+#data
+<?import namespace="foo" implementation="#bar">
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,47): expected-doctype-but-got-eof
+#document
+| <!-- ?import namespace="foo" implementation="#bar" -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!--foo--bar-->
+#errors
+(1,10): unexpected-char-in-comment
+(1,15): expected-doctype-but-got-eof
+#document
+| <!-- foo--bar -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<![CDATA[x]]>
+#errors
+(1,2): expected-dashes-or-doctype
+(1,13): expected-doctype-but-got-eof
+#document
+| <!-- [CDATA[x]] -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<textarea><!--</textarea>--></textarea>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,39): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--"
+|     "-->"
+
+#data
+<textarea><!--</textarea>-->
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--"
+|     "-->"
+
+#data
+<style><!--</style>--></style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,30): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "-->"
+
+#data
+<style><!--</style>-->
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "-->"
+
+#data
+<ul><li>A </li> <li>B</li></ul>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         "A "
+|       " "
+|       <li>
+|         "B"
+
+#data
+<table><form><input type=hidden><input></form><div></div></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,13): unexpected-form-in-table
+(1,32): unexpected-hidden-input-in-table
+(1,39): unexpected-start-tag-implies-table-voodoo
+(1,46): unexpected-end-tag-implies-table-voodoo
+(1,46): unexpected-end-tag
+(1,51): unexpected-start-tag-implies-table-voodoo
+(1,57): unexpected-end-tag-implies-table-voodoo
+#document
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|     <div>
+|     <table>
+|       <form>
+|       <input>
+|         type="hidden"
+
+#data
+<i>A<b>B<p></i>C</b>D
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,15): adoption-agency-1.3
+(1,20): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "A"
+|       <b>
+|         "B"
+|     <b>
+|     <p>
+|       <b>
+|         <i>
+|         "C"
+|       "D"
+
+#data
+<div></div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<svg></svg>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<math></math>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
diff --git a/libs/html5lib/tests/testdata/tree-construction/inbody01.dat b/libs/html5lib/tests/testdata/tree-construction/inbody01.dat
new file mode 100644
index 000000000..10f6520f6
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/inbody01.dat
@@ -0,0 +1,54 @@
+#data
+<button>1</foo>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,15): unexpected-end-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <button>
+|       "1"
+
+#data
+<foo>1<p>2</foo>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,16): unexpected-end-tag
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "1"
+|       <p>
+|         "2"
+
+#data
+<dd>1</foo>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+|       "1"
+
+#data
+<foo>1<dd>2</foo>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): unexpected-end-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "1"
+|       <dd>
+|         "2"
diff --git a/libs/html5lib/tests/testdata/tree-construction/isindex.dat b/libs/html5lib/tests/testdata/tree-construction/isindex.dat
new file mode 100644
index 000000000..733f82ea8
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/isindex.dat
@@ -0,0 +1,49 @@
+#data
+<isindex>
+#errors
+(1,9): expected-doctype-but-got-start-tag
+(1,9): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <isindex>
+
+#data
+<isindex name="A" action="B" prompt="C" foo="D">
+#errors
+(1,48): expected-doctype-but-got-start-tag
+(1,48): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <isindex>
+|       action="B"
+|       foo="D"
+|       name="A"
+|       prompt="C"
+
+#data
+<form><isindex>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <isindex>
+
+#data
+<!doctype html><isindex>x</isindex>x
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <isindex>
+|       "x"
+|     "x"
diff --git a/libs/html5lib/tests/testdata/tree-construction/main-element.dat b/libs/html5lib/tests/testdata/tree-construction/main-element.dat
new file mode 100644
index 000000000..4b103bb0f
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/main-element.dat
@@ -0,0 +1,46 @@
+#data
+<!doctype html><p>foo<main>bar<p>baz
+#errors
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "foo"
+|     <main>
+|       "bar"
+|       <p>
+|         "baz"
+
+#data
+<!doctype html><main><p>foo</main>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <main>
+|       <p>
+|         "foo"
+|     "bar"
+
+#data
+<!DOCTYPE html>xxx<svg><x><g><a><main><b>
+#errors
+ * (1,42) unexpected HTML-like start tag token in foreign content
+ * (1,42) unexpected end of file
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "xxx"
+|     <svg svg>
+|       <svg x>
+|         <svg g>
+|           <svg a>
+|             <svg main>
+|     <b>
diff --git a/libs/html5lib/tests/testdata/tree-construction/math.dat b/libs/html5lib/tests/testdata/tree-construction/math.dat
new file mode 100644
index 000000000..ae9cd7c61
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/math.dat
@@ -0,0 +1,81 @@
+#data
+<math><tr><td><mo><tr>
+#errors
+#document-fragment
+td
+#document
+| <math math>
+|   <math tr>
+|     <math td>
+|       <math mo>
+
+#data
+<math><tr><td><mo><tr>
+#errors
+#document-fragment
+tr
+#document
+| <math math>
+|   <math tr>
+|     <math td>
+|       <math mo>
+
+#data
+<math><thead><mo><tbody>
+#errors
+#document-fragment
+thead
+#document
+| <math math>
+|   <math thead>
+|     <math mo>
+
+#data
+<math><tfoot><mo><tbody>
+#errors
+#document-fragment
+tfoot
+#document
+| <math math>
+|   <math tfoot>
+|     <math mo>
+
+#data
+<math><tbody><mo><tfoot>
+#errors
+#document-fragment
+tbody
+#document
+| <math math>
+|   <math tbody>
+|     <math mo>
+
+#data
+<math><tbody><mo></table>
+#errors
+#document-fragment
+tbody
+#document
+| <math math>
+|   <math tbody>
+|     <math mo>
+
+#data
+<math><thead><mo></table>
+#errors
+#document-fragment
+tbody
+#document
+| <math math>
+|   <math thead>
+|     <math mo>
+
+#data
+<math><tfoot><mo></table>
+#errors
+#document-fragment
+tbody
+#document
+| <math math>
+|   <math tfoot>
+|     <math mo>
diff --git a/libs/html5lib/tests/testdata/tree-construction/menuitem-element.dat b/libs/html5lib/tests/testdata/tree-construction/menuitem-element.dat
new file mode 100644
index 000000000..306933200
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/menuitem-element.dat
@@ -0,0 +1,229 @@
+#data
+<menuitem>
+#errors
+10: Start tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+
+#data
+</menuitem>
+#errors
+11: End tag seen without seeing a doctype first. Expected “<!DOCTYPE html>”.
+11: Stray end tag “menuitem”.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><body><menuitem>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       "A"
+
+#data
+<!DOCTYPE html><body><menuitem>A<menuitem>B
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       "A"
+|     <menuitem>
+|       "B"
+
+#data
+<!DOCTYPE html><body><menuitem>A<menu>B</menu>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       "A"
+|     <menu>
+|       "B"
+
+#data
+<!DOCTYPE html><body><menuitem>A<hr>B
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       "A"
+|     <hr>
+|     "B"
+
+#data
+<!DOCTYPE html><li><menuitem><li>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <li>
+|       <menuitem>
+|     <li>
+
+#data
+<!DOCTYPE html><menuitem><p></menuitem>x
+#errors
+39: Stray end tag “menuitem”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       <p>
+|         "x"
+
+#data
+<!DOCTYPE html><p><b></p><menuitem>
+#errors
+25: End tag “p” seen, but there were open elements.
+21: Unclosed element “b”.
+35: End of file seen and there were open elements.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|     <b>
+|       <menuitem>
+
+#data
+<!DOCTYPE html><menuitem><asdf></menuitem>x
+#errors
+40: End tag “menuitem” seen, but there were open elements.
+31: Unclosed element “asdf”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       <asdf>
+|     "x"
+
+#data
+<!DOCTYPE html></menuitem>
+#errors
+26: Stray end tag “menuitem”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html></menuitem>
+#errors
+26: Stray end tag “menuitem”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><head></menuitem>
+#errors
+26: Stray end tag “menuitem”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><select><menuitem></select>
+#errors
+33: Stray start tag “menuitem”.
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!DOCTYPE html><option><menuitem>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <option>
+|       <menuitem>
+
+#data
+<!DOCTYPE html><menuitem><option>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       <option>
+
+#data
+<!DOCTYPE html><menuitem></body>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+
+#data
+<!DOCTYPE html><menuitem></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+
+#data
+<!DOCTYPE html><menuitem><p>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       <p>
+
+#data
+<!DOCTYPE html><menuitem><li>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <menuitem>
+|       <li>
diff --git a/libs/html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat b/libs/html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat
new file mode 100644
index 000000000..ca35c0e7c
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/namespace-sensitivity.dat
@@ -0,0 +1,16 @@
+#data
+<body><table><tr><td><svg><td><foreignObject><span></td>Foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Foo"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg td>
+|                 <svg foreignObject>
+|                   <span>
diff --git a/libs/html5lib/tests/testdata/tree-construction/noscript01.dat b/libs/html5lib/tests/testdata/tree-construction/noscript01.dat
new file mode 100644
index 000000000..f11eca549
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/noscript01.dat
@@ -0,0 +1,237 @@
+#data
+<head><noscript><!doctype html><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 31 Unexpected DOCTYPE. Ignored.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><html class="foo"><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 34 html needs to be the first start tag.
+#document
+| <html>
+|   class="foo"
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript></noscript>
+#script-off
+#errors
+(1,6): expected-doctype-but-got-tag
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+
+#data
+<head><noscript>   </noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "   "
+|   <body>
+
+#data
+<head><noscript><!--foo--></noscript>
+#script-off
+#errors
+(1,6): expected-doctype-but-got-tag
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><basefont><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <basefont>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><bgsound><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <bgsound>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><link><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <link>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><meta><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <meta>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><noframes>XXX</noscript></noframes></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <noframes>
+|         "XXX</noscript>"
+|   <body>
+
+#data
+<head><noscript><style>XXX</style></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <style>
+|         "XXX"
+|   <body>
+
+#data
+<head><noscript></br><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 21 Element br not allowed in a inhead-noscript context
+Line: 1 Col: 21 Unexpected end tag (br). Treated as br element.
+Line: 1 Col: 42 Unexpected end tag (noscript). Ignored.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+|     <br>
+|     <!-- foo -->
+
+#data
+<head><noscript><head class="foo"><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 34 Unexpected start tag (head).
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><noscript class="foo"><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 34 Unexpected start tag (noscript).
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript></p><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 20 Unexpected end tag (p). Ignored.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- foo -->
+|   <body>
+
+#data
+<head><noscript><p><!--foo--></noscript>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 19 Element p not allowed in a inhead-noscript context
+Line: 1 Col: 40 Unexpected end tag (noscript). Ignored.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+|     <p>
+|       <!-- foo -->
+
+#data
+<head><noscript>XXX<!--foo--></noscript></head>
+#script-off
+#errors
+Line: 1 Col: 6 Unexpected start tag (head). Expected DOCTYPE.
+Line: 1 Col: 19 Unexpected non-space character. Expected inhead-noscript content
+Line: 1 Col: 30 Unexpected end tag (noscript). Ignored.
+Line: 1 Col: 37 Unexpected end tag (head). Ignored.
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+|     "XXX"
+|     <!-- foo -->
+
+#data
+<head><noscript>
+#script-off
+#errors
+(1,6): expected-doctype-but-got-tag
+(1,6): eof-in-head-noscript
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat b/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat
new file mode 100644
index 000000000..3ee8cec90
Binary files /dev/null and b/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes-plain-text-unsafe.dat differ
diff --git a/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat b/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat
new file mode 100644
index 000000000..1647d7f23
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/pending-spec-changes.dat
@@ -0,0 +1,46 @@
+#data
+<input type="hidden"><frameset>
+#errors
+(1,21): expected-doctype-but-got-start-tag
+(1,31): unexpected-start-tag
+(1,31): eof-in-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><table><caption><svg>foo</table>bar
+#errors
+(1,47): unexpected-end-tag
+(1,47): end-table-tag-in-caption
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           "foo"
+|     "bar"
+
+#data
+<table><tr><td><svg><desc><td></desc><circle>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,30): unexpected-cell-end-tag
+(1,37): unexpected-end-tag
+(1,45): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg desc>
+|           <td>
+|             <circle>
diff --git a/libs/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat b/libs/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat
new file mode 100644
index 000000000..f40dd5760
Binary files /dev/null and b/libs/html5lib/tests/testdata/tree-construction/plain-text-unsafe.dat differ
diff --git a/libs/html5lib/tests/testdata/tree-construction/ruby.dat b/libs/html5lib/tests/testdata/tree-construction/ruby.dat
new file mode 100644
index 000000000..696782f04
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/ruby.dat
@@ -0,0 +1,301 @@
+#data
+<html><ruby>a<rb>b<rb></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|       <rb>
+
+#data
+<html><ruby>a<rb>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rb>b<rtc></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|       <rtc>
+
+#data
+<html><ruby>a<rb>b<rp></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|       <rp>
+
+#data
+<html><ruby>a<rb>b<span></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,31): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|         <span>
+
+#data
+<html><ruby>a<rt>b<rb></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|       <rb>
+
+#data
+<html><ruby>a<rt>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rt>b<rtc></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|       <rtc>
+
+#data
+<html><ruby>a<rt>b<rp></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|       <rp>
+
+#data
+<html><ruby>a<rt>b<span></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,31): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|         <span>
+
+#data
+<html><ruby>a<rtc>b<rb></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|       <rb>
+
+#data
+<html><ruby>a<rtc>b<rt>c<rt>d</ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|         <rt>
+|           "c"
+|         <rt>
+|           "d"
+
+#data
+<html><ruby>a<rtc>b<rtc></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|       <rtc>
+
+#data
+<html><ruby>a<rtc>b<rp></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|         <rp>
+
+#data
+<html><ruby>a<rtc>b<span></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|         <span>
+
+#data
+<html><ruby>a<rp>b<rb></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|       <rb>
+
+#data
+<html><ruby>a<rp>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rp>b<rtc></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|       <rtc>
+
+#data
+<html><ruby>a<rp>b<rp></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|       <rp>
+
+#data
+<html><ruby>a<rp>b<span></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,31): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|         <span>
+
+#data
+<html><ruby><rtc><ruby>a<rb>b<rt></ruby></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <rtc>
+|         <ruby>
+|           "a"
+|           <rb>
+|             "b"
+|           <rt>
diff --git a/libs/html5lib/tests/testdata/tree-construction/scriptdata01.dat b/libs/html5lib/tests/testdata/tree-construction/scriptdata01.dat
new file mode 100644
index 000000000..ac698d282
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/scriptdata01.dat
@@ -0,0 +1,365 @@
+#data
+FOO<script>'Hello'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'Hello'"
+|     "BAR"
+
+#data
+FOO<script></script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script >BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script/>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,21): self-closing-flag-on-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script></script/ >BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,20): unexpected-character-after-solidus-in-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script type="text/plain"></scriptx>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,42): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "</scriptx>BAR"
+
+#data
+FOO<script></script foo=">" dd>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,31): attributes-in-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|     "BAR"
+
+#data
+FOO<script>'<'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<'"
+|     "BAR"
+
+#data
+FOO<script>'<!'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!'"
+|     "BAR"
+
+#data
+FOO<script>'<!-'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-'"
+|     "BAR"
+
+#data
+FOO<script>'<!--'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!--'"
+|     "BAR"
+
+#data
+FOO<script>'<!---'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!---'"
+|     "BAR"
+
+#data
+FOO<script>'<!-->'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-->'"
+|     "BAR"
+
+#data
+FOO<script>'<!-->'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-->'"
+|     "BAR"
+
+#data
+FOO<script>'<!-- potato'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- potato'"
+|     "BAR"
+
+#data
+FOO<script>'<!-- <sCrIpt'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- <sCrIpt'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt>'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,56): expected-script-data-but-got-eof
+(1,56): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt>'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> -'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,58): expected-script-data-but-got-eof
+(1,58): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> -'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> --'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,59): expected-script-data-but-got-eof
+(1,59): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> --'</script>BAR"
+
+#data
+FOO<script>'<!-- <sCrIpt> -->'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "'<!-- <sCrIpt> -->'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> --!>'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,61): expected-script-data-but-got-eof
+(1,61): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> --!>'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt> -- >'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,61): expected-script-data-but-got-eof
+(1,61): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt> -- >'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt '</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,56): expected-script-data-but-got-eof
+(1,56): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt '</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+(1,56): expected-script-data-but-got-eof
+(1,56): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt/'</script>BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt\'</script>BAR
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt\'"
+|     "BAR"
+
+#data
+FOO<script type="text/plain">'<!-- <sCrIpt/'</script>BAR</script>QUX
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       type="text/plain"
+|       "'<!-- <sCrIpt/'</script>BAR"
+|     "QUX"
+
+#data
+FOO<script><!--<script>-></script>--></script>QUX
+#errors
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "FOO"
+|     <script>
+|       "<!--<script>-></script>-->"
+|     "QUX"
diff --git a/libs/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat b/libs/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat
new file mode 100644
index 000000000..4e08d0e84
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/scripted/adoption01.dat
@@ -0,0 +1,15 @@
+#data
+<p><b id="A"><script>document.getElementById("A").id = "B"</script></p>TEXT</b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         id="B"
+|         <script>
+|           "document.getElementById("A").id = "B""
+|     <b>
+|       id="A"
+|       "TEXT"
diff --git a/libs/html5lib/tests/testdata/tree-construction/scripted/ark.dat b/libs/html5lib/tests/testdata/tree-construction/scripted/ark.dat
new file mode 100644
index 000000000..acbac41df
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/scripted/ark.dat
@@ -0,0 +1,26 @@
+#data
+<p><font size=4><font size=4><font size=4><script>document.getElementsByTagName("font")[2].setAttribute("size", "5");</script><font size=4><p>X
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="5"
+|             <script>
+|               "document.getElementsByTagName("font")[2].setAttribute("size", "5");"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             "X"
diff --git a/libs/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat b/libs/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat
new file mode 100644
index 000000000..ef4a41ca0
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/scripted/webkit01.dat
@@ -0,0 +1,28 @@
+#data
+1<script>document.write("2")</script>3
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "1"
+|     <script>
+|       "document.write("2")"
+|     "23"
+
+#data
+1<script>document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")</script>4
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     "1"
+|     <script>
+|       "document.write("<script>document.write('2')</scr"+ "ipt><script>document.write('3')</scr" + "ipt>")"
+|     <script>
+|       "document.write('2')"
+|     "2"
+|     <script>
+|       "document.write('3')"
+|     "34"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tables01.dat b/libs/html5lib/tests/testdata/tree-construction/tables01.dat
new file mode 100644
index 000000000..f0caaa3c5
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tables01.dat
@@ -0,0 +1,286 @@
+#data
+<table><th>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,11): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <th>
+
+#data
+<table><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,11): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><col foo='bar'>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,22): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|           foo="bar"
+
+#data
+<table><colgroup></html>foo
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,24): unexpected-end-tag
+(1,27): foster-parenting-character-in-table
+(1,27): foster-parenting-character-in-table
+(1,27): foster-parenting-character-in-table
+(1,27): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <table>
+|       <colgroup>
+
+#data
+<table></table><p>foo
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|     <p>
+|       "foo"
+
+#data
+<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,14): unexpected-end-tag
+(1,24): unexpected-end-tag
+(1,30): unexpected-end-tag
+(1,41): unexpected-end-tag
+(1,48): unexpected-end-tag
+(1,56): unexpected-end-tag
+(1,61): unexpected-end-tag
+(1,69): unexpected-end-tag
+(1,74): unexpected-end-tag
+(1,82): unexpected-end-tag
+(1,87): unexpected-end-tag
+(1,91): unexpected-cell-in-table-body
+(1,91): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><select><option>3</select></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-implies-table-voodoo
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "3"
+|     <table>
+
+#data
+<table><select><table></table></select></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-implies-table-voodoo
+(1,22): unexpected-table-element-start-tag-in-select-in-table
+(1,22): unexpected-start-tag-implies-end-tag
+(1,39): unexpected-end-tag
+(1,47): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|     <table>
+
+#data
+<table><select></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-implies-table-voodoo
+(1,23): unexpected-table-element-end-tag-in-select-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+
+#data
+<table><select><option>A<tr><td>B</td></tr></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-implies-table-voodoo
+(1,28): unexpected-table-element-start-tag-in-select-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "A"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "B"
+
+#data
+<table><td></body></caption></col></colgroup></html>foo
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,18): unexpected-end-tag
+(1,28): unexpected-end-tag
+(1,34): unexpected-end-tag
+(1,45): unexpected-end-tag
+(1,52): unexpected-end-tag
+(1,55): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "foo"
+
+#data
+<table><td>A</table>B
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+|     "B"
+
+#data
+<table><tr><caption>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|       <caption>
+
+#data
+<table><tr></body></caption></col></colgroup></html></td></th><td>foo
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,18): unexpected-end-tag-in-table-row
+(1,28): unexpected-end-tag-in-table-row
+(1,34): unexpected-end-tag-in-table-row
+(1,45): unexpected-end-tag-in-table-row
+(1,52): unexpected-end-tag-in-table-row
+(1,57): unexpected-end-tag-in-table-row
+(1,62): unexpected-end-tag-in-table-row
+(1,69): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "foo"
+
+#data
+<table><td><tr>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,15): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|         <tr>
+
+#data
+<table><td><button><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,23): unexpected-cell-end-tag
+(1,23): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <button>
+|           <td>
+
+#data
+<table><tr><td><svg><desc><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,30): unexpected-cell-end-tag
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg desc>
+|           <td>
diff --git a/libs/html5lib/tests/testdata/tree-construction/template.dat b/libs/html5lib/tests/testdata/tree-construction/template.dat
new file mode 100644
index 000000000..b38d4f580
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/template.dat
@@ -0,0 +1,1604 @@
+#data
+<body><template>Hello</template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         "Hello"
+
+#data
+<template>Hello</template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         "Hello"
+|   <body>
+
+#data
+<template></template><div></div>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|   <body>
+|     <div>
+
+#data
+<html><template>Hello</template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         "Hello"
+|   <body>
+
+#data
+<head><template><div></div></template></head>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <div>
+|   <body>
+
+#data
+<div><template><div><span></template><b>
+#errors
+ * (1,6) missing DOCTYPE
+ * (1,38) mismatched template end tag
+ * (1,41) unexpected end of file
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <template>
+|         content
+|           <div>
+|             <span>
+|       <b>
+
+#data
+<div><template></div>Hello
+#errors
+ * (1,6) missing DOCTYPE
+ * (1,22) unexpected token in template
+ * (1,27) unexpected end of file in template
+ * (1,27) unexpected end of file
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <template>
+|         content
+|           "Hello"
+
+#data
+<div></template></div>
+#errors
+ * (1,6) missing DOCTYPE
+ * (1,17) unexpected template end tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<table><template></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+
+#data
+<table><template></template></div>
+#errors
+ * (1,8) missing DOCTYPE
+ * (1,35) unexpected token in table - foster parenting
+ * (1,35) unexpected end tag
+ * (1,35) unexpected end of file
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+
+#data
+<table><div><template></template></div>
+#errors
+ * (1,8) missing DOCTYPE
+ * (1,13) unexpected token in table - foster parenting
+ * (1,40) unexpected token in table - foster parenting
+ * (1,40) unexpected end of file
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <template>
+|         content
+|     <table>
+
+#data
+<table><template></template><div></div>
+#errors
+no doctype
+bad div in table
+bad /div in table
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|     <table>
+|       <template>
+|         content
+
+#data
+<table>   <template></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "   "
+|       <template>
+|         content
+
+#data
+<table><tbody><template></template></tbody>
+#errors
+no doctype
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <template>
+|           content
+
+#data
+<table><tbody><template></tbody></template>
+#errors
+no doctype
+bad /tbody
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <template>
+|           content
+
+#data
+<table><tbody><template></template></tbody></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <template>
+|           content
+
+#data
+<table><thead><template></template></thead>
+#errors
+no doctype
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <thead>
+|         <template>
+|           content
+
+#data
+<table><tfoot><template></template></tfoot>
+#errors
+no doctype
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tfoot>
+|         <template>
+|           content
+
+#data
+<select><template></template></select>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <template>
+|         content
+
+#data
+<select><template><option></option></template></select>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <template>
+|         content
+|           <option>
+
+#data
+<template><option></option></select><option></option></template>
+#errors
+no doctype
+bad /select
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <option>
+|         <option>
+|   <body>
+
+#data
+<select><template></template><option></select>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <template>
+|         content
+|       <option>
+
+#data
+<select><option><template></template></select>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         <template>
+|           content
+
+#data
+<select><template>
+#errors
+no doctype
+eof in template
+eof in select
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <template>
+|         content
+
+#data
+<select><option></option><template>
+#errors
+no doctype
+eof in template
+eof in select
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <template>
+|         content
+
+#data
+<select><option></option><template><option>
+#errors
+no doctype
+eof in template
+eof in select
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <template>
+|         content
+|           <option>
+
+#data
+<table><thead><template><td></template></table>
+#errors
+ * (1,8) missing DOCTYPE
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <thead>
+|         <template>
+|           content
+|             <td>
+
+#data
+<table><template><thead></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <thead>
+
+#data
+<body><table><template><td></tr><div></template></table>
+#errors
+no doctype
+bad </tr>
+missing </div>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <td>
+|             <div>
+
+#data
+<table><template><thead></template></thead></table>
+#errors
+no doctype
+bad /thead after /template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <thead>
+
+#data
+<table><thead><template><tr></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <thead>
+|         <template>
+|           content
+|             <tr>
+
+#data
+<table><template><tr></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <tr>
+
+#data
+<table><tr><template><td>
+#errors
+no doctype
+eof in template
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <template>
+|             content
+|               <td>
+
+#data
+<table><template><tr><template><td></template></tr></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <tr>
+|             <template>
+|               content
+|                 <td>
+
+#data
+<table><template><tr><template><td></td></template></tr></template></table>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <tr>
+|             <template>
+|               content
+|                 <td>
+
+#data
+<table><template><td></template>
+#errors
+no doctype
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <template>
+|         content
+|           <td>
+
+#data
+<body><template><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+
+#data
+<body><template><template><tr></tr></template><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <tr>
+|         <td>
+
+#data
+<table><colgroup><template><col>
+#errors
+no doctype
+eof in template
+eof in table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <template>
+|           content
+|             <col>
+
+#data
+<frameset><template><frame></frame></template></frameset>
+#errors
+ * (1,11) missing DOCTYPE
+ * (1,21) unexpected start tag token
+ * (1,36) unexpected end tag token
+ * (1,47) unexpected end tag token
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<template><frame></frame></frameset><frame></frame></template>
+#errors
+ * (1,11) missing DOCTYPE
+ * (1,18) unexpected start tag
+ * (1,26) unexpected end tag
+ * (1,37) unexpected end tag
+ * (1,44) unexpected start tag
+ * (1,52) unexpected end tag
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|   <body>
+
+#data
+<template><div><frameset><span></span></div><span></span></template>
+#errors
+no doctype
+bad frameset
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <div>
+|           <span>
+|         <span>
+|   <body>
+
+#data
+<body><template><div><frameset><span></span></div><span></span></template></body>
+#errors
+no doctype
+bad frameset
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <div>
+|           <span>
+|         <span>
+
+#data
+<body><template><script>var i = 1;</script><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <script>
+|           "var i = 1;"
+|         <td>
+
+#data
+<body><template><tr><div></div></tr></template>
+#errors
+no doctype
+foster-parented div
+foster-parented /div
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <div>
+
+#data
+<body><template><tr></tr><td></td></template>
+#errors
+no doctype
+unexpected <td>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <tr>
+|           <td>
+
+#data
+<body><template><td></td></tr><td></td></template>
+#errors
+no doctype
+bad </tr>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+|         <td>
+
+#data
+<body><template><td></td><tbody><td></td></template>
+#errors
+no doctype
+bad <tbody>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+|         <td>
+
+#data
+<body><template><td></td><caption></caption><td></td></template>
+#errors
+ * (1,7) missing DOCTYPE
+ * (1,35) unexpected start tag in table row
+ * (1,45) unexpected end tag in table row
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+|         <td>
+
+#data
+<body><template><td></td><colgroup></caption><td></td></template>
+#errors
+ * (1,7) missing DOCTYPE
+ * (1,36) unexpected start tag in table row
+ * (1,46) unexpected end tag in table row
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+|         <td>
+
+#data
+<body><template><td></td></table><td></td></template>
+#errors
+no doctype
+bad </table>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <td>
+|         <td>
+
+#data
+<body><template><tr></tr><tbody><tr></tr></template>
+#errors
+no doctype
+bad <tbody>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <tr>
+
+#data
+<body><template><tr></tr><caption><tr></tr></template>
+#errors
+no doctype
+bad <caption>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <tr>
+
+#data
+<body><template><tr></tr></table><tr></tr></template>
+#errors
+no doctype
+bad </table>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <tr>
+
+#data
+<body><template><thead></thead><caption></caption><tbody></tbody></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <thead>
+|         <caption>
+|         <tbody>
+
+#data
+<body><template><thead></thead></table><tbody></tbody></template></body>
+#errors
+no doctype
+bad </table>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <thead>
+|         <tbody>
+
+#data
+<body><template><div><tr></tr></div></template>
+#errors
+no doctype
+bad tr
+bad /tr
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <div>
+
+#data
+<body><template><em>Hello</em></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <em>
+|           "Hello"
+
+#data
+<body><template><!--comment--></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <!-- comment -->
+
+#data
+<body><template><style></style><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <style>
+|         <td>
+
+#data
+<body><template><meta><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <meta>
+|         <td>
+
+#data
+<body><template><link><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <link>
+|         <td>
+
+#data
+<body><template><template><tr></tr></template><td></td></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <tr>
+|         <td>
+
+#data
+<body><table><colgroup><template><col></col></template></colgroup></table></body>
+#errors
+no doctype
+bad /col
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <template>
+|           content
+|             <col>
+
+#data
+<body a=b><template><div></div><body c=d><div></div></body></template></body>
+#errors
+no doctype
+bad <body>
+bad </body>
+#document
+| <html>
+|   <head>
+|   <body>
+|     a="b"
+|     <template>
+|       content
+|         <div>
+|         <div>
+
+#data
+<html a=b><template><div><html b=c><span></template>
+#errors
+no doctype
+bad <html>
+missing end tags in template
+#document
+| <html>
+|   a="b"
+|   <head>
+|     <template>
+|       content
+|         <div>
+|           <span>
+|   <body>
+
+#data
+<html a=b><template><col></col><html b=c><col></col></template>
+#errors
+no doctype
+bad /col
+bad html
+bad /col
+#document
+| <html>
+|   a="b"
+|   <head>
+|     <template>
+|       content
+|         <col>
+|         <col>
+|   <body>
+
+#data
+<html a=b><template><frame></frame><html b=c><frame></frame></template>
+#errors
+no doctype
+bad frame
+bad /frame
+bad html
+bad frame
+bad /frame
+#document
+| <html>
+|   a="b"
+|   <head>
+|     <template>
+|       content
+|   <body>
+
+#data
+<body><template><tr></tr><template></template><td></td></template>
+#errors
+no doctype
+unexpected <td>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <tr>
+|         <template>
+|           content
+|         <tr>
+|           <td>
+
+#data
+<body><template><thead></thead><template><tr></tr></template><tr></tr><tfoot></tfoot></template>
+#errors
+no doctype
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <thead>
+|         <template>
+|           content
+|             <tr>
+|         <tbody>
+|           <tr>
+|         <tfoot>
+
+#data
+<body><template><template><b><template></template></template>text</template>
+#errors
+no doctype
+missing </b>
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <b>
+|               <template>
+|                 content
+|         "text"
+
+#data
+<body><template><col><colgroup>
+#errors
+no doctype
+bad colgroup
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><col></colgroup>
+#errors
+no doctype
+bogus /colgroup
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><col><colgroup></template></body>
+#errors
+no doctype
+bad colgroup
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><col><div>
+#errors
+ * (1,7) missing DOCTYPE
+ * (1,27) unexpected token
+ * (1,27) unexpected end of file in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><col></div>
+#errors
+no doctype
+bad /div
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><col>Hello
+#errors
+no doctype
+unexpected text
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <col>
+
+#data
+<body><template><i><menu>Foo</i>
+#errors
+no doctype
+mising /menu
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <i>
+|         <menu>
+|           <i>
+|             "Foo"
+
+#data
+<body><template></div><div>Foo</div><template></template><tr></tr>
+#errors
+no doctype
+bogus /div
+bogus tr
+bogus /tr
+eof in template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+|         <div>
+|           "Foo"
+|         <template>
+|           content
+
+#data
+<body><div><template></div><tr><td>Foo</td></tr></template>
+#errors
+ * (1,7) missing DOCTYPE
+ * (1,28) unexpected token in template
+ * (1,60) unexpected end of file
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <template>
+|         content
+|           <tr>
+|             <td>
+|               "Foo"
+
+#data
+<template></figcaption><sub><table></table>
+#errors
+no doctype
+bad /figcaption
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <sub>
+|           <table>
+|   <body>
+
+#data
+<template><template>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|   <body>
+
+#data
+<template><div>
+#errors
+no doctype
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <div>
+|   <body>
+
+#data
+<template><template><div>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <div>
+|   <body>
+
+#data
+<template><template><table>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <table>
+|   <body>
+
+#data
+<template><template><tbody>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <tbody>
+|   <body>
+
+#data
+<template><template><tr>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <tr>
+|   <body>
+
+#data
+<template><template><td>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <td>
+|   <body>
+
+#data
+<template><template><caption>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <caption>
+|   <body>
+
+#data
+<template><template><colgroup>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <colgroup>
+|   <body>
+
+#data
+<template><template><col>
+#errors
+no doctype
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <col>
+|   <body>
+
+#data
+<template><template><tbody><select>
+#errors
+ * (1,11) missing DOCTYPE
+ * (1,36) unexpected token in table - foster parenting
+ * (1,36) unexpected end of file in template
+ * (1,36) unexpected end of file in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <tbody>
+|             <select>
+|   <body>
+
+#data
+<template><template><table>Foo
+#errors
+no doctype
+foster-parenting text F
+foster-parenting text o
+foster-parenting text o
+eof
+eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             "Foo"
+|             <table>
+|   <body>
+
+#data
+<template><template><frame>
+#errors
+no doctype
+bad tag
+eof
+eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|   <body>
+
+#data
+<template><template><script>var i
+#errors
+no doctype
+eof in script
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <script>
+|               "var i"
+|   <body>
+
+#data
+<template><template><style>var i
+#errors
+no doctype
+eof in style
+eof in template
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <template>
+|           content
+|             <style>
+|               "var i"
+|   <body>
+
+#data
+<template><table></template><body><span>Foo
+#errors
+no doctype
+missing /table
+bad eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <table>
+|   <body>
+|     <span>
+|       "Foo"
+
+#data
+<template><td></template><body><span>Foo
+#errors
+no doctype
+bad eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <td>
+|   <body>
+|     <span>
+|       "Foo"
+
+#data
+<template><object></template><body><span>Foo
+#errors
+no doctype
+missing /object
+bad eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <object>
+|   <body>
+|     <span>
+|       "Foo"
+
+#data
+<template><svg><template>
+#errors
+no doctype
+eof in template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <svg svg>
+|           <svg template>
+|   <body>
+
+#data
+<template><svg><foo><template><foreignObject><div></template><div>
+#errors
+no doctype
+ugly template closure
+bad eof
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <svg svg>
+|           <svg foo>
+|             <svg template>
+|               <svg foreignObject>
+|                 <div>
+|   <body>
+|     <div>
+
+#data
+<dummy><template><span></dummy>
+#errors
+no doctype
+bad end tag </dummy>
+eof in template
+eof in dummy
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dummy>
+|       <template>
+|         content
+|           <span>
+
+#data
+<body><table><tr><td><select><template>Foo</template><caption>A</table>
+#errors
+no doctype
+(1,62): unexpected-caption-in-select-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|               <template>
+|                 content
+|                   "Foo"
+|       <caption>
+|         "A"
+
+#data
+<body></body><template>
+#errors
+no doctype
+(1,23): template-after-body
+(1,24): eof-in-template
+#document
+| <html>
+|   <head>
+|   <body>
+|     <template>
+|       content
+
+#data
+<head></head><template>
+#errors
+no doctype
+(1,23): template-after-head
+(1,24): eof-in-template
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|   <body>
+
+#data
+<head></head><template>Foo</template>
+#errors
+no doctype
+(1,23): template-after-head
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         "Foo"
+|   <body>
+
+#data
+<!DOCTYPE HTML><dummy><table><template><table><template><table><script>
+#errors
+eof script
+eof template
+eof template
+eof table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dummy>
+|       <table>
+|         <template>
+|           content
+|             <table>
+|               <template>
+|                 content
+|                   <table>
+|                     <script>
+
+#data
+<template><a><table><a>
+#errors
+#document
+| <html>
+|   <head>
+|     <template>
+|       content
+|         <a>
+|           <a>
+|           <table>
+|   <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests1.dat b/libs/html5lib/tests/testdata/tree-construction/tests1.dat
new file mode 100644
index 000000000..33f6dc241
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests1.dat
@@ -0,0 +1,1957 @@
+#data
+Test
+#errors
+(1,0): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<p>One<p>Two
+#errors
+(1,3): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "One"
+|     <p>
+|       "Two"
+
+#data
+Line1<br>Line2<br>Line3<br>Line4
+#errors
+(1,0): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Line1"
+|     <br>
+|     "Line2"
+|     <br>
+|     "Line3"
+|     <br>
+|     "Line4"
+
+#data
+<html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<head>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head><body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></head><body></body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head><body></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><head><body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<html><body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<head></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</head>
+#errors
+(1,7): expected-doctype-but-got-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</body>
+#errors
+(1,7): expected-doctype-but-got-end-tag element.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+</html>
+#errors
+(1,7): expected-doctype-but-got-end-tag element.
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<b><table><td><i></table>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,25): unexpected-cell-end-tag
+(1,25): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<b><table><td></b><i></table>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,18): unexpected-end-tag
+(1,29): unexpected-cell-end-tag
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+|       "X"
+
+#data
+<h1>Hello<h2>World
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,13): unexpected-start-tag
+(1,18): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       "Hello"
+|     <h2>
+|       "World"
+
+#data
+<a><p>X<a>Y</a>Z</p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,10): unexpected-start-tag-implies-end-tag
+(1,10): adoption-agency-1.3
+(1,24): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+|         "X"
+|       <a>
+|         "Y"
+|       "Z"
+
+#data
+<b><button>foo</b>bar
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,18): adoption-agency-1.3
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <button>
+|       <b>
+|         "foo"
+|       "bar"
+
+#data
+<!DOCTYPE html><span><button>foo</span>bar
+#errors
+(1,39): unexpected-end-tag
+(1,42): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <span>
+|       <button>
+|         "foobar"
+
+#data
+<p><b><div><marquee></p></b></div>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+(1,24): unexpected-end-tag
+(1,28): unexpected-end-tag
+(1,34): end-tag-too-early
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|     <div>
+|       <b>
+|         <marquee>
+|           <p>
+|           "X"
+
+#data
+<script><div></script></div><title><p></title><p><p>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,28): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<div>"
+|     <title>
+|       "<p>"
+|   <body>
+|     <p>
+|     <p>
+
+#data
+<!--><div>--<!-->
+#errors
+(1,5): incorrect-comment
+(1,10): expected-doctype-but-got-start-tag
+(1,17): incorrect-comment
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <!--  -->
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "--"
+|       <!--  -->
+
+#data
+<p><hr></p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <hr>
+|     <p>
+
+#data
+<select><b><option><select><option></b></select>X
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): unexpected-start-tag-in-select
+(1,27): unexpected-select-in-select
+(1,39): unexpected-end-tag
+(1,48): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|     <option>
+|       "X"
+
+#data
+<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,35): unexpected-start-tag-implies-end-tag
+(1,40): unexpected-cell-end-tag
+(1,43): unexpected-start-tag-implies-table-voodoo
+(1,43): unexpected-start-tag-implies-end-tag
+(1,43): unexpected-end-tag
+(1,63): unexpected-start-tag-implies-end-tag
+(1,64): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 <table>
+|               <a>
+|     <a>
+|       <b>
+|         "X"
+|       "C"
+|     <a>
+|       "Y"
+
+#data
+<a X>0<b>1<a Y>2
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-implies-end-tag
+(1,15): adoption-agency-1.3
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       x=""
+|       "0"
+|       <b>
+|         "1"
+|     <b>
+|       <a>
+|         y=""
+|         "2"
+
+#data
+<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X-->
+#errors
+(1,7): unexpected-dash-after-double-dash-in-comment
+(1,14): expected-doctype-but-got-start-tag
+(1,41): unexpected-start-tag-implies-table-voodoo
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): foster-parenting-character-in-table
+(1,48): unexpected-cell-in-table-body
+(1,63): unexpected-cell-end-tag
+(1,71): eof-in-table
+#document
+| <!-- - -->
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <div>
+|         "helloexcite!"
+|         <b>
+|           "me!"
+|         <table>
+|           <tbody>
+|             <tr>
+|               <th>
+|                 <i>
+|                   "please!"
+|             <!-- X -->
+
+#data
+<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <li>
+|       "hello"
+|     <li>
+|       "world"
+|       <ul>
+|         "how"
+|         <li>
+|           "do"
+|       "you"
+|   <!-- do -->
+
+#data
+<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E
+#errors
+(1,54): unexpected-end-tag-in-select
+(1,55): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+|     <option>
+|       "B"
+|     <optgroup>
+|       "C"
+|       <select>
+|         "DE"
+
+#data
+<
+#errors
+(1,1): expected-tag-name
+(1,1): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<"
+
+#data
+<#
+#errors
+(1,1): expected-tag-name
+(1,1): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<#"
+
+#data
+</
+#errors
+(1,2): expected-closing-tag-but-got-eof
+(1,2): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "</"
+
+#data
+</#
+#errors
+(1,2): expected-closing-tag-but-got-char
+(1,3): expected-doctype-but-got-eof
+#document
+| <!-- # -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,2): expected-doctype-but-got-eof
+#document
+| <!-- ? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?#
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,3): expected-doctype-but-got-eof
+#document
+| <!-- ?# -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!
+#errors
+(1,2): expected-dashes-or-doctype
+(1,2): expected-doctype-but-got-eof
+#document
+| <!--  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!#
+#errors
+(1,2): expected-dashes-or-doctype
+(1,3): expected-doctype-but-got-eof
+#document
+| <!-- # -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?COMMENT?>
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,11): expected-doctype-but-got-eof
+#document
+| <!-- ?COMMENT? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!COMMENT>
+#errors
+(1,2): expected-dashes-or-doctype
+(1,10): expected-doctype-but-got-eof
+#document
+| <!-- COMMENT -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+</ COMMENT >
+#errors
+(1,2): expected-closing-tag-but-got-char
+(1,12): expected-doctype-but-got-eof
+#document
+| <!--  COMMENT  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<?COM--MENT?>
+#errors
+(1,1): expected-tag-name-but-got-question-mark
+(1,13): expected-doctype-but-got-eof
+#document
+| <!-- ?COM--MENT? -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!COM--MENT>
+#errors
+(1,2): expected-dashes-or-doctype
+(1,12): expected-doctype-but-got-eof
+#document
+| <!-- COM--MENT -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+</ COM--MENT >
+#errors
+(1,2): expected-closing-tag-but-got-char
+(1,14): expected-doctype-but-got-eof
+#document
+| <!--  COM--MENT  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><style> EOF
+#errors
+(1,26): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       " EOF"
+|   <body>
+
+#data
+<!DOCTYPE html><script> <!-- </script> --> </script> EOF
+#errors
+(1,52): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       " <!-- "
+|     " "
+|   <body>
+|     "-->  EOF"
+
+#data
+<b><p></b>TEST
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,10): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <p>
+|       <b>
+|       "TEST"
+
+#data
+<p id=a><b><p id=b></b>TEST
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,19): unexpected-end-tag
+(1,23): adoption-agency-1.2
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       id="a"
+|       <b>
+|     <p>
+|       id="b"
+|       "TEST"
+
+#data
+<b id=a><p><b id=b></p></b>TEST
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,23): unexpected-end-tag
+(1,27): adoption-agency-1.2
+(1,31): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       id="a"
+|       <p>
+|         <b>
+|           id="b"
+|       "TEST"
+
+#data
+<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body>
+#errors
+(1,61): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "U-test"
+|   <body>
+|     <div>
+|       <p>
+|         "Test"
+|         <u>
+
+#data
+<!DOCTYPE html><font><table></font></table></font>
+#errors
+(1,35): unexpected-end-tag-implies-table-voodoo
+(1,35): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <table>
+
+#data
+<font><p>hello<b>cruel</font>world
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,29): adoption-agency-1.3
+(1,29): adoption-agency-1.3
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|     <p>
+|       <font>
+|         "hello"
+|         <b>
+|           "cruel"
+|       <b>
+|         "world"
+
+#data
+<b>Test</i>Test
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "TestTest"
+
+#data
+<b>A<cite>B<div>C
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|         <div>
+|           "C"
+
+#data
+<b>A<cite>B<div>C</cite>D
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,24): unexpected-end-tag
+(1,25): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|         <div>
+|           "CD"
+
+#data
+<b>A<cite>B<div>C</b>D
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,21): adoption-agency-1.3
+(1,22): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "A"
+|       <cite>
+|         "B"
+|     <div>
+|       <b>
+|         "C"
+|       "D"
+
+#data
+
+#errors
+(1,0): expected-doctype-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<DIV>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,5): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<DIV> abc
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,9): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc"
+
+#data
+<DIV> abc <B>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,13): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+
+#data
+<DIV> abc <B> def
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def"
+
+#data
+<DIV> abc <B> def <I>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+
+#data
+<DIV> abc <B> def <I> ghi
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,25): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi"
+
+#data
+<DIV> abc <B> def <I> ghi <P>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|           <p>
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|           <p>
+|             " jkl"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|         <p>
+|           <b>
+|             " jkl "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,42): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|         <p>
+|           <b>
+|             " jkl "
+|           " mno"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,47): adoption-agency-1.3
+(1,47): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,47): adoption-agency-1.3
+(1,51): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr"
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,47): adoption-agency-1.3
+(1,56): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr "
+
+#data
+<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,38): adoption-agency-1.3
+(1,47): adoption-agency-1.3
+(1,60): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       " abc "
+|       <b>
+|         " def "
+|         <i>
+|           " ghi "
+|       <i>
+|       <p>
+|         <i>
+|           <b>
+|             " jkl "
+|           " mno "
+|         " pqr "
+|       " stu"
+
+#data
+<test attribute---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->
+#errors
+(1,1040): expected-doctype-but-got-start-tag
+(1,1040): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <test>
+|       attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=""
+
+#data
+<a href="blah">aba<table><a href="foo">br<tr><td></td></tr>x</table>aoe
+#errors
+(1,15): expected-doctype-but-got-start-tag
+(1,39): unexpected-start-tag-implies-table-voodoo
+(1,39): unexpected-start-tag-implies-end-tag
+(1,39): unexpected-end-tag
+(1,45): foster-parenting-character-in-table
+(1,45): foster-parenting-character-in-table
+(1,68): foster-parenting-character-in-table
+(1,71): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "aba"
+|       <a>
+|         href="foo"
+|         "br"
+|       <a>
+|         href="foo"
+|         "x"
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|     <a>
+|       href="foo"
+|       "aoe"
+
+#data
+<a href="blah">aba<table><tr><td><a href="foo">br</td></tr>x</table>aoe
+#errors
+(1,15): expected-doctype-but-got-start-tag
+(1,54): unexpected-cell-end-tag
+(1,68): unexpected text in table
+(1,71): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "abax"
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 href="foo"
+|                 "br"
+|       "aoe"
+
+#data
+<table><a href="blah">aba<tr><td><a href="foo">br</td></tr>x</table>aoe
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,22): unexpected-start-tag-implies-table-voodoo
+(1,29): foster-parenting-character-in-table
+(1,29): foster-parenting-character-in-table
+(1,29): foster-parenting-character-in-table
+(1,54): unexpected-cell-end-tag
+(1,68): foster-parenting-character-in-table
+(1,71): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="blah"
+|       "aba"
+|     <a>
+|       href="blah"
+|       "x"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <a>
+|               href="foo"
+|               "br"
+|     <a>
+|       href="blah"
+|       "aoe"
+
+#data
+<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,45): end-tag-too-early
+(1,47): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="a"
+|       "aa"
+|       <marquee>
+|         "aa"
+|         <a>
+|           href="b"
+|           "bb"
+|       "aa"
+
+#data
+<wbr><strike><code></strike><code><strike></code>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,28): adoption-agency-1.3
+(1,49): adoption-agency-1.3
+(1,49): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+|     <strike>
+|       <code>
+|     <code>
+|       <code>
+|         <strike>
+
+#data
+<!DOCTYPE html><spacer>foo
+#errors
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <spacer>
+|       "foo"
+
+#data
+<title><meta></title><link><title><meta></title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<meta>"
+|     <link>
+|     <title>
+|       "<meta>"
+|   <body>
+
+#data
+<style><!--</style><meta><script>--><link></script>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|     <meta>
+|     <script>
+|       "--><link>"
+|   <body>
+
+#data
+<head><meta></head><link>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,25): unexpected-start-tag-out-of-my-head
+#document
+| <html>
+|   <head>
+|     <meta>
+|     <link>
+|   <body>
+
+#data
+<table><tr><tr><td><td><span><th><span>X</table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,33): unexpected-cell-end-tag
+(1,48): unexpected-cell-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|         <tr>
+|           <td>
+|           <td>
+|             <span>
+|           <th>
+|             <span>
+|               "X"
+
+#data
+<body><body><base><link><meta><title><p></title><body><p></body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,12): unexpected-start-tag
+(1,54): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <base>
+|     <link>
+|     <meta>
+|     <title>
+|       "<p>"
+|     <p>
+
+#data
+<textarea><p></textarea>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<p>"
+
+#data
+<p><image></p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,10): unexpected-start-tag-treated-as
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <img>
+
+#data
+<a><table><a></table><p><a><div><a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,13): unexpected-start-tag-implies-table-voodoo
+(1,13): unexpected-start-tag-implies-end-tag
+(1,13): adoption-agency-1.3
+(1,27): unexpected-start-tag-implies-end-tag
+(1,27): adoption-agency-1.2
+(1,32): unexpected-end-tag
+(1,35): unexpected-start-tag-implies-end-tag
+(1,35): adoption-agency-1.2
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|     <p>
+|       <a>
+|     <div>
+|       <a>
+
+#data
+<head></p><meta><p>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,10): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <meta>
+|   <body>
+|     <p>
+
+#data
+<head></html><meta><p>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,19): expected-eof-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     <p>
+
+#data
+<b><table><td><i></table>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,25): unexpected-cell-end-tag
+(1,25): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<b><table><td></b><i></table>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,18): unexpected-end-tag
+(1,29): unexpected-cell-end-tag
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <i>
+
+#data
+<h1><h2>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,8): unexpected-start-tag
+(1,8): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|     <h2>
+
+#data
+<a><p><a></a></p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,9): unexpected-start-tag-implies-end-tag
+(1,9): adoption-agency-1.3
+(1,21): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <p>
+|       <a>
+|       <a>
+
+#data
+<b><button></b></button></b>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,15): adoption-agency-1.3
+(1,28): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <button>
+|       <b>
+
+#data
+<p><b><div><marquee></p></b></div>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+(1,24): unexpected-end-tag
+(1,28): unexpected-end-tag
+(1,34): end-tag-too-early
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|     <div>
+|       <b>
+|         <marquee>
+|           <p>
+
+#data
+<script></script></div><title></title><p><p>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,23): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|     <title>
+|   <body>
+|     <p>
+|     <p>
+
+#data
+<p><hr></p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <hr>
+|     <p>
+
+#data
+<select><b><option><select><option></b></select>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): unexpected-start-tag-in-select
+(1,27): unexpected-select-in-select
+(1,39): unexpected-end-tag
+(1,48): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|     <option>
+
+#data
+<html><head><title></title><body></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|   <body>
+
+#data
+<a><table><td><a><table></table><a></tr><a></table><a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-cell-in-table-body
+(1,35): unexpected-start-tag-implies-end-tag
+(1,40): unexpected-cell-end-tag
+(1,43): unexpected-start-tag-implies-table-voodoo
+(1,43): unexpected-start-tag-implies-end-tag
+(1,43): unexpected-end-tag
+(1,54): unexpected-start-tag-implies-end-tag
+(1,54): adoption-agency-1.2
+(1,54): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <a>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <a>
+|                 <table>
+|               <a>
+|     <a>
+
+#data
+<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,45): end-tag-too-early
+(1,58): end-tag-too-early
+(1,69): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|       <div>
+|         <li>
+|       <li>
+|       <li>
+|         <div>
+|       <li>
+|         <address>
+|       <li>
+|         <b>
+|           <em>
+|       <li>
+
+#data
+<ul><li><ul></li><li>a</li></ul></li></ul>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,17): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <ul>
+|           <li>
+|             "a"
+
+#data
+<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+|     <frameset>
+|       <frame>
+|     <noframes>
+
+#data
+<h1><table><td><h3></table><h3></h1>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,15): unexpected-cell-in-table-body
+(1,27): unexpected-cell-end-tag
+(1,31): unexpected-start-tag
+(1,36): end-tag-too-early
+#document
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       <table>
+|         <tbody>
+|           <tr>
+|             <td>
+|               <h3>
+|     <h3>
+
+#data
+<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|       <colgroup>
+|         <col>
+|         <col>
+|         <col>
+|       <colgroup>
+|         <col>
+|         <col>
+|       <thead>
+|         <tr>
+|           <td>
+
+#data
+<table><col><tbody><col><tr><col><td><col></table><col>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,37): unexpected-cell-in-table-body
+(1,55): unexpected-start-tag-ignored
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|         <tr>
+|       <colgroup>
+|         <col>
+|       <tbody>
+|         <tr>
+|           <td>
+|       <colgroup>
+|         <col>
+
+#data
+<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,52): unexpected-cell-in-table-body
+(1,80): unexpected-start-tag-ignored
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+|       <tbody>
+|       <colgroup>
+|       <tbody>
+|         <tr>
+|       <colgroup>
+|       <tbody>
+|         <tr>
+|           <td>
+|       <colgroup>
+
+#data
+</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>
+#errors
+(1,9): expected-doctype-but-got-end-tag
+(1,9): unexpected-end-tag-before-html
+(1,13): unexpected-end-tag-before-html
+(1,18): unexpected-end-tag-before-html
+(1,22): unexpected-end-tag-before-html
+(1,26): unexpected-end-tag-before-html
+(1,35): unexpected-end-tag-before-html
+(1,39): unexpected-end-tag-before-html
+(1,47): unexpected-end-tag-before-html
+(1,52): unexpected-end-tag-before-html
+(1,58): unexpected-end-tag-before-html
+(1,64): unexpected-end-tag-before-html
+(1,72): unexpected-end-tag-before-html
+(1,79): unexpected-end-tag-before-html
+(1,88): unexpected-end-tag-before-html
+(1,93): unexpected-end-tag-before-html
+(1,98): unexpected-end-tag-before-html
+(1,103): unexpected-end-tag-before-html
+(1,108): unexpected-end-tag-before-html
+(1,113): unexpected-end-tag-before-html
+(1,118): unexpected-end-tag-before-html
+(1,130): unexpected-end-tag-after-body
+(1,130): unexpected-end-tag-treated-as
+(1,134): unexpected-end-tag
+(1,140): unexpected-end-tag
+(1,148): unexpected-end-tag
+(1,155): unexpected-end-tag
+(1,163): unexpected-end-tag
+(1,172): unexpected-end-tag
+(1,180): unexpected-end-tag
+(1,185): unexpected-end-tag
+(1,190): unexpected-end-tag
+(1,195): unexpected-end-tag
+(1,203): unexpected-end-tag
+(1,210): unexpected-end-tag
+(1,217): unexpected-end-tag
+(1,225): unexpected-end-tag
+(1,230): unexpected-end-tag
+(1,238): unexpected-end-tag
+(1,244): unexpected-end-tag
+(1,251): unexpected-end-tag
+(1,258): unexpected-end-tag
+(1,269): unexpected-end-tag
+(1,279): unexpected-end-tag
+(1,287): unexpected-end-tag
+(1,296): unexpected-end-tag
+(1,300): unexpected-end-tag
+(1,305): unexpected-end-tag
+(1,310): unexpected-end-tag
+(1,320): unexpected-end-tag
+(1,331): unexpected-end-tag
+(1,339): unexpected-end-tag
+(1,347): unexpected-end-tag
+(1,355): unexpected-end-tag
+(1,365): end-tag-too-early
+(1,378): end-tag-too-early
+(1,387): end-tag-too-early
+(1,393): end-tag-too-early
+(1,399): end-tag-too-early
+(1,404): end-tag-too-early
+(1,415): end-tag-too-early
+(1,425): end-tag-too-early
+(1,432): end-tag-too-early
+(1,437): end-tag-too-early
+(1,442): end-tag-too-early
+(1,447): unexpected-end-tag
+(1,454): unexpected-end-tag
+(1,460): unexpected-end-tag
+(1,467): unexpected-end-tag
+(1,476): end-tag-too-early
+(1,486): end-tag-too-early
+(1,495): end-tag-too-early
+(1,513): expected-eof-but-got-end-tag
+(1,513): unexpected-end-tag
+(1,520): unexpected-end-tag
+(1,529): unexpected-end-tag
+(1,537): unexpected-end-tag
+(1,547): unexpected-end-tag
+(1,557): unexpected-end-tag
+(1,568): unexpected-end-tag
+(1,579): unexpected-end-tag
+(1,590): unexpected-end-tag
+(1,599): unexpected-end-tag
+(1,611): unexpected-end-tag
+(1,622): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     <p>
+
+#data
+<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,20): unexpected-end-tag-implies-table-voodoo
+(1,20): unexpected-end-tag
+(1,24): unexpected-end-tag-implies-table-voodoo
+(1,24): unexpected-end-tag
+(1,29): unexpected-end-tag-implies-table-voodoo
+(1,29): unexpected-end-tag
+(1,33): unexpected-end-tag-implies-table-voodoo
+(1,33): unexpected-end-tag
+(1,37): unexpected-end-tag-implies-table-voodoo
+(1,37): unexpected-end-tag
+(1,46): unexpected-end-tag-implies-table-voodoo
+(1,46): unexpected-end-tag
+(1,50): unexpected-end-tag-implies-table-voodoo
+(1,50): unexpected-end-tag
+(1,58): unexpected-end-tag-implies-table-voodoo
+(1,58): unexpected-end-tag
+(1,63): unexpected-end-tag-implies-table-voodoo
+(1,63): unexpected-end-tag
+(1,69): unexpected-end-tag-implies-table-voodoo
+(1,69): end-tag-too-early
+(1,75): unexpected-end-tag-implies-table-voodoo
+(1,75): unexpected-end-tag
+(1,83): unexpected-end-tag-implies-table-voodoo
+(1,83): unexpected-end-tag
+(1,90): unexpected-end-tag-implies-table-voodoo
+(1,90): unexpected-end-tag
+(1,99): unexpected-end-tag-implies-table-voodoo
+(1,99): unexpected-end-tag
+(1,104): unexpected-end-tag-implies-table-voodoo
+(1,104): end-tag-too-early
+(1,109): unexpected-end-tag-implies-table-voodoo
+(1,109): end-tag-too-early
+(1,114): unexpected-end-tag-implies-table-voodoo
+(1,114): end-tag-too-early
+(1,119): unexpected-end-tag-implies-table-voodoo
+(1,119): end-tag-too-early
+(1,124): unexpected-end-tag-implies-table-voodoo
+(1,124): end-tag-too-early
+(1,129): unexpected-end-tag-implies-table-voodoo
+(1,129): end-tag-too-early
+(1,136): unexpected-end-tag-in-table-row
+(1,141): unexpected-end-tag-implies-table-voodoo
+(1,141): unexpected-end-tag-treated-as
+(1,145): unexpected-end-tag-implies-table-voodoo
+(1,145): unexpected-end-tag
+(1,151): unexpected-end-tag-implies-table-voodoo
+(1,151): unexpected-end-tag
+(1,159): unexpected-end-tag-implies-table-voodoo
+(1,159): unexpected-end-tag
+(1,166): unexpected-end-tag-implies-table-voodoo
+(1,166): unexpected-end-tag
+(1,174): unexpected-end-tag-implies-table-voodoo
+(1,174): unexpected-end-tag
+(1,183): unexpected-end-tag-implies-table-voodoo
+(1,183): unexpected-end-tag
+(1,196): unexpected-end-tag
+(1,201): unexpected-end-tag
+(1,206): unexpected-end-tag
+(1,214): unexpected-end-tag
+(1,221): unexpected-end-tag
+(1,228): unexpected-end-tag
+(1,236): unexpected-end-tag
+(1,241): unexpected-end-tag
+(1,249): unexpected-end-tag
+(1,255): unexpected-end-tag
+(1,262): unexpected-end-tag
+(1,269): unexpected-end-tag
+(1,280): unexpected-end-tag
+(1,290): unexpected-end-tag
+(1,298): unexpected-end-tag
+(1,307): unexpected-end-tag
+(1,311): unexpected-end-tag
+(1,316): unexpected-end-tag
+(1,321): unexpected-end-tag
+(1,331): unexpected-end-tag
+(1,342): unexpected-end-tag
+(1,350): unexpected-end-tag
+(1,358): unexpected-end-tag
+(1,366): unexpected-end-tag
+(1,376): end-tag-too-early
+(1,389): end-tag-too-early
+(1,398): end-tag-too-early
+(1,404): end-tag-too-early
+(1,410): end-tag-too-early
+(1,415): end-tag-too-early
+(1,426): end-tag-too-early
+(1,436): end-tag-too-early
+(1,443): end-tag-too-early
+(1,448): end-tag-too-early
+(1,453): end-tag-too-early
+(1,458): unexpected-end-tag
+(1,465): unexpected-end-tag
+(1,471): unexpected-end-tag
+(1,478): unexpected-end-tag
+(1,487): end-tag-too-early
+(1,497): end-tag-too-early
+(1,506): end-tag-too-early
+(1,524): expected-eof-but-got-end-tag
+(1,524): unexpected-end-tag
+(1,531): unexpected-end-tag
+(1,540): unexpected-end-tag
+(1,548): unexpected-end-tag
+(1,558): unexpected-end-tag
+(1,568): unexpected-end-tag
+(1,579): unexpected-end-tag
+(1,590): unexpected-end-tag
+(1,601): unexpected-end-tag
+(1,610): unexpected-end-tag
+(1,622): unexpected-end-tag
+(1,633): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     <table>
+|       <tbody>
+|         <tr>
+|     <p>
+
+#data
+<frameset>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,10): eof-in-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests10.dat b/libs/html5lib/tests/testdata/tree-construction/tests10.dat
new file mode 100644
index 000000000..3e9a9f19b
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests10.dat
@@ -0,0 +1,847 @@
+#data
+<!DOCTYPE html><svg></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!DOCTYPE html><svg></svg><![CDATA[a]]>
+#errors
+(1,28) expected-dashes-or-doctype
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <!-- [CDATA[a]] -->
+
+#data
+<!DOCTYPE html><body><svg></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!DOCTYPE html><body><select><svg></svg></select>
+#errors
+(1,34) unexpected-start-tag-in-select
+(1,40) unexpected-end-tag-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!DOCTYPE html><body><select><option><svg></svg></option></select>
+#errors
+(1,42) unexpected-start-tag-in-select
+(1,48) unexpected-end-tag-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!DOCTYPE html><body><table><svg></svg></table>
+#errors
+(1,33) foster-parenting-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><svg><g>foo</g></svg></table>
+#errors
+(1,33) foster-parenting-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table>
+#errors
+(1,33) foster-parenting-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table>
+#errors
+(1,40) foster-parenting-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+|       <tbody>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table>
+#errors
+(1,44) foster-parenting-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg g>
+|                 "foo"
+|               <svg g>
+|                 "bar"
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg g>
+|                 "foo"
+|               <svg g>
+|                 "bar"
+|             <p>
+|               "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|         <p>
+|           "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+(1,65) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|         <p>
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux
+#errors
+(1,73) unexpected-end-tag
+(1,73) expected-one-end-tag-but-got-another
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <svg svg>
+|           <svg g>
+|             "foo"
+|           <svg g>
+|             "bar"
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+(1,43) foster-parenting-start-tag svg
+(1,66) unexpected HTML-like start tag token in foreign content
+(1,66) foster-parenting-start-tag
+(1,67) foster-parenting-character
+(1,68) foster-parenting-character
+(1,69) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+|     <table>
+|       <colgroup>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+(1,49) unexpected-start-tag-in-select
+(1,52) unexpected-start-tag-in-select
+(1,59) unexpected-end-tag-in-select
+(1,62) unexpected-start-tag-in-select
+(1,69) unexpected-end-tag-in-select
+(1,72) unexpected-start-tag-in-select
+(1,83) unexpected-table-element-end-tag-in-select-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|               "foobarbaz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux
+#errors
+(1,36) unexpected-start-tag-implies-table-voodoo
+(1,41) unexpected-start-tag-in-select
+(1,44) unexpected-start-tag-in-select
+(1,51) unexpected-end-tag-in-select
+(1,54) unexpected-start-tag-in-select
+(1,61) unexpected-end-tag-in-select
+(1,64) unexpected-start-tag-in-select
+(1,75) unexpected-table-element-end-tag-in-select-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "foobarbaz"
+|     <table>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz
+#errors
+(1,40) expected-eof-but-got-start-tag
+(1,63) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz
+#errors
+(1,33) unexpected-start-tag-after-body
+(1,56) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg g>
+|         "foo"
+|       <svg g>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><frameset><svg><g></g><g></g><p><span>
+#errors
+(1,30) unexpected-start-tag-in-frameset
+(1,33) unexpected-start-tag-in-frameset
+(1,37) unexpected-end-tag-in-frameset
+(1,40) unexpected-start-tag-in-frameset
+(1,44) unexpected-end-tag-in-frameset
+(1,47) unexpected-start-tag-in-frameset
+(1,53) unexpected-start-tag-in-frameset
+(1,53) eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span>
+#errors
+(1,41) unexpected-start-tag-after-frameset
+(1,44) unexpected-start-tag-after-frameset
+(1,48) unexpected-end-tag-after-frameset
+(1,51) unexpected-start-tag-after-frameset
+(1,55) unexpected-end-tag-after-frameset
+(1,58) unexpected-start-tag-after-frameset
+(1,64) unexpected-start-tag-after-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     <svg svg>
+|       xlink href="foo"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <svg svg>
+|       <svg g>
+|         xlink href="foo"
+|         xml lang="en"
+|       "bar"
+
+#data
+<svg></path>
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,12) unexpected-end-tag
+(1,12) unexpected-end-tag
+(1,12) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<div><svg></div>a
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,16) unexpected-end-tag
+(1,16) end-tag-too-early
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|     "a"
+
+#data
+<div><svg><path></div>a
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,22) unexpected-end-tag
+(1,22) end-tag-too-early
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|     "a"
+
+#data
+<div><svg><path></svg><path>
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,22) unexpected-end-tag
+(1,28) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|       <path>
+
+#data
+<div><svg><path><foreignObject><math></div>a
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,43) unexpected-end-tag
+(1,43) end-tag-too-early
+(1,44) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <math math>
+|               "a"
+
+#data
+<div><svg><path><foreignObject><p></div>a
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,40) end-tag-too-early
+(1,41) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <p>
+|               "a"
+
+#data
+<!DOCTYPE html><svg><desc><div><svg><ul>a
+#errors
+(1,40) unexpected-html-element-in-foreign-content
+(1,41) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg desc>
+|         <div>
+|           <svg svg>
+|           <ul>
+|             "a"
+
+#data
+<!DOCTYPE html><svg><desc><svg><ul>a
+#errors
+(1,35) unexpected-html-element-in-foreign-content
+(1,36) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg desc>
+|         <svg svg>
+|         <ul>
+|           "a"
+
+#data
+<!DOCTYPE html><p><svg><desc><p>
+#errors
+(1,32) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <svg svg>
+|         <svg desc>
+|           <p>
+
+#data
+<!DOCTYPE html><p><svg><title><p>
+#errors
+(1,33) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <svg svg>
+|         <svg title>
+|           <p>
+
+#data
+<div><svg><path><foreignObject><p></foreignObject><p>
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,50) unexpected-end-tag
+(1,53) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <svg svg>
+|         <svg path>
+|           <svg foreignObject>
+|             <p>
+|             <p>
+
+#data
+<math><mi><div><object><div><span></span></div></object></div></mi><mi>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,71) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <div>
+|           <object>
+|             <div>
+|               <span>
+|       <math mi>
+
+#data
+<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,83) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <svg svg>
+|           <svg foreignObject>
+|             <div>
+|               <div>
+|       <math mi>
+
+#data
+<svg><script></script><path>
+#errors
+(1,5) expected-doctype-but-got-start-tag
+(1,28) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg script>
+|       <svg path>
+
+#data
+<table><svg></svg><tr>
+#errors
+(1,7) expected-doctype-but-got-start-tag
+(1,12) unexpected-start-tag-implies-table-voodoo
+(1,22) eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<math><mi><mglyph>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,18) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <math mglyph>
+
+#data
+<math><mi><malignmark>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,22) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         <math malignmark>
+
+#data
+<math><mo><mglyph>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,18) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mo>
+|         <math mglyph>
+
+#data
+<math><mo><malignmark>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,22) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mo>
+|         <math malignmark>
+
+#data
+<math><mn><mglyph>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,18) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         <math mglyph>
+
+#data
+<math><mn><malignmark>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,22) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         <math malignmark>
+
+#data
+<math><ms><mglyph>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,18) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math ms>
+|         <math mglyph>
+
+#data
+<math><ms><malignmark>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,22) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math ms>
+|         <math malignmark>
+
+#data
+<math><mtext><mglyph>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,21) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <math mglyph>
+
+#data
+<math><mtext><malignmark>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,25) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <math malignmark>
+
+#data
+<math><annotation-xml><svg></svg></annotation-xml><mi>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,54) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|       <math mi>
+
+#data
+<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,144) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg foreignObject>
+|             <div>
+|               <math math>
+|                 <math mi>
+|               <span>
+|           <svg path>
+|       <math mi>
+
+#data
+<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>
+#errors
+(1,6) expected-doctype-but-got-start-tag
+(1,153) expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg foreignObject>
+|             <math math>
+|               <math mi>
+|                 <svg svg>
+|               <math mo>
+|             <span>
+|           <svg path>
+|       <math mi>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests11.dat b/libs/html5lib/tests/testdata/tree-construction/tests11.dat
new file mode 100644
index 000000000..b9901e79e
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests11.dat
@@ -0,0 +1,523 @@
+#data
+<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       filterUnits=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' DIFFUSECONSTANT='' EDGEMODE='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       filterUnits=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' diffuseconstant='' edgemode='' filterunits='' filterres='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       attributeName=""
+|       attributeType=""
+|       baseFrequency=""
+|       baseProfile=""
+|       calcMode=""
+|       clipPathUnits=""
+|       diffuseConstant=""
+|       edgeMode=""
+|       filterUnits=""
+|       filterres=""
+|       glyphRef=""
+|       gradientTransform=""
+|       gradientUnits=""
+|       kernelMatrix=""
+|       kernelUnitLength=""
+|       keyPoints=""
+|       keySplines=""
+|       keyTimes=""
+|       lengthAdjust=""
+|       limitingConeAngle=""
+|       markerHeight=""
+|       markerUnits=""
+|       markerWidth=""
+|       maskContentUnits=""
+|       maskUnits=""
+|       numOctaves=""
+|       pathLength=""
+|       patternContentUnits=""
+|       patternTransform=""
+|       patternUnits=""
+|       pointsAtX=""
+|       pointsAtY=""
+|       pointsAtZ=""
+|       preserveAlpha=""
+|       preserveAspectRatio=""
+|       primitiveUnits=""
+|       refX=""
+|       refY=""
+|       repeatCount=""
+|       repeatDur=""
+|       requiredExtensions=""
+|       requiredFeatures=""
+|       specularConstant=""
+|       specularExponent=""
+|       spreadMethod=""
+|       startOffset=""
+|       stdDeviation=""
+|       stitchTiles=""
+|       surfaceScale=""
+|       systemLanguage=""
+|       tableValues=""
+|       targetX=""
+|       targetY=""
+|       textLength=""
+|       viewBox=""
+|       viewTarget=""
+|       xChannelSelector=""
+|       yChannelSelector=""
+|       zoomAndPan=""
+
+#data
+<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       attributename=""
+|       attributetype=""
+|       basefrequency=""
+|       baseprofile=""
+|       calcmode=""
+|       clippathunits=""
+|       diffuseconstant=""
+|       edgemode=""
+|       filterunits=""
+|       glyphref=""
+|       gradienttransform=""
+|       gradientunits=""
+|       kernelmatrix=""
+|       kernelunitlength=""
+|       keypoints=""
+|       keysplines=""
+|       keytimes=""
+|       lengthadjust=""
+|       limitingconeangle=""
+|       markerheight=""
+|       markerunits=""
+|       markerwidth=""
+|       maskcontentunits=""
+|       maskunits=""
+|       numoctaves=""
+|       pathlength=""
+|       patterncontentunits=""
+|       patterntransform=""
+|       patternunits=""
+|       pointsatx=""
+|       pointsaty=""
+|       pointsatz=""
+|       preservealpha=""
+|       preserveaspectratio=""
+|       primitiveunits=""
+|       refx=""
+|       refy=""
+|       repeatcount=""
+|       repeatdur=""
+|       requiredextensions=""
+|       requiredfeatures=""
+|       specularconstant=""
+|       specularexponent=""
+|       spreadmethod=""
+|       startoffset=""
+|       stddeviation=""
+|       stitchtiles=""
+|       surfacescale=""
+|       systemlanguage=""
+|       tablevalues=""
+|       targetx=""
+|       targety=""
+|       textlength=""
+|       viewbox=""
+|       viewtarget=""
+|       xchannelselector=""
+|       ychannelselector=""
+|       zoomandpan=""
+
+#data
+<!DOCTYPE html><body><svg contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       contentscripttype=""
+|       contentstyletype=""
+|       externalresourcesrequired=""
+|       filterres=""
+
+#data
+<!DOCTYPE html><body><svg CONTENTSCRIPTTYPE='' CONTENTSTYLETYPE='' EXTERNALRESOURCESREQUIRED='' FILTERRES=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       contentscripttype=""
+|       contentstyletype=""
+|       externalresourcesrequired=""
+|       filterres=""
+
+#data
+<!DOCTYPE html><body><svg contentscripttype='' contentstyletype='' externalresourcesrequired='' filterres=''></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       contentscripttype=""
+|       contentstyletype=""
+|       externalresourcesrequired=""
+|       filterres=""
+
+#data
+<!DOCTYPE html><body><math contentScriptType='' contentStyleType='' externalResourcesRequired='' filterRes=''></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       contentscripttype=""
+|       contentstyletype=""
+|       externalresourcesrequired=""
+|       filterres=""
+
+#data
+<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg altGlyph>
+|       <svg altGlyphDef>
+|       <svg altGlyphItem>
+|       <svg animateColor>
+|       <svg animateMotion>
+|       <svg animateTransform>
+|       <svg clipPath>
+|       <svg feBlend>
+|       <svg feColorMatrix>
+|       <svg feComponentTransfer>
+|       <svg feComposite>
+|       <svg feConvolveMatrix>
+|       <svg feDiffuseLighting>
+|       <svg feDisplacementMap>
+|       <svg feDistantLight>
+|       <svg feFlood>
+|       <svg feFuncA>
+|       <svg feFuncB>
+|       <svg feFuncG>
+|       <svg feFuncR>
+|       <svg feGaussianBlur>
+|       <svg feImage>
+|       <svg feMerge>
+|       <svg feMergeNode>
+|       <svg feMorphology>
+|       <svg feOffset>
+|       <svg fePointLight>
+|       <svg feSpecularLighting>
+|       <svg feSpotLight>
+|       <svg feTile>
+|       <svg feTurbulence>
+|       <svg foreignObject>
+|       <svg glyphRef>
+|       <svg linearGradient>
+|       <svg radialGradient>
+|       <svg textPath>
+
+#data
+<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math altglyph>
+|       <math altglyphdef>
+|       <math altglyphitem>
+|       <math animatecolor>
+|       <math animatemotion>
+|       <math animatetransform>
+|       <math clippath>
+|       <math feblend>
+|       <math fecolormatrix>
+|       <math fecomponenttransfer>
+|       <math fecomposite>
+|       <math feconvolvematrix>
+|       <math fediffuselighting>
+|       <math fedisplacementmap>
+|       <math fedistantlight>
+|       <math feflood>
+|       <math fefunca>
+|       <math fefuncb>
+|       <math fefuncg>
+|       <math fefuncr>
+|       <math fegaussianblur>
+|       <math feimage>
+|       <math femerge>
+|       <math femergenode>
+|       <math femorphology>
+|       <math feoffset>
+|       <math fepointlight>
+|       <math fespecularlighting>
+|       <math fespotlight>
+|       <math fetile>
+|       <math feturbulence>
+|       <math foreignobject>
+|       <math glyphref>
+|       <math lineargradient>
+|       <math radialgradient>
+|       <math textpath>
+
+#data
+<!DOCTYPE html><body><svg><solidColor /></svg>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg solidcolor>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests12.dat b/libs/html5lib/tests/testdata/tree-construction/tests12.dat
new file mode 100644
index 000000000..63107d277
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests12.dat
@@ -0,0 +1,62 @@
+#data
+<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "foo"
+|       <math math>
+|         <math mtext>
+|           <i>
+|             "baz"
+|         <math annotation-xml>
+|           <svg svg>
+|             <svg desc>
+|               <b>
+|                 "eggs"
+|             <svg g>
+|               <svg foreignObject>
+|                 <p>
+|                   "spam"
+|                 <table>
+|                   <tbody>
+|                     <tr>
+|                       <td>
+|                         <img>
+|             <svg g>
+|               "quux"
+|       "bar"
+
+#data
+<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <math math>
+|       <math mtext>
+|         <i>
+|           "baz"
+|       <math annotation-xml>
+|         <svg svg>
+|           <svg desc>
+|             <b>
+|               "eggs"
+|           <svg g>
+|             <svg foreignObject>
+|               <p>
+|                 "spam"
+|               <table>
+|                 <tbody>
+|                   <tr>
+|                     <td>
+|                       <img>
+|           <svg g>
+|             "quux"
+|     "bar"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests14.dat b/libs/html5lib/tests/testdata/tree-construction/tests14.dat
new file mode 100644
index 000000000..a08b7649e
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests14.dat
@@ -0,0 +1,75 @@
+#data
+<!DOCTYPE html><html><body><xyz:abc></xyz:abc>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xyz:abc>
+
+#data
+<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xyz:abc>
+|     <span>
+
+#data
+<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc>
+#errors
+(1,38): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   abc:def="gh"
+|   <head>
+|   <body>
+|     <xyz:abc>
+
+#data
+<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo>
+#errors
+(1,53): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   xml:lang="bar"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html 123=456>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   123="456"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html 123=456><html 789=012>
+#errors
+(1,43): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   123="456"
+|   789="012"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><html><body 789=012>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     789="012"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests15.dat b/libs/html5lib/tests/testdata/tree-construction/tests15.dat
new file mode 100644
index 000000000..93d06a871
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests15.dat
@@ -0,0 +1,216 @@
+#data
+<!DOCTYPE html><p><b><i><u></p> <p>X
+#errors
+(1,31): unexpected-end-tag
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <i>
+|           <u>
+|     <b>
+|       <i>
+|         <u>
+|           " "
+|           <p>
+|             "X"
+
+#data
+<p><b><i><u></p>
+<p>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,16): unexpected-end-tag
+(2,4): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         <i>
+|           <u>
+|     <b>
+|       <i>
+|         <u>
+|           "
+"
+|           <p>
+|             "X"
+
+#data
+<!doctype html></html> <head>
+#errors
+(1,29): expected-eof-but-got-start-tag
+(1,29): unexpected-start-tag-ignored
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " "
+
+#data
+<!doctype html></body><meta>
+#errors
+(1,28): unexpected-start-tag-after-body
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+
+#data
+<html></html><!-- foo -->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+| <!--  foo  -->
+
+#data
+<!doctype html></body><title>X</title>
+#errors
+(1,29): unexpected-start-tag-after-body
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+
+#data
+<!doctype html><table> X<meta></table>
+#errors
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+(1,30): foster-parenting-start-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " X"
+|     <meta>
+|     <table>
+
+#data
+<!doctype html><table> x</table>
+#errors
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x"
+|     <table>
+
+#data
+<!doctype html><table> x </table>
+#errors
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+(1,25): foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x "
+|     <table>
+
+#data
+<!doctype html><table><tr> x</table>
+#errors
+(1,27): foster-parenting-character
+(1,28): foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " x"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table>X<style> <tr>x </style> </table>
+#errors
+(1,23): foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <style>
+|         " <tr>x "
+|       " "
+
+#data
+<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div>
+#errors
+(1,30): foster-parenting-start-tag
+(1,31): foster-parenting-character
+(1,32): foster-parenting-character
+(1,33): foster-parenting-character
+(1,37): foster-parenting-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <a>
+|         "foo"
+|       <table>
+|         " "
+|         <tbody>
+|           <tr>
+|             <td>
+|               "bar"
+|             " "
+
+#data
+<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,7): unexpected-start-tag-ignored
+(1,15): unexpected-end-tag
+(1,23): unexpected-end-tag
+(1,33): unexpected-start-tag
+(1,99): expected-named-closing-tag-but-got-eof
+(1,99): eof-in-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+|     <frameset>
+|       <frame>
+|     <noframes>
+|       "</frameset><noframes>"
+
+#data
+<!DOCTYPE html><object></html>
+#errors
+(1,30): expected-body-in-scope
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <object>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests16.dat b/libs/html5lib/tests/testdata/tree-construction/tests16.dat
new file mode 100644
index 000000000..8d9631fa9
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests16.dat
@@ -0,0 +1,2460 @@
+#data
+<!doctype html><script>
+#errors
+(1,23): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script>a
+#errors
+(1,24): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "a"
+|   <body>
+
+#data
+<!doctype html><script><
+#errors
+(1,24): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<"
+|   <body>
+
+#data
+<!doctype html><script></
+#errors
+(1,25): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</"
+|   <body>
+
+#data
+<!doctype html><script></S
+#errors
+(1,26): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</S"
+|   <body>
+
+#data
+<!doctype html><script></SC
+#errors
+(1,27): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SC"
+|   <body>
+
+#data
+<!doctype html><script></SCR
+#errors
+(1,28): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCR"
+|   <body>
+
+#data
+<!doctype html><script></SCRI
+#errors
+(1,29): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRI"
+|   <body>
+
+#data
+<!doctype html><script></SCRIP
+#errors
+(1,30): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIP"
+|   <body>
+
+#data
+<!doctype html><script></SCRIPT
+#errors
+(1,31): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIPT"
+|   <body>
+
+#data
+<!doctype html><script></SCRIPT 
+#errors
+(1,32): expected-attribute-name-but-got-eof
+(1,32): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script></s
+#errors
+(1,26): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</s"
+|   <body>
+
+#data
+<!doctype html><script></sc
+#errors
+(1,27): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</sc"
+|   <body>
+
+#data
+<!doctype html><script></scr
+#errors
+(1,28): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scr"
+|   <body>
+
+#data
+<!doctype html><script></scri
+#errors
+(1,29): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scri"
+|   <body>
+
+#data
+<!doctype html><script></scrip
+#errors
+(1,30): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</scrip"
+|   <body>
+
+#data
+<!doctype html><script></script
+#errors
+(1,31): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "</script"
+|   <body>
+
+#data
+<!doctype html><script></script 
+#errors
+(1,32): expected-attribute-name-but-got-eof
+(1,32): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<!doctype html><script><!
+#errors
+(1,25): expected-script-data-but-got-eof
+(1,25): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!"
+|   <body>
+
+#data
+<!doctype html><script><!a
+#errors
+(1,26): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!a"
+|   <body>
+
+#data
+<!doctype html><script><!-
+#errors
+(1,26): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!-"
+|   <body>
+
+#data
+<!doctype html><script><!-a
+#errors
+(1,27): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!-a"
+|   <body>
+
+#data
+<!doctype html><script><!--
+#errors
+(1,27): expected-named-closing-tag-but-got-eof
+(1,27): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<!doctype html><script><!--a
+#errors
+(1,28): expected-named-closing-tag-but-got-eof
+(1,28): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--a"
+|   <body>
+
+#data
+<!doctype html><script><!--<
+#errors
+(1,28): expected-named-closing-tag-but-got-eof
+(1,28): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<"
+|   <body>
+
+#data
+<!doctype html><script><!--<a
+#errors
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<a"
+|   <body>
+
+#data
+<!doctype html><script><!--</
+#errors
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--</"
+|   <body>
+
+#data
+<!doctype html><script><!--</script
+#errors
+(1,35): expected-named-closing-tag-but-got-eof
+(1,35): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--</script"
+|   <body>
+
+#data
+<!doctype html><script><!--</script 
+#errors
+(1,36): expected-attribute-name-but-got-eof
+(1,36): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<!doctype html><script><!--<s
+#errors
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<s"
+|   <body>
+
+#data
+<!doctype html><script><!--<script
+#errors
+(1,34): expected-named-closing-tag-but-got-eof
+(1,34): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script 
+#errors
+(1,35): eof-in-script-in-script
+(1,35): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script <
+#errors
+(1,36): eof-in-script-in-script
+(1,36): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <"
+|   <body>
+
+#data
+<!doctype html><script><!--<script <a
+#errors
+(1,37): eof-in-script-in-script
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </
+#errors
+(1,37): eof-in-script-in-script
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </s
+#errors
+(1,38): eof-in-script-in-script
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </s"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script
+#errors
+(1,43): eof-in-script-in-script
+(1,43): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </scripta
+#errors
+(1,44): eof-in-script-in-script
+(1,44): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </scripta"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script 
+#errors
+(1,44): expected-named-closing-tag-but-got-eof
+(1,44): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script>
+#errors
+(1,44): expected-named-closing-tag-but-got-eof
+(1,44): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script>"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script/
+#errors
+(1,44): expected-named-closing-tag-but-got-eof
+(1,44): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script/"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script <
+#errors
+(1,45): expected-named-closing-tag-but-got-eof
+(1,45): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script <a
+#errors
+(1,46): expected-named-closing-tag-but-got-eof
+(1,46): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </
+#errors
+(1,46): expected-named-closing-tag-but-got-eof
+(1,46): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script
+#errors
+(1,52): expected-named-closing-tag-but-got-eof
+(1,52): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script 
+#errors
+(1,53): expected-attribute-name-but-got-eof
+(1,53): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script/
+#errors
+(1,53): unexpected-EOF-after-solidus-in-tag
+(1,53): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script </script </script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<!doctype html><script><!--<script -
+#errors
+(1,36): eof-in-script-in-script
+(1,36): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -a
+#errors
+(1,37): eof-in-script-in-script
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -<
+#errors
+(1,37): eof-in-script-in-script
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -<"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --
+#errors
+(1,37): eof-in-script-in-script
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --a
+#errors
+(1,38): eof-in-script-in-script
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --a"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --<
+#errors
+(1,38): eof-in-script-in-script
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --<"
+|   <body>
+
+#data
+<!doctype html><script><!--<script -->
+#errors
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --><
+#errors
+(1,39): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --><"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></
+#errors
+(1,40): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script
+#errors
+(1,46): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></script"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script 
+#errors
+(1,47): expected-attribute-name-but-got-eof
+(1,47): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script/
+#errors
+(1,47): unexpected-EOF-after-solidus-in-tag
+(1,47): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script --></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script><\/script>--></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script><\/script>-->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></scr'+'ipt>--></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt>-->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>--><!--</script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>--><!--"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>-- ></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>-- >"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>- -></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- ->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>- - ></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- - >"
+|   <body>
+
+#data
+<!doctype html><script><!--<script></script><script></script>-></script>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>->"
+|   <body>
+
+#data
+<!doctype html><script><!--<script>--!></script>X
+#errors
+(1,49): expected-named-closing-tag-but-got-eof
+(1,49): unexpected-EOF-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script>--!></script>X"
+|   <body>
+
+#data
+<!doctype html><script><!--<scr'+'ipt></script>--></script>
+#errors
+(1,59): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<scr'+'ipt>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><script><!--<script></scr'+'ipt></script>X
+#errors
+(1,57): expected-named-closing-tag-but-got-eof
+(1,57): unexpected-eof-in-text-mode
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt></script>X"
+|   <body>
+
+#data
+<!doctype html><style><!--<style></style>--></style>
+#errors
+(1,52): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--<style>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><style><!--</style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><style><!--...</style>...--></style>
+#errors
+(1,51): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|   <body>
+|     "...-->"
+
+#data
+<!doctype html><style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><style><!--...<style><!--...--!></style>--></style>
+#errors
+(1,66): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--...<style><!--...--!>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><style><!--...</style><!-- --><style>@import ...</style>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|     <!--   -->
+|     <style>
+|       "@import ..."
+|   <body>
+
+#data
+<!doctype html><style>...<style><!--...</style><!-- --></style>
+#errors
+(1,63): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "...<style><!--..."
+|     <!--   -->
+|   <body>
+
+#data
+<!doctype html><style>...<!--[if IE]><style>...</style>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <style>
+|       "...<!--[if IE]><style>..."
+|   <body>
+|     "X"
+
+#data
+<!doctype html><title><!--<title></title>--></title>
+#errors
+(1,52): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "<!--<title>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><title>&lt;/title></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "</title>"
+|   <body>
+
+#data
+<!doctype html><title>foo/title><link></head><body>X
+#errors
+(1,52): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "foo/title><link></head><body>X"
+|   <body>
+
+#data
+<!doctype html><noscript><!--<noscript></noscript>--></noscript>
+#errors
+(1,64): unexpected-end-tag
+#script-on
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--<noscript>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><noscript><!--<noscript></noscript>--></noscript>
+#errors
+#script-off
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- <noscript></noscript> -->
+|   <body>
+
+#data
+<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+#script-on
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "X"
+|     <noscript>
+|       "-->"
+
+#data
+<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+#script-off
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- </noscript>X<noscript> -->
+|   <body>
+
+#data
+<!doctype html><noscript><iframe></noscript>X
+#errors
+#script-on
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|       "<iframe>"
+|   <body>
+|     "X"
+
+#data
+<!doctype html><noscript><iframe></noscript>X
+#errors
+ * (1,34) unexpected token in head noscript
+ * (1,46) unexpected EOF
+#script-off
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+|     <iframe>
+|       "</noscript>X"
+
+#data
+<!doctype html><noframes><!--<noframes></noframes>--></noframes>
+#errors
+(1,64): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noframes>
+|       "<!--<noframes>"
+|   <body>
+|     "-->"
+
+#data
+<!doctype html><noframes><body><script><!--...</script></body></noframes></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <noframes>
+|       "<body><script><!--...</script></body>"
+|   <body>
+
+#data
+<!doctype html><textarea><!--<textarea></textarea>--></textarea>
+#errors
+(1,64): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--<textarea>"
+|     "-->"
+
+#data
+<!doctype html><textarea>&lt;/textarea></textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "</textarea>"
+
+#data
+<!doctype html><textarea>&lt;</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<"
+
+#data
+<!doctype html><textarea>a&lt;b</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "a<b"
+
+#data
+<!doctype html><iframe><!--<iframe></iframe>--></iframe>
+#errors
+(1,56): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "<!--<iframe>"
+|     "-->"
+
+#data
+<!doctype html><iframe>...<!--X->...<!--/X->...</iframe>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "...<!--X->...<!--/X->..."
+
+#data
+<!doctype html><xmp><!--<xmp></xmp>--></xmp>
+#errors
+(1,44): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       "<!--<xmp>"
+|     "-->"
+
+#data
+<!doctype html><noembed><!--<noembed></noembed>--></noembed>
+#errors
+(1,60): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <noembed>
+|       "<!--<noembed>"
+|     "-->"
+
+#data
+<script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,8): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script>a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,9): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "a"
+|   <body>
+
+#data
+<script><
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,9): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<"
+|   <body>
+
+#data
+<script></
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,10): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</"
+|   <body>
+
+#data
+<script></S
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</S"
+|   <body>
+
+#data
+<script></SC
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,12): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SC"
+|   <body>
+
+#data
+<script></SCR
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,13): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCR"
+|   <body>
+
+#data
+<script></SCRI
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,14): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRI"
+|   <body>
+
+#data
+<script></SCRIP
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,15): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIP"
+|   <body>
+
+#data
+<script></SCRIPT
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,16): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</SCRIPT"
+|   <body>
+
+#data
+<script></SCRIPT 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,17): expected-attribute-name-but-got-eof
+(1,17): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script></s
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</s"
+|   <body>
+
+#data
+<script></sc
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,12): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</sc"
+|   <body>
+
+#data
+<script></scr
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,13): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scr"
+|   <body>
+
+#data
+<script></scri
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,14): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scri"
+|   <body>
+
+#data
+<script></scrip
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,15): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</scrip"
+|   <body>
+
+#data
+<script></script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,16): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</script"
+|   <body>
+
+#data
+<script></script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,17): expected-attribute-name-but-got-eof
+(1,17): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<script><!
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,10): expected-script-data-but-got-eof
+(1,10): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!"
+|   <body>
+
+#data
+<script><!a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!a"
+|   <body>
+
+#data
+<script><!-
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!-"
+|   <body>
+
+#data
+<script><!-a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,12): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!-a"
+|   <body>
+
+#data
+<script><!--
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,12): expected-named-closing-tag-but-got-eof
+(1,12): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<script><!--a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,13): expected-named-closing-tag-but-got-eof
+(1,13): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--a"
+|   <body>
+
+#data
+<script><!--<
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,13): expected-named-closing-tag-but-got-eof
+(1,13): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<"
+|   <body>
+
+#data
+<script><!--<a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,14): expected-named-closing-tag-but-got-eof
+(1,14): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<a"
+|   <body>
+
+#data
+<script><!--</
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,14): expected-named-closing-tag-but-got-eof
+(1,14): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--</"
+|   <body>
+
+#data
+<script><!--</script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,20): expected-named-closing-tag-but-got-eof
+(1,20): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--</script"
+|   <body>
+
+#data
+<script><!--</script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,21): expected-attribute-name-but-got-eof
+(1,21): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--"
+|   <body>
+
+#data
+<script><!--<s
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,14): expected-named-closing-tag-but-got-eof
+(1,14): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<s"
+|   <body>
+
+#data
+<script><!--<script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,19): expected-named-closing-tag-but-got-eof
+(1,19): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script"
+|   <body>
+
+#data
+<script><!--<script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,20): eof-in-script-in-script
+(1,20): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script "
+|   <body>
+
+#data
+<script><!--<script <
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,21): eof-in-script-in-script
+(1,21): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <"
+|   <body>
+
+#data
+<script><!--<script <a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,22): eof-in-script-in-script
+(1,22): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script <a"
+|   <body>
+
+#data
+<script><!--<script </
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,22): eof-in-script-in-script
+(1,22): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </"
+|   <body>
+
+#data
+<script><!--<script </s
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,23): eof-in-script-in-script
+(1,23): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </s"
+|   <body>
+
+#data
+<script><!--<script </script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,28): eof-in-script-in-script
+(1,28): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script"
+|   <body>
+
+#data
+<script><!--<script </scripta
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,29): eof-in-script-in-script
+(1,29): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </scripta"
+|   <body>
+
+#data
+<script><!--<script </script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script>"
+|   <body>
+
+#data
+<script><!--<script </script/
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,29): expected-named-closing-tag-but-got-eof
+(1,29): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script/"
+|   <body>
+
+#data
+<script><!--<script </script <
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,30): expected-named-closing-tag-but-got-eof
+(1,30): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <"
+|   <body>
+
+#data
+<script><!--<script </script <a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,31): expected-named-closing-tag-but-got-eof
+(1,31): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script <a"
+|   <body>
+
+#data
+<script><!--<script </script </
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,31): expected-named-closing-tag-but-got-eof
+(1,31): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </"
+|   <body>
+
+#data
+<script><!--<script </script </script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,37): expected-named-closing-tag-but-got-eof
+(1,37): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script </script"
+|   <body>
+
+#data
+<script><!--<script </script </script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,38): expected-attribute-name-but-got-eof
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script </script/
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,38): unexpected-EOF-after-solidus-in-tag
+(1,38): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script </script </script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script </script "
+|   <body>
+
+#data
+<script><!--<script -
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,21): eof-in-script-in-script
+(1,21): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -"
+|   <body>
+
+#data
+<script><!--<script -a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,22): eof-in-script-in-script
+(1,22): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -a"
+|   <body>
+
+#data
+<script><!--<script --
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,22): eof-in-script-in-script
+(1,22): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --"
+|   <body>
+
+#data
+<script><!--<script --a
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,23): eof-in-script-in-script
+(1,23): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --a"
+|   <body>
+
+#data
+<script><!--<script -->
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,23): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --><
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,24): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --><"
+|   <body>
+
+#data
+<script><!--<script --></
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,25): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></"
+|   <body>
+
+#data
+<script><!--<script --></script
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,31): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script --></script"
+|   <body>
+
+#data
+<script><!--<script --></script 
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,32): expected-attribute-name-but-got-eof
+(1,32): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --></script/
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,32): unexpected-EOF-after-solidus-in-tag
+(1,32): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script --></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script -->"
+|   <body>
+
+#data
+<script><!--<script><\/script>--></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script><\/script>-->"
+|   <body>
+
+#data
+<script><!--<script></scr'+'ipt>--></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt>-->"
+|   <body>
+
+#data
+<script><!--<script></script><script></script></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>--><!--</script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>--><!--"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>-- ></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>-- >"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>- -></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- ->"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>- - ></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>- - >"
+|   <body>
+
+#data
+<script><!--<script></script><script></script>-></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></script><script></script>->"
+|   <body>
+
+#data
+<script><!--<script>--!></script>X
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,34): expected-named-closing-tag-but-got-eof
+(1,34): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script>--!></script>X"
+|   <body>
+
+#data
+<script><!--<scr'+'ipt></script>--></script>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,44): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<scr'+'ipt>"
+|   <body>
+|     "-->"
+
+#data
+<script><!--<script></scr'+'ipt></script>X
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,42): expected-named-closing-tag-but-got-eof
+(1,42): unexpected-eof-in-text-mode
+#document
+| <html>
+|   <head>
+|     <script>
+|       "<!--<script></scr'+'ipt></script>X"
+|   <body>
+
+#data
+<style><!--<style></style>--></style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,37): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--<style>"
+|   <body>
+|     "-->"
+
+#data
+<style><!--</style>X
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--"
+|   <body>
+|     "X"
+
+#data
+<style><!--...</style>...--></style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,36): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|   <body>
+|     "...-->"
+
+#data
+<style><!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style></style>X
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--<br><html xmlns:v="urn:schemas-microsoft-com:vml"><!--[if !mso]><style>"
+|   <body>
+|     "X"
+
+#data
+<style><!--...<style><!--...--!></style>--></style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,51): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--...<style><!--...--!>"
+|   <body>
+|     "-->"
+
+#data
+<style><!--...</style><!-- --><style>@import ...</style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "<!--..."
+|     <!--   -->
+|     <style>
+|       "@import ..."
+|   <body>
+
+#data
+<style>...<style><!--...</style><!-- --></style>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,48): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "...<style><!--..."
+|     <!--   -->
+|   <body>
+
+#data
+<style>...<!--[if IE]><style>...</style>X
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       "...<!--[if IE]><style>..."
+|   <body>
+|     "X"
+
+#data
+<title><!--<title></title>--></title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,37): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--<title>"
+|   <body>
+|     "-->"
+
+#data
+<title>&lt;/title></title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "</title>"
+|   <body>
+
+#data
+<title>foo/title><link></head><body>X
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,37): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <title>
+|       "foo/title><link></head><body>X"
+|   <body>
+
+#data
+<noscript><!--<noscript></noscript>--></noscript>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,49): unexpected-end-tag
+#script-on
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--<noscript>"
+|   <body>
+|     "-->"
+
+#data
+<noscript><!--<noscript></noscript>--></noscript>
+#errors
+ * (1,11) missing DOCTYPE
+#script-off
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- <noscript></noscript> -->
+|   <body>
+
+#data
+<noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#script-on
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "X"
+|     <noscript>
+|       "-->"
+
+#data
+<noscript><!--</noscript>X<noscript>--></noscript>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#script-off
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- </noscript>X<noscript> -->
+|   <body>
+
+#data
+<noscript><iframe></noscript>X
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#script-on
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<iframe>"
+|   <body>
+|     "X"
+
+#data
+<noscript><iframe></noscript>X
+#errors
+ * (1,11) missing DOCTYPE
+ * (1,19) unexpected token in head noscript
+ * (1,31) unexpected EOF
+#script-off
+#document
+| <html>
+|   <head>
+|     <noscript>
+|   <body>
+|     <iframe>
+|       "</noscript>X"
+
+#data
+<noframes><!--<noframes></noframes>--></noframes>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,49): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <noframes>
+|       "<!--<noframes>"
+|   <body>
+|     "-->"
+
+#data
+<noframes><body><script><!--...</script></body></noframes></html>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <noframes>
+|       "<body><script><!--...</script></body>"
+|   <body>
+
+#data
+<textarea><!--<textarea></textarea>--></textarea>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,49): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "<!--<textarea>"
+|     "-->"
+
+#data
+<textarea>&lt;/textarea></textarea>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "</textarea>"
+
+#data
+<iframe><!--<iframe></iframe>--></iframe>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,41): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "<!--<iframe>"
+|     "-->"
+
+#data
+<iframe>...<!--X->...<!--/X->...</iframe>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       "...<!--X->...<!--/X->..."
+
+#data
+<xmp><!--<xmp></xmp>--></xmp>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,29): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       "<!--<xmp>"
+|     "-->"
+
+#data
+<noembed><!--<noembed></noembed>--></noembed>
+#errors
+(1,9): expected-doctype-but-got-start-tag
+(1,45): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <noembed>
+|       "<!--<noembed>"
+|     "-->"
+
+#data
+<!doctype html><table>
+
+#errors
+(2,0): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "
+"
+
+#data
+<!doctype html><table><td><span><font></span><span>
+#errors
+(1,26): unexpected-cell-in-table-body
+(1,45): unexpected-end-tag
+(1,51): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <span>
+|               <font>
+|             <font>
+|               <span>
+
+#data
+<!doctype html><form><table></form><form></table></form>
+#errors
+(1,35): unexpected-end-tag-implies-table-voodoo
+(1,35): unexpected-end-tag
+(1,41): unexpected-form-in-table
+(1,56): unexpected-end-tag
+(1,56): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <table>
+|         <form>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests17.dat b/libs/html5lib/tests/testdata/tree-construction/tests17.dat
new file mode 100644
index 000000000..e49bcf031
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests17.dat
@@ -0,0 +1,179 @@
+#data
+<!doctype html><table><tbody><select><tr>
+#errors
+(1,37): unexpected-start-tag-implies-table-voodoo
+(1,41): unexpected-table-element-start-tag-in-select-in-table
+(1,41): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><tr><select><td>
+#errors
+(1,34): unexpected-start-tag-implies-table-voodoo
+(1,38): unexpected-table-element-start-tag-in-select-in-table
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<!doctype html><table><tr><td><select><td>
+#errors
+(1,42): unexpected-table-element-start-tag-in-select-in-table
+(1,42): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|           <td>
+
+#data
+<!doctype html><table><tr><th><select><td>
+#errors
+(1,42): unexpected-table-element-start-tag-in-select-in-table
+(1,42): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <th>
+|             <select>
+|           <td>
+
+#data
+<!doctype html><table><caption><select><tr>
+#errors
+(1,43): unexpected-table-element-start-tag-in-select-in-table
+(1,43): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <select>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><select><tr>
+#errors
+(1,27): unexpected-start-tag-in-select
+(1,27): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><td>
+#errors
+(1,27): unexpected-start-tag-in-select
+(1,27): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><th>
+#errors
+(1,27): unexpected-start-tag-in-select
+(1,27): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><tbody>
+#errors
+(1,30): unexpected-start-tag-in-select
+(1,30): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><thead>
+#errors
+(1,30): unexpected-start-tag-in-select
+(1,30): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><tfoot>
+#errors
+(1,30): unexpected-start-tag-in-select
+(1,30): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><select><caption>
+#errors
+(1,32): unexpected-start-tag-in-select
+(1,32): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><table><tr></table>a
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|     "a"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests18.dat b/libs/html5lib/tests/testdata/tree-construction/tests18.dat
new file mode 100644
index 000000000..926bccb38
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests18.dat
@@ -0,0 +1,322 @@
+#data
+<!doctype html><plaintext></plaintext>
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+
+#data
+<!doctype html><table><plaintext></plaintext>
+#errors
+(1,33): foster-parenting-start-tag
+(1,34): foster-parenting-character
+(1,35): foster-parenting-character
+(1,36): foster-parenting-character
+(1,37): foster-parenting-character
+(1,38): foster-parenting-character
+(1,39): foster-parenting-character
+(1,40): foster-parenting-character
+(1,41): foster-parenting-character
+(1,42): foster-parenting-character
+(1,43): foster-parenting-character
+(1,44): foster-parenting-character
+(1,45): foster-parenting-character
+(1,45): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+
+#data
+<!doctype html><table><tbody><plaintext></plaintext>
+#errors
+(1,40): foster-parenting-start-tag
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,41): foster-parenting-character
+(1,52): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+|       <tbody>
+
+#data
+<!doctype html><table><tbody><tr><plaintext></plaintext>
+#errors
+(1,44): foster-parenting-start-tag
+(1,45): foster-parenting-character
+(1,46): foster-parenting-character
+(1,47): foster-parenting-character
+(1,48): foster-parenting-character
+(1,49): foster-parenting-character
+(1,50): foster-parenting-character
+(1,51): foster-parenting-character
+(1,52): foster-parenting-character
+(1,53): foster-parenting-character
+(1,54): foster-parenting-character
+(1,55): foster-parenting-character
+(1,56): foster-parenting-character
+(1,56): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><td><plaintext></plaintext>
+#errors
+(1,26): unexpected-cell-in-table-body
+(1,49): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <plaintext>
+|               "</plaintext>"
+
+#data
+<!doctype html><table><caption><plaintext></plaintext>
+#errors
+(1,54): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <plaintext>
+|           "</plaintext>"
+
+#data
+<!doctype html><table><tr><style></script></style>abc
+#errors
+(1,51): foster-parenting-character
+(1,52): foster-parenting-character
+(1,53): foster-parenting-character
+(1,53): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <style>
+|             "</script>"
+
+#data
+<!doctype html><table><tr><script></style></script>abc
+#errors
+(1,52): foster-parenting-character
+(1,53): foster-parenting-character
+(1,54): foster-parenting-character
+(1,54): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <script>
+|             "</style>"
+
+#data
+<!doctype html><table><caption><style></script></style>abc
+#errors
+(1,58): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <style>
+|           "</script>"
+|         "abc"
+
+#data
+<!doctype html><table><td><style></script></style>abc
+#errors
+(1,26): unexpected-cell-in-table-body
+(1,53): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <style>
+|               "</script>"
+|             "abc"
+
+#data
+<!doctype html><select><script></style></script>abc
+#errors
+(1,51): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+
+#data
+<!doctype html><table><select><script></style></script>abc
+#errors
+(1,30): unexpected-start-tag-implies-table-voodoo
+(1,58): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+|     <table>
+
+#data
+<!doctype html><table><tr><select><script></style></script>abc
+#errors
+(1,34): unexpected-start-tag-implies-table-voodoo
+(1,62): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <script>
+|         "</style>"
+|       "abc"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><frameset></frameset><noframes>abc
+#errors
+(1,49): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+
+#data
+<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+|   <!-- abc -->
+
+#data
+<!doctype html><frameset></frameset></html><noframes>abc
+#errors
+(1,56): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+
+#data
+<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   <noframes>
+|     "abc"
+| <!-- abc -->
+
+#data
+<!doctype html><table><tr></tbody><tfoot>
+#errors
+(1,41): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|       <tfoot>
+
+#data
+<!doctype html><table><td><svg></svg>abc<td>
+#errors
+(1,26): unexpected-cell-in-table-body
+(1,44): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|             "abc"
+|           <td>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests19.dat b/libs/html5lib/tests/testdata/tree-construction/tests19.dat
new file mode 100644
index 000000000..a1897774d
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests19.dat
@@ -0,0 +1,1454 @@
+#data
+<!doctype html><math><mn DefinitionUrl="foo">
+#errors
+(1,45): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mn>
+|         definitionURL="foo"
+
+#data
+<!doctype html><html></p><!--foo-->
+#errors
+(1,25): end-tag-after-implied-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   <!-- foo -->
+|   <head>
+|   <body>
+
+#data
+<!doctype html><head></head></p><!--foo-->
+#errors
+(1,32): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <!-- foo -->
+|   <body>
+
+#data
+<!doctype html><body><p><pre>
+#errors
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <pre>
+
+#data
+<!doctype html><body><p><listing>
+#errors
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <listing>
+
+#data
+<!doctype html><p><plaintext>
+#errors
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <plaintext>
+
+#data
+<!doctype html><p><h1>
+#errors
+(1,22): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <h1>
+
+#data
+<!doctype html><isindex type="hidden">
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <isindex>
+|       type="hidden"
+
+#data
+<!doctype html><ruby><p><rp>
+#errors
+(1,28): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <p>
+|       <rp>
+
+#data
+<!doctype html><ruby><div><span><rp>
+#errors
+(1,36): XXX-undefined-error
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <span>
+|           <rp>
+
+#data
+<!doctype html><ruby><div><p><rp>
+#errors
+(1,33): XXX-undefined-error
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <p>
+|         <rp>
+
+#data
+<!doctype html><ruby><p><rt>
+#errors
+(1,28): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <p>
+|       <rt>
+
+#data
+<!doctype html><ruby><div><span><rt>
+#errors
+(1,36): XXX-undefined-error
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <span>
+|           <rt>
+
+#data
+<!doctype html><ruby><div><p><rt>
+#errors
+(1,33): XXX-undefined-error
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <p>
+|         <rt>
+
+#data
+<html><ruby>a<rb>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rb>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rp>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rp>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rt>b<rt></ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rt>
+|         "b"
+|       <rt>
+
+#data
+<html><ruby>a<rtc>b<rt>c<rb>d</ruby></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       "a"
+|       <rtc>
+|         "b"
+|         <rt>
+|           "c"
+|       <rb>
+|         "d"
+
+#data
+<!doctype html><math/><foo>
+#errors
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|     <foo>
+
+#data
+<!doctype html><svg/><foo>
+#errors
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <foo>
+
+#data
+<!doctype html><div></body><!--foo-->
+#errors
+(1,27): expected-one-end-tag-but-got-another
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|   <!-- foo -->
+
+#data
+<!doctype html><h1><div><h3><span></h1>foo
+#errors
+(1,39): end-tag-too-early
+(1,42): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <h1>
+|       <div>
+|         <h3>
+|           <span>
+|         "foo"
+
+#data
+<!doctype html><p></h3>foo
+#errors
+(1,23): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "foo"
+
+#data
+<!doctype html><h3><li>abc</h2>foo
+#errors
+(1,31): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <h3>
+|       <li>
+|         "abc"
+|     "foo"
+
+#data
+<!doctype html><table>abc<!--foo-->
+#errors
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+(1,25): foster-parenting-character
+(1,35): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "abc"
+|     <table>
+|       <!-- foo -->
+
+#data
+<!doctype html><table>  <!--foo-->
+#errors
+(1,34): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <!-- foo -->
+
+#data
+<!doctype html><table> b <!--foo-->
+#errors
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+(1,25): foster-parenting-character
+(1,35): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     " b "
+|     <table>
+|       <!-- foo -->
+
+#data
+<!doctype html><select><option><option>
+#errors
+(1,39): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <option>
+
+#data
+<!doctype html><select><option></optgroup>
+#errors
+(1,42): unexpected-end-tag-in-select
+(1,42): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!doctype html><select><option></optgroup>
+#errors
+(1,42): unexpected-end-tag-in-select
+(1,42): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!doctype html><dd><optgroup><dd>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+|       <optgroup>
+|     <dd>
+
+#data
+<!doctype html><p><math><mi><p><h1>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mi>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mo><p><h1>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mo>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mn><p><h1>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mn>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><ms><p><h1>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math ms>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><p><math><mtext><p><h1>
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mtext>
+|           <p>
+|           <h1>
+
+#data
+<!doctype html><frameset></noframes>
+#errors
+(1,36): unexpected-end-tag-in-frameset
+(1,36): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html c=d><body></html><html a=b>
+#errors
+(1,48): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <body>
+
+#data
+<!doctype html><html c=d><frameset></frameset></html><html a=b>
+#errors
+(1,63): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html><!--foo-->
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+| <!-- foo -->
+
+#data
+<!doctype html><html><frameset></frameset></html>  
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   "  "
+
+#data
+<!doctype html><html><frameset></frameset></html>abc
+#errors
+(1,50): expected-eof-but-got-char
+(1,51): expected-eof-but-got-char
+(1,52): expected-eof-but-got-char
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html><p>
+#errors
+(1,52): expected-eof-but-got-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><html><frameset></frameset></html></p>
+#errors
+(1,53): expected-eof-but-got-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<html><frameset></frameset></html><!doctype html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,49): unexpected-doctype
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><body><frameset>
+#errors
+(1,31): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html><p><frameset><frame>
+#errors
+(1,28): unexpected-start-tag
+(1,35): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><p>a<frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "a"
+
+#data
+<!doctype html><p> <frameset><frame>
+#errors
+(1,29): unexpected-start-tag
+(1,36): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><pre><frameset>
+#errors
+(1,30): unexpected-start-tag
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+
+#data
+<!doctype html><listing><frameset>
+#errors
+(1,34): unexpected-start-tag
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <listing>
+
+#data
+<!doctype html><li><frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <li>
+
+#data
+<!doctype html><dd><frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+
+#data
+<!doctype html><dt><frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dt>
+
+#data
+<!doctype html><button><frameset>
+#errors
+(1,33): unexpected-start-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <button>
+
+#data
+<!doctype html><applet><frameset>
+#errors
+(1,33): unexpected-start-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <applet>
+
+#data
+<!doctype html><marquee><frameset>
+#errors
+(1,34): unexpected-start-tag
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <marquee>
+
+#data
+<!doctype html><object><frameset>
+#errors
+(1,33): unexpected-start-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <object>
+
+#data
+<!doctype html><table><frameset>
+#errors
+(1,32): unexpected-start-tag-implies-table-voodoo
+(1,32): unexpected-start-tag
+(1,32): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+
+#data
+<!doctype html><area><frameset>
+#errors
+(1,31): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <area>
+
+#data
+<!doctype html><basefont><frameset>
+#errors
+(1,35): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <basefont>
+|   <frameset>
+
+#data
+<!doctype html><bgsound><frameset>
+#errors
+(1,34): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <bgsound>
+|   <frameset>
+
+#data
+<!doctype html><br><frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<!doctype html><embed><frameset>
+#errors
+(1,32): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <embed>
+
+#data
+<!doctype html><img><frameset>
+#errors
+(1,30): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+
+#data
+<!doctype html><input><frameset>
+#errors
+(1,32): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+
+#data
+<!doctype html><keygen><frameset>
+#errors
+(1,33): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <keygen>
+
+#data
+<!doctype html><wbr><frameset>
+#errors
+(1,30): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+
+#data
+<!doctype html><hr><frameset>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <hr>
+
+#data
+<!doctype html><textarea></textarea><frameset>
+#errors
+(1,46): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+
+#data
+<!doctype html><xmp></xmp><frameset>
+#errors
+(1,36): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+
+#data
+<!doctype html><iframe></iframe><frameset>
+#errors
+(1,42): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+
+#data
+<!doctype html><select></select><frameset>
+#errors
+(1,42): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!doctype html><svg></svg><frameset><frame>
+#errors
+(1,36): unexpected-start-tag
+(1,43): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><math></math><frameset><frame>
+#errors
+(1,38): unexpected-start-tag
+(1,45): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><svg><foreignObject><div> <frameset><frame>
+#errors
+(1,51): unexpected-start-tag
+(1,58): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<!doctype html><svg>a</svg><frameset><frame>
+#errors
+(1,37): unexpected-start-tag
+(1,44): unexpected-start-tag-ignored
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "a"
+
+#data
+<!doctype html><svg> </svg><frameset><frame>
+#errors
+(1,37): unexpected-start-tag
+(1,44): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     <frame>
+
+#data
+<html>aaa<frameset></frameset>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,19): unexpected-start-tag
+(1,30): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "aaa"
+
+#data
+<html> a <frameset></frameset>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,19): unexpected-start-tag
+(1,30): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "a "
+
+#data
+<!doctype html><div><frameset>
+#errors
+(1,30): unexpected-start-tag
+(1,30): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><div><body><frameset>
+#errors
+(1,26): unexpected-start-tag
+(1,36): unexpected-start-tag
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<!doctype html><p><math></p>a
+#errors
+(1,28): unexpected-end-tag
+(1,28): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|     "a"
+
+#data
+<!doctype html><p><math><mn><span></p>a
+#errors
+(1,38): unexpected-end-tag
+(1,39): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <math math>
+|         <math mn>
+|           <span>
+|             <p>
+|             "a"
+
+#data
+<!doctype html><math></html>
+#errors
+(1,28): unexpected-end-tag
+(1,28): expected-one-end-tag-but-got-another
+(1,28): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!doctype html><meta charset="ascii">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|       charset="ascii"
+|   <body>
+
+#data
+<!doctype html><meta http-equiv="content-type" content="text/html;charset=ascii">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|       content="text/html;charset=ascii"
+|       http-equiv="content-type"
+|   <body>
+
+#data
+<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset="utf8">
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <!-- aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -->
+|     <meta>
+|       charset="utf8"
+|   <body>
+
+#data
+<!doctype html><html a=b><head></head><html c=d>
+#errors
+(1,48): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   a="b"
+|   c="d"
+|   <head>
+|   <body>
+
+#data
+<!doctype html><image/>
+#errors
+(1,23): image-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+
+#data
+<!doctype html>a<i>b<table>c<b>d</i>e</b>f
+#errors
+(1,28): foster-parenting-character
+(1,31): foster-parenting-start-tag
+(1,32): foster-parenting-character
+(1,36): foster-parenting-end-tag
+(1,36): adoption-agency-1.3
+(1,37): foster-parenting-character
+(1,41): foster-parenting-end-tag
+(1,42): foster-parenting-character
+(1,42): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "a"
+|     <i>
+|       "bc"
+|       <b>
+|         "de"
+|       "f"
+|       <table>
+
+#data
+<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+(1,25): foster-parenting-start-tag
+(1,26): foster-parenting-character
+(1,29): foster-parenting-start-tag
+(1,30): foster-parenting-character
+(1,35): foster-parenting-start-tag
+(1,36): foster-parenting-character
+(1,39): foster-parenting-start-tag
+(1,40): foster-parenting-character
+(1,44): foster-parenting-end-tag
+(1,44): adoption-agency-1.3
+(1,44): adoption-agency-1.3
+(1,45): foster-parenting-character
+(1,49): foster-parenting-end-tag
+(1,49): adoption-agency-1.3
+(1,49): adoption-agency-1.3
+(1,50): foster-parenting-character
+(1,50): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+|     <table>
+
+#data
+<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+(1,37): adoption-agency-1.3
+(1,37): adoption-agency-1.3
+(1,42): adoption-agency-1.3
+(1,42): adoption-agency-1.3
+(1,43): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+
+#data
+<!doctype html><table><i>a<b>b<div>c</i>
+#errors
+(1,25): foster-parenting-start-tag
+(1,26): foster-parenting-character
+(1,29): foster-parenting-start-tag
+(1,30): foster-parenting-character
+(1,35): foster-parenting-start-tag
+(1,36): foster-parenting-character
+(1,40): foster-parenting-end-tag
+(1,40): adoption-agency-1.3
+(1,40): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|       <div>
+|         <i>
+|           "c"
+|     <table>
+
+#data
+<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f
+#errors
+(1,25): foster-parenting-start-tag
+(1,26): foster-parenting-character
+(1,29): foster-parenting-start-tag
+(1,30): foster-parenting-character
+(1,35): foster-parenting-start-tag
+(1,36): foster-parenting-character
+(1,39): foster-parenting-start-tag
+(1,40): foster-parenting-character
+(1,44): foster-parenting-end-tag
+(1,44): adoption-agency-1.3
+(1,44): adoption-agency-1.3
+(1,45): foster-parenting-character
+(1,49): foster-parenting-end-tag
+(1,44): adoption-agency-1.3
+(1,44): adoption-agency-1.3
+(1,50): foster-parenting-character
+(1,50): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <b>
+|         "b"
+|     <b>
+|     <div>
+|       <b>
+|         <i>
+|           "c"
+|           <a>
+|             "d"
+|         <a>
+|           "e"
+|       <a>
+|         "f"
+|     <table>
+
+#data
+<!doctype html><table><i>a<div>b<tr>c<b>d</i>e
+#errors
+(1,25): foster-parenting-start-tag
+(1,26): foster-parenting-character
+(1,31): foster-parenting-start-tag
+(1,32): foster-parenting-character
+(1,37): foster-parenting-character
+(1,40): foster-parenting-start-tag
+(1,41): foster-parenting-character
+(1,45): foster-parenting-end-tag
+(1,45): adoption-agency-1.3
+(1,46): foster-parenting-character
+(1,46): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <i>
+|       "a"
+|       <div>
+|         "b"
+|     <i>
+|       "c"
+|       <b>
+|         "d"
+|     <b>
+|       "e"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><table><td><table><i>a<div>b<b>c</i>d
+#errors
+(1,26): unexpected-cell-in-table-body
+(1,36): foster-parenting-start-tag
+(1,37): foster-parenting-character
+(1,42): foster-parenting-start-tag
+(1,43): foster-parenting-character
+(1,46): foster-parenting-start-tag
+(1,47): foster-parenting-character
+(1,51): foster-parenting-end-tag
+(1,51): adoption-agency-1.3
+(1,51): adoption-agency-1.3
+(1,52): foster-parenting-character
+(1,52): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <i>
+|               "a"
+|             <div>
+|               <i>
+|                 "b"
+|                 <b>
+|                   "c"
+|               <b>
+|                 "d"
+|             <table>
+
+#data
+<!doctype html><body><bgsound>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <bgsound>
+
+#data
+<!doctype html><body><basefont>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <basefont>
+
+#data
+<!doctype html><a><b></a><basefont>
+#errors
+(1,25): adoption-agency-1.3
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <basefont>
+
+#data
+<!doctype html><a><b></a><bgsound>
+#errors
+(1,25): adoption-agency-1.3
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <bgsound>
+
+#data
+<!doctype html><figcaption><article></figcaption>a
+#errors
+(1,49): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <figcaption>
+|       <article>
+|     "a"
+
+#data
+<!doctype html><summary><article></summary>a
+#errors
+(1,43): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <summary>
+|       <article>
+|     "a"
+
+#data
+<!doctype html><p><a><plaintext>b
+#errors
+(1,32): unexpected-end-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <a>
+|     <plaintext>
+|       <a>
+|         "b"
+
+#data
+<!DOCTYPE html><div>a<a></div>b<p>c</p>d
+#errors
+(1,30): end-tag-too-early
+(1,40): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "a"
+|       <a>
+|     <a>
+|       "b"
+|       <p>
+|         "c"
+|       "d"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests2.dat b/libs/html5lib/tests/testdata/tree-construction/tests2.dat
new file mode 100644
index 000000000..bd2d11d9d
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests2.dat
@@ -0,0 +1,780 @@
+#data
+<!DOCTYPE html>Test
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<textarea>test</div>test
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,24): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "test</div>test"
+
+#data
+<table><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,11): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><td>test</tbody></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "test"
+
+#data
+<frame>test
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,7): unexpected-start-tag-ignored
+#document
+| <html>
+|   <head>
+|   <body>
+|     "test"
+
+#data
+<!DOCTYPE html><frameset>test
+#errors
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset> te st
+#errors
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): unexpected-char-in-frameset
+(1,29): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|     "  "
+
+#data
+<!DOCTYPE html><frameset></frameset> te st
+#errors
+(1,29): unexpected-char-after-frameset
+(1,29): unexpected-char-after-frameset
+(1,29): unexpected-char-after-frameset
+(1,29): unexpected-char-after-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+|   "  "
+
+#data
+<!DOCTYPE html><frameset><!DOCTYPE html>
+#errors
+(1,40): unexpected-doctype
+(1,40): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><font><p><b>test</font>
+#errors
+(1,38): adoption-agency-1.3
+(1,38): adoption-agency-1.3
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|     <p>
+|       <font>
+|         <b>
+|           "test"
+
+#data
+<!DOCTYPE html><dt><div><dd>
+#errors
+(1,28): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <dt>
+|       <div>
+|     <dd>
+
+#data
+<script></x
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,11): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <script>
+|       "</x"
+|   <body>
+
+#data
+<table><plaintext><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,18): unexpected-start-tag-implies-table-voodoo
+(1,22): foster-parenting-character-in-table
+(1,22): foster-parenting-character-in-table
+(1,22): foster-parenting-character-in-table
+(1,22): foster-parenting-character-in-table
+(1,22): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "<td>"
+|     <table>
+
+#data
+<plaintext></plaintext>
+#errors
+(1,11): expected-doctype-but-got-start-tag
+(1,23): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "</plaintext>"
+
+#data
+<!DOCTYPE html><table><tr>TEST
+#errors
+(1,30): foster-parenting-character-in-table
+(1,30): foster-parenting-character-in-table
+(1,30): foster-parenting-character-in-table
+(1,30): foster-parenting-character-in-table
+(1,30): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "TEST"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4>
+#errors
+(1,37): unexpected-start-tag
+(1,53): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     t1="1"
+|     t2="2"
+|     t3="3"
+|     t4="4"
+
+#data
+</b test
+#errors
+(1,8): eof-in-attribute-name
+(1,8): expected-doctype-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html></b test<b &=&amp>X
+#errors
+(1,24): invalid-character-in-attribute-name
+(1,32): named-entity-without-semicolon
+(1,33): attributes-in-end-tag
+(1,33): unexpected-end-tag-before-html
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+
+#data
+<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt
+#errors
+(1,9): need-space-after-doctype
+(1,54): expected-named-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       type="text/x-foobar;baz"
+|       "X</SCRipt"
+|   <body>
+
+#data
+&
+#errors
+(1,1): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&"
+
+#data
+&#
+#errors
+(1,2): expected-numeric-entity
+(1,2): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#"
+
+#data
+&#X
+#errors
+(1,3): expected-numeric-entity
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#X"
+
+#data
+&#x
+#errors
+(1,3): expected-numeric-entity
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&#x"
+
+#data
+&#45
+#errors
+(1,4): numeric-entity-without-semicolon
+(1,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "-"
+
+#data
+&x-test
+#errors
+(1,2): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&x-test"
+
+#data
+<!doctypehtml><p><li>
+#errors
+(1,9): need-space-after-doctype
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <li>
+
+#data
+<!doctypehtml><p><dt>
+#errors
+(1,9): need-space-after-doctype
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <dt>
+
+#data
+<!doctypehtml><p><dd>
+#errors
+(1,9): need-space-after-doctype
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <dd>
+
+#data
+<!doctypehtml><p><form>
+#errors
+(1,9): need-space-after-doctype
+(1,23): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <form>
+
+#data
+<!DOCTYPE html><p></P>X
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     "X"
+
+#data
+&AMP
+#errors
+(1,4): named-entity-without-semicolon
+(1,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&"
+
+#data
+&AMp;
+#errors
+(1,3): expected-named-entity
+(1,3): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "&AMp;"
+
+#data
+<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY>
+#errors
+(1,110): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly>
+
+#data
+<!DOCTYPE html>X</body>X
+#errors
+(1,24): unexpected-char-after-body
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "XX"
+
+#data
+<!DOCTYPE html><!-- X
+#errors
+(1,21): eof-in-comment
+#document
+| <!DOCTYPE html>
+| <!--  X -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><table><caption>test TEST</caption><td>test
+#errors
+(1,54): unexpected-cell-in-table-body
+(1,58): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         "test TEST"
+|       <tbody>
+|         <tr>
+|           <td>
+|             "test"
+
+#data
+<!DOCTYPE html><select><option><optgroup>
+#errors
+(1,41): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|       <optgroup>
+
+#data
+<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>
+#errors
+(1,68): unexpected-select-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+|         <option>
+|       <option>
+|     <option>
+
+#data
+<!DOCTYPE html><select><optgroup><option><optgroup>
+#errors
+(1,51): eof-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+|         <option>
+|       <optgroup>
+
+#data
+<!DOCTYPE html><datalist><option>foo</datalist>bar
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <datalist>
+|       <option>
+|         "foo"
+|     "bar"
+
+#data
+<!DOCTYPE html><font><input><input></font>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <input>
+|       <input>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX -->
+#errors
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX
+#errors
+(1,29): eof-in-comment
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><!-- XXX - XXX - XXX -->
+#errors
+#document
+| <!DOCTYPE html>
+| <!--  XXX - XXX - XXX  -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+test
+test
+#errors
+(2,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "test
+test"
+
+#data
+<!DOCTYPE html><body><title>test</body></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "test</body>"
+
+#data
+<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style>
+x { content:"</style" } </style>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+|     <meta>
+|       name="z"
+|     <link>
+|       rel="foo"
+|     <style>
+|       "
+x { content:"</style" } "
+
+#data
+<!DOCTYPE html><select><optgroup></optgroup></select>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <optgroup>
+
+#data
+ 
+ 
+#errors
+(2,1): expected-doctype-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>  <html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><script>
+</script>  <title>x</title>  </head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <script>
+|       "
+"
+|     "  "
+|     <title>
+|       "x"
+|     "  "
+|   <body>
+
+#data
+<!DOCTYPE html><html><body><html id=x>
+#errors
+(1,38): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>X</body><html id="x">
+#errors
+(1,36): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+|     "X"
+
+#data
+<!DOCTYPE html><head><html id=x>
+#errors
+(1,32): non-html-root
+#document
+| <!DOCTYPE html>
+| <html>
+|   id="x"
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html>X</html>X
+#errors
+(1,24): expected-eof-but-got-char
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "XX"
+
+#data
+<!DOCTYPE html>X</html> 
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X "
+
+#data
+<!DOCTYPE html>X</html><p>X
+#errors
+(1,26): expected-eof-but-got-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <p>
+|       "X"
+
+#data
+<!DOCTYPE html>X<p/x/y/z>
+#errors
+(1,19): unexpected-character-after-solidus-in-tag
+(1,21): unexpected-character-after-solidus-in-tag
+(1,23): unexpected-character-after-solidus-in-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <p>
+|       x=""
+|       y=""
+|       z=""
+
+#data
+<!DOCTYPE html><!--x--
+#errors
+(1,22): eof-in-comment-double-dash
+#document
+| <!DOCTYPE html>
+| <!-- x -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE html><table><tr><td></p></table>
+#errors
+(1,34): unexpected-end-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <p>
+
+#data
+<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->-->
+#errors
+(1,20): expected-space-or-right-bracket-in-doctype
+(1,25): unknown-doctype
+(1,35): unexpected-char-in-comment
+#document
+| <!DOCTYPE <!doctype>
+| <html>
+|   <head>
+|   <body>
+|     ">"
+|     <!-- <!--x -->
+|     "-->"
+
+#data
+<!doctype html><div><form></form><div></div></div>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <form>
+|       <div>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests20.dat b/libs/html5lib/tests/testdata/tree-construction/tests20.dat
new file mode 100644
index 000000000..afdae7431
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests20.dat
@@ -0,0 +1,582 @@
+#data
+<!doctype html><p><button><button>
+#errors
+(1,34): unexpected-start-tag-implies-end-tag
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|       <button>
+
+#data
+<!doctype html><p><button><address>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <address>
+
+#data
+<!doctype html><p><button><blockquote>
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <blockquote>
+
+#data
+<!doctype html><p><button><menu>
+#errors
+(1,32): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <menu>
+
+#data
+<!doctype html><p><button><p>
+#errors
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <p>
+
+#data
+<!doctype html><p><button><ul>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <ul>
+
+#data
+<!doctype html><p><button><h1>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <h1>
+
+#data
+<!doctype html><p><button><h6>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <h6>
+
+#data
+<!doctype html><p><button><listing>
+#errors
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <listing>
+
+#data
+<!doctype html><p><button><pre>
+#errors
+(1,31): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <pre>
+
+#data
+<!doctype html><p><button><form>
+#errors
+(1,32): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <form>
+
+#data
+<!doctype html><p><button><li>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <li>
+
+#data
+<!doctype html><p><button><dd>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <dd>
+
+#data
+<!doctype html><p><button><dt>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <dt>
+
+#data
+<!doctype html><p><button><plaintext>
+#errors
+(1,37): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <plaintext>
+
+#data
+<!doctype html><p><button><table>
+#errors
+(1,33): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <table>
+
+#data
+<!doctype html><p><button><hr>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <hr>
+
+#data
+<!doctype html><p><button><xmp>
+#errors
+(1,31): expected-named-closing-tag-but-got-eof
+(1,31): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <xmp>
+
+#data
+<!doctype html><p><button></p>
+#errors
+(1,30): unexpected-end-tag
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <button>
+|         <p>
+
+#data
+<!doctype html><address><button></address>a
+#errors
+(1,42): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <address>
+|       <button>
+|     "a"
+
+#data
+<!doctype html><address><button></address>a
+#errors
+(1,42): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <address>
+|       <button>
+|     "a"
+
+#data
+<p><table></p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,14): unexpected-end-tag-implies-table-voodoo
+(1,14): unexpected-end-tag
+(1,14): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <p>
+|       <table>
+
+#data
+<!doctype html><svg>
+#errors
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<!doctype html><p><figcaption>
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <figcaption>
+
+#data
+<!doctype html><p><summary>
+#errors
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <summary>
+
+#data
+<!doctype html><form><table><form>
+#errors
+(1,34): unexpected-form-in-table
+(1,34): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <table>
+
+#data
+<!doctype html><table><form><form>
+#errors
+(1,28): unexpected-form-in-table
+(1,34): unexpected-form-in-table
+(1,34): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <form>
+
+#data
+<!doctype html><table><form></table><form>
+#errors
+(1,28): unexpected-form-in-table
+(1,42): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <form>
+
+#data
+<!doctype html><svg><foreignObject><p>
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <p>
+
+#data
+<!doctype html><svg><title>abc
+#errors
+(1,30): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         "abc"
+
+#data
+<option><span><option>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,22): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <option>
+|       <span>
+|         <option>
+
+#data
+<option><option>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <option>
+|     <option>
+
+#data
+<math><annotation-xml><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): unexpected-html-element-in-foreign-content
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|     <div>
+
+#data
+<math><annotation-xml encoding="application/svg+xml"><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,58): unexpected-html-element-in-foreign-content
+(1,58): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="application/svg+xml"
+|     <div>
+
+#data
+<math><annotation-xml encoding="application/xhtml+xml"><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,60): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="application/xhtml+xml"
+|         <div>
+
+#data
+<math><annotation-xml encoding="aPPlication/xhtmL+xMl"><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,60): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="aPPlication/xhtmL+xMl"
+|         <div>
+
+#data
+<math><annotation-xml encoding="text/html"><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,48): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="text/html"
+|         <div>
+
+#data
+<math><annotation-xml encoding="Text/htmL"><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,48): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding="Text/htmL"
+|         <div>
+
+#data
+<math><annotation-xml encoding=" text/html "><div>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,50): unexpected-html-element-in-foreign-content
+(1,50): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         encoding=" text/html "
+|     <div>
+
+#data
+<math><annotation-xml> </annotation-xml>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,40): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         " "
+
+#data
+<math><annotation-xml>c</annotation-xml>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,40): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         "c"
+
+#data
+<math><annotation-xml><!--foo-->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,32): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <!-- foo -->
+
+#data
+<math><annotation-xml></svg>x
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,28): unexpected-end-tag
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         "x"
+
+#data
+<math><annotation-xml><svg>x
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,28): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|           "x"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests21.dat b/libs/html5lib/tests/testdata/tree-construction/tests21.dat
new file mode 100644
index 000000000..d384a5556
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests21.dat
@@ -0,0 +1,305 @@
+#data
+<svg><![CDATA[foo]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<math><![CDATA[foo]]>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       "foo"
+
+#data
+<div><![CDATA[foo]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,7): expected-dashes-or-doctype
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <!-- [CDATA[foo]] -->
+
+#data
+<svg><![CDATA[foo
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<svg><![CDATA[foo
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo"
+
+#data
+<svg><![CDATA[
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,14): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<svg><![CDATA[]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+
+#data
+<svg><![CDATA[]] >]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]] >"
+
+#data
+<svg><![CDATA[]] >]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]] >"
+
+#data
+<svg><![CDATA[]]
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]]"
+
+#data
+<svg><![CDATA[]
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]"
+
+#data
+<svg><![CDATA[]>a
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "]>a"
+
+#data
+<!DOCTYPE html><svg><![CDATA[foo]]]>
+#errors
+(1,36): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo]"
+
+#data
+<!DOCTYPE html><svg><![CDATA[foo]]]]>
+#errors
+(1,37): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo]]"
+
+#data
+<!DOCTYPE html><svg><![CDATA[foo]]]]]>
+#errors
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "foo]]]"
+
+#data
+<svg><foreignObject><div><![CDATA[foo]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,27): expected-dashes-or-doctype
+(1,40): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <div>
+|           <!-- [CDATA[foo]] -->
+
+#data
+<svg><![CDATA[<svg>]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,22): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+
+#data
+<svg><![CDATA[</svg>a]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,24): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "</svg>a"
+
+#data
+<svg><![CDATA[<svg>a
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>a"
+
+#data
+<svg><![CDATA[</svg>a
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "</svg>a"
+
+#data
+<svg><![CDATA[<svg>]]><path>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,28): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+|       <svg path>
+
+#data
+<svg><![CDATA[<svg>]]></path>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,29): unexpected-end-tag
+(1,29): unexpected-end-tag
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+
+#data
+<svg><![CDATA[<svg>]]><!--path-->
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>"
+|       <!-- path -->
+
+#data
+<svg><![CDATA[<svg>]]>path
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<svg>path"
+
+#data
+<svg><![CDATA[<!--svg-->]]>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       "<!--svg-->"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests22.dat b/libs/html5lib/tests/testdata/tree-construction/tests22.dat
new file mode 100644
index 000000000..31e6d9e33
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests22.dat
@@ -0,0 +1,190 @@
+#data
+<a><b><big><em><strong><div>X</a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,33): adoption-agency-1.3
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|         <big>
+|           <em>
+|             <strong>
+|     <big>
+|       <em>
+|         <strong>
+|           <div>
+|             <a>
+|               "X"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): adoption-agency-1.3
+(1,91): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         "A"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): adoption-agency-1.3
+(1,101): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         <div>
+|                           id="9"
+|                           "A"
+
+#data
+<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): adoption-agency-1.3
+(1,112): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       <b>
+|     <b>
+|       <div>
+|         id="1"
+|         <a>
+|         <div>
+|           id="2"
+|           <a>
+|           <div>
+|             id="3"
+|             <a>
+|             <div>
+|               id="4"
+|               <a>
+|               <div>
+|                 id="5"
+|                 <a>
+|                 <div>
+|                   id="6"
+|                   <a>
+|                   <div>
+|                     id="7"
+|                     <a>
+|                     <div>
+|                       id="8"
+|                       <a>
+|                         <div>
+|                           id="9"
+|                           <div>
+|                             id="10"
+|                             "A"
+
+#data
+<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,46): adoption-agency-1.3
+(1,50): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <cite>
+|       <b>
+|         <cite>
+|           <i>
+|             <cite>
+|               <i>
+|                 <cite>
+|                   <i>
+|       <i>
+|         <i>
+|           <div>
+|             <b>
+|               "X"
+|             "TEST"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests23.dat b/libs/html5lib/tests/testdata/tree-construction/tests23.dat
new file mode 100644
index 000000000..49e4a4ace
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests23.dat
@@ -0,0 +1,168 @@
+#data
+<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,116): unexpected-end-tag
+(1,117): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           color="red"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               <font>
+|                 size="4"
+|                 <font>
+|                   size="4"
+|                   <font>
+|                     size="4"
+|                     <font>
+|                       color="red"
+|     <p>
+|       <font>
+|         color="red"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               <font>
+|                 color="red"
+|                 "X"
+
+#data
+<p><font size=4><font size=4><font size=4><font size=4><p>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,58): unexpected-end-tag
+(1,59): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             "X"
+
+#data
+<p><font size=4><font size=4><font size=4><font size="5"><font size=4><p>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,73): unexpected-end-tag
+(1,74): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="5"
+|               <font>
+|                 size="4"
+|     <p>
+|       <font>
+|         size="4"
+|         <font>
+|           size="4"
+|           <font>
+|             size="5"
+|             <font>
+|               size="4"
+|               "X"
+
+#data
+<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,68): unexpected-end-tag
+(1,69): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <font>
+|         id="a"
+|         size="4"
+|         <font>
+|           id="b"
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|     <p>
+|       <font>
+|         id="a"
+|         size="4"
+|         <font>
+|           id="b"
+|           size="4"
+|           <font>
+|             size="4"
+|             <font>
+|               size="4"
+|               "X"
+
+#data
+<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,64): end-tag-too-early
+(1,67): unexpected-end-tag
+(1,68): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <b>
+|         id="a"
+|         <b>
+|           id="a"
+|           <b>
+|             id="a"
+|             <b>
+|               <object>
+|                 <b>
+|                   id="a"
+|                   <b>
+|                     id="a"
+|                     "X"
+|     <p>
+|       <b>
+|         id="a"
+|         <b>
+|           id="a"
+|           <b>
+|             id="a"
+|             <b>
+|               "Y"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests24.dat b/libs/html5lib/tests/testdata/tree-construction/tests24.dat
new file mode 100644
index 000000000..f6dc7eb48
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests24.dat
@@ -0,0 +1,79 @@
+#data
+<!DOCTYPE html>&NotEqualTilde;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "≂̸"
+
+#data
+<!DOCTYPE html>&NotEqualTilde;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "≂̸A"
+
+#data
+<!DOCTYPE html>&ThickSpace;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "âźâ€Š"
+
+#data
+<!DOCTYPE html>&ThickSpace;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "âźâ€ŠA"
+
+#data
+<!DOCTYPE html>&NotSubset;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "⊂â’"
+
+#data
+<!DOCTYPE html>&NotSubset;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "⊂â’A"
+
+#data
+<!DOCTYPE html>&Gopf;
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "𝔾"
+
+#data
+<!DOCTYPE html>&Gopf;A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "𝔾A"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests25.dat b/libs/html5lib/tests/testdata/tree-construction/tests25.dat
new file mode 100644
index 000000000..2bbf038f2
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests25.dat
@@ -0,0 +1,221 @@
+#data
+<!DOCTYPE html><body><foo>A
+#errors
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       "A"
+
+#data
+<!DOCTYPE html><body><area>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <area>
+|     "A"
+
+#data
+<!DOCTYPE html><body><base>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <base>
+|     "A"
+
+#data
+<!DOCTYPE html><body><basefont>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <basefont>
+|     "A"
+
+#data
+<!DOCTYPE html><body><bgsound>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <bgsound>
+|     "A"
+
+#data
+<!DOCTYPE html><body><br>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <br>
+|     "A"
+
+#data
+<!DOCTYPE html><body><col>A
+#errors
+(1,26): unexpected-start-tag-ignored
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+
+#data
+<!DOCTYPE html><body><command>A
+#errors
+eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <command>
+|       "A"
+
+#data
+<!DOCTYPE html><body><embed>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <embed>
+|     "A"
+
+#data
+<!DOCTYPE html><body><frame>A
+#errors
+(1,28): unexpected-start-tag-ignored
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "A"
+
+#data
+<!DOCTYPE html><body><hr>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <hr>
+|     "A"
+
+#data
+<!DOCTYPE html><body><img>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <img>
+|     "A"
+
+#data
+<!DOCTYPE html><body><input>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|     "A"
+
+#data
+<!DOCTYPE html><body><keygen>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <keygen>
+|     "A"
+
+#data
+<!DOCTYPE html><body><link>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <link>
+|     "A"
+
+#data
+<!DOCTYPE html><body><meta>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     "A"
+
+#data
+<!DOCTYPE html><body><param>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <param>
+|     "A"
+
+#data
+<!DOCTYPE html><body><source>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <source>
+|     "A"
+
+#data
+<!DOCTYPE html><body><track>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <track>
+|     "A"
+
+#data
+<!DOCTYPE html><body><wbr>A
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <wbr>
+|     "A"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests26.dat b/libs/html5lib/tests/testdata/tree-construction/tests26.dat
new file mode 100644
index 000000000..8964624a4
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests26.dat
@@ -0,0 +1,388 @@
+#data
+<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a>
+#errors
+(1,47): unexpected-start-tag-implies-end-tag
+(1,51): adoption-agency-1.3
+(1,74): unexpected-start-tag-implies-end-tag
+(1,74): adoption-agency-1.3
+(1,81): unexpected-start-tag-implies-end-tag
+(1,85): adoption-agency-1.3
+(1,108): unexpected-start-tag-implies-end-tag
+(1,108): adoption-agency-1.3
+(1,115): unexpected-start-tag-implies-end-tag
+(1,119): adoption-agency-1.3
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       href="#1"
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <nobr>
+|       <br>
+|       <a>
+|         href="#2"
+|     <a>
+|       href="#2"
+|       <nobr>
+|         "2"
+|       <nobr>
+|     <nobr>
+|       <br>
+|       <a>
+|         href="#3"
+|     <a>
+|       href="#3"
+|       <nobr>
+|         "3"
+|       <nobr>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3
+#errors
+(1,37): unexpected-start-tag-implies-end-tag
+(1,41): adoption-agency-1.3
+(1,50): unexpected-start-tag-implies-end-tag
+(1,50): adoption-agency-1.3
+(1,57): unexpected-start-tag-implies-end-tag
+(1,61): adoption-agency-1.3
+(1,62): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+|         "2"
+|       <nobr>
+|     <nobr>
+|       "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3
+#errors
+(1,44): foster-parenting-start-tag
+(1,48): foster-parenting-end-tag
+(1,48): adoption-agency-1.3
+(1,51): foster-parenting-start-tag
+(1,57): foster-parenting-start-tag
+(1,57): nobr-already-in-scope
+(1,57): adoption-agency-1.2
+(1,58): foster-parenting-character
+(1,64): foster-parenting-start-tag
+(1,64): nobr-already-in-scope
+(1,68): foster-parenting-end-tag
+(1,68): adoption-agency-1.2
+(1,69): foster-parenting-character
+(1,69): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <nobr>
+|           <i>
+|         <i>
+|           <nobr>
+|             "2"
+|           <nobr>
+|         <nobr>
+|           "3"
+|         <table>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3
+#errors
+(1,56): unexpected-end-tag
+(1,65): unexpected-start-tag-implies-end-tag
+(1,65): adoption-agency-1.3
+(1,72): unexpected-start-tag-implies-end-tag
+(1,76): adoption-agency-1.3
+(1,77): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <table>
+|           <tbody>
+|             <tr>
+|               <td>
+|                 <nobr>
+|                   <i>
+|                 <i>
+|                   <nobr>
+|                     "2"
+|                   <nobr>
+|                 <nobr>
+|                   "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3
+#errors
+(1,42): unexpected-start-tag-implies-end-tag
+(1,42): adoption-agency-1.3
+(1,46): adoption-agency-1.3
+(1,46): adoption-agency-1.3
+(1,55): unexpected-start-tag-implies-end-tag
+(1,55): adoption-agency-1.3
+(1,62): unexpected-start-tag-implies-end-tag
+(1,66): adoption-agency-1.3
+(1,67): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|     <div>
+|       <b>
+|         <nobr>
+|         <nobr>
+|       <nobr>
+|         <i>
+|       <i>
+|         <nobr>
+|           "2"
+|         <nobr>
+|       <nobr>
+|         "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3
+#errors
+(1,37): unexpected-start-tag-implies-end-tag
+(1,41): adoption-agency-1.3
+(1,55): unexpected-start-tag-implies-end-tag
+(1,55): adoption-agency-1.3
+(1,62): unexpected-start-tag-implies-end-tag
+(1,66): adoption-agency-1.3
+(1,67): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|     <div>
+|       <nobr>
+|         <i>
+|       <i>
+|         <nobr>
+|           "2"
+|         <nobr>
+|       <nobr>
+|         "3"
+
+#data
+<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>
+#errors
+(1,37): unexpected-start-tag-implies-end-tag
+(1,46): adoption-agency-1.3
+(1,55): unexpected-start-tag-implies-end-tag
+(1,55): adoption-agency-1.3
+(1,55): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|       <nobr>
+|         <ins>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+
+#data
+<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2
+#errors
+(1,42): unexpected-start-tag-implies-end-tag
+(1,42): adoption-agency-1.3
+(1,46): adoption-agency-1.3
+(1,50): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <nobr>
+|         "1"
+|         <ins>
+|       <nobr>
+|     <nobr>
+|       <i>
+|         "2"
+
+#data
+<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>
+#errors
+(1,35): adoption-agency-1.3
+(1,44): unexpected-start-tag-implies-end-tag
+(1,44): adoption-agency-1.3
+(1,49): adoption-agency-1.3
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "1"
+|       <nobr>
+|     <nobr>
+|       <i>
+|     <i>
+|       <nobr>
+|         "2"
+
+#data
+<p><code x</code></p>
+
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,11): invalid-character-in-attribute-name
+(1,12): unexpected-character-after-solidus-in-tag
+(1,21): unexpected-end-tag
+(2,0): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <code>
+|         code=""
+|         x<=""
+|     <code>
+|       code=""
+|       x<=""
+|       "
+"
+
+#data
+<!DOCTYPE html><svg><foreignObject><p><i></p>a
+#errors
+(1,45): unexpected-end-tag
+(1,46): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <p>
+|           <i>
+|         <i>
+|           "a"
+
+#data
+<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a
+#errors
+(1,60): unexpected-end-tag
+(1,61): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg foreignObject>
+|                 <p>
+|                   <i>
+|                 <i>
+|                   "a"
+
+#data
+<!DOCTYPE html><math><mtext><p><i></p>a
+#errors
+(1,38): unexpected-end-tag
+(1,39): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mtext>
+|         <p>
+|           <i>
+|         <i>
+|           "a"
+
+#data
+<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a
+#errors
+(1,53): unexpected-end-tag
+(1,54): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mtext>
+|                 <p>
+|                   <i>
+|                 <i>
+|                   "a"
+
+#data
+<!DOCTYPE html><body><div><!/div>a
+#errors
+(1,28): expected-dashes-or-doctype
+(1,34): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <!-- /div -->
+|       "a"
+
+#data
+<button><p><button>
+#errors
+Line 1 Col 8 Unexpected start tag (button). Expected DOCTYPE.
+Line 1 Col 19 Unexpected start tag (button) implies end tag (button).
+Line 1 Col 19 Expected closing tag. Unexpected end of file.
+#document
+| <html>
+|   <head>
+|   <body>
+|     <button>
+|       <p>
+|     <button>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests3.dat b/libs/html5lib/tests/testdata/tree-construction/tests3.dat
new file mode 100644
index 000000000..c7583d99e
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests3.dat
@@ -0,0 +1,305 @@
+#data
+<head></head><style></style>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,20): unexpected-start-tag-out-of-my-head
+#document
+| <html>
+|   <head>
+|     <style>
+|   <body>
+
+#data
+<head></head><script></script>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,21): unexpected-start-tag-out-of-my-head
+#document
+| <html>
+|   <head>
+|     <script>
+|   <body>
+
+#data
+<head></head><!-- --><style></style><!-- --><script></script>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,28): unexpected-start-tag-out-of-my-head
+(1,52): unexpected-start-tag-out-of-my-head
+#document
+| <html>
+|   <head>
+|     <style>
+|     <script>
+|   <!--   -->
+|   <!--   -->
+|   <body>
+
+#data
+<head></head><!-- -->x<style></style><!-- --><script></script>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <!--   -->
+|   <body>
+|     "x"
+|     <style>
+|     <!--   -->
+|     <script>
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+foo</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+
+foo</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "
+foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>
+foo
+</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "foo
+"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x</pre><span>
+</span></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x"
+|     <span>
+|       "
+"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x
+y</pre></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x
+y"
+
+#data
+<!DOCTYPE html><html><head></head><body><pre>x<div>
+y</pre></body></html>
+#errors
+(2,7): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "x"
+|       <div>
+|         "
+y"
+
+#data
+<!DOCTYPE html><pre>&#x0a;&#x0a;A</pre>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <pre>
+|       "
+A"
+
+#data
+<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML>
+#errors
+(1,33): two-heads-are-not-better-than-one
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <meta>
+|   <body>
+
+#data
+<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML>
+#errors
+(1,33): two-heads-are-not-better-than-one
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<textarea>foo<span>bar</span><i>baz
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,35): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "foo<span>bar</span><i>baz"
+
+#data
+<title>foo<span>bar</em><i>baz
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,30): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|     <title>
+|       "foo<span>bar</em><i>baz"
+|   <body>
+
+#data
+<!DOCTYPE html><textarea>
+</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+
+#data
+<!DOCTYPE html><textarea>
+foo</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "foo"
+
+#data
+<!DOCTYPE html><textarea>
+
+foo</textarea>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       "
+foo"
+
+#data
+<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html>
+#errors
+(1,60): end-tag-too-early
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <div>
+|           <p>
+|       <li>
+
+#data
+<!doctype html><nobr><nobr><nobr>
+#errors
+(1,27): unexpected-start-tag-implies-end-tag
+(1,33): unexpected-start-tag-implies-end-tag
+(1,33): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <nobr>
+|     <nobr>
+|     <nobr>
+
+#data
+<!doctype html><nobr><nobr></nobr><nobr>
+#errors
+(1,27): unexpected-start-tag-implies-end-tag
+(1,40): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <nobr>
+|     <nobr>
+|     <nobr>
+
+#data
+<!doctype html><html><body><p><table></table></body></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <table>
+
+#data
+<p><table></table>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <table>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests4.dat b/libs/html5lib/tests/testdata/tree-construction/tests4.dat
new file mode 100644
index 000000000..0a6174c36
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests4.dat
@@ -0,0 +1,58 @@
+#data
+direct div content
+#errors
+#document-fragment
+div
+#document
+| "direct div content"
+
+#data
+direct textarea content
+#errors
+#document-fragment
+textarea
+#document
+| "direct textarea content"
+
+#data
+textarea content with <em>pseudo</em> <foo>markup
+#errors
+#document-fragment
+textarea
+#document
+| "textarea content with <em>pseudo</em> <foo>markup"
+
+#data
+this is &#x0043;DATA inside a <style> element
+#errors
+#document-fragment
+style
+#document
+| "this is &#x0043;DATA inside a <style> element"
+
+#data
+</plaintext>
+#errors
+#document-fragment
+plaintext
+#document
+| "</plaintext>"
+
+#data
+setting html's innerHTML
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   "setting html's innerHTML"
+
+#data
+<title>setting head's innerHTML</title>
+#errors
+#document-fragment
+head
+#document
+| <title>
+|   "setting head's innerHTML"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests5.dat b/libs/html5lib/tests/testdata/tree-construction/tests5.dat
new file mode 100644
index 000000000..1ef8cae42
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests5.dat
@@ -0,0 +1,210 @@
+#data
+<style> <!-- </style>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!-- "
+|   <body>
+|     "x"
+
+#data
+<style> <!-- </style> --> </style>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,34): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<style> <!--> </style>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!--> "
+|   <body>
+|     "x"
+
+#data
+<style> <!---> </style>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!---> "
+|   <body>
+|     "x"
+
+#data
+<iframe> <!---> </iframe>x
+#errors
+(1,8): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       " <!---> "
+|     "x"
+
+#data
+<iframe> <!--- </iframe>->x</iframe> --> </iframe>x
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,36): unexpected-end-tag
+(1,50): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <iframe>
+|       " <!--- "
+|     "->x --> x"
+
+#data
+<script> <!-- </script> --> </script>x
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,37): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <script>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<title> <!-- </title> --> </title>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,34): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       " <!-- "
+|     " "
+|   <body>
+|     "--> x"
+
+#data
+<textarea> <!--- </textarea>->x</textarea> --> </textarea>x
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,42): unexpected-end-tag
+(1,58): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <textarea>
+|       " <!--- "
+|     "->x --> x"
+
+#data
+<style> <!</-- </style>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <style>
+|       " <!</-- "
+|   <body>
+|     "x"
+
+#data
+<p><xmp></xmp>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|     <xmp>
+
+#data
+<xmp> <!-- > --> </xmp>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <xmp>
+|       " <!-- > --> "
+
+#data
+<title>&amp;</title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "&"
+|   <body>
+
+#data
+<title><!--&amp;--></title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--&-->"
+|   <body>
+
+#data
+<title><!--</title>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|     <title>
+|       "<!--"
+|   <body>
+
+#data
+<noscript><!--</noscript>--></noscript>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,39): unexpected-end-tag
+#script-on
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       "<!--"
+|   <body>
+|     "-->"
+
+#data
+<noscript><!--</noscript>--></noscript>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#script-off
+#document
+| <html>
+|   <head>
+|     <noscript>
+|       <!-- </noscript> -->
+|   <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests6.dat b/libs/html5lib/tests/testdata/tree-construction/tests6.dat
new file mode 100644
index 000000000..d774fc234
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests6.dat
@@ -0,0 +1,659 @@
+#data
+<!doctype html></head> <head>
+#errors
+(1,29): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   " "
+|   <body>
+
+#data
+<!doctype html><form><div></form><div>
+#errors
+(1,33): end-tag-too-early-ignored
+(1,38): expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <form>
+|       <div>
+|         <div>
+
+#data
+<!doctype html><title>&amp;</title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "&"
+|   <body>
+
+#data
+<!doctype html><title><!--&amp;--></title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "<!--&-->"
+|   <body>
+
+#data
+<!doctype>
+#errors
+(1,9): need-space-after-doctype
+(1,10): expected-doctype-name-but-got-right-bracket
+(1,10): unknown-doctype
+#document
+| <!DOCTYPE >
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!---x
+#errors
+(1,6): eof-in-comment
+(1,6): expected-doctype-but-got-eof
+#document
+| <!-- -x -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>
+<div>
+#errors
+(1,6): unexpected-start-tag
+(2,5): expected-closing-tag-but-got-eof
+#document-fragment
+div
+#document
+| "
+"
+| <div>
+
+#data
+<frameset></frameset>
+foo
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(2,1): unexpected-char-after-frameset
+(2,2): unexpected-char-after-frameset
+(2,3): unexpected-char-after-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+<noframes>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(2,10): expected-named-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+|   <noframes>
+
+#data
+<frameset></frameset>
+<div>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(2,5): unexpected-start-tag-after-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+</html>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<frameset></frameset>
+</div>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(2,6): unexpected-end-tag-after-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   "
+"
+
+#data
+<form><form>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,12): unexpected-start-tag
+(1,12): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <form>
+
+#data
+<button><button>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,16): unexpected-start-tag-implies-end-tag
+(1,16): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <button>
+|     <button>
+
+#data
+<table><tr><td></th>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,20): unexpected-end-tag
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><caption><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,20): unexpected-cell-in-table-body
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><caption><div>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+</caption><div>
+#errors
+(1,10): XXX-undefined-error
+(1,15): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <div>
+
+#data
+<table><caption><div></caption>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,31): expected-one-end-tag-but-got-another
+(1,31): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+<table><caption></table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+
+#data
+</table><div>
+#errors
+(1,8): unexpected-end-tag
+(1,13): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <div>
+
+#data
+<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,23): unexpected-end-tag
+(1,29): unexpected-end-tag
+(1,40): unexpected-end-tag
+(1,47): unexpected-end-tag
+(1,55): unexpected-end-tag
+(1,60): unexpected-end-tag
+(1,68): unexpected-end-tag
+(1,73): unexpected-end-tag
+(1,81): unexpected-end-tag
+(1,86): unexpected-end-tag
+(1,86): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+
+#data
+<table><caption><div></div>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <div>
+
+#data
+<table><tr><td></body></caption></col></colgroup></html>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,22): unexpected-end-tag
+(1,32): unexpected-end-tag
+(1,38): unexpected-end-tag
+(1,49): unexpected-end-tag
+(1,56): unexpected-end-tag
+(1,56): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+</table></tbody></tfoot></thead></tr><div>
+#errors
+(1,8): unexpected-end-tag
+(1,16): unexpected-end-tag
+(1,24): unexpected-end-tag
+(1,32): unexpected-end-tag
+(1,37): unexpected-end-tag
+(1,42): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <div>
+
+#data
+<table><colgroup>foo
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,18): foster-parenting-character-in-table
+(1,19): foster-parenting-character-in-table
+(1,20): foster-parenting-character-in-table
+(1,20): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     "foo"
+|     <table>
+|       <colgroup>
+
+#data
+foo<col>
+#errors
+(1,1): unexpected-character-in-colgroup
+(1,2): unexpected-character-in-colgroup
+(1,3): unexpected-character-in-colgroup
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<table><colgroup></col>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,23): no-end-tag
+(1,23): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <colgroup>
+
+#data
+<frameset><div>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,15): unexpected-start-tag-in-frameset
+(1,15): eof-in-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</frameset><frame>
+#errors
+(1,11): unexpected-frameset-in-frameset-innerhtml
+#document-fragment
+frameset
+#document
+| <frame>
+
+#data
+<frameset></div>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+(1,16): unexpected-end-tag-in-frameset
+(1,16): eof-in-frameset
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</body><div>
+#errors
+(1,7): unexpected-close-tag
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+body
+#document
+| <div>
+
+#data
+<table><tr><div>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,16): unexpected-start-tag-implies-table-voodoo
+(1,16): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+</tr><td>
+#errors
+(1,5): unexpected-end-tag
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+</tbody></tfoot></thead><td>
+#errors
+(1,8): unexpected-end-tag
+(1,16): unexpected-end-tag
+(1,24): unexpected-end-tag
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<table><tr><div><td>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,16): foster-parenting-start-tag
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<caption><col><colgroup><tbody><tfoot><thead><tr>
+#errors
+(1,9): unexpected-start-tag
+(1,14): unexpected-start-tag
+(1,24): unexpected-start-tag
+(1,31): unexpected-start-tag
+(1,38): unexpected-start-tag
+(1,45): unexpected-start-tag
+#document-fragment
+tbody
+#document
+| <tr>
+
+#data
+<table><tbody></thead>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,22): unexpected-end-tag-in-table-body
+(1,22): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+</table><tr>
+#errors
+(1,8): unexpected-end-tag
+#document-fragment
+tbody
+#document
+| <tr>
+
+#data
+<table><tbody></body></caption></col></colgroup></html></td></th></tr>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,21): unexpected-end-tag-in-table-body
+(1,31): unexpected-end-tag-in-table-body
+(1,37): unexpected-end-tag-in-table-body
+(1,48): unexpected-end-tag-in-table-body
+(1,55): unexpected-end-tag-in-table-body
+(1,60): unexpected-end-tag-in-table-body
+(1,65): unexpected-end-tag-in-table-body
+(1,70): unexpected-end-tag-in-table-body
+(1,70): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+<table><tbody></div>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,20): unexpected-end-tag-implies-table-voodoo
+(1,20): end-tag-too-early
+(1,20): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+
+#data
+<table><table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,14): unexpected-start-tag-implies-end-tag
+(1,14): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|     <table>
+
+#data
+<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,14): unexpected-end-tag
+(1,24): unexpected-end-tag
+(1,30): unexpected-end-tag
+(1,41): unexpected-end-tag
+(1,48): unexpected-end-tag
+(1,56): unexpected-end-tag
+(1,61): unexpected-end-tag
+(1,69): unexpected-end-tag
+(1,74): unexpected-end-tag
+(1,82): unexpected-end-tag
+(1,87): unexpected-end-tag
+(1,87): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+
+#data
+</table><tr>
+#errors
+(1,8): unexpected-end-tag
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+<body></body></html>
+#errors
+(1,20): unexpected-end-tag-after-body-innerhtml
+#document-fragment
+html
+#document
+| <head>
+| <body>
+
+#data
+<html><frameset></frameset></html> 
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+|   " "
+
+#data
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"><html></html>
+#errors
+#document
+| <!DOCTYPE html "-//W3C//DTD HTML 4.01//EN" "">
+| <html>
+|   <head>
+|   <body>
+
+#data
+<param><frameset></frameset>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,17): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<source><frameset></frameset>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,18): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<track><frameset></frameset>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,17): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</html><frameset></frameset>
+#errors
+(1,7): expected-doctype-but-got-end-tag
+(1,17): expected-eof-but-got-start-tag
+(1,17): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+</body><frameset></frameset>
+#errors
+(1,7): expected-doctype-but-got-end-tag
+(1,17): unexpected-start-tag-after-body
+(1,17): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests7.dat b/libs/html5lib/tests/testdata/tree-construction/tests7.dat
new file mode 100644
index 000000000..395dc72bd
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests7.dat
@@ -0,0 +1,418 @@
+#data
+<!doctype html><body><title>X</title>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+
+#data
+<!doctype html><table><title>X</title></table>
+#errors
+(1,29): unexpected-start-tag-implies-table-voodoo
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <title>
+|       "X"
+|     <table>
+
+#data
+<!doctype html><head></head><title>X</title>
+#errors
+(1,35): unexpected-start-tag-out-of-my-head
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "X"
+|   <body>
+
+#data
+<!doctype html></head><title>X</title>
+#errors
+(1,29): unexpected-start-tag-out-of-my-head
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|     <title>
+|       "X"
+|   <body>
+
+#data
+<!doctype html><table><meta></table>
+#errors
+(1,28): unexpected-start-tag-implies-table-voodoo
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <meta>
+|     <table>
+
+#data
+<!doctype html><table>X<tr><td><table> <meta></table></table>
+#errors
+unexpected text in table
+(1,45): unexpected-start-tag-implies-table-voodoo
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <meta>
+|             <table>
+|               " "
+
+#data
+<!doctype html><html> <head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html> <head>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!doctype html><table><style> <tr>x </style> </table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <style>
+|         " <tr>x "
+|       " "
+
+#data
+<!doctype html><table><TBODY><script> <tr>x </script> </table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <script>
+|           " <tr>x "
+|         " "
+
+#data
+<!doctype html><p><applet><p>X</p></applet>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <applet>
+|         <p>
+|           "X"
+
+#data
+<!doctype html><p><object type="application/x-non-existant-plugin"><p>X</p></object>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <object>
+|         type="application/x-non-existant-plugin"
+|         <p>
+|           "X"
+
+#data
+<!doctype html><listing>
+X</listing>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <listing>
+|       "X"
+
+#data
+<!doctype html><select><input>X
+#errors
+(1,30): unexpected-input-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <input>
+|     "X"
+
+#data
+<!doctype html><select><select>X
+#errors
+(1,31): unexpected-select-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     "X"
+
+#data
+<!doctype html><table><input type=hidDEN></table>
+#errors
+(1,41): unexpected-hidden-input-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>X<input type=hidDEN></table>
+#errors
+(1,23): foster-parenting-character
+(1,42): unexpected-hidden-input-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     "X"
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>  <input type=hidDEN></table>
+#errors
+(1,43): unexpected-hidden-input-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table>  <input type='hidDEN'></table>
+#errors
+(1,45): unexpected-hidden-input-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       "  "
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table><input type=" hidden"><input type=hidDEN></table>
+#errors
+(1,44): unexpected-start-tag-implies-table-voodoo
+(1,63): unexpected-hidden-input-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|       type=" hidden"
+|     <table>
+|       <input>
+|         type="hidDEN"
+
+#data
+<!doctype html><table><select>X<tr>
+#errors
+(1,30): unexpected-start-tag-implies-table-voodoo
+(1,35): unexpected-table-element-start-tag-in-select-in-table
+(1,35): eof-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "X"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!doctype html><select>X</select>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "X"
+
+#data
+<!DOCTYPE hTmL><html></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<!DOCTYPE HTML><html></html>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+
+#data
+<body>X</body></body>
+#errors
+(1,21): unexpected-end-tag-after-body
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   "X"
+
+#data
+<div><p>a</x> b
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,13): unexpected-end-tag
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <p>
+|         "a b"
+
+#data
+<table><tr><td><code></code> </table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <code>
+|             " "
+
+#data
+<table><b><tr><td>aaa</td></tr>bbb</table>ccc
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,10): foster-parenting-start-tag
+(1,32): foster-parenting-character
+(1,33): foster-parenting-character
+(1,34): foster-parenting-character
+(1,45): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <b>
+|       "bbb"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "aaa"
+|     <b>
+|       "ccc"
+
+#data
+A<table><tr> B</tr> B</table>
+#errors
+(1,1): expected-doctype-but-got-chars
+(1,13): foster-parenting-character
+(1,14): foster-parenting-character
+(1,20): foster-parenting-character
+(1,21): foster-parenting-character
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A B B"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+A<table><tr> B</tr> </em>C</table>
+#errors
+(1,1): expected-doctype-but-got-chars
+(1,13): foster-parenting-character
+(1,14): foster-parenting-character
+(1,20): foster-parenting-character
+(1,25): unexpected-end-tag
+(1,25): unexpected-end-tag-in-special-element
+(1,26): foster-parenting-character
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A BC"
+|     <table>
+|       <tbody>
+|         <tr>
+|         " "
+
+#data
+<select><keygen>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,16): unexpected-input-in-select
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|     <keygen>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests8.dat b/libs/html5lib/tests/testdata/tree-construction/tests8.dat
new file mode 100644
index 000000000..33dd96d33
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests8.dat
@@ -0,0 +1,151 @@
+#data
+<div>
+<div></div>
+</span>x
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(3,7): unexpected-end-tag
+(3,8): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "
+"
+|       <div>
+|       "
+x"
+
+#data
+<div>x<div></div>
+</span>x
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(2,7): unexpected-end-tag
+(2,8): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "
+x"
+
+#data
+<div>x<div></div>x</span>x
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,25): unexpected-end-tag
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "xx"
+
+#data
+<div>x<div></div>y</span>z
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,25): unexpected-end-tag
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "yz"
+
+#data
+<table><div>x<div></div>x</span>x
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,12): foster-parenting-start-tag
+(1,13): foster-parenting-character
+(1,18): foster-parenting-start-tag
+(1,24): foster-parenting-end-tag
+(1,25): foster-parenting-start-tag
+(1,32): foster-parenting-end-tag
+(1,32): unexpected-end-tag
+(1,33): foster-parenting-character
+(1,33): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "x"
+|       <div>
+|       "xx"
+|     <table>
+
+#data
+x<table>x
+#errors
+(1,1): expected-doctype-but-got-chars
+(1,9): foster-parenting-character
+(1,9): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     "xx"
+|     <table>
+
+#data
+x<table><table>x
+#errors
+(1,1): expected-doctype-but-got-chars
+(1,15): unexpected-start-tag-implies-end-tag
+(1,16): foster-parenting-character
+(1,16): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <table>
+|     "x"
+|     <table>
+
+#data
+<b>a<div></div><div></b>y
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,24): adoption-agency-1.3
+(1,25): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       "a"
+|       <div>
+|     <div>
+|       <b>
+|       "y"
+
+#data
+<a><div><p></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,15): adoption-agency-1.3
+(1,15): adoption-agency-1.3
+(1,15): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <div>
+|       <a>
+|       <p>
+|         <a>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests9.dat b/libs/html5lib/tests/testdata/tree-construction/tests9.dat
new file mode 100644
index 000000000..f8d04b23b
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests9.dat
@@ -0,0 +1,472 @@
+#data
+<!DOCTYPE html><math></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!DOCTYPE html><body><math></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+
+#data
+<!DOCTYPE html><math><mi>
+#errors
+(1,25) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+
+#data
+<!DOCTYPE html><math><annotation-xml><svg><u>
+#errors
+(1,45) unexpected-html-element-in-foreign-content
+(1,45) expected-closing-tag-but-got-eof
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math annotation-xml>
+|         <svg svg>
+|     <u>
+
+#data
+<!DOCTYPE html><body><select><math></math></select>
+#errors
+(1,35) unexpected-start-tag-in-select
+(1,42) unexpected-end-tag-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+
+#data
+<!DOCTYPE html><body><select><option><math></math></option></select>
+#errors
+(1,43) unexpected-start-tag-in-select
+(1,50) unexpected-end-tag-in-select
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+
+#data
+<!DOCTYPE html><body><table><math></math></table>
+#errors
+(1,34) unexpected-start-tag-implies-table-voodoo
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><math><mi>foo</mi></math></table>
+#errors
+(1,34) foster-parenting-start-token
+(1,39) foster-parenting-character
+(1,40) foster-parenting-character
+(1,41) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table>
+#errors
+(1,34) foster-parenting-start-tag
+(1,39) foster-parenting-character
+(1,40) foster-parenting-character
+(1,41) foster-parenting-character
+(1,51) foster-parenting-character
+(1,52) foster-parenting-character
+(1,53) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+
+#data
+<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table>
+#errors
+(1,41) foster-parenting-start-tag
+(1,46) foster-parenting-character
+(1,47) foster-parenting-character
+(1,48) foster-parenting-character
+(1,58) foster-parenting-character
+(1,59) foster-parenting-character
+(1,60) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+|       <tbody>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table>
+#errors
+(1,45) foster-parenting-start-tag
+(1,50) foster-parenting-character
+(1,51) foster-parenting-character
+(1,52) foster-parenting-character
+(1,62) foster-parenting-character
+(1,63) foster-parenting-character
+(1,64) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mi>
+|                 "foo"
+|               <math mi>
+|                 "bar"
+
+#data
+<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <math math>
+|               <math mi>
+|                 "foo"
+|               <math mi>
+|                 "bar"
+|             <p>
+|               "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|         <p>
+|           "baz"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+(1,70) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|         <p>
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux
+#errors
+(1,78) unexpected-end-tag
+(1,78) expected-one-end-tag-but-got-another
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <caption>
+|         <math math>
+|           <math mi>
+|             "foo"
+|           <math mi>
+|             "bar"
+|           "baz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+(1,44) foster-parenting-start-tag
+(1,49) foster-parenting-character
+(1,50) foster-parenting-character
+(1,51) foster-parenting-character
+(1,61) foster-parenting-character
+(1,62) foster-parenting-character
+(1,63) foster-parenting-character
+(1,71) unexpected-html-element-in-foreign-content
+(1,71) foster-parenting-start-tag
+(1,63) foster-parenting-character
+(1,63) foster-parenting-character
+(1,63) foster-parenting-character
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+|     <table>
+|       <colgroup>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+(1,50) unexpected-start-tag-in-select
+(1,54) unexpected-start-tag-in-select
+(1,62) unexpected-end-tag-in-select
+(1,66) unexpected-start-tag-in-select
+(1,74) unexpected-end-tag-in-select
+(1,77) unexpected-start-tag-in-select
+(1,88) unexpected-table-element-end-tag-in-select-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <select>
+|               "foobarbaz"
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux
+#errors
+(1,36) unexpected-start-tag-implies-table-voodoo
+(1,42) unexpected-start-tag-in-select
+(1,46) unexpected-start-tag-in-select
+(1,54) unexpected-end-tag-in-select
+(1,58) unexpected-start-tag-in-select
+(1,66) unexpected-end-tag-in-select
+(1,69) unexpected-start-tag-in-select
+(1,80) unexpected-table-element-end-tag-in-select-in-table
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       "foobarbaz"
+|     <table>
+|     <p>
+|       "quux"
+
+#data
+<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz
+#errors
+(1,41) expected-eof-but-got-start-tag
+(1,68) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz
+#errors
+(1,34) unexpected-start-tag-after-body
+(1,61) unexpected-html-element-in-foreign-content
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mi>
+|         "foo"
+|       <math mi>
+|         "bar"
+|     <p>
+|       "baz"
+
+#data
+<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span>
+#errors
+(1,31) unexpected-start-tag-in-frameset
+(1,35) unexpected-start-tag-in-frameset
+(1,40) unexpected-end-tag-in-frameset
+(1,44) unexpected-start-tag-in-frameset
+(1,49) unexpected-end-tag-in-frameset
+(1,52) unexpected-start-tag-in-frameset
+(1,58) unexpected-start-tag-in-frameset
+(1,58) eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span>
+#errors
+(1,42) unexpected-start-tag-after-frameset
+(1,46) unexpected-start-tag-after-frameset
+(1,51) unexpected-end-tag-after-frameset
+(1,55) unexpected-start-tag-after-frameset
+(1,60) unexpected-end-tag-after-frameset
+(1,63) unexpected-start-tag-after-frameset
+(1,69) unexpected-start-tag-after-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     <math math>
+|       xlink href="foo"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+
+#data
+<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math>
+#errors
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     xlink:href="foo"
+|     xml:lang="en"
+|     <math math>
+|       <math mi>
+|         xlink href="foo"
+|         xml lang="en"
+|       "bar"
diff --git a/libs/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat b/libs/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat
new file mode 100644
index 000000000..54f436848
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tests_innerHTML_1.dat
@@ -0,0 +1,887 @@
+#data
+<body><span>
+#errors
+(1,6): unexpected-start-tag
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><body>
+#errors
+(1,12): unexpected-start-tag
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><body>
+#errors
+(1,12): unexpected-start-tag
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+div
+#document
+| <span>
+
+#data
+<body><span>
+#errors
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+html
+#document
+| <head>
+| <body>
+|   <span>
+
+#data
+<frameset><span>
+#errors
+(1,10): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><frameset>
+#errors
+(1,16): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+body
+#document
+| <span>
+
+#data
+<span><frameset>
+#errors
+(1,16): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+div
+#document
+| <span>
+
+#data
+<frameset><span>
+#errors
+(1,16): unexpected-start-tag-in-frameset
+(1,16): eof-in-frameset
+#document-fragment
+html
+#document
+| <head>
+| <frameset>
+
+#data
+<table><tr>
+#errors
+(1,7): unexpected-start-tag
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+</table><tr>
+#errors
+(1,8): unexpected-end-tag
+#document-fragment
+table
+#document
+| <tbody>
+|   <tr>
+
+#data
+<a>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,3): eof-in-table
+#document-fragment
+table
+#document
+| <a>
+
+#data
+<a>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,3): eof-in-table
+#document-fragment
+table
+#document
+| <a>
+
+#data
+<a><caption>a
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,13): expected-closing-tag-but-got-eof
+#document-fragment
+table
+#document
+| <a>
+| <caption>
+|   "a"
+
+#data
+<a><colgroup><col>
+#errors
+(1,3): foster-parenting-start-token
+(1,18): expected-closing-tag-but-got-eof
+#document-fragment
+table
+#document
+| <a>
+| <colgroup>
+|   <col>
+
+#data
+<a><tbody><tr>
+#errors
+(1,3): foster-parenting-start-tag
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+
+#data
+<a><tfoot><tr>
+#errors
+(1,3): foster-parenting-start-tag
+#document-fragment
+table
+#document
+| <a>
+| <tfoot>
+|   <tr>
+
+#data
+<a><thead><tr>
+#errors
+(1,3): foster-parenting-start-tag
+#document-fragment
+table
+#document
+| <a>
+| <thead>
+|   <tr>
+
+#data
+<a><tr>
+#errors
+(1,3): foster-parenting-start-tag
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+
+#data
+<a><th>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,7): unexpected-cell-in-table-body
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+|     <th>
+
+#data
+<a><td>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,7): unexpected-cell-in-table-body
+#document-fragment
+table
+#document
+| <a>
+| <tbody>
+|   <tr>
+|     <td>
+
+#data
+<table></table><tbody>
+#errors
+(1,22): unexpected-start-tag
+#document-fragment
+caption
+#document
+| <table>
+
+#data
+</table><span>
+#errors
+(1,8): unexpected-end-tag
+(1,14): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+<span></table>
+#errors
+(1,14): unexpected-end-tag
+(1,14): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+</caption><span>
+#errors
+(1,10): XXX-undefined-error
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+
+#data
+<span></caption><span>
+#errors
+(1,16): XXX-undefined-error
+(1,22): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><caption><span>
+#errors
+(1,15): unexpected-start-tag
+(1,21): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><col><span>
+#errors
+(1,11): unexpected-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><colgroup><span>
+#errors
+(1,16): unexpected-start-tag
+(1,22): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><html><span>
+#errors
+(1,12): non-html-root
+(1,18): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tbody><span>
+#errors
+(1,13): unexpected-start-tag
+(1,19): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><td><span>
+#errors
+(1,10): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tfoot><span>
+#errors
+(1,13): unexpected-start-tag
+(1,19): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><thead><span>
+#errors
+(1,13): unexpected-start-tag
+(1,19): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><th><span>
+#errors
+(1,10): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span><tr><span>
+#errors
+(1,10): unexpected-start-tag
+(1,16): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+<span></table><span>
+#errors
+(1,14): unexpected-end-tag
+(1,20): expected-closing-tag-but-got-eof
+#document-fragment
+caption
+#document
+| <span>
+|   <span>
+
+#data
+</colgroup><col>
+#errors
+(1,11): XXX-undefined-error
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<a><col>
+#errors
+(1,3): XXX-undefined-error
+#document-fragment
+colgroup
+#document
+| <col>
+
+#data
+<caption><a>
+#errors
+(1,9): XXX-undefined-error
+(1,12): unexpected-start-tag-implies-table-voodoo
+(1,12): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<col><a>
+#errors
+(1,5): XXX-undefined-error
+(1,8): unexpected-start-tag-implies-table-voodoo
+(1,8): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<colgroup><a>
+#errors
+(1,10): XXX-undefined-error
+(1,13): unexpected-start-tag-implies-table-voodoo
+(1,13): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<tbody><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): unexpected-start-tag-implies-table-voodoo
+(1,10): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<tfoot><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): unexpected-start-tag-implies-table-voodoo
+(1,10): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<thead><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): unexpected-start-tag-implies-table-voodoo
+(1,10): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+</table><a>
+#errors
+(1,8): XXX-undefined-error
+(1,11): unexpected-start-tag-implies-table-voodoo
+(1,11): eof-in-table
+#document-fragment
+tbody
+#document
+| <a>
+
+#data
+<a><tr>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+
+#data
+<a><td>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,7): unexpected-cell-in-table-body
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<a><td>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,7): unexpected-cell-in-table-body
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<a><td>
+#errors
+(1,3): unexpected-start-tag-implies-table-voodoo
+(1,7): unexpected-cell-in-table-body
+#document-fragment
+tbody
+#document
+| <a>
+| <tr>
+|   <td>
+
+#data
+<td><table><tbody><a><tr>
+#errors
+(1,4): unexpected-cell-in-table-body
+(1,21): unexpected-start-tag-implies-table-voodoo
+(1,25): eof-in-table
+#document-fragment
+tbody
+#document
+| <tr>
+|   <td>
+|     <a>
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+</tr><td>
+#errors
+(1,5): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<td><table><a><tr></tr><tr>
+#errors
+(1,14): unexpected-start-tag-implies-table-voodoo
+(1,27): eof-in-table
+#document-fragment
+tr
+#document
+| <td>
+|   <a>
+|   <table>
+|     <tbody>
+|       <tr>
+|       <tr>
+
+#data
+<caption><td>
+#errors
+(1,9): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<col><td>
+#errors
+(1,5): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<colgroup><td>
+#errors
+(1,10): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tbody><td>
+#errors
+(1,7): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tfoot><td>
+#errors
+(1,7): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<thead><td>
+#errors
+(1,7): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<tr><td>
+#errors
+(1,4): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+</table><td>
+#errors
+(1,8): XXX-undefined-error
+#document-fragment
+tr
+#document
+| <td>
+
+#data
+<td><table></table><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+|   <table>
+| <td>
+
+#data
+<td><table></table><td>
+#errors
+#document-fragment
+tr
+#document
+| <td>
+|   <table>
+| <td>
+
+#data
+<caption><a>
+#errors
+(1,9): XXX-undefined-error
+(1,12): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<col><a>
+#errors
+(1,5): XXX-undefined-error
+(1,8): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<colgroup><a>
+#errors
+(1,10): XXX-undefined-error
+(1,13): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tbody><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tfoot><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<th><a>
+#errors
+(1,4): XXX-undefined-error
+(1,7): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<thead><a>
+#errors
+(1,7): XXX-undefined-error
+(1,10): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<tr><a>
+#errors
+(1,4): XXX-undefined-error
+(1,7): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</table><a>
+#errors
+(1,8): XXX-undefined-error
+(1,11): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tbody><a>
+#errors
+(1,8): XXX-undefined-error
+(1,11): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</td><a>
+#errors
+(1,5): unexpected-end-tag
+(1,8): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tfoot><a>
+#errors
+(1,8): XXX-undefined-error
+(1,11): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</thead><a>
+#errors
+(1,8): XXX-undefined-error
+(1,11): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</th><a>
+#errors
+(1,5): unexpected-end-tag
+(1,8): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+</tr><a>
+#errors
+(1,5): XXX-undefined-error
+(1,8): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <a>
+
+#data
+<table><td><td>
+#errors
+(1,11): unexpected-cell-in-table-body
+(1,15): expected-closing-tag-but-got-eof
+#document-fragment
+td
+#document
+| <table>
+|   <tbody>
+|     <tr>
+|       <td>
+|       <td>
+
+#data
+</select><option>
+#errors
+(1,9): XXX-undefined-error
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<input><option>
+#errors
+(1,7): unexpected-input-in-select
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<keygen><option>
+#errors
+(1,8): unexpected-input-in-select
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<textarea><option>
+#errors
+(1,10): unexpected-input-in-select
+#document-fragment
+select
+#document
+| <option>
+
+#data
+</html><!--abc-->
+#errors
+(1,7): unexpected-end-tag-after-body-innerhtml
+#document-fragment
+html
+#document
+| <head>
+| <body>
+| <!-- abc -->
+
+#data
+</frameset><frame>
+#errors
+(1,11): unexpected-frameset-in-frameset-innerhtml
+#document-fragment
+frameset
+#document
+| <frame>
+
+#data
+#errors
+#document-fragment
+html
+#document
+| <head>
+| <body>
diff --git a/libs/html5lib/tests/testdata/tree-construction/tricky01.dat b/libs/html5lib/tests/testdata/tree-construction/tricky01.dat
new file mode 100644
index 000000000..753502a26
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/tricky01.dat
@@ -0,0 +1,336 @@
+#data
+<b><p>Bold </b> Not bold</p>
+Also not bold.
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,15): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|     <p>
+|       <b>
+|         "Bold "
+|       " Not bold"
+|     "
+Also not bold."
+
+#data
+<html>
+<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain
+<p>I should not be red. <font color=red>Red. <i>Italic and red.</p>
+<p>Italic and red. </i> Red.</font> I should not be red.</p>
+<b>Bold <i>Bold and italic</b> Only Italic </i> Plain
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(2,58): adoption-agency-1.3
+(3,67): unexpected-end-tag
+(4,23): adoption-agency-1.3
+(4,35): adoption-agency-1.3
+(5,30): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       color="red"
+|       <i>
+|         "Italic and Red"
+|     <i>
+|       <p>
+|         <font>
+|           color="red"
+|           "Italic and Red "
+|         " Just italic."
+|       " Italic only."
+|     " Plain
+"
+|     <p>
+|       "I should not be red. "
+|       <font>
+|         color="red"
+|         "Red. "
+|         <i>
+|           "Italic and red."
+|     <font>
+|       color="red"
+|       <i>
+|         "
+"
+|     <p>
+|       <font>
+|         color="red"
+|         <i>
+|           "Italic and red. "
+|         " Red."
+|       " I should not be red."
+|     "
+"
+|     <b>
+|       "Bold "
+|       <i>
+|         "Bold and italic"
+|     <i>
+|       " Only Italic "
+|     " Plain"
+
+#data
+<html><body>
+<p><font size="7">First paragraph.</p>
+<p>Second paragraph.</p></font>
+<b><p><i>Bold and Italic</b> Italic</p>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(2,38): unexpected-end-tag
+(4,28): adoption-agency-1.3
+(4,28): adoption-agency-1.3
+(4,39): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <p>
+|       <font>
+|         size="7"
+|         "First paragraph."
+|     <font>
+|       size="7"
+|       "
+"
+|       <p>
+|         "Second paragraph."
+|     "
+"
+|     <b>
+|     <p>
+|       <b>
+|         <i>
+|           "Bold and Italic"
+|       <i>
+|         " Italic"
+
+#data
+<html>
+<dl>
+<dt><b>Boo
+<dd>Goo?
+</dl>
+</html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(4,4): end-tag-too-early
+(5,5): end-tag-too-early
+(6,7): expected-one-end-tag-but-got-another
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dl>
+|       "
+"
+|       <dt>
+|         <b>
+|           "Boo
+"
+|       <dd>
+|         <b>
+|           "Goo?
+"
+|     <b>
+|       "
+"
+
+#data
+<html><body>
+<label><a><div>Hello<div>World</div></a></label>  
+</body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(2,40): adoption-agency-1.3
+(2,48): unexpected-end-tag
+(3,7): expected-one-end-tag-but-got-another
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <label>
+|       <a>
+|       <div>
+|         <a>
+|           "Hello"
+|           <div>
+|             "World"
+|         "  
+"
+
+#data
+<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table>
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,15): foster-parenting-start-tag
+(1,16): foster-parenting-character
+(1,22): foster-parenting-start-tag
+(1,23): foster-parenting-character
+(1,32): foster-parenting-end-tag
+(1,32): end-tag-too-early
+(1,33): foster-parenting-character
+(1,38): foster-parenting-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <center>
+|       " "
+|       <font>
+|         "a"
+|     <font>
+|       <img>
+|       " "
+|     <table>
+|       " "
+|       <tbody>
+|         <tr>
+|           <td>
+|             " "
+|           " "
+|         " "
+
+#data
+<table><tr><p><a><p>You should see this text.
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,14): unexpected-start-tag-implies-table-voodoo
+(1,17): unexpected-start-tag-implies-table-voodoo
+(1,20): unexpected-start-tag-implies-table-voodoo
+(1,20): closing-non-current-p-element
+(1,21): foster-parenting-character
+(1,22): foster-parenting-character
+(1,23): foster-parenting-character
+(1,24): foster-parenting-character
+(1,25): foster-parenting-character
+(1,26): foster-parenting-character
+(1,27): foster-parenting-character
+(1,28): foster-parenting-character
+(1,29): foster-parenting-character
+(1,30): foster-parenting-character
+(1,31): foster-parenting-character
+(1,32): foster-parenting-character
+(1,33): foster-parenting-character
+(1,34): foster-parenting-character
+(1,35): foster-parenting-character
+(1,36): foster-parenting-character
+(1,37): foster-parenting-character
+(1,38): foster-parenting-character
+(1,39): foster-parenting-character
+(1,40): foster-parenting-character
+(1,41): foster-parenting-character
+(1,42): foster-parenting-character
+(1,43): foster-parenting-character
+(1,44): foster-parenting-character
+(1,45): foster-parenting-character
+(1,45): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       <a>
+|     <p>
+|       <a>
+|         "You should see this text."
+|     <table>
+|       <tbody>
+|         <tr>
+
+#data
+<TABLE>
+<TR>
+<CENTER><CENTER><TD></TD></TR><TR>
+<FONT>
+<TABLE><tr></tr></TABLE>
+</P>
+<a></font><font></a>
+This page contains an insanely badly-nested tag sequence.
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(3,8): unexpected-start-tag-implies-table-voodoo
+(3,16): unexpected-start-tag-implies-table-voodoo
+(4,6): unexpected-start-tag-implies-table-voodoo
+(4,6): unexpected character token in table (the newline)
+(5,7): unexpected-start-tag-implies-end-tag
+(6,4): unexpected p end tag
+(7,10): adoption-agency-1.3
+(7,20): adoption-agency-1.3
+(8,57): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <center>
+|       <center>
+|     <font>
+|       "
+"
+|     <table>
+|       "
+"
+|       <tbody>
+|         <tr>
+|           "
+"
+|           <td>
+|         <tr>
+|           "
+"
+|     <table>
+|       <tbody>
+|         <tr>
+|     <font>
+|       "
+"
+|       <p>
+|       "
+"
+|       <a>
+|     <a>
+|       <font>
+|     <font>
+|       "
+This page contains an insanely badly-nested tag sequence."
+
+#data
+<html>
+<body>
+<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the
+nobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>
+</body>
+</html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(3,56): adoption-agency-1.3
+(4,58): adoption-agency-1.3
+(5,7): expected-one-end-tag-but-got-another
+#document
+| <html>
+|   <head>
+|   <body>
+|     "
+"
+|     <b>
+|       <nobr>
+|     <div>
+|       <b>
+|         <nobr>
+|           "This text is in a div inside a nobr"
+|         "More text that should not be in the nobr, i.e., the
+nobr should have closed the div inside it implicitly. "
+|       <pre>
+|         "A pre tag outside everything else."
+|       "
+
+"
diff --git a/libs/html5lib/tests/testdata/tree-construction/webkit01.dat b/libs/html5lib/tests/testdata/tree-construction/webkit01.dat
new file mode 100644
index 000000000..da91d77d4
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/webkit01.dat
@@ -0,0 +1,720 @@
+#data
+Test
+#errors
+(1,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "Test"
+
+#data
+<div></div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+
+#data
+<div>Test</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Test"
+
+#data
+<di
+#errors
+(1,3): eof-in-tag-name
+(1,3): expected-doctype-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<div>Hello</div>
+<script>
+console.log("PASS");
+</script>
+<div>Bye</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Hello"
+|     "
+"
+|     <script>
+|       "
+console.log("PASS");
+"
+|     "
+"
+|     <div>
+|       "Bye"
+
+#data
+<div foo="bar">Hello</div>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo="bar"
+|       "Hello"
+
+#data
+<div>Hello</div>
+<script>
+console.log("FOO<span>BAR</span>BAZ");
+</script>
+<div>Bye</div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       "Hello"
+|     "
+"
+|     <script>
+|       "
+console.log("FOO<span>BAR</span>BAZ");
+"
+|     "
+"
+|     <div>
+|       "Bye"
+
+#data
+<foo bar="baz"></foo><potato quack="duck"></potato>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="baz"
+|     <potato>
+|       quack="duck"
+
+#data
+<foo bar="baz"><potato quack="duck"></potato></foo>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="baz"
+|       <potato>
+|         quack="duck"
+
+#data
+<foo></foo bar="baz"><potato></potato quack="duck">
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,21): attributes-in-end-tag
+(1,51): attributes-in-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|     <potato>
+
+#data
+</ tttt>
+#errors
+(1,2): expected-closing-tag-but-got-char
+(1,8): expected-doctype-but-got-eof
+#document
+| <!--  tttt -->
+| <html>
+|   <head>
+|   <body>
+
+#data
+<div FOO ><img><img></div>
+#errors
+(1,10): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       foo=""
+|       <img>
+|       <img>
+
+#data
+<p>Test</p<p>Test2</p>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,13): unexpected-end-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       "TestTest2"
+
+#data
+<rdar://problem/6869687>
+#errors
+(1,7): unexpected-character-after-solidus-in-tag
+(1,8): unexpected-character-after-solidus-in-tag
+(1,16): unexpected-character-after-solidus-in-tag
+(1,24): expected-doctype-but-got-start-tag
+(1,24): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <rdar:>
+|       6869687=""
+|       problem=""
+
+#data
+<A>test< /A>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,8): expected-tag-name
+(1,12): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|       "test< /A>"
+
+#data
+&lt;
+#errors
+(1,4): expected-doctype-but-got-chars
+#document
+| <html>
+|   <head>
+|   <body>
+|     "<"
+
+#data
+<body foo='bar'><body foo='baz' yo='mama'>
+#errors
+(1,16): expected-doctype-but-got-start-tag
+(1,42): unexpected-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     foo="bar"
+|     yo="mama"
+
+#data
+<body></br foo="bar"></body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,21): attributes-in-end-tag
+(1,21): unexpected-end-tag-treated-as
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<bdy><br foo="bar"></body>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,26): expected-one-end-tag-but-got-another
+#document
+| <html>
+|   <head>
+|   <body>
+|     <bdy>
+|       <br>
+|         foo="bar"
+
+#data
+<body></body></br foo="bar">
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,28): attributes-in-end-tag
+(1,28): unexpected-end-tag-after-body
+(1,28): unexpected-end-tag-treated-as
+#document
+| <html>
+|   <head>
+|   <body>
+|     <br>
+
+#data
+<bdy></body><br foo="bar">
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,12): expected-one-end-tag-but-got-another
+(1,26): unexpected-start-tag-after-body
+(1,26): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <bdy>
+|       <br>
+|         foo="bar"
+
+#data
+<html><body></body></html><!-- Hi there -->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+| <!--  Hi there  -->
+
+#data
+<html><body></body></html>x<!-- Hi there -->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): expected-eof-but-got-char
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+
+#data
+<html><body></body></html>x<!-- Hi there --></html><!-- Again -->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): expected-eof-but-got-char
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+| <!--  Again  -->
+
+#data
+<html><body></body></html>x<!-- Hi there --></body></html><!-- Again -->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): expected-eof-but-got-char
+#document
+| <html>
+|   <head>
+|   <body>
+|     "x"
+|     <!--  Hi there  -->
+| <!--  Again  -->
+
+#data
+<html><body><ruby><div><rp>xx</rp></div></ruby></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): XXX-undefined-error
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <rp>
+|           "xx"
+
+#data
+<html><body><ruby><div><rt>xx</rt></div></ruby></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,27): XXX-undefined-error
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ruby>
+|       <div>
+|         <rt>
+|           "xx"
+
+#data
+<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6-->
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <frameset>
+|     <!-- 1 -->
+|     <noframes>
+|       "A"
+|     <!-- 2 -->
+|   <!-- 3 -->
+|   <noframes>
+|     "B"
+|   <!-- 4 -->
+|   <noframes>
+|     "C"
+| <!-- 5 -->
+| <!-- 6 -->
+
+#data
+<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select>
+#errors
+(1,8): expected-doctype-but-got-start-tag
+(1,25): unexpected-select-in-select
+(1,59): unexpected-select-in-select
+(1,93): unexpected-select-in-select
+(1,127): unexpected-select-in-select
+#document
+| <html>
+|   <head>
+|   <body>
+|     <select>
+|       <option>
+|         "A"
+|     <option>
+|       "B"
+|       <select>
+|         <option>
+|           "C"
+|     <option>
+|       "D"
+|       <select>
+|         <option>
+|           "E"
+|     <option>
+|       "F"
+|       <select>
+|         <option>
+|           "G"
+
+#data
+<dd><dd><dt><dt><dd><li><li>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <dd>
+|     <dd>
+|     <dt>
+|     <dt>
+|     <dd>
+|       <li>
+|       <li>
+
+#data
+<div><b></div><div><nobr>a<nobr>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,14): end-tag-too-early
+(1,32): unexpected-start-tag-implies-end-tag
+(1,32): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <b>
+|     <div>
+|       <b>
+|         <nobr>
+|           "a"
+|         <nobr>
+
+#data
+<head></head>
+<body></body>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   "
+"
+|   <body>
+
+#data
+<head></head> <style></style>ddd
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,21): unexpected-start-tag-out-of-my-head
+#document
+| <html>
+|   <head>
+|     <style>
+|   " "
+|   <body>
+|     "ddd"
+
+#data
+<kbd><table></kbd><col><select><tr>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,18): unexpected-end-tag-implies-table-voodoo
+(1,18): unexpected-end-tag
+(1,31): unexpected-start-tag-implies-table-voodoo
+(1,35): unexpected-table-element-start-tag-in-select-in-table
+(1,35): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     <kbd>
+|       <select>
+|       <table>
+|         <colgroup>
+|           <col>
+|         <tbody>
+|           <tr>
+
+#data
+<kbd><table></kbd><col><select><tr></table><div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,18): unexpected-end-tag-implies-table-voodoo
+(1,18): unexpected-end-tag
+(1,31): unexpected-start-tag-implies-table-voodoo
+(1,35): unexpected-table-element-start-tag-in-select-in-table
+(1,48): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <kbd>
+|       <select>
+|       <table>
+|         <colgroup>
+|           <col>
+|         <tbody>
+|           <tr>
+|       <div>
+
+#data
+<a><li><style></style><title></title></a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,41): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <li>
+|       <a>
+|         <style>
+|         <title>
+
+#data
+<font></p><p><meta><title></title></font>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,10): unexpected-end-tag
+(1,41): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <font>
+|       <p>
+|     <p>
+|       <font>
+|         <meta>
+|         <title>
+
+#data
+<a><center><title></title><a>
+#errors
+(1,3): expected-doctype-but-got-start-tag
+(1,29): unexpected-start-tag-implies-end-tag
+(1,29): adoption-agency-1.3
+(1,29): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <a>
+|     <center>
+|       <a>
+|         <title>
+|       <a>
+
+#data
+<svg><title><div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <div>
+
+#data
+<svg><title><rect><div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,23): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <rect>
+|           <div>
+
+#data
+<svg><title><svg><div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,22): unexpected-html-element-in-foreign-content
+(1,22): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg title>
+|         <svg svg>
+|         <div>
+
+#data
+<img <="" FAIL>
+#errors
+(1,6): invalid-character-in-attribute-name
+(1,15): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <img>
+|       <=""
+|       fail=""
+
+#data
+<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>
+#errors
+(1,4): expected-doctype-but-got-start-tag
+(1,23): non-void-element-with-trailing-solidus
+(1,29): end-tag-too-early
+#document
+| <html>
+|   <head>
+|   <body>
+|     <ul>
+|       <li>
+|         <div>
+|           id="foo"
+|           "A"
+|       <li>
+|         "B"
+|         <div>
+|           "C"
+
+#data
+<svg><em><desc></em>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,9): unexpected-html-element-in-foreign-content
+(1,20): adoption-agency-1.3
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|     <em>
+|       <desc>
+
+#data
+<table><tr><td><svg><desc><td></desc><circle>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             <svg svg>
+|               <svg desc>
+|           <td>
+|             <circle>
+
+#data
+<svg><tfoot></mi><td>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+(1,17): unexpected-end-tag
+(1,17): unexpected-end-tag
+(1,21): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg tfoot>
+|         <svg td>
+
+#data
+<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <math math>
+|       <math mrow>
+|         <math mrow>
+|           <math mn>
+|             "1"
+|         <math mi>
+|           "a"
+
+#data
+<!doctype html><input type="hidden"><frameset>
+#errors
+(1,46): unexpected-start-tag
+(1,46): eof-in-frameset
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <frameset>
+
+#data
+<!doctype html><input type="button"><frameset>
+#errors
+(1,46): unexpected-start-tag
+#document
+| <!DOCTYPE html>
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|       type="button"
diff --git a/libs/html5lib/tests/testdata/tree-construction/webkit02.dat b/libs/html5lib/tests/testdata/tree-construction/webkit02.dat
new file mode 100644
index 000000000..c596820b3
--- /dev/null
+++ b/libs/html5lib/tests/testdata/tree-construction/webkit02.dat
@@ -0,0 +1,301 @@
+#data
+<foo bar=qux/>
+#errors
+(1,14): expected-doctype-but-got-start-tag
+(1,14): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <foo>
+|       bar="qux/"
+
+#data
+<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#script-on
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       id="status"
+|       <noscript>
+|         "<strong>A</strong>"
+|       <span>
+|         "B"
+
+#data
+<p id="status"><noscript><strong>A</strong></noscript><span>B</span></p>
+#errors
+(1,15): expected-doctype-but-got-start-tag
+#script-off
+#document
+| <html>
+|   <head>
+|   <body>
+|     <p>
+|       id="status"
+|       <noscript>
+|         <strong>
+|           "A"
+|       <span>
+|         "B"
+
+#data
+<div><sarcasm><div></div></sarcasm></div>
+#errors
+(1,5): expected-doctype-but-got-start-tag
+#document
+| <html>
+|   <head>
+|   <body>
+|     <div>
+|       <sarcasm>
+|         <div>
+
+#data
+<html><body><img src="" border="0" alt="><div>A</div></body></html>
+#errors
+(1,6): expected-doctype-but-got-start-tag
+(1,67): eof-in-attribute-value-double-quote
+#document
+| <html>
+|   <head>
+|   <body>
+
+#data
+<table><td></tbody>A
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,20): foster-parenting-character
+(1,20): eof-in-table
+#document
+| <html>
+|   <head>
+|   <body>
+|     "A"
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+
+#data
+<table><td></thead>A
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,19): XXX-undefined-error
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+
+#data
+<table><td></tfoot>A
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,11): unexpected-cell-in-table-body
+(1,19): XXX-undefined-error
+(1,20): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <tbody>
+|         <tr>
+|           <td>
+|             "A"
+
+#data
+<table><thead><td></tbody>A
+#errors
+(1,7): expected-doctype-but-got-start-tag
+(1,18): unexpected-cell-in-table-body
+(1,26): XXX-undefined-error
+(1,27): expected-closing-tag-but-got-eof
+#document
+| <html>
+|   <head>
+|   <body>
+|     <table>
+|       <thead>
+|         <tr>
+|           <td>
+|             "A"
+
+#data
+<legend>test</legend>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <legend>
+|       "test"
+
+#data
+<table><input>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <input>
+|     <table>
+
+#data
+<b><em><foo><foo><aside></b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <em>
+|         <foo>
+|           <foo>
+|     <em>
+|       <aside>
+|         <b>
+
+#data
+<b><em><foo><foo><aside></b></em>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <em>
+|         <foo>
+|           <foo>
+|     <em>
+|     <aside>
+|       <em>
+|         <b>
+
+#data
+<b><em><foo><foo><foo><aside></b>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <em>
+|         <foo>
+|           <foo>
+|             <foo>
+|     <aside>
+|       <b>
+
+#data
+<b><em><foo><foo><foo><aside></b></em>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <b>
+|       <em>
+|         <foo>
+|           <foo>
+|             <foo>
+|     <aside>
+|       <b>
+
+#data
+<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo><aside></b></em>
+#errors
+#document-fragment
+div
+#document
+| <b>
+|   <em>
+|     <foo>
+|       <foo>
+|         <foo>
+|           <foo>
+|             <foo>
+|               <foo>
+|                 <foo>
+|                   <foo>
+|                     <foo>
+|                       <foo>
+| <aside>
+|   <b>
+
+#data
+<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food><aside></b></em>
+#errors
+#document-fragment
+div
+#document
+| <b>
+|   <em>
+|     <foo>
+|       <foob>
+|         <foob>
+|           <foob>
+|             <foob>
+|               <fooc>
+|                 <fooc>
+|                   <fooc>
+|                     <fooc>
+|                       <food>
+| <aside>
+|   <b>
+
+#data
+<option><XH<optgroup></optgroup>
+#errors
+#document-fragment
+select
+#document
+| <option>
+
+#data
+<svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|         <div>
+|           "foo"
+|         <plaintext>
+|           "</foreignObject></svg><div>bar</div>"
+
+#data
+<svg><foreignObject></foreignObject><title></svg>foo
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <svg svg>
+|       <svg foreignObject>
+|       <svg title>
+|     "foo"
+
+#data
+</foreignObject><plaintext><div>foo</div>
+#errors
+#document
+| <html>
+|   <head>
+|   <body>
+|     <plaintext>
+|       "<div>foo</div>"
diff --git a/libs/html5lib/tests/tokenizer.py b/libs/html5lib/tests/tokenizer.py
new file mode 100644
index 000000000..1440a722c
--- /dev/null
+++ b/libs/html5lib/tests/tokenizer.py
@@ -0,0 +1,252 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import codecs
+import json
+import warnings
+import re
+
+import pytest
+from six import unichr
+
+from html5lib._tokenizer import HTMLTokenizer
+from html5lib import constants, _utils
+
+
+class TokenizerTestParser(object):
+    def __init__(self, initialState, lastStartTag=None):
+        self.tokenizer = HTMLTokenizer
+        self._state = initialState
+        self._lastStartTag = lastStartTag
+
+    def parse(self, stream, encoding=None, innerHTML=False):
+        # pylint:disable=unused-argument
+        tokenizer = self.tokenizer(stream, encoding)
+        self.outputTokens = []
+
+        tokenizer.state = getattr(tokenizer, self._state)
+        if self._lastStartTag is not None:
+            tokenizer.currentToken = {"type": "startTag",
+                                      "name": self._lastStartTag}
+
+        types = dict((v, k) for k, v in constants.tokenTypes.items())
+        for token in tokenizer:
+            getattr(self, 'process%s' % types[token["type"]])(token)
+
+        return self.outputTokens
+
+    def processDoctype(self, token):
+        self.outputTokens.append(["DOCTYPE", token["name"], token["publicId"],
+                                  token["systemId"], token["correct"]])
+
+    def processStartTag(self, token):
+        self.outputTokens.append(["StartTag", token["name"],
+                                  dict(token["data"][::-1]), token["selfClosing"]])
+
+    def processEmptyTag(self, token):
+        if token["name"] not in constants.voidElements:
+            self.outputTokens.append("ParseError")
+        self.outputTokens.append(["StartTag", token["name"], dict(token["data"][::-1])])
+
+    def processEndTag(self, token):
+        self.outputTokens.append(["EndTag", token["name"],
+                                  token["selfClosing"]])
+
+    def processComment(self, token):
+        self.outputTokens.append(["Comment", token["data"]])
+
+    def processSpaceCharacters(self, token):
+        self.outputTokens.append(["Character", token["data"]])
+        self.processSpaceCharacters = self.processCharacters
+
+    def processCharacters(self, token):
+        self.outputTokens.append(["Character", token["data"]])
+
+    def processEOF(self, token):
+        pass
+
+    def processParseError(self, token):
+        self.outputTokens.append(["ParseError", token["data"]])
+
+
+def concatenateCharacterTokens(tokens):
+    outputTokens = []
+    for token in tokens:
+        if "ParseError" not in token and token[0] == "Character":
+            if (outputTokens and "ParseError" not in outputTokens[-1] and
+                    outputTokens[-1][0] == "Character"):
+                outputTokens[-1][1] += token[1]
+            else:
+                outputTokens.append(token)
+        else:
+            outputTokens.append(token)
+    return outputTokens
+
+
+def normalizeTokens(tokens):
+    # TODO: convert tests to reflect arrays
+    for i, token in enumerate(tokens):
+        if token[0] == 'ParseError':
+            tokens[i] = token[0]
+    return tokens
+
+
+def tokensMatch(expectedTokens, receivedTokens, ignoreErrorOrder,
+                ignoreErrors=False):
+    """Test whether the test has passed or failed
+
+    If the ignoreErrorOrder flag is set to true we don't test the relative
+    positions of parse errors and non parse errors
+    """
+    checkSelfClosing = False
+    for token in expectedTokens:
+        if (token[0] == "StartTag" and len(token) == 4 or
+                token[0] == "EndTag" and len(token) == 3):
+            checkSelfClosing = True
+            break
+
+    if not checkSelfClosing:
+        for token in receivedTokens:
+            if token[0] == "StartTag" or token[0] == "EndTag":
+                token.pop()
+
+    if not ignoreErrorOrder and not ignoreErrors:
+        expectedTokens = concatenateCharacterTokens(expectedTokens)
+        return expectedTokens == receivedTokens
+    else:
+        # Sort the tokens into two groups; non-parse errors and parse errors
+        tokens = {"expected": [[], []], "received": [[], []]}
+        for tokenType, tokenList in zip(list(tokens.keys()),
+                                        (expectedTokens, receivedTokens)):
+            for token in tokenList:
+                if token != "ParseError":
+                    tokens[tokenType][0].append(token)
+                else:
+                    if not ignoreErrors:
+                        tokens[tokenType][1].append(token)
+            tokens[tokenType][0] = concatenateCharacterTokens(tokens[tokenType][0])
+        return tokens["expected"] == tokens["received"]
+
+
+_surrogateRe = re.compile(r"\\u([0-9A-Fa-f]{4})(?:\\u([0-9A-Fa-f]{4}))?")
+
+
+def unescape(test):
+    def decode(inp):
+        """Decode \\uXXXX escapes
+
+        This decodes \\uXXXX escapes, possibly into non-BMP characters when
+        two surrogate character escapes are adjacent to each other.
+        """
+        # This cannot be implemented using the unicode_escape codec
+        # because that requires its input be ISO-8859-1, and we need
+        # arbitrary unicode as input.
+        def repl(m):
+            if m.group(2) is not None:
+                high = int(m.group(1), 16)
+                low = int(m.group(2), 16)
+                if 0xD800 <= high <= 0xDBFF and 0xDC00 <= low <= 0xDFFF:
+                    cp = ((high - 0xD800) << 10) + (low - 0xDC00) + 0x10000
+                    return unichr(cp)
+                else:
+                    return unichr(high) + unichr(low)
+            else:
+                return unichr(int(m.group(1), 16))
+        try:
+            return _surrogateRe.sub(repl, inp)
+        except ValueError:
+            # This occurs when unichr throws ValueError, which should
+            # only be for a lone-surrogate.
+            if _utils.supports_lone_surrogates:
+                raise
+            return None
+
+    test["input"] = decode(test["input"])
+    for token in test["output"]:
+        if token == "ParseError":
+            continue
+        else:
+            token[1] = decode(token[1])
+            if len(token) > 2:
+                for key, value in token[2]:
+                    del token[2][key]
+                    token[2][decode(key)] = decode(value)
+    return test
+
+
+def _doCapitalize(match):
+    return match.group(1).upper()
+
+_capitalizeRe = re.compile(r"\W+(\w)").sub
+
+
+def capitalize(s):
+    s = s.lower()
+    s = _capitalizeRe(_doCapitalize, s)
+    return s
+
+
+class TokenizerFile(pytest.File):
+    def collect(self):
+        with codecs.open(str(self.fspath), "r", encoding="utf-8") as fp:
+            tests = json.load(fp)
+        if 'tests' in tests:
+            for i, test in enumerate(tests['tests']):
+                yield TokenizerTestCollector(str(i), self, testdata=test)
+
+
+class TokenizerTestCollector(pytest.Collector):
+    def __init__(self, name, parent=None, config=None, session=None, testdata=None):
+        super(TokenizerTestCollector, self).__init__(name, parent, config, session)
+        if 'initialStates' not in testdata:
+            testdata["initialStates"] = ["Data state"]
+        if 'doubleEscaped' in testdata:
+            testdata = unescape(testdata)
+        self.testdata = testdata
+
+    def collect(self):
+        for initialState in self.testdata["initialStates"]:
+            initialState = capitalize(initialState)
+            item = TokenizerTest(initialState,
+                                 self,
+                                 self.testdata,
+                                 initialState)
+            if self.testdata["input"] is None:
+                item.add_marker(pytest.mark.skipif(True, reason="Relies on lone surrogates"))
+            yield item
+
+
+class TokenizerTest(pytest.Item):
+    def __init__(self, name, parent, test, initialState):
+        super(TokenizerTest, self).__init__(name, parent)
+        self.obj = lambda: 1  # this is to hack around skipif needing a function!
+        self.test = test
+        self.initialState = initialState
+
+    def runtest(self):
+        warnings.resetwarnings()
+        warnings.simplefilter("error")
+
+        expected = self.test['output']
+        if 'lastStartTag' not in self.test:
+            self.test['lastStartTag'] = None
+        parser = TokenizerTestParser(self.initialState,
+                                     self.test['lastStartTag'])
+        tokens = parser.parse(self.test['input'])
+        received = normalizeTokens(tokens)
+        errorMsg = "\n".join(["\n\nInitial state:",
+                              self.initialState,
+                              "\nInput:", self.test['input'],
+                              "\nExpected:", repr(expected),
+                              "\nreceived:", repr(tokens)])
+        errorMsg = errorMsg
+        ignoreErrorOrder = self.test.get('ignoreErrorOrder', False)
+        assert tokensMatch(expected, received, ignoreErrorOrder, True), errorMsg
+
+    def repr_failure(self, excinfo):
+        traceback = excinfo.traceback
+        ntraceback = traceback.cut(path=__file__)
+        excinfo.traceback = ntraceback.filter()
+
+        return excinfo.getrepr(funcargs=True,
+                               showlocals=False,
+                               style="short", tbfilter=False)
diff --git a/libs/html5lib/tests/tokenizertotree.py b/libs/html5lib/tests/tokenizertotree.py
new file mode 100644
index 000000000..b841c76ce
--- /dev/null
+++ b/libs/html5lib/tests/tokenizertotree.py
@@ -0,0 +1,68 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import sys
+import os
+import json
+import re
+
+import html5lib
+from . import support
+from . import test_tokenizer
+
+p = html5lib.HTMLParser()
+
+unnamespaceExpected = re.compile(r"^(\|\s*)<html ([^>]+)>", re.M).sub
+
+
+def main(out_path):
+    if not os.path.exists(out_path):
+        sys.stderr.write("Path %s does not exist" % out_path)
+        sys.exit(1)
+
+    for filename in support.get_data_files('tokenizer', '*.test'):
+        run_file(filename, out_path)
+
+
+def run_file(filename, out_path):
+    try:
+        tests_data = json.load(open(filename, "r"))
+    except ValueError:
+        sys.stderr.write("Failed to load %s\n" % filename)
+        return
+    name = os.path.splitext(os.path.split(filename)[1])[0]
+    output_file = open(os.path.join(out_path, "tokenizer_%s.dat" % name), "w")
+
+    if 'tests' in tests_data:
+        for test_data in tests_data['tests']:
+            if 'initialStates' not in test_data:
+                test_data["initialStates"] = ["Data state"]
+
+            for initial_state in test_data["initialStates"]:
+                if initial_state != "Data state":
+                    # don't support this yet
+                    continue
+                test = make_test(test_data)
+                output_file.write(test)
+
+    output_file.close()
+
+
+def make_test(test_data):
+    if 'doubleEscaped' in test_data:
+        test_data = test_tokenizer.unescape_test(test_data)
+
+    rv = []
+    rv.append("#data")
+    rv.append(test_data["input"].encode("utf8"))
+    rv.append("#errors")
+    tree = p.parse(test_data["input"])
+    output = p.tree.testSerializer(tree)
+    output = "\n".join(("| " + line[3:]) if line.startswith("|  ") else line
+                       for line in output.split("\n"))
+    output = unnamespaceExpected(r"\1<\2>", output)
+    rv.append(output.encode("utf8"))
+    rv.append("")
+    return "\n".join(rv)
+
+if __name__ == "__main__":
+    main(sys.argv[1])
diff --git a/libs/html5lib/tests/tree_construction.py b/libs/html5lib/tests/tree_construction.py
new file mode 100644
index 000000000..c6e7ca090
--- /dev/null
+++ b/libs/html5lib/tests/tree_construction.py
@@ -0,0 +1,204 @@
+from __future__ import absolute_import, division, unicode_literals
+
+import itertools
+import re
+import warnings
+from difflib import unified_diff
+
+import pytest
+
+from .support import TestData, convert, convertExpected, treeTypes
+from html5lib import html5parser, constants, treewalkers
+from html5lib.filters.lint import Filter as Lint
+
+_attrlist_re = re.compile(r"^(\s+)\w+=.*(\n\1\w+=.*)+", re.M)
+
+
+def sortattrs(s):
+    def replace(m):
+        lines = m.group(0).split("\n")
+        lines.sort()
+        return "\n".join(lines)
+    return _attrlist_re.sub(replace, s)
+
+
+class TreeConstructionFile(pytest.File):
+    def collect(self):
+        tests = TestData(str(self.fspath), "data")
+        for i, test in enumerate(tests):
+            yield TreeConstructionTest(str(i), self, testdata=test)
+
+
+class TreeConstructionTest(pytest.Collector):
+    def __init__(self, name, parent=None, config=None, session=None, testdata=None):
+        super(TreeConstructionTest, self).__init__(name, parent, config, session)
+        self.testdata = testdata
+
+    def collect(self):
+        for treeName, treeAPIs in sorted(treeTypes.items()):
+            for x in itertools.chain(self._getParserTests(treeName, treeAPIs),
+                                     self._getTreeWalkerTests(treeName, treeAPIs)):
+                yield x
+
+    def _getParserTests(self, treeName, treeAPIs):
+        if treeAPIs is not None and "adapter" in treeAPIs:
+            return
+        for namespaceHTMLElements in (True, False):
+            if namespaceHTMLElements:
+                nodeid = "%s::parser::namespaced" % treeName
+            else:
+                nodeid = "%s::parser::void-namespace" % treeName
+            item = ParserTest(nodeid,
+                              self,
+                              self.testdata,
+                              treeAPIs["builder"] if treeAPIs is not None else None,
+                              namespaceHTMLElements)
+            item.add_marker(getattr(pytest.mark, treeName))
+            item.add_marker(pytest.mark.parser)
+            if namespaceHTMLElements:
+                item.add_marker(pytest.mark.namespaced)
+            if treeAPIs is None:
+                item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded"))
+            yield item
+
+    def _getTreeWalkerTests(self, treeName, treeAPIs):
+        nodeid = "%s::treewalker" % treeName
+        item = TreeWalkerTest(nodeid,
+                              self,
+                              self.testdata,
+                              treeAPIs)
+        item.add_marker(getattr(pytest.mark, treeName))
+        item.add_marker(pytest.mark.treewalker)
+        if treeAPIs is None:
+            item.add_marker(pytest.mark.skipif(True, reason="Treebuilder not loaded"))
+        yield item
+
+
+def convertTreeDump(data):
+    return "\n".join(convert(3)(data).split("\n")[1:])
+
+namespaceExpected = re.compile(r"^(\s*)<(\S+)>", re.M).sub
+
+
+class ParserTest(pytest.Item):
+    def __init__(self, name, parent, test, treeClass, namespaceHTMLElements):
+        super(ParserTest, self).__init__(name, parent)
+        self.obj = lambda: 1  # this is to hack around skipif needing a function!
+        self.test = test
+        self.treeClass = treeClass
+        self.namespaceHTMLElements = namespaceHTMLElements
+
+    def runtest(self):
+        p = html5parser.HTMLParser(tree=self.treeClass,
+                                   namespaceHTMLElements=self.namespaceHTMLElements)
+
+        input = self.test['data']
+        fragmentContainer = self.test['document-fragment']
+        expected = convertExpected(self.test['document'])
+        expectedErrors = self.test['errors'].split("\n") if self.test['errors'] else []
+
+        scripting = False
+        if 'script-on' in self.test:
+            scripting = True
+
+        with warnings.catch_warnings():
+            warnings.simplefilter("error")
+            try:
+                if fragmentContainer:
+                    document = p.parseFragment(input, fragmentContainer, scripting=scripting)
+                else:
+                    document = p.parse(input, scripting=scripting)
+            except constants.DataLossWarning:
+                pytest.skip("data loss warning")
+
+        output = convertTreeDump(p.tree.testSerializer(document))
+
+        expected = expected
+        if self.namespaceHTMLElements:
+            expected = namespaceExpected(r"\1<html \2>", expected)
+
+        errorMsg = "\n".join(["\n\nInput:", input, "\nExpected:", expected,
+                              "\nReceived:", output])
+        assert expected == output, errorMsg
+
+        errStr = []
+        for (line, col), errorcode, datavars in p.errors:
+            assert isinstance(datavars, dict), "%s, %s" % (errorcode, repr(datavars))
+            errStr.append("Line: %i Col: %i %s" % (line, col,
+                                                   constants.E[errorcode] % datavars))
+
+        errorMsg2 = "\n".join(["\n\nInput:", input,
+                               "\nExpected errors (" + str(len(expectedErrors)) + "):\n" + "\n".join(expectedErrors),
+                               "\nActual errors (" + str(len(p.errors)) + "):\n" + "\n".join(errStr)])
+        if False:  # we're currently not testing parse errors
+            assert len(p.errors) == len(expectedErrors), errorMsg2
+
+    def repr_failure(self, excinfo):
+        traceback = excinfo.traceback
+        ntraceback = traceback.cut(path=__file__)
+        excinfo.traceback = ntraceback.filter()
+
+        return excinfo.getrepr(funcargs=True,
+                               showlocals=False,
+                               style="short", tbfilter=False)
+
+
+class TreeWalkerTest(pytest.Item):
+    def __init__(self, name, parent, test, treeAPIs):
+        super(TreeWalkerTest, self).__init__(name, parent)
+        self.obj = lambda: 1  # this is to hack around skipif needing a function!
+        self.test = test
+        self.treeAPIs = treeAPIs
+
+    def runtest(self):
+        p = html5parser.HTMLParser(tree=self.treeAPIs["builder"])
+
+        input = self.test['data']
+        fragmentContainer = self.test['document-fragment']
+        expected = convertExpected(self.test['document'])
+
+        scripting = False
+        if 'script-on' in self.test:
+            scripting = True
+
+        with warnings.catch_warnings():
+            warnings.simplefilter("error")
+            try:
+                if fragmentContainer:
+                    document = p.parseFragment(input, fragmentContainer, scripting=scripting)
+                else:
+                    document = p.parse(input, scripting=scripting)
+            except constants.DataLossWarning:
+                pytest.skip("data loss warning")
+
+        poutput = convertTreeDump(p.tree.testSerializer(document))
+        namespace_expected = namespaceExpected(r"\1<html \2>", expected)
+        if poutput != namespace_expected:
+            pytest.skip("parser output incorrect")
+
+        document = self.treeAPIs.get("adapter", lambda x: x)(document)
+
+        try:
+            output = treewalkers.pprint(Lint(self.treeAPIs["walker"](document)))
+            output = sortattrs(output)
+            expected = sortattrs(expected)
+            diff = "".join(unified_diff([line + "\n" for line in expected.splitlines()],
+                                        [line + "\n" for line in output.splitlines()],
+                                        "Expected", "Received"))
+            assert expected == output, "\n".join([
+                "", "Input:", input,
+                    "", "Expected:", expected,
+                    "", "Received:", output,
+                    "", "Diff:", diff,
+            ])
+        except NotImplementedError:
+            pytest.skip("tree walker NotImplementedError")
+
+    def repr_failure(self, excinfo):
+        traceback = excinfo.traceback
+        ntraceback = traceback.cut(path=__file__)
+        excinfo.traceback = ntraceback.filter()
+
+        return excinfo.getrepr(funcargs=True,
+                               showlocals=False,
+                               style="short", tbfilter=False)
diff --git a/libs/html5lib/treeadapters/__init__.py b/libs/html5lib/treeadapters/__init__.py
new file mode 100644
index 000000000..dfeb0ba5e
--- /dev/null
+++ b/libs/html5lib/treeadapters/__init__.py
@@ -0,0 +1,30 @@
+"""Tree adapters let you convert from one tree structure to another
+
+Example:
+
+.. code-block:: python
+
+   import html5lib
+   from html5lib.treeadapters import genshi
+
+   doc = '<html><body>Hi!</body></html>'
+   treebuilder = html5lib.getTreeBuilder('etree')
+   parser = html5lib.HTMLParser(tree=treebuilder)
+   tree = parser.parse(doc)
+   TreeWalker = html5lib.getTreeWalker('etree')
+
+   genshi_tree = genshi.to_genshi(TreeWalker(tree))
+
+"""
+from __future__ import absolute_import, division, unicode_literals
+
+from . import sax
+
+__all__ = ["sax"]
+
+try:
+    from . import genshi  # noqa
+except ImportError:
+    pass
+else:
+    __all__.append("genshi")
diff --git a/libs/html5lib/treeadapters/genshi.py b/libs/html5lib/treeadapters/genshi.py
new file mode 100644
index 000000000..61d5fb6ac
--- /dev/null
+++ b/libs/html5lib/treeadapters/genshi.py
@@ -0,0 +1,54 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName, Attrs
+from genshi.core import START, END, TEXT, COMMENT, DOCTYPE
+
+
+def to_genshi(walker):
+    """Convert a tree to a genshi tree
+
+    :arg walker: the treewalker to use to walk the tree to convert it
+
+    :returns: generator of genshi nodes
+
+    """
+    text = []
+    for token in walker:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            text.append(token["data"])
+        elif text:
+            yield TEXT, "".join(text), (None, -1, -1)
+            text = []
+
+        if type in ("StartTag", "EmptyTag"):
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+            attrs = Attrs([(QName("{%s}%s" % attr if attr[0] is not None else attr[1]), value)
+                           for attr, value in token["data"].items()])
+            yield (START, (QName(name), attrs), (None, -1, -1))
+            if type == "EmptyTag":
+                type = "EndTag"
+
+        if type == "EndTag":
+            if token["namespace"]:
+                name = "{%s}%s" % (token["namespace"], token["name"])
+            else:
+                name = token["name"]
+
+            yield END, QName(name), (None, -1, -1)
+
+        elif type == "Comment":
+            yield COMMENT, token["data"], (None, -1, -1)
+
+        elif type == "Doctype":
+            yield DOCTYPE, (token["name"], token["publicId"],
+                            token["systemId"]), (None, -1, -1)
+
+        else:
+            pass  # FIXME: What to do?
+
+    if text:
+        yield TEXT, "".join(text), (None, -1, -1)
diff --git a/libs/html5lib/treeadapters/sax.py b/libs/html5lib/treeadapters/sax.py
new file mode 100644
index 000000000..f4ccea5a2
--- /dev/null
+++ b/libs/html5lib/treeadapters/sax.py
@@ -0,0 +1,50 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.sax.xmlreader import AttributesNSImpl
+
+from ..constants import adjustForeignAttributes, unadjustForeignAttributes
+
+prefix_mapping = {}
+for prefix, localName, namespace in adjustForeignAttributes.values():
+    if prefix is not None:
+        prefix_mapping[prefix] = namespace
+
+
+def to_sax(walker, handler):
+    """Call SAX-like content handler based on treewalker walker
+
+    :arg walker: the treewalker to use to walk the tree to convert it
+
+    :arg handler: SAX handler to use
+
+    """
+    handler.startDocument()
+    for prefix, namespace in prefix_mapping.items():
+        handler.startPrefixMapping(prefix, namespace)
+
+    for token in walker:
+        type = token["type"]
+        if type == "Doctype":
+            continue
+        elif type in ("StartTag", "EmptyTag"):
+            attrs = AttributesNSImpl(token["data"],
+                                     unadjustForeignAttributes)
+            handler.startElementNS((token["namespace"], token["name"]),
+                                   token["name"],
+                                   attrs)
+            if type == "EmptyTag":
+                handler.endElementNS((token["namespace"], token["name"]),
+                                     token["name"])
+        elif type == "EndTag":
+            handler.endElementNS((token["namespace"], token["name"]),
+                                 token["name"])
+        elif type in ("Characters", "SpaceCharacters"):
+            handler.characters(token["data"])
+        elif type == "Comment":
+            pass
+        else:
+            assert False, "Unknown token type"
+
+    for prefix, namespace in prefix_mapping.items():
+        handler.endPrefixMapping(prefix)
+    handler.endDocument()
diff --git a/libs/html5lib/treebuilders/__init__.py b/libs/html5lib/treebuilders/__init__.py
new file mode 100644
index 000000000..d44447eaf
--- /dev/null
+++ b/libs/html5lib/treebuilders/__init__.py
@@ -0,0 +1,88 @@
+"""A collection of modules for building different kinds of trees from HTML
+documents.
+
+To create a treebuilder for a new type of tree, you need to do
+implement several things:
+
+1. A set of classes for various types of elements: Document, Doctype, Comment,
+   Element. These must implement the interface of ``base.treebuilders.Node``
+   (although comment nodes have a different signature for their constructor,
+   see ``treebuilders.etree.Comment``) Textual content may also be implemented
+   as another node type, or not, as your tree implementation requires.
+
+2. A treebuilder object (called ``TreeBuilder`` by convention) that inherits
+   from ``treebuilders.base.TreeBuilder``. This has 4 required attributes:
+
+   * ``documentClass`` - the class to use for the bottommost node of a document
+   * ``elementClass`` - the class to use for HTML Elements
+   * ``commentClass`` - the class to use for comments
+   * ``doctypeClass`` - the class to use for doctypes
+
+   It also has one required method:
+
+   * ``getDocument`` - Returns the root node of the complete document tree
+
+3. If you wish to run the unit tests, you must also create a ``testSerializer``
+   method on your treebuilder which accepts a node and returns a string
+   containing Node and its children serialized according to the format used in
+   the unittests
+
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .._utils import default_etree
+
+treeBuilderCache = {}
+
+
+def getTreeBuilder(treeType, implementation=None, **kwargs):
+    """Get a TreeBuilder class for various types of trees with built-in support
+
+    :arg treeType: the name of the tree type required (case-insensitive). Supported
+        values are:
+
+        * "dom" - A generic builder for DOM implementations, defaulting to a
+          xml.dom.minidom based implementation.
+        * "etree" - A generic builder for tree implementations exposing an
+          ElementTree-like interface, defaulting to xml.etree.cElementTree if
+          available and xml.etree.ElementTree if not.
+        * "lxml" - A etree-based builder for lxml.etree, handling limitations
+          of lxml's implementation.
+
+    :arg implementation: (Currently applies to the "etree" and "dom" tree
+        types). A module implementing the tree type e.g. xml.etree.ElementTree
+        or xml.etree.cElementTree.
+
+    :arg kwargs: Any additional options to pass to the TreeBuilder when
+        creating it.
+
+    Example:
+
+    >>> from html5lib.treebuilders import getTreeBuilder
+    >>> builder = getTreeBuilder('etree')
+
+    """
+
+    treeType = treeType.lower()
+    if treeType not in treeBuilderCache:
+        if treeType == "dom":
+            from . import dom
+            # Come up with a sane default (pref. from the stdlib)
+            if implementation is None:
+                from xml.dom import minidom
+                implementation = minidom
+            # NEVER cache here, caching is done in the dom submodule
+            return dom.getDomModule(implementation, **kwargs).TreeBuilder
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeBuilderCache[treeType] = etree_lxml.TreeBuilder
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeBuilder
+        else:
+            raise ValueError("""Unrecognised treebuilder "%s" """ % treeType)
+    return treeBuilderCache.get(treeType)
diff --git a/libs/html5lib/treebuilders/base.py b/libs/html5lib/treebuilders/base.py
new file mode 100644
index 000000000..05d97eccc
--- /dev/null
+++ b/libs/html5lib/treebuilders/base.py
@@ -0,0 +1,417 @@
+from __future__ import absolute_import, division, unicode_literals
+from six import text_type
+
+from ..constants import scopingElements, tableInsertModeElements, namespaces
+
+# The scope markers are inserted when entering object elements,
+# marquees, table cells, and table captions, and are used to prevent formatting
+# from "leaking" into tables, object elements, and marquees.
+Marker = None
+
+listElementsMap = {
+    None: (frozenset(scopingElements), False),
+    "button": (frozenset(scopingElements | set([(namespaces["html"], "button")])), False),
+    "list": (frozenset(scopingElements | set([(namespaces["html"], "ol"),
+                                              (namespaces["html"], "ul")])), False),
+    "table": (frozenset([(namespaces["html"], "html"),
+                         (namespaces["html"], "table")]), False),
+    "select": (frozenset([(namespaces["html"], "optgroup"),
+                          (namespaces["html"], "option")]), True)
+}
+
+
+class Node(object):
+    """Represents an item in the tree"""
+    def __init__(self, name):
+        """Creates a Node
+
+        :arg name: The tag name associated with the node
+
+        """
+        # The tag name assocaited with the node
+        self.name = name
+        # The parent of the current node (or None for the document node)
+        self.parent = None
+        # The value of the current node (applies to text nodes and comments)
+        self.value = None
+        # A dict holding name -> value pairs for attributes of the node
+        self.attributes = {}
+        # A list of child nodes of the current node. This must include all
+        # elements but not necessarily other node types.
+        self.childNodes = []
+        # A list of miscellaneous flags that can be set on the node.
+        self._flags = []
+
+    def __str__(self):
+        attributesStr = " ".join(["%s=\"%s\"" % (name, value)
+                                  for name, value in
+                                  self.attributes.items()])
+        if attributesStr:
+            return "<%s %s>" % (self.name, attributesStr)
+        else:
+            return "<%s>" % (self.name)
+
+    def __repr__(self):
+        return "<%s>" % (self.name)
+
+    def appendChild(self, node):
+        """Insert node as a child of the current node
+
+        :arg node: the node to insert
+
+        """
+        raise NotImplementedError
+
+    def insertText(self, data, insertBefore=None):
+        """Insert data as text in the current node, positioned before the
+        start of node insertBefore or to the end of the node's text.
+
+        :arg data: the data to insert
+
+        :arg insertBefore: True if you want to insert the text before the node
+            and False if you want to insert it after the node
+
+        """
+        raise NotImplementedError
+
+    def insertBefore(self, node, refNode):
+        """Insert node as a child of the current node, before refNode in the
+        list of child nodes. Raises ValueError if refNode is not a child of
+        the current node
+
+        :arg node: the node to insert
+
+        :arg refNode: the child node to insert the node before
+
+        """
+        raise NotImplementedError
+
+    def removeChild(self, node):
+        """Remove node from the children of the current node
+
+        :arg node: the child node to remove
+
+        """
+        raise NotImplementedError
+
+    def reparentChildren(self, newParent):
+        """Move all the children of the current node to newParent.
+        This is needed so that trees that don't store text as nodes move the
+        text in the correct way
+
+        :arg newParent: the node to move all this node's children to
+
+        """
+        # XXX - should this method be made more general?
+        for child in self.childNodes:
+            newParent.appendChild(child)
+        self.childNodes = []
+
+    def cloneNode(self):
+        """Return a shallow copy of the current node i.e. a node with the same
+        name and attributes but with no parent or child nodes
+        """
+        raise NotImplementedError
+
+    def hasContent(self):
+        """Return true if the node has children or text, false otherwise
+        """
+        raise NotImplementedError
+
+
+class ActiveFormattingElements(list):
+    def append(self, node):
+        equalCount = 0
+        if node != Marker:
+            for element in self[::-1]:
+                if element == Marker:
+                    break
+                if self.nodesEqual(element, node):
+                    equalCount += 1
+                if equalCount == 3:
+                    self.remove(element)
+                    break
+        list.append(self, node)
+
+    def nodesEqual(self, node1, node2):
+        if not node1.nameTuple == node2.nameTuple:
+            return False
+
+        if not node1.attributes == node2.attributes:
+            return False
+
+        return True
+
+
+class TreeBuilder(object):
+    """Base treebuilder implementation
+
+    * documentClass - the class to use for the bottommost node of a document
+    * elementClass - the class to use for HTML Elements
+    * commentClass - the class to use for comments
+    * doctypeClass - the class to use for doctypes
+
+    """
+    # pylint:disable=not-callable
+
+    # Document class
+    documentClass = None
+
+    # The class to use for creating a node
+    elementClass = None
+
+    # The class to use for creating comments
+    commentClass = None
+
+    # The class to use for creating doctypes
+    doctypeClass = None
+
+    # Fragment class
+    fragmentClass = None
+
+    def __init__(self, namespaceHTMLElements):
+        """Create a TreeBuilder
+
+        :arg namespaceHTMLElements: whether or not to namespace HTML elements
+
+        """
+        if namespaceHTMLElements:
+            self.defaultNamespace = "http://www.w3.org/1999/xhtml"
+        else:
+            self.defaultNamespace = None
+        self.reset()
+
+    def reset(self):
+        self.openElements = []
+        self.activeFormattingElements = ActiveFormattingElements()
+
+        # XXX - rename these to headElement, formElement
+        self.headPointer = None
+        self.formPointer = None
+
+        self.insertFromTable = False
+
+        self.document = self.documentClass()
+
+    def elementInScope(self, target, variant=None):
+
+        # If we pass a node in we match that. if we pass a string
+        # match any node with that name
+        exactNode = hasattr(target, "nameTuple")
+        if not exactNode:
+            if isinstance(target, text_type):
+                target = (namespaces["html"], target)
+            assert isinstance(target, tuple)
+
+        listElements, invert = listElementsMap[variant]
+
+        for node in reversed(self.openElements):
+            if exactNode and node == target:
+                return True
+            elif not exactNode and node.nameTuple == target:
+                return True
+            elif (invert ^ (node.nameTuple in listElements)):
+                return False
+
+        assert False  # We should never reach this point
+
+    def reconstructActiveFormattingElements(self):
+        # Within this algorithm the order of steps described in the
+        # specification is not quite the same as the order of steps in the
+        # code. It should still do the same though.
+
+        # Step 1: stop the algorithm when there's nothing to do.
+        if not self.activeFormattingElements:
+            return
+
+        # Step 2 and step 3: we start with the last element. So i is -1.
+        i = len(self.activeFormattingElements) - 1
+        entry = self.activeFormattingElements[i]
+        if entry == Marker or entry in self.openElements:
+            return
+
+        # Step 6
+        while entry != Marker and entry not in self.openElements:
+            if i == 0:
+                # This will be reset to 0 below
+                i = -1
+                break
+            i -= 1
+            # Step 5: let entry be one earlier in the list.
+            entry = self.activeFormattingElements[i]
+
+        while True:
+            # Step 7
+            i += 1
+
+            # Step 8
+            entry = self.activeFormattingElements[i]
+            clone = entry.cloneNode()  # Mainly to get a new copy of the attributes
+
+            # Step 9
+            element = self.insertElement({"type": "StartTag",
+                                          "name": clone.name,
+                                          "namespace": clone.namespace,
+                                          "data": clone.attributes})
+
+            # Step 10
+            self.activeFormattingElements[i] = element
+
+            # Step 11
+            if element == self.activeFormattingElements[-1]:
+                break
+
+    def clearActiveFormattingElements(self):
+        entry = self.activeFormattingElements.pop()
+        while self.activeFormattingElements and entry != Marker:
+            entry = self.activeFormattingElements.pop()
+
+    def elementInActiveFormattingElements(self, name):
+        """Check if an element exists between the end of the active
+        formatting elements and the last marker. If it does, return it, else
+        return false"""
+
+        for item in self.activeFormattingElements[::-1]:
+            # Check for Marker first because if it's a Marker it doesn't have a
+            # name attribute.
+            if item == Marker:
+                break
+            elif item.name == name:
+                return item
+        return False
+
+    def insertRoot(self, token):
+        element = self.createElement(token)
+        self.openElements.append(element)
+        self.document.appendChild(element)
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        doctype = self.doctypeClass(name, publicId, systemId)
+        self.document.appendChild(doctype)
+
+    def insertComment(self, token, parent=None):
+        if parent is None:
+            parent = self.openElements[-1]
+        parent.appendChild(self.commentClass(token["data"]))
+
+    def createElement(self, token):
+        """Create an element but don't insert it anywhere"""
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        return element
+
+    def _getInsertFromTable(self):
+        return self._insertFromTable
+
+    def _setInsertFromTable(self, value):
+        """Switch the function used to insert an element from the
+        normal one to the misnested table one and back again"""
+        self._insertFromTable = value
+        if value:
+            self.insertElement = self.insertElementTable
+        else:
+            self.insertElement = self.insertElementNormal
+
+    insertFromTable = property(_getInsertFromTable, _setInsertFromTable)
+
+    def insertElementNormal(self, token):
+        name = token["name"]
+        assert isinstance(name, text_type), "Element %s not unicode" % name
+        namespace = token.get("namespace", self.defaultNamespace)
+        element = self.elementClass(name, namespace)
+        element.attributes = token["data"]
+        self.openElements[-1].appendChild(element)
+        self.openElements.append(element)
+        return element
+
+    def insertElementTable(self, token):
+        """Create an element and insert it into the tree"""
+        element = self.createElement(token)
+        if self.openElements[-1].name not in tableInsertModeElements:
+            return self.insertElementNormal(token)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            if insertBefore is None:
+                parent.appendChild(element)
+            else:
+                parent.insertBefore(element, insertBefore)
+            self.openElements.append(element)
+        return element
+
+    def insertText(self, data, parent=None):
+        """Insert text data."""
+        if parent is None:
+            parent = self.openElements[-1]
+
+        if (not self.insertFromTable or (self.insertFromTable and
+                                         self.openElements[-1].name
+                                         not in tableInsertModeElements)):
+            parent.insertText(data)
+        else:
+            # We should be in the InTable mode. This means we want to do
+            # special magic element rearranging
+            parent, insertBefore = self.getTableMisnestedNodePosition()
+            parent.insertText(data, insertBefore)
+
+    def getTableMisnestedNodePosition(self):
+        """Get the foster parent element, and sibling to insert before
+        (or None) when inserting a misnested table node"""
+        # The foster parent element is the one which comes before the most
+        # recently opened table element
+        # XXX - this is really inelegant
+        lastTable = None
+        fosterParent = None
+        insertBefore = None
+        for elm in self.openElements[::-1]:
+            if elm.name == "table":
+                lastTable = elm
+                break
+        if lastTable:
+            # XXX - we should really check that this parent is actually a
+            # node here
+            if lastTable.parent:
+                fosterParent = lastTable.parent
+                insertBefore = lastTable
+            else:
+                fosterParent = self.openElements[
+                    self.openElements.index(lastTable) - 1]
+        else:
+            fosterParent = self.openElements[0]
+        return fosterParent, insertBefore
+
+    def generateImpliedEndTags(self, exclude=None):
+        name = self.openElements[-1].name
+        # XXX td, th and tr are not actually needed
+        if (name in frozenset(("dd", "dt", "li", "option", "optgroup", "p", "rp", "rt")) and
+                name != exclude):
+            self.openElements.pop()
+            # XXX This is not entirely what the specification says. We should
+            # investigate it more closely.
+            self.generateImpliedEndTags(exclude)
+
+    def getDocument(self):
+        """Return the final tree"""
+        return self.document
+
+    def getFragment(self):
+        """Return the final fragment"""
+        # assert self.innerHTML
+        fragment = self.fragmentClass()
+        self.openElements[0].reparentChildren(fragment)
+        return fragment
+
+    def testSerializer(self, node):
+        """Serialize the subtree of node in the format required by unit tests
+
+        :arg node: the node from which to start serializing
+
+        """
+        raise NotImplementedError
diff --git a/libs/html5lib/treebuilders/dom.py b/libs/html5lib/treebuilders/dom.py
new file mode 100644
index 000000000..dcfac220b
--- /dev/null
+++ b/libs/html5lib/treebuilders/dom.py
@@ -0,0 +1,236 @@
+from __future__ import absolute_import, division, unicode_literals
+
+
+from collections import MutableMapping
+from xml.dom import minidom, Node
+import weakref
+
+from . import base
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+
+def getDomBuilder(DomImplementation):
+    Dom = DomImplementation
+
+    class AttrList(MutableMapping):
+        def __init__(self, element):
+            self.element = element
+
+        def __iter__(self):
+            return iter(self.element.attributes.keys())
+
+        def __setitem__(self, name, value):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                attr = self.element.ownerDocument.createAttribute(name)
+                attr.value = value
+                self.element.attributes[name] = attr
+
+        def __len__(self):
+            return len(self.element.attributes)
+
+        def items(self):
+            return list(self.element.attributes.items())
+
+        def values(self):
+            return list(self.element.attributes.values())
+
+        def __getitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                return self.element.attributes[name].value
+
+        def __delitem__(self, name):
+            if isinstance(name, tuple):
+                raise NotImplementedError
+            else:
+                del self.element.attributes[name]
+
+    class NodeBuilder(base.Node):
+        def __init__(self, element):
+            base.Node.__init__(self, element.nodeName)
+            self.element = element
+
+        namespace = property(lambda self: hasattr(self.element, "namespaceURI") and
+                             self.element.namespaceURI or None)
+
+        def appendChild(self, node):
+            node.parent = self
+            self.element.appendChild(node.element)
+
+        def insertText(self, data, insertBefore=None):
+            text = self.element.ownerDocument.createTextNode(data)
+            if insertBefore:
+                self.element.insertBefore(text, insertBefore.element)
+            else:
+                self.element.appendChild(text)
+
+        def insertBefore(self, node, refNode):
+            self.element.insertBefore(node.element, refNode.element)
+            node.parent = self
+
+        def removeChild(self, node):
+            if node.element.parentNode == self.element:
+                self.element.removeChild(node.element)
+            node.parent = None
+
+        def reparentChildren(self, newParent):
+            while self.element.hasChildNodes():
+                child = self.element.firstChild
+                self.element.removeChild(child)
+                newParent.element.appendChild(child)
+            self.childNodes = []
+
+        def getAttributes(self):
+            return AttrList(self.element)
+
+        def setAttributes(self, attributes):
+            if attributes:
+                for name, value in list(attributes.items()):
+                    if isinstance(name, tuple):
+                        if name[0] is not None:
+                            qualifiedName = (name[0] + ":" + name[1])
+                        else:
+                            qualifiedName = name[1]
+                        self.element.setAttributeNS(name[2], qualifiedName,
+                                                    value)
+                    else:
+                        self.element.setAttribute(
+                            name, value)
+        attributes = property(getAttributes, setAttributes)
+
+        def cloneNode(self):
+            return NodeBuilder(self.element.cloneNode(False))
+
+        def hasContent(self):
+            return self.element.hasChildNodes()
+
+        def getNameTuple(self):
+            if self.namespace is None:
+                return namespaces["html"], self.name
+            else:
+                return self.namespace, self.name
+
+        nameTuple = property(getNameTuple)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        def documentClass(self):
+            self.dom = Dom.getDOMImplementation().createDocument(None, None, None)
+            return weakref.proxy(self)
+
+        def insertDoctype(self, token):
+            name = token["name"]
+            publicId = token["publicId"]
+            systemId = token["systemId"]
+
+            domimpl = Dom.getDOMImplementation()
+            doctype = domimpl.createDocumentType(name, publicId, systemId)
+            self.document.appendChild(NodeBuilder(doctype))
+            if Dom == minidom:
+                doctype.ownerDocument = self.dom
+
+        def elementClass(self, name, namespace=None):
+            if namespace is None and self.defaultNamespace is None:
+                node = self.dom.createElement(name)
+            else:
+                node = self.dom.createElementNS(namespace, name)
+
+            return NodeBuilder(node)
+
+        def commentClass(self, data):
+            return NodeBuilder(self.dom.createComment(data))
+
+        def fragmentClass(self):
+            return NodeBuilder(self.dom.createDocumentFragment())
+
+        def appendChild(self, node):
+            self.dom.appendChild(node.element)
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            return self.dom
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self).element
+
+        def insertText(self, data, parent=None):
+            data = data
+            if parent != self:
+                base.TreeBuilder.insertText(self, data, parent)
+            else:
+                # HACK: allow text nodes as children of the document node
+                if hasattr(self.dom, '_child_node_types'):
+                    # pylint:disable=protected-access
+                    if Node.TEXT_NODE not in self.dom._child_node_types:
+                        self.dom._child_node_types = list(self.dom._child_node_types)
+                        self.dom._child_node_types.append(Node.TEXT_NODE)
+                self.dom.appendChild(self.dom.createTextNode(data))
+
+        implementation = DomImplementation
+        name = None
+
+    def testSerializer(element):
+        element.normalize()
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if element.nodeType == Node.DOCUMENT_TYPE_NODE:
+                if element.name:
+                    if element.publicId or element.systemId:
+                        publicId = element.publicId or ""
+                        systemId = element.systemId or ""
+                        rv.append("""|%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (' ' * indent, element.name, publicId, systemId))
+                    else:
+                        rv.append("|%s<!DOCTYPE %s>" % (' ' * indent, element.name))
+                else:
+                    rv.append("|%s<!DOCTYPE >" % (' ' * indent,))
+            elif element.nodeType == Node.DOCUMENT_NODE:
+                rv.append("#document")
+            elif element.nodeType == Node.DOCUMENT_FRAGMENT_NODE:
+                rv.append("#document-fragment")
+            elif element.nodeType == Node.COMMENT_NODE:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.nodeValue))
+            elif element.nodeType == Node.TEXT_NODE:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.nodeValue))
+            else:
+                if (hasattr(element, "namespaceURI") and
+                        element.namespaceURI is not None):
+                    name = "%s %s" % (constants.prefixes[element.namespaceURI],
+                                      element.nodeName)
+                else:
+                    name = element.nodeName
+                rv.append("|%s<%s>" % (' ' * indent, name))
+                if element.hasAttributes():
+                    attributes = []
+                    for i in range(len(element.attributes)):
+                        attr = element.attributes.item(i)
+                        name = attr.nodeName
+                        value = attr.value
+                        ns = attr.namespaceURI
+                        if ns:
+                            name = "%s %s" % (constants.prefixes[ns], attr.localName)
+                        else:
+                            name = attr.nodeName
+                        attributes.append((name, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+            indent += 2
+            for child in element.childNodes:
+                serializeElement(child, indent)
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    return locals()
+
+
+# The actual means to get a module!
+getDomModule = moduleFactoryFactory(getDomBuilder)
diff --git a/libs/html5lib/treebuilders/etree.py b/libs/html5lib/treebuilders/etree.py
new file mode 100644
index 000000000..cb1d4aef5
--- /dev/null
+++ b/libs/html5lib/treebuilders/etree.py
@@ -0,0 +1,340 @@
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+from six import text_type
+
+import re
+
+from . import base
+from .. import _ihatexml
+from .. import constants
+from ..constants import namespaces
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation, fullTree=False):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class Element(base.Node):
+        def __init__(self, name, namespace=None):
+            self._name = name
+            self._namespace = namespace
+            self._element = ElementTree.Element(self._getETreeTag(name,
+                                                                  namespace))
+            if namespace is None:
+                self.nameTuple = namespaces["html"], self._name
+            else:
+                self.nameTuple = self._namespace, self._name
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getETreeTag(self, name, namespace):
+            if namespace is None:
+                etree_tag = name
+            else:
+                etree_tag = "{%s}%s" % (namespace, name)
+            return etree_tag
+
+        def _setName(self, name):
+            self._name = name
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getName(self):
+            return self._name
+
+        name = property(_getName, _setName)
+
+        def _setNamespace(self, namespace):
+            self._namespace = namespace
+            self._element.tag = self._getETreeTag(self._name, self._namespace)
+
+        def _getNamespace(self):
+            return self._namespace
+
+        namespace = property(_getNamespace, _setNamespace)
+
+        def _getAttributes(self):
+            return self._element.attrib
+
+        def _setAttributes(self, attributes):
+            # Delete existing attributes first
+            # XXX - there may be a better way to do this...
+            for key in list(self._element.attrib.keys()):
+                del self._element.attrib[key]
+            for key, value in attributes.items():
+                if isinstance(key, tuple):
+                    name = "{%s}%s" % (key[2], key[1])
+                else:
+                    name = key
+                self._element.set(name, value)
+
+        attributes = property(_getAttributes, _setAttributes)
+
+        def _getChildNodes(self):
+            return self._childNodes
+
+        def _setChildNodes(self, value):
+            del self._element[:]
+            self._childNodes = []
+            for element in value:
+                self.insertChild(element)
+
+        childNodes = property(_getChildNodes, _setChildNodes)
+
+        def hasContent(self):
+            """Return true if the node has children or text"""
+            return bool(self._element.text or len(self._element))
+
+        def appendChild(self, node):
+            self._childNodes.append(node)
+            self._element.append(node._element)
+            node.parent = self
+
+        def insertBefore(self, node, refNode):
+            index = list(self._element).index(refNode._element)
+            self._element.insert(index, node._element)
+            node.parent = self
+
+        def removeChild(self, node):
+            self._childNodes.remove(node)
+            self._element.remove(node._element)
+            node.parent = None
+
+        def insertText(self, data, insertBefore=None):
+            if not(len(self._element)):
+                if not self._element.text:
+                    self._element.text = ""
+                self._element.text += data
+            elif insertBefore is None:
+                # Insert the text as the tail of the last child element
+                if not self._element[-1].tail:
+                    self._element[-1].tail = ""
+                self._element[-1].tail += data
+            else:
+                # Insert the text before the specified node
+                children = list(self._element)
+                index = children.index(insertBefore._element)
+                if index > 0:
+                    if not self._element[index - 1].tail:
+                        self._element[index - 1].tail = ""
+                    self._element[index - 1].tail += data
+                else:
+                    if not self._element.text:
+                        self._element.text = ""
+                    self._element.text += data
+
+        def cloneNode(self):
+            element = type(self)(self.name, self.namespace)
+            for name, value in self.attributes.items():
+                element.attributes[name] = value
+            return element
+
+        def reparentChildren(self, newParent):
+            if newParent.childNodes:
+                newParent.childNodes[-1]._element.tail += self._element.text
+            else:
+                if not newParent._element.text:
+                    newParent._element.text = ""
+                if self._element.text is not None:
+                    newParent._element.text += self._element.text
+            self._element.text = ""
+            base.Node.reparentChildren(self, newParent)
+
+    class Comment(Element):
+        def __init__(self, data):
+            # Use the superclass constructor to set all properties on the
+            # wrapper element
+            self._element = ElementTree.Comment(data)
+            self.parent = None
+            self._childNodes = []
+            self._flags = []
+
+        def _getData(self):
+            return self._element.text
+
+        def _setData(self, value):
+            self._element.text = value
+
+        data = property(_getData, _setData)
+
+    class DocumentType(Element):
+        def __init__(self, name, publicId, systemId):
+            Element.__init__(self, "<!DOCTYPE>")
+            self._element.text = name
+            self.publicId = publicId
+            self.systemId = systemId
+
+        def _getPublicId(self):
+            return self._element.get("publicId", "")
+
+        def _setPublicId(self, value):
+            if value is not None:
+                self._element.set("publicId", value)
+
+        publicId = property(_getPublicId, _setPublicId)
+
+        def _getSystemId(self):
+            return self._element.get("systemId", "")
+
+        def _setSystemId(self, value):
+            if value is not None:
+                self._element.set("systemId", value)
+
+        systemId = property(_getSystemId, _setSystemId)
+
+    class Document(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_ROOT")
+
+    class DocumentFragment(Element):
+        def __init__(self):
+            Element.__init__(self, "DOCUMENT_FRAGMENT")
+
+    def testSerializer(element):
+        rv = []
+
+        def serializeElement(element, indent=0):
+            if not(hasattr(element, "tag")):
+                element = element.getroot()
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                rv.append("#document")
+                if element.text is not None:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+            elif element.tag == ElementTreeCommentType:
+                rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            else:
+                assert isinstance(element.tag, text_type), \
+                    "Expected unicode, got %s, %s" % (type(element.tag), element.tag)
+                nsmatch = tag_regexp.match(element.tag)
+
+                if nsmatch is None:
+                    name = element.tag
+                else:
+                    ns, name = nsmatch.groups()
+                    prefix = constants.prefixes[ns]
+                    name = "%s %s" % (prefix, name)
+                rv.append("|%s<%s>" % (' ' * indent, name))
+
+                if hasattr(element, "attrib"):
+                    attributes = []
+                    for name, value in element.attrib.items():
+                        nsmatch = tag_regexp.match(name)
+                        if nsmatch is not None:
+                            ns, name = nsmatch.groups()
+                            prefix = constants.prefixes[ns]
+                            attr_string = "%s %s" % (prefix, name)
+                        else:
+                            attr_string = name
+                        attributes.append((attr_string, value))
+
+                    for name, value in sorted(attributes):
+                        rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+                if element.text:
+                    rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+        serializeElement(element, 0)
+
+        return "\n".join(rv)
+
+    def tostring(element):  # pylint:disable=unused-variable
+        """Serialize an element and its child nodes to a string"""
+        rv = []
+        filter = _ihatexml.InfosetFilter()
+
+        def serializeElement(element):
+            if isinstance(element, ElementTree.ElementTree):
+                element = element.getroot()
+
+            if element.tag == "<!DOCTYPE>":
+                if element.get("publicId") or element.get("systemId"):
+                    publicId = element.get("publicId") or ""
+                    systemId = element.get("systemId") or ""
+                    rv.append("""<!DOCTYPE %s PUBLIC "%s" "%s">""" %
+                              (element.text, publicId, systemId))
+                else:
+                    rv.append("<!DOCTYPE %s>" % (element.text,))
+            elif element.tag == "DOCUMENT_ROOT":
+                if element.text is not None:
+                    rv.append(element.text)
+                if element.tail is not None:
+                    raise TypeError("Document node cannot have tail")
+                if hasattr(element, "attrib") and len(element.attrib):
+                    raise TypeError("Document node cannot have attributes")
+
+                for child in element:
+                    serializeElement(child)
+
+            elif element.tag == ElementTreeCommentType:
+                rv.append("<!--%s-->" % (element.text,))
+            else:
+                # This is assumed to be an ordinary element
+                if not element.attrib:
+                    rv.append("<%s>" % (filter.fromXmlName(element.tag),))
+                else:
+                    attr = " ".join(["%s=\"%s\"" % (
+                        filter.fromXmlName(name), value)
+                        for name, value in element.attrib.items()])
+                    rv.append("<%s %s>" % (element.tag, attr))
+                if element.text:
+                    rv.append(element.text)
+
+                for child in element:
+                    serializeElement(child)
+
+                rv.append("</%s>" % (element.tag,))
+
+            if element.tail:
+                rv.append(element.tail)
+
+        serializeElement(element)
+
+        return "".join(rv)
+
+    class TreeBuilder(base.TreeBuilder):  # pylint:disable=unused-variable
+        documentClass = Document
+        doctypeClass = DocumentType
+        elementClass = Element
+        commentClass = Comment
+        fragmentClass = DocumentFragment
+        implementation = ElementTreeImplementation
+
+        def testSerializer(self, element):
+            return testSerializer(element)
+
+        def getDocument(self):
+            if fullTree:
+                return self.document._element
+            else:
+                if self.defaultNamespace is not None:
+                    return self.document._element.find(
+                        "{%s}html" % self.defaultNamespace)
+                else:
+                    return self.document._element.find("html")
+
+        def getFragment(self):
+            return base.TreeBuilder.getFragment(self)._element
+
+    return locals()
+
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/libs/html5lib/treebuilders/etree_lxml.py b/libs/html5lib/treebuilders/etree_lxml.py
new file mode 100644
index 000000000..ca12a99cc
--- /dev/null
+++ b/libs/html5lib/treebuilders/etree_lxml.py
@@ -0,0 +1,366 @@
+"""Module for supporting the lxml.etree library. The idea here is to use as much
+of the native library as possible, without using fragile hacks like custom element
+names that break between releases. The downside of this is that we cannot represent
+all possible trees; specifically the following are known to cause problems:
+
+Text or comments as siblings of the root element
+Docypes with no name
+
+When any of these things occur, we emit a DataLossWarning
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+# pylint:disable=protected-access
+
+import warnings
+import re
+import sys
+
+from . import base
+from ..constants import DataLossWarning
+from .. import constants
+from . import etree as etree_builders
+from .. import _ihatexml
+
+import lxml.etree as etree
+
+
+fullTree = True
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+comment_type = etree.Comment("asd").tag
+
+
+class DocumentType(object):
+    def __init__(self, name, publicId, systemId):
+        self.name = name
+        self.publicId = publicId
+        self.systemId = systemId
+
+
+class Document(object):
+    def __init__(self):
+        self._elementTree = None
+        self._childNodes = []
+
+    def appendChild(self, element):
+        self._elementTree.getroot().addnext(element._element)
+
+    def _getChildNodes(self):
+        return self._childNodes
+
+    childNodes = property(_getChildNodes)
+
+
+def testSerializer(element):
+    rv = []
+    infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+
+    def serializeElement(element, indent=0):
+        if not hasattr(element, "tag"):
+            if hasattr(element, "getroot"):
+                # Full tree case
+                rv.append("#document")
+                if element.docinfo.internalDTD:
+                    if not (element.docinfo.public_id or
+                            element.docinfo.system_url):
+                        dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                    else:
+                        dtd_str = """<!DOCTYPE %s "%s" "%s">""" % (
+                            element.docinfo.root_name,
+                            element.docinfo.public_id,
+                            element.docinfo.system_url)
+                    rv.append("|%s%s" % (' ' * (indent + 2), dtd_str))
+                next_element = element.getroot()
+                while next_element.getprevious() is not None:
+                    next_element = next_element.getprevious()
+                while next_element is not None:
+                    serializeElement(next_element, indent + 2)
+                    next_element = next_element.getnext()
+            elif isinstance(element, str) or isinstance(element, bytes):
+                # Text in a fragment
+                assert isinstance(element, str) or sys.version_info[0] == 2
+                rv.append("|%s\"%s\"" % (' ' * indent, element))
+            else:
+                # Fragment case
+                rv.append("#document-fragment")
+                for next_element in element:
+                    serializeElement(next_element, indent + 2)
+        elif element.tag == comment_type:
+            rv.append("|%s<!-- %s -->" % (' ' * indent, element.text))
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * indent, element.tail))
+        else:
+            assert isinstance(element, etree._Element)
+            nsmatch = etree_builders.tag_regexp.match(element.tag)
+            if nsmatch is not None:
+                ns = nsmatch.group(1)
+                tag = nsmatch.group(2)
+                prefix = constants.prefixes[ns]
+                rv.append("|%s<%s %s>" % (' ' * indent, prefix,
+                                          infosetFilter.fromXmlName(tag)))
+            else:
+                rv.append("|%s<%s>" % (' ' * indent,
+                                       infosetFilter.fromXmlName(element.tag)))
+
+            if hasattr(element, "attrib"):
+                attributes = []
+                for name, value in element.attrib.items():
+                    nsmatch = tag_regexp.match(name)
+                    if nsmatch is not None:
+                        ns, name = nsmatch.groups()
+                        name = infosetFilter.fromXmlName(name)
+                        prefix = constants.prefixes[ns]
+                        attr_string = "%s %s" % (prefix, name)
+                    else:
+                        attr_string = infosetFilter.fromXmlName(name)
+                    attributes.append((attr_string, value))
+
+                for name, value in sorted(attributes):
+                    rv.append('|%s%s="%s"' % (' ' * (indent + 2), name, value))
+
+            if element.text:
+                rv.append("|%s\"%s\"" % (' ' * (indent + 2), element.text))
+            indent += 2
+            for child in element:
+                serializeElement(child, indent)
+            if hasattr(element, "tail") and element.tail:
+                rv.append("|%s\"%s\"" % (' ' * (indent - 2), element.tail))
+    serializeElement(element, 0)
+
+    return "\n".join(rv)
+
+
+def tostring(element):
+    """Serialize an element and its child nodes to a string"""
+    rv = []
+
+    def serializeElement(element):
+        if not hasattr(element, "tag"):
+            if element.docinfo.internalDTD:
+                if element.docinfo.doctype:
+                    dtd_str = element.docinfo.doctype
+                else:
+                    dtd_str = "<!DOCTYPE %s>" % element.docinfo.root_name
+                rv.append(dtd_str)
+            serializeElement(element.getroot())
+
+        elif element.tag == comment_type:
+            rv.append("<!--%s-->" % (element.text,))
+
+        else:
+            # This is assumed to be an ordinary element
+            if not element.attrib:
+                rv.append("<%s>" % (element.tag,))
+            else:
+                attr = " ".join(["%s=\"%s\"" % (name, value)
+                                 for name, value in element.attrib.items()])
+                rv.append("<%s %s>" % (element.tag, attr))
+            if element.text:
+                rv.append(element.text)
+
+            for child in element:
+                serializeElement(child)
+
+            rv.append("</%s>" % (element.tag,))
+
+        if hasattr(element, "tail") and element.tail:
+            rv.append(element.tail)
+
+    serializeElement(element)
+
+    return "".join(rv)
+
+
+class TreeBuilder(base.TreeBuilder):
+    documentClass = Document
+    doctypeClass = DocumentType
+    elementClass = None
+    commentClass = None
+    fragmentClass = Document
+    implementation = etree
+
+    def __init__(self, namespaceHTMLElements, fullTree=False):
+        builder = etree_builders.getETreeModule(etree, fullTree=fullTree)
+        infosetFilter = self.infosetFilter = _ihatexml.InfosetFilter(preventDoubleDashComments=True)
+        self.namespaceHTMLElements = namespaceHTMLElements
+
+        class Attributes(dict):
+            def __init__(self, element, value=None):
+                if value is None:
+                    value = {}
+                self._element = element
+                dict.__init__(self, value)  # pylint:disable=non-parent-init-called
+                for key, value in self.items():
+                    if isinstance(key, tuple):
+                        name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
+                    else:
+                        name = infosetFilter.coerceAttribute(key)
+                    self._element._element.attrib[name] = value
+
+            def __setitem__(self, key, value):
+                dict.__setitem__(self, key, value)
+                if isinstance(key, tuple):
+                    name = "{%s}%s" % (key[2], infosetFilter.coerceAttribute(key[1]))
+                else:
+                    name = infosetFilter.coerceAttribute(key)
+                self._element._element.attrib[name] = value
+
+        class Element(builder.Element):
+            def __init__(self, name, namespace):
+                name = infosetFilter.coerceElement(name)
+                builder.Element.__init__(self, name, namespace=namespace)
+                self._attributes = Attributes(self)
+
+            def _setName(self, name):
+                self._name = infosetFilter.coerceElement(name)
+                self._element.tag = self._getETreeTag(
+                    self._name, self._namespace)
+
+            def _getName(self):
+                return infosetFilter.fromXmlName(self._name)
+
+            name = property(_getName, _setName)
+
+            def _getAttributes(self):
+                return self._attributes
+
+            def _setAttributes(self, attributes):
+                self._attributes = Attributes(self, attributes)
+
+            attributes = property(_getAttributes, _setAttributes)
+
+            def insertText(self, data, insertBefore=None):
+                data = infosetFilter.coerceCharacters(data)
+                builder.Element.insertText(self, data, insertBefore)
+
+            def appendChild(self, child):
+                builder.Element.appendChild(self, child)
+
+        class Comment(builder.Comment):
+            def __init__(self, data):
+                data = infosetFilter.coerceComment(data)
+                builder.Comment.__init__(self, data)
+
+            def _setData(self, data):
+                data = infosetFilter.coerceComment(data)
+                self._element.text = data
+
+            def _getData(self):
+                return self._element.text
+
+            data = property(_getData, _setData)
+
+        self.elementClass = Element
+        self.commentClass = Comment
+        # self.fragmentClass = builder.DocumentFragment
+        base.TreeBuilder.__init__(self, namespaceHTMLElements)
+
+    def reset(self):
+        base.TreeBuilder.reset(self)
+        self.insertComment = self.insertCommentInitial
+        self.initial_comments = []
+        self.doctype = None
+
+    def testSerializer(self, element):
+        return testSerializer(element)
+
+    def getDocument(self):
+        if fullTree:
+            return self.document._elementTree
+        else:
+            return self.document._elementTree.getroot()
+
+    def getFragment(self):
+        fragment = []
+        element = self.openElements[0]._element
+        if element.text:
+            fragment.append(element.text)
+        fragment.extend(list(element))
+        if element.tail:
+            fragment.append(element.tail)
+        return fragment
+
+    def insertDoctype(self, token):
+        name = token["name"]
+        publicId = token["publicId"]
+        systemId = token["systemId"]
+
+        if not name:
+            warnings.warn("lxml cannot represent empty doctype", DataLossWarning)
+            self.doctype = None
+        else:
+            coercedName = self.infosetFilter.coerceElement(name)
+            if coercedName != name:
+                warnings.warn("lxml cannot represent non-xml doctype", DataLossWarning)
+
+            doctype = self.doctypeClass(coercedName, publicId, systemId)
+            self.doctype = doctype
+
+    def insertCommentInitial(self, data, parent=None):
+        assert parent is None or parent is self.document
+        assert self.document._elementTree is None
+        self.initial_comments.append(data)
+
+    def insertCommentMain(self, data, parent=None):
+        if (parent == self.document and
+                self.document._elementTree.getroot()[-1].tag == comment_type):
+            warnings.warn("lxml cannot represent adjacent comments beyond the root elements", DataLossWarning)
+        super(TreeBuilder, self).insertComment(data, parent)
+
+    def insertRoot(self, token):
+        # Because of the way libxml2 works, it doesn't seem to be possible to
+        # alter information like the doctype after the tree has been parsed.
+        # Therefore we need to use the built-in parser to create our initial
+        # tree, after which we can add elements like normal
+        docStr = ""
+        if self.doctype:
+            assert self.doctype.name
+            docStr += "<!DOCTYPE %s" % self.doctype.name
+            if (self.doctype.publicId is not None or
+                    self.doctype.systemId is not None):
+                docStr += (' PUBLIC "%s" ' %
+                           (self.infosetFilter.coercePubid(self.doctype.publicId or "")))
+                if self.doctype.systemId:
+                    sysid = self.doctype.systemId
+                    if sysid.find("'") >= 0 and sysid.find('"') >= 0:
+                        warnings.warn("DOCTYPE system cannot contain single and double quotes", DataLossWarning)
+                        sysid = sysid.replace("'", 'U00027')
+                    if sysid.find("'") >= 0:
+                        docStr += '"%s"' % sysid
+                    else:
+                        docStr += "'%s'" % sysid
+                else:
+                    docStr += "''"
+            docStr += ">"
+            if self.doctype.name != token["name"]:
+                warnings.warn("lxml cannot represent doctype with a different name to the root element", DataLossWarning)
+        docStr += "<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>"
+        root = etree.fromstring(docStr)
+
+        # Append the initial comments:
+        for comment_token in self.initial_comments:
+            comment = self.commentClass(comment_token["data"])
+            root.addprevious(comment._element)
+
+        # Create the root document and add the ElementTree to it
+        self.document = self.documentClass()
+        self.document._elementTree = root.getroottree()
+
+        # Give the root element the right name
+        name = token["name"]
+        namespace = token.get("namespace", self.defaultNamespace)
+        if namespace is None:
+            etree_tag = name
+        else:
+            etree_tag = "{%s}%s" % (namespace, name)
+        root.tag = etree_tag
+
+        # Add the root element to the internal child/open data structures
+        root_element = self.elementClass(name, namespace)
+        root_element._element = root
+        self.document._childNodes.append(root_element)
+        self.openElements.append(root_element)
+
+        # Reset to the default insert comment function
+        self.insertComment = self.insertCommentMain
diff --git a/libs/html5lib/treewalkers/__init__.py b/libs/html5lib/treewalkers/__init__.py
new file mode 100644
index 000000000..9bec2076f
--- /dev/null
+++ b/libs/html5lib/treewalkers/__init__.py
@@ -0,0 +1,154 @@
+"""A collection of modules for iterating through different kinds of
+tree, generating tokens identical to those produced by the tokenizer
+module.
+
+To create a tree walker for a new type of tree, you need to do
+implement a tree walker object (called TreeWalker by convention) that
+implements a 'serialize' method taking a tree as sole argument and
+returning an iterator generating tokens.
+"""
+
+from __future__ import absolute_import, division, unicode_literals
+
+from .. import constants
+from .._utils import default_etree
+
+__all__ = ["getTreeWalker", "pprint"]
+
+treeWalkerCache = {}
+
+
+def getTreeWalker(treeType, implementation=None, **kwargs):
+    """Get a TreeWalker class for various types of tree with built-in support
+
+    :arg str treeType: the name of the tree type required (case-insensitive).
+        Supported values are:
+
+        * "dom": The xml.dom.minidom DOM implementation
+        * "etree": A generic walker for tree implementations exposing an
+          elementtree-like interface (known to work with ElementTree,
+          cElementTree and lxml.etree).
+        * "lxml": Optimized walker for lxml.etree
+        * "genshi": a Genshi stream
+
+    :arg implementation: A module implementing the tree type e.g.
+        xml.etree.ElementTree or cElementTree (Currently applies to the "etree"
+        tree type only).
+
+    :arg kwargs: keyword arguments passed to the etree walker--for other
+        walkers, this has no effect
+
+    :returns: a TreeWalker class
+
+    """
+
+    treeType = treeType.lower()
+    if treeType not in treeWalkerCache:
+        if treeType == "dom":
+            from . import dom
+            treeWalkerCache[treeType] = dom.TreeWalker
+        elif treeType == "genshi":
+            from . import genshi
+            treeWalkerCache[treeType] = genshi.TreeWalker
+        elif treeType == "lxml":
+            from . import etree_lxml
+            treeWalkerCache[treeType] = etree_lxml.TreeWalker
+        elif treeType == "etree":
+            from . import etree
+            if implementation is None:
+                implementation = default_etree
+            # XXX: NEVER cache here, caching is done in the etree submodule
+            return etree.getETreeModule(implementation, **kwargs).TreeWalker
+    return treeWalkerCache.get(treeType)
+
+
+def concatenateCharacterTokens(tokens):
+    pendingCharacters = []
+    for token in tokens:
+        type = token["type"]
+        if type in ("Characters", "SpaceCharacters"):
+            pendingCharacters.append(token["data"])
+        else:
+            if pendingCharacters:
+                yield {"type": "Characters", "data": "".join(pendingCharacters)}
+                pendingCharacters = []
+            yield token
+    if pendingCharacters:
+        yield {"type": "Characters", "data": "".join(pendingCharacters)}
+
+
+def pprint(walker):
+    """Pretty printer for tree walkers
+
+    Takes a TreeWalker instance and pretty prints the output of walking the tree.
+
+    :arg walker: a TreeWalker instance
+
+    """
+    output = []
+    indent = 0
+    for token in concatenateCharacterTokens(walker):
+        type = token["type"]
+        if type in ("StartTag", "EmptyTag"):
+            # tag name
+            if token["namespace"] and token["namespace"] != constants.namespaces["html"]:
+                if token["namespace"] in constants.prefixes:
+                    ns = constants.prefixes[token["namespace"]]
+                else:
+                    ns = token["namespace"]
+                name = "%s %s" % (ns, token["name"])
+            else:
+                name = token["name"]
+            output.append("%s<%s>" % (" " * indent, name))
+            indent += 2
+            # attributes (sorted for consistent ordering)
+            attrs = token["data"]
+            for (namespace, localname), value in sorted(attrs.items()):
+                if namespace:
+                    if namespace in constants.prefixes:
+                        ns = constants.prefixes[namespace]
+                    else:
+                        ns = namespace
+                    name = "%s %s" % (ns, localname)
+                else:
+                    name = localname
+                output.append("%s%s=\"%s\"" % (" " * indent, name, value))
+            # self-closing
+            if type == "EmptyTag":
+                indent -= 2
+
+        elif type == "EndTag":
+            indent -= 2
+
+        elif type == "Comment":
+            output.append("%s<!-- %s -->" % (" " * indent, token["data"]))
+
+        elif type == "Doctype":
+            if token["name"]:
+                if token["publicId"]:
+                    output.append("""%s<!DOCTYPE %s "%s" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["publicId"],
+                                   token["systemId"] if token["systemId"] else ""))
+                elif token["systemId"]:
+                    output.append("""%s<!DOCTYPE %s "" "%s">""" %
+                                  (" " * indent,
+                                   token["name"],
+                                   token["systemId"]))
+                else:
+                    output.append("%s<!DOCTYPE %s>" % (" " * indent,
+                                                       token["name"]))
+            else:
+                output.append("%s<!DOCTYPE >" % (" " * indent,))
+
+        elif type == "Characters":
+            output.append("%s\"%s\"" % (" " * indent, token["data"]))
+
+        elif type == "SpaceCharacters":
+            assert False, "concatenateCharacterTokens should have got rid of all Space tokens"
+
+        else:
+            raise ValueError("Unknown token type, %s" % type)
+
+    return "\n".join(output)
diff --git a/libs/html5lib/treewalkers/base.py b/libs/html5lib/treewalkers/base.py
new file mode 100644
index 000000000..80c474c4e
--- /dev/null
+++ b/libs/html5lib/treewalkers/base.py
@@ -0,0 +1,252 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+from ..constants import namespaces, voidElements, spaceCharacters
+
+__all__ = ["DOCUMENT", "DOCTYPE", "TEXT", "ELEMENT", "COMMENT", "ENTITY", "UNKNOWN",
+           "TreeWalker", "NonRecursiveTreeWalker"]
+
+DOCUMENT = Node.DOCUMENT_NODE
+DOCTYPE = Node.DOCUMENT_TYPE_NODE
+TEXT = Node.TEXT_NODE
+ELEMENT = Node.ELEMENT_NODE
+COMMENT = Node.COMMENT_NODE
+ENTITY = Node.ENTITY_NODE
+UNKNOWN = "<#UNKNOWN#>"
+
+spaceCharacters = "".join(spaceCharacters)
+
+
+class TreeWalker(object):
+    """Walks a tree yielding tokens
+
+    Tokens are dicts that all have a ``type`` field specifying the type of the
+    token.
+
+    """
+    def __init__(self, tree):
+        """Creates a TreeWalker
+
+        :arg tree: the tree to walk
+
+        """
+        self.tree = tree
+
+    def __iter__(self):
+        raise NotImplementedError
+
+    def error(self, msg):
+        """Generates an error token with the given message
+
+        :arg msg: the error message
+
+        :returns: SerializeError token
+
+        """
+        return {"type": "SerializeError", "data": msg}
+
+    def emptyTag(self, namespace, name, attrs, hasChildren=False):
+        """Generates an EmptyTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :arg attrs: the attributes of the element as a dict
+
+        :arg hasChildren: whether or not to yield a SerializationError because
+            this tag shouldn't have children
+
+        :returns: EmptyTag token
+
+        """
+        yield {"type": "EmptyTag", "name": name,
+               "namespace": namespace,
+               "data": attrs}
+        if hasChildren:
+            yield self.error("Void element has children")
+
+    def startTag(self, namespace, name, attrs):
+        """Generates a StartTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :arg attrs: the attributes of the element as a dict
+
+        :returns: StartTag token
+
+        """
+        return {"type": "StartTag",
+                "name": name,
+                "namespace": namespace,
+                "data": attrs}
+
+    def endTag(self, namespace, name):
+        """Generates an EndTag token
+
+        :arg namespace: the namespace of the token--can be ``None``
+
+        :arg name: the name of the element
+
+        :returns: EndTag token
+
+        """
+        return {"type": "EndTag",
+                "name": name,
+                "namespace": namespace}
+
+    def text(self, data):
+        """Generates SpaceCharacters and Characters tokens
+
+        Depending on what's in the data, this generates one or more
+        ``SpaceCharacters`` and ``Characters`` tokens.
+
+        For example:
+
+            >>> from html5lib.treewalkers.base import TreeWalker
+            >>> # Give it an empty tree just so it instantiates
+            >>> walker = TreeWalker([])
+            >>> list(walker.text(''))
+            []
+            >>> list(walker.text('  '))
+            [{u'data': '  ', u'type': u'SpaceCharacters'}]
+            >>> list(walker.text(' abc '))  # doctest: +NORMALIZE_WHITESPACE
+            [{u'data': ' ', u'type': u'SpaceCharacters'},
+            {u'data': u'abc', u'type': u'Characters'},
+            {u'data': u' ', u'type': u'SpaceCharacters'}]
+
+        :arg data: the text data
+
+        :returns: one or more ``SpaceCharacters`` and ``Characters`` tokens
+
+        """
+        data = data
+        middle = data.lstrip(spaceCharacters)
+        left = data[:len(data) - len(middle)]
+        if left:
+            yield {"type": "SpaceCharacters", "data": left}
+        data = middle
+        middle = data.rstrip(spaceCharacters)
+        right = data[len(middle):]
+        if middle:
+            yield {"type": "Characters", "data": middle}
+        if right:
+            yield {"type": "SpaceCharacters", "data": right}
+
+    def comment(self, data):
+        """Generates a Comment token
+
+        :arg data: the comment
+
+        :returns: Comment token
+
+        """
+        return {"type": "Comment", "data": data}
+
+    def doctype(self, name, publicId=None, systemId=None):
+        """Generates a Doctype token
+
+        :arg name:
+
+        :arg publicId:
+
+        :arg systemId:
+
+        :returns: the Doctype token
+
+        """
+        return {"type": "Doctype",
+                "name": name,
+                "publicId": publicId,
+                "systemId": systemId}
+
+    def entity(self, name):
+        """Generates an Entity token
+
+        :arg name: the entity name
+
+        :returns: an Entity token
+
+        """
+        return {"type": "Entity", "name": name}
+
+    def unknown(self, nodeType):
+        """Handles unknown node types"""
+        return self.error("Unknown node type: " + nodeType)
+
+
+class NonRecursiveTreeWalker(TreeWalker):
+    def getNodeDetails(self, node):
+        raise NotImplementedError
+
+    def getFirstChild(self, node):
+        raise NotImplementedError
+
+    def getNextSibling(self, node):
+        raise NotImplementedError
+
+    def getParentNode(self, node):
+        raise NotImplementedError
+
+    def __iter__(self):
+        currentNode = self.tree
+        while currentNode is not None:
+            details = self.getNodeDetails(currentNode)
+            type, details = details[0], details[1:]
+            hasChildren = False
+
+            if type == DOCTYPE:
+                yield self.doctype(*details)
+
+            elif type == TEXT:
+                for token in self.text(*details):
+                    yield token
+
+            elif type == ELEMENT:
+                namespace, name, attributes, hasChildren = details
+                if (not namespace or namespace == namespaces["html"]) and name in voidElements:
+                    for token in self.emptyTag(namespace, name, attributes,
+                                               hasChildren):
+                        yield token
+                    hasChildren = False
+                else:
+                    yield self.startTag(namespace, name, attributes)
+
+            elif type == COMMENT:
+                yield self.comment(details[0])
+
+            elif type == ENTITY:
+                yield self.entity(details[0])
+
+            elif type == DOCUMENT:
+                hasChildren = True
+
+            else:
+                yield self.unknown(details[0])
+
+            if hasChildren:
+                firstChild = self.getFirstChild(currentNode)
+            else:
+                firstChild = None
+
+            if firstChild is not None:
+                currentNode = firstChild
+            else:
+                while currentNode is not None:
+                    details = self.getNodeDetails(currentNode)
+                    type, details = details[0], details[1:]
+                    if type == ELEMENT:
+                        namespace, name, attributes, hasChildren = details
+                        if (namespace and namespace != namespaces["html"]) or name not in voidElements:
+                            yield self.endTag(namespace, name)
+                    if self.tree is currentNode:
+                        currentNode = None
+                        break
+                    nextSibling = self.getNextSibling(currentNode)
+                    if nextSibling is not None:
+                        currentNode = nextSibling
+                        break
+                    else:
+                        currentNode = self.getParentNode(currentNode)
diff --git a/libs/html5lib/treewalkers/dom.py b/libs/html5lib/treewalkers/dom.py
new file mode 100644
index 000000000..b0c89b001
--- /dev/null
+++ b/libs/html5lib/treewalkers/dom.py
@@ -0,0 +1,43 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from xml.dom import Node
+
+from . import base
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def getNodeDetails(self, node):
+        if node.nodeType == Node.DOCUMENT_TYPE_NODE:
+            return base.DOCTYPE, node.name, node.publicId, node.systemId
+
+        elif node.nodeType in (Node.TEXT_NODE, Node.CDATA_SECTION_NODE):
+            return base.TEXT, node.nodeValue
+
+        elif node.nodeType == Node.ELEMENT_NODE:
+            attrs = {}
+            for attr in list(node.attributes.keys()):
+                attr = node.getAttributeNode(attr)
+                if attr.namespaceURI:
+                    attrs[(attr.namespaceURI, attr.localName)] = attr.value
+                else:
+                    attrs[(None, attr.name)] = attr.value
+            return (base.ELEMENT, node.namespaceURI, node.nodeName,
+                    attrs, node.hasChildNodes())
+
+        elif node.nodeType == Node.COMMENT_NODE:
+            return base.COMMENT, node.nodeValue
+
+        elif node.nodeType in (Node.DOCUMENT_NODE, Node.DOCUMENT_FRAGMENT_NODE):
+            return (base.DOCUMENT,)
+
+        else:
+            return base.UNKNOWN, node.nodeType
+
+    def getFirstChild(self, node):
+        return node.firstChild
+
+    def getNextSibling(self, node):
+        return node.nextSibling
+
+    def getParentNode(self, node):
+        return node.parentNode
diff --git a/libs/html5lib/treewalkers/etree.py b/libs/html5lib/treewalkers/etree.py
new file mode 100644
index 000000000..d15a7eebf
--- /dev/null
+++ b/libs/html5lib/treewalkers/etree.py
@@ -0,0 +1,130 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from collections import OrderedDict
+import re
+
+from six import string_types
+
+from . import base
+from .._utils import moduleFactoryFactory
+
+tag_regexp = re.compile("{([^}]*)}(.*)")
+
+
+def getETreeBuilder(ElementTreeImplementation):
+    ElementTree = ElementTreeImplementation
+    ElementTreeCommentType = ElementTree.Comment("asd").tag
+
+    class TreeWalker(base.NonRecursiveTreeWalker):  # pylint:disable=unused-variable
+        """Given the particular ElementTree representation, this implementation,
+        to avoid using recursion, returns "nodes" as tuples with the following
+        content:
+
+        1. The current element
+
+        2. The index of the element relative to its parent
+
+        3. A stack of ancestor elements
+
+        4. A flag "text", "tail" or None to indicate if the current node is a
+           text node; either the text or tail of the current element (1)
+        """
+        def getNodeDetails(self, node):
+            if isinstance(node, tuple):  # It might be the root Element
+                elt, _, _, flag = node
+                if flag in ("text", "tail"):
+                    return base.TEXT, getattr(elt, flag)
+                else:
+                    node = elt
+
+            if not(hasattr(node, "tag")):
+                node = node.getroot()
+
+            if node.tag in ("DOCUMENT_ROOT", "DOCUMENT_FRAGMENT"):
+                return (base.DOCUMENT,)
+
+            elif node.tag == "<!DOCTYPE>":
+                return (base.DOCTYPE, node.text,
+                        node.get("publicId"), node.get("systemId"))
+
+            elif node.tag == ElementTreeCommentType:
+                return base.COMMENT, node.text
+
+            else:
+                assert isinstance(node.tag, string_types), type(node.tag)
+                # This is assumed to be an ordinary element
+                match = tag_regexp.match(node.tag)
+                if match:
+                    namespace, tag = match.groups()
+                else:
+                    namespace = None
+                    tag = node.tag
+                attrs = OrderedDict()
+                for name, value in list(node.attrib.items()):
+                    match = tag_regexp.match(name)
+                    if match:
+                        attrs[(match.group(1), match.group(2))] = value
+                    else:
+                        attrs[(None, name)] = value
+                return (base.ELEMENT, namespace, tag,
+                        attrs, len(node) or node.text)
+
+        def getFirstChild(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                element, key, parents, flag = node, None, [], None
+
+            if flag in ("text", "tail"):
+                return None
+            else:
+                if element.text:
+                    return element, key, parents, "text"
+                elif len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+
+        def getNextSibling(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if len(element):
+                    parents.append(element)
+                    return element[0], 0, parents, None
+                else:
+                    return None
+            else:
+                if element.tail and flag != "tail":
+                    return element, key, parents, "tail"
+                elif key < len(parents[-1]) - 1:
+                    return parents[-1][key + 1], key + 1, parents, None
+                else:
+                    return None
+
+        def getParentNode(self, node):
+            if isinstance(node, tuple):
+                element, key, parents, flag = node
+            else:
+                return None
+
+            if flag == "text":
+                if not parents:
+                    return element
+                else:
+                    return element, key, parents, None
+            else:
+                parent = parents.pop()
+                if not parents:
+                    return parent
+                else:
+                    assert list(parents[-1]).count(parent) == 1
+                    return parent, list(parents[-1]).index(parent), parents, None
+
+    return locals()
+
+getETreeModule = moduleFactoryFactory(getETreeBuilder)
diff --git a/libs/html5lib/treewalkers/etree_lxml.py b/libs/html5lib/treewalkers/etree_lxml.py
new file mode 100644
index 000000000..fb2363112
--- /dev/null
+++ b/libs/html5lib/treewalkers/etree_lxml.py
@@ -0,0 +1,213 @@
+from __future__ import absolute_import, division, unicode_literals
+from six import text_type
+
+from lxml import etree
+from ..treebuilders.etree import tag_regexp
+
+from . import base
+
+from .. import _ihatexml
+
+
+def ensure_str(s):
+    if s is None:
+        return None
+    elif isinstance(s, text_type):
+        return s
+    else:
+        return s.decode("ascii", "strict")
+
+
+class Root(object):
+    def __init__(self, et):
+        self.elementtree = et
+        self.children = []
+
+        try:
+            if et.docinfo.internalDTD:
+                self.children.append(Doctype(self,
+                                             ensure_str(et.docinfo.root_name),
+                                             ensure_str(et.docinfo.public_id),
+                                             ensure_str(et.docinfo.system_url)))
+        except AttributeError:
+            pass
+
+        try:
+            node = et.getroot()
+        except AttributeError:
+            node = et
+
+        while node.getprevious() is not None:
+            node = node.getprevious()
+        while node is not None:
+            self.children.append(node)
+            node = node.getnext()
+
+        self.text = None
+        self.tail = None
+
+    def __getitem__(self, key):
+        return self.children[key]
+
+    def getnext(self):
+        return None
+
+    def __len__(self):
+        return 1
+
+
+class Doctype(object):
+    def __init__(self, root_node, name, public_id, system_id):
+        self.root_node = root_node
+        self.name = name
+        self.public_id = public_id
+        self.system_id = system_id
+
+        self.text = None
+        self.tail = None
+
+    def getnext(self):
+        return self.root_node.children[1]
+
+
+class FragmentRoot(Root):
+    def __init__(self, children):
+        self.children = [FragmentWrapper(self, child) for child in children]
+        self.text = self.tail = None
+
+    def getnext(self):
+        return None
+
+
+class FragmentWrapper(object):
+    def __init__(self, fragment_root, obj):
+        self.root_node = fragment_root
+        self.obj = obj
+        if hasattr(self.obj, 'text'):
+            self.text = ensure_str(self.obj.text)
+        else:
+            self.text = None
+        if hasattr(self.obj, 'tail'):
+            self.tail = ensure_str(self.obj.tail)
+        else:
+            self.tail = None
+
+    def __getattr__(self, name):
+        return getattr(self.obj, name)
+
+    def getnext(self):
+        siblings = self.root_node.children
+        idx = siblings.index(self)
+        if idx < len(siblings) - 1:
+            return siblings[idx + 1]
+        else:
+            return None
+
+    def __getitem__(self, key):
+        return self.obj[key]
+
+    def __bool__(self):
+        return bool(self.obj)
+
+    def getparent(self):
+        return None
+
+    def __str__(self):
+        return str(self.obj)
+
+    def __unicode__(self):
+        return str(self.obj)
+
+    def __len__(self):
+        return len(self.obj)
+
+
+class TreeWalker(base.NonRecursiveTreeWalker):
+    def __init__(self, tree):
+        # pylint:disable=redefined-variable-type
+        if isinstance(tree, list):
+            self.fragmentChildren = set(tree)
+            tree = FragmentRoot(tree)
+        else:
+            self.fragmentChildren = set()
+            tree = Root(tree)
+        base.NonRecursiveTreeWalker.__init__(self, tree)
+        self.filter = _ihatexml.InfosetFilter()
+
+    def getNodeDetails(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            return base.TEXT, ensure_str(getattr(node, key))
+
+        elif isinstance(node, Root):
+            return (base.DOCUMENT,)
+
+        elif isinstance(node, Doctype):
+            return base.DOCTYPE, node.name, node.public_id, node.system_id
+
+        elif isinstance(node, FragmentWrapper) and not hasattr(node, "tag"):
+            return base.TEXT, ensure_str(node.obj)
+
+        elif node.tag == etree.Comment:
+            return base.COMMENT, ensure_str(node.text)
+
+        elif node.tag == etree.Entity:
+            return base.ENTITY, ensure_str(node.text)[1:-1]  # strip &;
+
+        else:
+            # This is assumed to be an ordinary element
+            match = tag_regexp.match(ensure_str(node.tag))
+            if match:
+                namespace, tag = match.groups()
+            else:
+                namespace = None
+                tag = ensure_str(node.tag)
+            attrs = {}
+            for name, value in list(node.attrib.items()):
+                name = ensure_str(name)
+                value = ensure_str(value)
+                match = tag_regexp.match(name)
+                if match:
+                    attrs[(match.group(1), match.group(2))] = value
+                else:
+                    attrs[(None, name)] = value
+            return (base.ELEMENT, namespace, self.filter.fromXmlName(tag),
+                    attrs, len(node) > 0 or node.text)
+
+    def getFirstChild(self, node):
+        assert not isinstance(node, tuple), "Text nodes have no children"
+
+        assert len(node) or node.text, "Node has no children"
+        if node.text:
+            return (node, "text")
+        else:
+            return node[0]
+
+    def getNextSibling(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                # XXX: we cannot use a "bool(node) and node[0] or None" construct here
+                # because node[0] might evaluate to False if it has no child element
+                if len(node):
+                    return node[0]
+                else:
+                    return None
+            else:  # tail
+                return node.getnext()
+
+        return (node, "tail") if node.tail else node.getnext()
+
+    def getParentNode(self, node):
+        if isinstance(node, tuple):  # Text node
+            node, key = node
+            assert key in ("text", "tail"), "Text nodes are text or tail, found %s" % key
+            if key == "text":
+                return node
+            # else: fallback to "normal" processing
+        elif node in self.fragmentChildren:
+            return None
+
+        return node.getparent()
diff --git a/libs/html5lib/treewalkers/genshi.py b/libs/html5lib/treewalkers/genshi.py
new file mode 100644
index 000000000..7483be27d
--- /dev/null
+++ b/libs/html5lib/treewalkers/genshi.py
@@ -0,0 +1,69 @@
+from __future__ import absolute_import, division, unicode_literals
+
+from genshi.core import QName
+from genshi.core import START, END, XML_NAMESPACE, DOCTYPE, TEXT
+from genshi.core import START_NS, END_NS, START_CDATA, END_CDATA, PI, COMMENT
+
+from . import base
+
+from ..constants import voidElements, namespaces
+
+
+class TreeWalker(base.TreeWalker):
+    def __iter__(self):
+        # Buffer the events so we can pass in the following one
+        previous = None
+        for event in self.tree:
+            if previous is not None:
+                for token in self.tokens(previous, event):
+                    yield token
+            previous = event
+
+        # Don't forget the final event!
+        if previous is not None:
+            for token in self.tokens(previous, None):
+                yield token
+
+    def tokens(self, event, next):
+        kind, data, _ = event
+        if kind == START:
+            tag, attribs = data
+            name = tag.localname
+            namespace = tag.namespace
+            converted_attribs = {}
+            for k, v in attribs:
+                if isinstance(k, QName):
+                    converted_attribs[(k.namespace, k.localname)] = v
+                else:
+                    converted_attribs[(None, k)] = v
+
+            if namespace == namespaces["html"] and name in voidElements:
+                for token in self.emptyTag(namespace, name, converted_attribs,
+                                           not next or next[0] != END or
+                                           next[1] != tag):
+                    yield token
+            else:
+                yield self.startTag(namespace, name, converted_attribs)
+
+        elif kind == END:
+            name = data.localname
+            namespace = data.namespace
+            if namespace != namespaces["html"] or name not in voidElements:
+                yield self.endTag(namespace, name)
+
+        elif kind == COMMENT:
+            yield self.comment(data)
+
+        elif kind == TEXT:
+            for token in self.text(data):
+                yield token
+
+        elif kind == DOCTYPE:
+            yield self.doctype(*data)
+
+        elif kind in (XML_NAMESPACE, DOCTYPE, START_NS, END_NS,
+                      START_CDATA, END_CDATA, PI):
+            pass
+
+        else:
+            yield self.unknown(kind)
diff --git a/libs/json_tricks/__init__.py b/libs/json_tricks/__init__.py
new file mode 100644
index 000000000..8c890c6de
--- /dev/null
+++ b/libs/json_tricks/__init__.py
@@ -0,0 +1,24 @@
+
+from .utils import hashodict, NoNumpyException, NoPandasException, get_scalar_repr, encode_scalars_inplace
+from .comment import strip_comment_line_with_symbol, strip_comments
+from .encoders import TricksEncoder, json_date_time_encode, class_instance_encode, json_complex_encode, \
+	numeric_types_encode, ClassInstanceEncoder, json_set_encode, pandas_encode, nopandas_encode, \
+	numpy_encode, NumpyEncoder, nonumpy_encode, NoNumpyEncoder
+from .decoders import DuplicateJsonKeyException, TricksPairHook, json_date_time_hook, json_complex_hook, \
+	numeric_types_hook, ClassInstanceHook, json_set_hook, pandas_hook, nopandas_hook, json_numpy_obj_hook, \
+	json_nonumpy_obj_hook
+from .nonp import dumps, dump, loads, load
+
+
+try:
+	# find_module takes just as long as importing, so no optimization possible
+	import numpy
+except ImportError:
+	NUMPY_MODE = False
+	# from .nonp import dumps, dump, loads, load, nonumpy_encode as numpy_encode, json_nonumpy_obj_hook as json_numpy_obj_hook
+else:
+	NUMPY_MODE = True
+	# from .np import dumps, dump, loads, load, numpy_encode, NumpyEncoder, json_numpy_obj_hook
+	# from .np_utils import encode_scalars_inplace
+
+
diff --git a/libs/json_tricks/comment.py b/libs/json_tricks/comment.py
new file mode 100644
index 000000000..8b3c06909
--- /dev/null
+++ b/libs/json_tricks/comment.py
@@ -0,0 +1,29 @@
+
+from re import findall
+
+
+def strip_comment_line_with_symbol(line, start):
+	parts = line.split(start)
+	counts = [len(findall(r'(?:^|[^"\\]|(?:\\\\|\\")+)(")', part)) for part in parts]
+	total = 0
+	for nr, count in enumerate(counts):
+		total += count
+		if total % 2 == 0:
+			return start.join(parts[:nr+1]).rstrip()
+	else:
+		return line.rstrip()
+
+
+def strip_comments(string, comment_symbols=frozenset(('#', '//'))):
+	"""
+	:param string: A string containing json with comments started by comment_symbols.
+	:param comment_symbols: Iterable of symbols that start a line comment (default # or //).
+	:return: The string with the comments removed.
+	"""
+	lines = string.splitlines()
+	for k in range(len(lines)):
+		for symbol in comment_symbols:
+			lines[k] = strip_comment_line_with_symbol(lines[k], start=symbol)
+	return '\n'.join(lines)
+
+
diff --git a/libs/json_tricks/decoders.py b/libs/json_tricks/decoders.py
new file mode 100644
index 000000000..221a8f93e
--- /dev/null
+++ b/libs/json_tricks/decoders.py
@@ -0,0 +1,248 @@
+
+from datetime import datetime, date, time, timedelta
+from fractions import Fraction
+from importlib import import_module
+from collections import OrderedDict
+from decimal import Decimal
+from logging import warning
+from json_tricks import NoPandasException, NoNumpyException
+
+
+class DuplicateJsonKeyException(Exception):
+	""" Trying to load a json map which contains duplicate keys, but allow_duplicates is False """
+
+
+class TricksPairHook(object):
+	"""
+	Hook that converts json maps to the appropriate python type (dict or OrderedDict)
+	and then runs any number of hooks on the individual maps.
+	"""
+	def __init__(self, ordered=True, obj_pairs_hooks=None, allow_duplicates=True):
+		"""
+		:param ordered: True if maps should retain their ordering.
+		:param obj_pairs_hooks: An iterable of hooks to apply to elements.
+		"""
+		self.map_type = OrderedDict
+		if not ordered:
+			self.map_type = dict
+		self.obj_pairs_hooks = []
+		if obj_pairs_hooks:
+			self.obj_pairs_hooks = list(obj_pairs_hooks)
+		self.allow_duplicates = allow_duplicates
+
+	def __call__(self, pairs):
+		if not self.allow_duplicates:
+			known = set()
+			for key, value in pairs:
+				if key in known:
+					raise DuplicateJsonKeyException(('Trying to load a json map which contains a' +
+						' duplicate key "{0:}" (but allow_duplicates is False)').format(key))
+				known.add(key)
+		map = self.map_type(pairs)
+		for hook in self.obj_pairs_hooks:
+			map = hook(map)
+		return map
+
+
+def json_date_time_hook(dct):
+	"""
+	Return an encoded date, time, datetime or timedelta to it's python representation, including optional timezone.
+
+	:param dct: (dict) json encoded date, time, datetime or timedelta
+	:return: (date/time/datetime/timedelta obj) python representation of the above
+	"""
+	def get_tz(dct):
+		if not 'tzinfo' in dct:
+			return None
+		try:
+			import pytz
+		except ImportError as err:
+			raise ImportError(('Tried to load a json object which has a timezone-aware (date)time. '
+				'However, `pytz` could not be imported, so the object could not be loaded. '
+				'Error: {0:}').format(str(err)))
+		return pytz.timezone(dct['tzinfo'])
+
+	if isinstance(dct, dict):
+		if '__date__' in dct:
+			return date(year=dct.get('year', 0), month=dct.get('month', 0), day=dct.get('day', 0))
+		elif '__time__' in dct:
+			tzinfo = get_tz(dct)
+			return time(hour=dct.get('hour', 0), minute=dct.get('minute', 0), second=dct.get('second', 0),
+				microsecond=dct.get('microsecond', 0), tzinfo=tzinfo)
+		elif '__datetime__' in dct:
+			tzinfo = get_tz(dct)
+			return datetime(year=dct.get('year', 0), month=dct.get('month', 0), day=dct.get('day', 0),
+				hour=dct.get('hour', 0), minute=dct.get('minute', 0), second=dct.get('second', 0),
+				microsecond=dct.get('microsecond', 0), tzinfo=tzinfo)
+		elif '__timedelta__' in dct:
+			return timedelta(days=dct.get('days', 0), seconds=dct.get('seconds', 0),
+				microseconds=dct.get('microseconds', 0))
+	return dct
+
+
+def json_complex_hook(dct):
+	"""
+	Return an encoded complex number to it's python representation.
+
+	:param dct: (dict) json encoded complex number (__complex__)
+	:return: python complex number
+	"""
+	if isinstance(dct, dict):
+		if '__complex__' in dct:
+			parts = dct['__complex__']
+			assert len(parts) == 2
+			return parts[0] + parts[1] * 1j
+	return dct
+
+
+def numeric_types_hook(dct):
+	if isinstance(dct, dict):
+		if '__decimal__' in dct:
+			return Decimal(dct['__decimal__'])
+		if '__fraction__' in dct:
+			return Fraction(numerator=dct['numerator'], denominator=dct['denominator'])
+	return dct
+
+
+class ClassInstanceHook(object):
+	"""
+	This hook tries to convert json encoded by class_instance_encoder back to it's original instance.
+	It only works if the environment is the same, e.g. the class is similarly importable and hasn't changed.
+	"""
+	def __init__(self, cls_lookup_map=None):
+		self.cls_lookup_map = cls_lookup_map or {}
+
+	def __call__(self, dct):
+		if isinstance(dct, dict) and '__instance_type__' in dct:
+			mod, name = dct['__instance_type__']
+			attrs = dct['attributes']
+			if mod is None:
+				try:
+					Cls = getattr((__import__('__main__')), name)
+				except (ImportError, AttributeError) as err:
+					if not name in self.cls_lookup_map:
+						raise ImportError(('class {0:s} seems to have been exported from the main file, which means '
+							'it has no module/import path set; you need to provide cls_lookup_map which maps names '
+							'to classes').format(name))
+					Cls = self.cls_lookup_map[name]
+			else:
+				imp_err = None
+				try:
+					module = import_module('{0:}'.format(mod, name))
+				except ImportError as err:
+					imp_err = ('encountered import error "{0:}" while importing "{1:}" to decode a json file; perhaps '
+						'it was encoded in a different environment where {1:}.{2:} was available').format(err, mod, name)
+				else:
+					if not hasattr(module, name):
+						imp_err = 'imported "{0:}" but could find "{1:}" inside while decoding a json file (found {2:}'.format(
+							module, name, ', '.join(attr for attr in dir(module) if not attr.startswith('_')))
+					Cls = getattr(module, name)
+				if imp_err:
+					if 'name' in self.cls_lookup_map:
+						Cls = self.cls_lookup_map[name]
+					else:
+						raise ImportError(imp_err)
+			try:
+				obj = Cls.__new__(Cls)
+			except TypeError:
+				raise TypeError(('problem while decoding instance of "{0:s}"; this instance has a special '
+					'__new__ method and can\'t be restored').format(name))
+			if hasattr(obj, '__json_decode__'):
+				obj.__json_decode__(**attrs)
+			else:
+				obj.__dict__ = dict(attrs)
+			return  obj
+		return dct
+
+
+def json_set_hook(dct):
+	"""
+	Return an encoded set to it's python representation.
+	"""
+	if isinstance(dct, dict):
+		if '__set__' in dct:
+			return set((tuple(item) if isinstance(item, list) else item) for item in dct['__set__'])
+	return dct
+
+
+def pandas_hook(dct):
+	if '__pandas_dataframe__' in dct or '__pandas_series__' in dct:
+		# todo: this is experimental
+		if not getattr(pandas_hook, '_warned', False):
+			pandas_hook._warned = True
+			warning('Pandas loading support in json-tricks is experimental and may change in future versions.')
+	if '__pandas_dataframe__' in dct:
+		try:
+			from pandas import DataFrame
+		except ImportError:
+			raise NoPandasException('Trying to decode a map which appears to represent a pandas data structure, but pandas appears not to be installed.')
+		from numpy import dtype, array
+		meta = dct.pop('__pandas_dataframe__')
+		indx = dct.pop('index') if 'index' in dct else None
+		dtypes = dict((colname, dtype(tp)) for colname, tp in zip(meta['column_order'], meta['types']))
+		data = OrderedDict()
+		for name, col in dct.items():
+			data[name] = array(col, dtype=dtypes[name])
+		return DataFrame(
+			data=data,
+			index=indx,
+			columns=meta['column_order'],
+			# mixed `dtypes` argument not supported, so use duct of numpy arrays
+		)
+	elif '__pandas_series__' in dct:
+		from pandas import Series
+		from numpy import dtype, array
+		meta = dct.pop('__pandas_series__')
+		indx = dct.pop('index') if 'index' in dct else None
+		return Series(
+			data=dct['data'],
+			index=indx,
+			name=meta['name'],
+			dtype=dtype(meta['type']),
+		)
+	return dct
+
+
+def nopandas_hook(dct):
+	if isinstance(dct, dict) and ('__pandas_dataframe__' in dct or '__pandas_series__' in dct):
+		raise NoPandasException(('Trying to decode a map which appears to represent a pandas '
+			'data structure, but pandas support is not enabled, perhaps it is not installed.'))
+	return dct
+
+
+def json_numpy_obj_hook(dct):
+	"""
+	Replace any numpy arrays previously encoded by NumpyEncoder to their proper
+	shape, data type and data.
+
+	:param dct: (dict) json encoded ndarray
+	:return: (ndarray) if input was an encoded ndarray
+	"""
+	if isinstance(dct, dict) and '__ndarray__' in dct:
+		try:
+			from numpy import asarray
+			import numpy as nptypes
+		except ImportError:
+			raise NoNumpyException('Trying to decode a map which appears to represent a numpy '
+				'array, but numpy appears not to be installed.')
+		order = 'A'
+		if 'Corder' in dct:
+			order = 'C' if dct['Corder'] else 'F'
+		if dct['shape']:
+			return asarray(dct['__ndarray__'], dtype=dct['dtype'], order=order)
+		else:
+			dtype = getattr(nptypes, dct['dtype'])
+			return dtype(dct['__ndarray__'])
+	return dct
+
+
+def json_nonumpy_obj_hook(dct):
+	"""
+	This hook has no effect except to check if you're trying to decode numpy arrays without support, and give you a useful message.
+	"""
+	if isinstance(dct, dict) and '__ndarray__' in dct:
+		raise NoNumpyException(('Trying to decode a map which appears to represent a numpy array, '
+			'but numpy support is not enabled, perhaps it is not installed.'))
+	return dct
+
+
diff --git a/libs/json_tricks/encoders.py b/libs/json_tricks/encoders.py
new file mode 100644
index 000000000..386e690e5
--- /dev/null
+++ b/libs/json_tricks/encoders.py
@@ -0,0 +1,311 @@
+
+from datetime import datetime, date, time, timedelta
+from fractions import Fraction
+from logging import warning
+from json import JSONEncoder
+from sys import version
+from decimal import Decimal
+from .utils import hashodict, call_with_optional_kwargs, NoPandasException, NoNumpyException
+
+
+class TricksEncoder(JSONEncoder):
+	"""
+	Encoder that runs any number of encoder functions or instances on
+	the objects that are being encoded.
+
+	Each encoder should make any appropriate changes and return an object,
+	changed or not. This will be passes to the other encoders.
+	"""
+	def __init__(self, obj_encoders=None, silence_typeerror=False, primitives=False, **json_kwargs):
+		"""
+		:param obj_encoders: An iterable of functions or encoder instances to try.
+		:param silence_typeerror: If set to True, ignore the TypeErrors that Encoder instances throw (default False).
+		"""
+		self.obj_encoders = []
+		if obj_encoders:
+			self.obj_encoders = list(obj_encoders)
+		self.silence_typeerror = silence_typeerror
+		self.primitives = primitives
+		super(TricksEncoder, self).__init__(**json_kwargs)
+
+	def default(self, obj, *args, **kwargs):
+		"""
+		This is the method of JSONEncoders that is called for each object; it calls
+		all the encoders with the previous one's output used as input.
+
+		It works for Encoder instances, but they are expected not to throw
+		`TypeError` for unrecognized types (the super method does that by default).
+
+		It never calls the `super` method so if there are non-primitive types
+		left at the end, you'll get an encoding error.
+		"""
+		prev_id = id(obj)
+		for encoder in self.obj_encoders:
+			if hasattr(encoder, 'default'):
+				#todo: write test for this scenario (maybe ClassInstanceEncoder?)
+				try:
+					obj = call_with_optional_kwargs(encoder.default, obj, primitives=self.primitives)
+				except TypeError as err:
+					if not self.silence_typeerror:
+						raise
+			elif hasattr(encoder, '__call__'):
+				obj = call_with_optional_kwargs(encoder, obj, primitives=self.primitives)
+			else:
+				raise TypeError('`obj_encoder` {0:} does not have `default` method and is not callable'.format(encoder))
+		if id(obj) == prev_id:
+			#todo: test
+			raise TypeError('Object of type {0:} could not be encoded by {1:} using encoders [{2:s}]'.format(
+				type(obj), self.__class__.__name__, ', '.join(str(encoder) for encoder in self.obj_encoders)))
+		return obj
+
+
+def json_date_time_encode(obj, primitives=False):
+	"""
+	Encode a date, time, datetime or timedelta to a string of a json dictionary, including optional timezone.
+
+	:param obj: date/time/datetime/timedelta obj
+	:return: (dict) json primitives representation of date, time, datetime or timedelta
+	"""
+	if primitives and isinstance(obj, (date, time, datetime)):
+		return obj.isoformat()
+	if isinstance(obj, datetime):
+		dct = hashodict([('__datetime__', None), ('year', obj.year), ('month', obj.month),
+			('day', obj.day), ('hour', obj.hour), ('minute', obj.minute),
+			('second', obj.second), ('microsecond', obj.microsecond)])
+		if obj.tzinfo:
+			dct['tzinfo'] = obj.tzinfo.zone
+	elif isinstance(obj, date):
+		dct = hashodict([('__date__', None), ('year', obj.year), ('month', obj.month), ('day', obj.day)])
+	elif isinstance(obj, time):
+		dct = hashodict([('__time__', None), ('hour', obj.hour), ('minute', obj.minute),
+			('second', obj.second), ('microsecond', obj.microsecond)])
+		if obj.tzinfo:
+			dct['tzinfo'] = obj.tzinfo.zone
+	elif isinstance(obj, timedelta):
+		if primitives:
+			return obj.total_seconds()
+		else:
+			dct = hashodict([('__timedelta__', None), ('days', obj.days), ('seconds', obj.seconds),
+				('microseconds', obj.microseconds)])
+	else:
+		return obj
+	for key, val in tuple(dct.items()):
+		if not key.startswith('__') and not val:
+			del dct[key]
+	return dct
+
+
+def class_instance_encode(obj, primitives=False):
+	"""
+	Encodes a class instance to json. Note that it can only be recovered if the environment allows the class to be
+	imported in the same way.
+	"""
+	if isinstance(obj, list) or isinstance(obj, dict):
+		return obj
+	if hasattr(obj, '__class__') and hasattr(obj, '__dict__'):
+		if not hasattr(obj, '__new__'):
+			raise TypeError('class "{0:s}" does not have a __new__ method; '.format(obj.__class__) +
+				('perhaps it is an old-style class not derived from `object`; add `object` as a base class to encode it.'
+					if (version[:2] == '2.') else 'this should not happen in Python3'))
+		try:
+			obj.__new__(obj.__class__)
+		except TypeError:
+			raise TypeError(('instance "{0:}" of class "{1:}" cannot be encoded because it\'s __new__ method '
+				'cannot be called, perhaps it requires extra parameters').format(obj, obj.__class__))
+		mod = obj.__class__.__module__
+		if mod == '__main__':
+			mod = None
+			warning(('class {0:} seems to have been defined in the main file; unfortunately this means'
+				' that it\'s module/import path is unknown, so you might have to provide cls_lookup_map when '
+				'decoding').format(obj.__class__))
+		name = obj.__class__.__name__
+		if hasattr(obj, '__json_encode__'):
+			attrs = obj.__json_encode__()
+		else:
+			attrs = hashodict(obj.__dict__.items())
+		if primitives:
+			return attrs
+		else:
+			return hashodict((('__instance_type__', (mod, name)), ('attributes', attrs)))
+	return obj
+
+
+def json_complex_encode(obj, primitives=False):
+	"""
+	Encode a complex number as a json dictionary of it's real and imaginary part.
+
+	:param obj: complex number, e.g. `2+1j`
+	:return: (dict) json primitives representation of `obj`
+	"""
+	if isinstance(obj, complex):
+		if primitives:
+			return [obj.real, obj.imag]
+		else:
+			return hashodict(__complex__=[obj.real, obj.imag])
+	return obj
+
+
+def numeric_types_encode(obj, primitives=False):
+	"""
+	Encode Decimal and Fraction.
+	
+	:param primitives: Encode decimals and fractions as standard floats. You may lose precision. If you do this, you may need to enable `allow_nan` (decimals always allow NaNs but floats do not).
+	"""
+	if isinstance(obj, Decimal):
+		if primitives:
+			return float(obj)
+		else:
+			return {
+				'__decimal__': str(obj.canonical()),
+			}
+	if isinstance(obj, Fraction):
+		if primitives:
+			return float(obj)
+		else:
+			return hashodict((
+				('__fraction__', True),
+				('numerator', obj.numerator),
+				('denominator', obj.denominator),
+			))
+	return obj
+
+
+class ClassInstanceEncoder(JSONEncoder):
+	"""
+	See `class_instance_encoder`.
+	"""
+	# Not covered in tests since `class_instance_encode` is recommended way.
+	def __init__(self, obj, encode_cls_instances=True, **kwargs):
+		self.encode_cls_instances = encode_cls_instances
+		super(ClassInstanceEncoder, self).__init__(obj, **kwargs)
+
+	def default(self, obj, *args, **kwargs):
+		if self.encode_cls_instances:
+			obj = class_instance_encode(obj)
+		return super(ClassInstanceEncoder, self).default(obj, *args, **kwargs)
+
+
+def json_set_encode(obj, primitives=False):
+	"""
+	Encode python sets as dictionary with key __set__ and a list of the values.
+
+	Try to sort the set to get a consistent json representation, use arbitrary order if the data is not ordinal.
+	"""
+	if isinstance(obj, set):
+		try:
+			repr = sorted(obj)
+		except Exception:
+			repr = list(obj)
+		if primitives:
+			return repr
+		else:
+			return hashodict(__set__=repr)
+	return obj
+
+
+def pandas_encode(obj, primitives=False):
+	from pandas import DataFrame, Series
+	if isinstance(obj, (DataFrame, Series)):
+		#todo: this is experimental
+		if not getattr(pandas_encode, '_warned', False):
+			pandas_encode._warned = True
+			warning('Pandas dumping support in json-tricks is experimental and may change in future versions.')
+	if isinstance(obj, DataFrame):
+		repr = hashodict()
+		if not primitives:
+			repr['__pandas_dataframe__'] = hashodict((
+				('column_order', tuple(obj.columns.values)),
+				('types', tuple(str(dt) for dt in obj.dtypes)),
+			))
+		repr['index'] = tuple(obj.index.values)
+		for k, name in enumerate(obj.columns.values):
+			repr[name] = tuple(obj.ix[:, k].values)
+		return repr
+	if isinstance(obj, Series):
+		repr = hashodict()
+		if not primitives:
+			repr['__pandas_series__'] = hashodict((
+				('name', str(obj.name)),
+				('type', str(obj.dtype)),
+			))
+		repr['index'] = tuple(obj.index.values)
+		repr['data'] = tuple(obj.values)
+		return repr
+	return obj
+
+
+def nopandas_encode(obj):
+	if ('DataFrame' in getattr(obj.__class__, '__name__', '') or 'Series' in getattr(obj.__class__, '__name__', '')) \
+			and 'pandas.' in getattr(obj.__class__, '__module__', ''):
+		raise NoPandasException(('Trying to encode an object of type {0:} which appears to be '
+			'a numpy array, but numpy support is not enabled, perhaps it is not installed.').format(type(obj)))
+	return obj
+
+
+def numpy_encode(obj, primitives=False):
+	"""
+	Encodes numpy `ndarray`s as lists with meta data.
+	
+	Encodes numpy scalar types as Python equivalents. Special encoding is not possible,
+	because int64 (in py2) and float64 (in py2 and py3) are subclasses of primitives,
+	which never reach the encoder.
+	
+	:param primitives: If True, arrays are serialized as (nested) lists without meta info.
+	"""
+	from numpy import ndarray, generic
+	if isinstance(obj, ndarray):
+		if primitives:
+			return obj.tolist()
+		else:
+			dct = hashodict((
+				('__ndarray__', obj.tolist()),
+				('dtype', str(obj.dtype)),
+				('shape', obj.shape),
+			))
+			if len(obj.shape) > 1:
+				dct['Corder'] = obj.flags['C_CONTIGUOUS']
+			return dct
+	elif isinstance(obj, generic):
+		if NumpyEncoder.SHOW_SCALAR_WARNING:
+			NumpyEncoder.SHOW_SCALAR_WARNING = False
+			warning('json-tricks: numpy scalar serialization is experimental and may work differently in future versions')
+		return obj.item()
+	return obj
+
+
+class NumpyEncoder(ClassInstanceEncoder):
+	"""
+	JSON encoder for numpy arrays.
+	"""
+	SHOW_SCALAR_WARNING = True  # show a warning that numpy scalar serialization is experimental
+	
+	def default(self, obj, *args, **kwargs):
+		"""
+		If input object is a ndarray it will be converted into a dict holding
+		data type, shape and the data. The object can be restored using json_numpy_obj_hook.
+		"""
+		warning('`NumpyEncoder` is deprecated, use `numpy_encode`')  #todo
+		obj = numpy_encode(obj)
+		return super(NumpyEncoder, self).default(obj, *args, **kwargs)
+
+
+def nonumpy_encode(obj):
+	"""
+	Raises an error for numpy arrays.
+	"""
+	if 'ndarray' in getattr(obj.__class__, '__name__', '') and 'numpy.' in getattr(obj.__class__, '__module__', ''):
+		raise NoNumpyException(('Trying to encode an object of type {0:} which appears to be '
+			'a pandas data stucture, but pandas support is not enabled, perhaps it is not installed.').format(type(obj)))
+	return obj
+
+
+class NoNumpyEncoder(JSONEncoder):
+	"""
+	See `nonumpy_encode`.
+	"""
+	def default(self, obj, *args, **kwargs):
+		warning('`NoNumpyEncoder` is deprecated, use `nonumpy_encode`')  #todo
+		obj = nonumpy_encode(obj)
+		return super(NoNumpyEncoder, self).default(obj, *args, **kwargs)
+
+
diff --git a/libs/json_tricks/nonp.py b/libs/json_tricks/nonp.py
new file mode 100644
index 000000000..6522687d3
--- /dev/null
+++ b/libs/json_tricks/nonp.py
@@ -0,0 +1,207 @@
+
+from gzip import GzipFile
+from io import BytesIO
+from json import loads as json_loads
+from os import fsync
+from sys import exc_info, version
+from .utils import NoNumpyException  # keep 'unused' imports
+from .comment import strip_comment_line_with_symbol, strip_comments  # keep 'unused' imports
+from .encoders import TricksEncoder, json_date_time_encode, class_instance_encode, ClassInstanceEncoder, \
+	json_complex_encode, json_set_encode, numeric_types_encode, numpy_encode, nonumpy_encode, NoNumpyEncoder, \
+	nopandas_encode, pandas_encode  # keep 'unused' imports
+from .decoders import DuplicateJsonKeyException, TricksPairHook, json_date_time_hook, ClassInstanceHook, \
+	json_complex_hook, json_set_hook, numeric_types_hook, json_numpy_obj_hook, json_nonumpy_obj_hook, \
+	nopandas_hook, pandas_hook  # keep 'unused' imports
+from json import JSONEncoder
+
+
+is_py3 = (version[:2] == '3.')
+str_type = str if is_py3 else (basestring, unicode,)
+ENCODING = 'UTF-8'
+
+
+_cih_instance = ClassInstanceHook()
+DEFAULT_ENCODERS = [json_date_time_encode, class_instance_encode, json_complex_encode, json_set_encode, numeric_types_encode,]
+DEFAULT_HOOKS = [json_date_time_hook, _cih_instance, json_complex_hook, json_set_hook, numeric_types_hook,]
+
+try:
+	import numpy
+except ImportError:
+	DEFAULT_ENCODERS = [nonumpy_encode,] + DEFAULT_ENCODERS
+	DEFAULT_HOOKS = [json_nonumpy_obj_hook,] + DEFAULT_HOOKS
+else:
+	# numpy encode needs to be before complex
+	DEFAULT_ENCODERS = [numpy_encode,] + DEFAULT_ENCODERS
+	DEFAULT_HOOKS = [json_numpy_obj_hook,] + DEFAULT_HOOKS
+
+try:
+	import pandas
+except ImportError:
+	DEFAULT_ENCODERS = [nopandas_encode,] + DEFAULT_ENCODERS
+	DEFAULT_HOOKS = [nopandas_hook,] + DEFAULT_HOOKS
+else:
+	DEFAULT_ENCODERS = [pandas_encode,] + DEFAULT_ENCODERS
+	DEFAULT_HOOKS = [pandas_hook,] + DEFAULT_HOOKS
+
+
+DEFAULT_NONP_ENCODERS = [nonumpy_encode,] + DEFAULT_ENCODERS    # DEPRECATED
+DEFAULT_NONP_HOOKS = [json_nonumpy_obj_hook,] + DEFAULT_HOOKS   # DEPRECATED
+
+
+def dumps(obj, sort_keys=None, cls=TricksEncoder, obj_encoders=DEFAULT_ENCODERS, extra_obj_encoders=(),
+		primitives=False, compression=None, allow_nan=False, conv_str_byte=False, **jsonkwargs):
+	"""
+	Convert a nested data structure to a json string.
+
+	:param obj: The Python object to convert.
+	:param sort_keys: Keep this False if you want order to be preserved.
+	:param cls: The json encoder class to use, defaults to NoNumpyEncoder which gives a warning for numpy arrays.
+	:param obj_encoders: Iterable of encoders to use to convert arbitrary objects into json-able promitives.
+	:param extra_obj_encoders: Like `obj_encoders` but on top of them: use this to add encoders without replacing defaults. Since v3.5 these happen before default encoders.
+	:param allow_nan: Allow NaN and Infinity values, which is a (useful) violation of the JSON standard (default False).
+	:param conv_str_byte: Try to automatically convert between strings and bytes (assuming utf-8) (default False).
+	:return: The string containing the json-encoded version of obj.
+
+	Other arguments are passed on to `cls`. Note that `sort_keys` should be false if you want to preserve order.
+	"""
+	if not hasattr(extra_obj_encoders, '__iter__'):
+		raise TypeError('`extra_obj_encoders` should be a tuple in `json_tricks.dump(s)`')
+	encoders = tuple(extra_obj_encoders) + tuple(obj_encoders)
+	txt = cls(sort_keys=sort_keys, obj_encoders=encoders, allow_nan=allow_nan,
+		primitives=primitives, **jsonkwargs).encode(obj)
+	if not is_py3 and isinstance(txt, str):
+		txt = unicode(txt, ENCODING)
+	if not compression:
+		return txt
+	if compression is True:
+		compression = 5
+	txt = txt.encode(ENCODING)
+	sh = BytesIO()
+	with GzipFile(mode='wb', fileobj=sh, compresslevel=compression) as zh:
+		zh.write(txt)
+	gzstring = sh.getvalue()
+	return gzstring
+
+
+def dump(obj, fp, sort_keys=None, cls=TricksEncoder, obj_encoders=DEFAULT_ENCODERS, extra_obj_encoders=(),
+		 primitives=False, compression=None, force_flush=False, allow_nan=False, conv_str_byte=False, **jsonkwargs):
+	"""
+	Convert a nested data structure to a json string.
+
+	:param fp: File handle or path to write to.
+	:param compression: The gzip compression level, or None for no compression.
+	:param force_flush: If True, flush the file handle used, when possibly also in the operating system (default False).
+	
+	The other arguments are identical to `dumps`.
+	"""
+	txt = dumps(obj, sort_keys=sort_keys, cls=cls, obj_encoders=obj_encoders, extra_obj_encoders=extra_obj_encoders,
+		primitives=primitives, compression=compression, allow_nan=allow_nan, conv_str_byte=conv_str_byte, **jsonkwargs)
+	if isinstance(fp, str_type):
+		fh = open(fp, 'wb+')
+	else:
+		fh = fp
+		if conv_str_byte:
+			try:
+				fh.write(b'')
+			except TypeError:
+				pass
+				# if not isinstance(txt, str_type):
+				# 	# Cannot write bytes, so must be in text mode, but we didn't get a text
+				# 	if not compression:
+				# 		txt = txt.decode(ENCODING)
+			else:
+				try:
+					fh.write(u'')
+				except TypeError:
+					if isinstance(txt, str_type):
+						txt = txt.encode(ENCODING)
+	try:
+		if 'b' not in getattr(fh, 'mode', 'b?') and not isinstance(txt, str_type) and compression:
+			raise IOError('If compression is enabled, the file must be opened in binary mode.')
+		try:
+			fh.write(txt)
+		except TypeError as err:
+			err.args = (err.args[0] + '. A possible reason is that the file is not opened in binary mode; '
+				'be sure to set file mode to something like "wb".',)
+			raise
+	finally:
+		if force_flush:
+			fh.flush()
+			try:
+				if fh.fileno() is not None:
+					fsync(fh.fileno())
+			except (ValueError,):
+				pass
+		if isinstance(fp, str_type):
+			fh.close()
+	return txt
+
+
+def loads(string, preserve_order=True, ignore_comments=True, decompression=None, obj_pairs_hooks=DEFAULT_HOOKS,
+		extra_obj_pairs_hooks=(), cls_lookup_map=None, allow_duplicates=True, conv_str_byte=False, **jsonkwargs):
+	"""
+	Convert a nested data structure to a json string.
+
+	:param string: The string containing a json encoded data structure.
+	:param decode_cls_instances: True to attempt to decode class instances (requires the environment to be similar the the encoding one).
+	:param preserve_order: Whether to preserve order by using OrderedDicts or not.
+	:param ignore_comments: Remove comments (starting with # or //).
+	:param decompression: True to use gzip decompression, False to use raw data, None to automatically determine (default). Assumes utf-8 encoding!
+	:param obj_pairs_hooks: A list of dictionary hooks to apply.
+	:param extra_obj_pairs_hooks: Like `obj_pairs_hooks` but on top of them: use this to add hooks without replacing defaults. Since v3.5 these happen before default hooks.
+	:param cls_lookup_map: If set to a dict, for example ``globals()``, then classes encoded from __main__ are looked up this dict.
+	:param allow_duplicates: If set to False, an error will be raised when loading a json-map that contains duplicate keys.
+	:param parse_float: A function to parse strings to integers (e.g. Decimal). There is also `parse_int`.
+	:param conv_str_byte: Try to automatically convert between strings and bytes (assuming utf-8) (default False).
+	:return: The string containing the json-encoded version of obj.
+
+	Other arguments are passed on to json_func.
+	"""
+	if not hasattr(extra_obj_pairs_hooks, '__iter__'):
+		raise TypeError('`extra_obj_pairs_hooks` should be a tuple in `json_tricks.load(s)`')
+	if decompression is None:
+		decompression = string[:2] == b'\x1f\x8b'
+	if decompression:
+		with GzipFile(fileobj=BytesIO(string), mode='rb') as zh:
+			string = zh.read()
+			string = string.decode(ENCODING)
+	if not isinstance(string, str_type):
+		if conv_str_byte:
+			string = string.decode(ENCODING)
+		else:
+			raise TypeError(('Cannot automatically encode object of type "{0:}" in `json_tricks.load(s)` since '
+				'the encoding is not known. You should instead encode the bytes to a string and pass that '
+				'string to `load(s)`, for example bytevar.encode("utf-8") if utf-8 is the encoding.').format(type(string)))
+	if ignore_comments:
+		string = strip_comments(string)
+	obj_pairs_hooks = tuple(obj_pairs_hooks)
+	_cih_instance.cls_lookup_map = cls_lookup_map or {}
+	hooks = tuple(extra_obj_pairs_hooks) + obj_pairs_hooks
+	hook = TricksPairHook(ordered=preserve_order, obj_pairs_hooks=hooks, allow_duplicates=allow_duplicates)
+	return json_loads(string, object_pairs_hook=hook, **jsonkwargs)
+
+
+def load(fp, preserve_order=True, ignore_comments=True, decompression=None, obj_pairs_hooks=DEFAULT_HOOKS,
+		extra_obj_pairs_hooks=(), cls_lookup_map=None, allow_duplicates=True, conv_str_byte=False, **jsonkwargs):
+	"""
+	Convert a nested data structure to a json string.
+
+	:param fp: File handle or path to load from.
+
+	The other arguments are identical to loads.
+	"""
+	try:
+		if isinstance(fp, str_type):
+			with open(fp, 'rb') as fh:
+				string = fh.read()
+		else:
+			string = fp.read()
+	except UnicodeDecodeError as err:
+		# todo: not covered in tests, is it relevant?
+		raise Exception('There was a problem decoding the file content. A possible reason is that the file is not ' +
+			'opened  in binary mode; be sure to set file mode to something like "rb".').with_traceback(exc_info()[2])
+	return loads(string, preserve_order=preserve_order, ignore_comments=ignore_comments, decompression=decompression,
+		obj_pairs_hooks=obj_pairs_hooks, extra_obj_pairs_hooks=extra_obj_pairs_hooks, cls_lookup_map=cls_lookup_map,
+		allow_duplicates=allow_duplicates, conv_str_byte=conv_str_byte, **jsonkwargs)
+
+
diff --git a/libs/json_tricks/np.py b/libs/json_tricks/np.py
new file mode 100644
index 000000000..676041f9f
--- /dev/null
+++ b/libs/json_tricks/np.py
@@ -0,0 +1,28 @@
+
+"""
+This file exists for backward compatibility reasons.
+"""
+
+from logging import warning
+from .nonp import NoNumpyException, DEFAULT_ENCODERS, DEFAULT_HOOKS, dumps, dump, loads, load  # keep 'unused' imports
+from .utils import hashodict, NoPandasException
+from .comment import strip_comment_line_with_symbol, strip_comments  # keep 'unused' imports
+from .encoders import TricksEncoder, json_date_time_encode, class_instance_encode, ClassInstanceEncoder, \
+	numpy_encode, NumpyEncoder # keep 'unused' imports
+from .decoders import DuplicateJsonKeyException, TricksPairHook, json_date_time_hook, ClassInstanceHook, \
+	json_complex_hook, json_set_hook, json_numpy_obj_hook  # keep 'unused' imports
+
+try:
+	import numpy
+except ImportError:
+	raise NoNumpyException('Could not load numpy, maybe it is not installed? If you do not want to use numpy encoding '
+		'or decoding, you can import the functions from json_tricks.nonp instead, which do not need numpy.')
+
+
+# todo: warning('`json_tricks.np` is deprecated, you can import directly from `json_tricks`')
+
+
+DEFAULT_NP_ENCODERS = [numpy_encode,] + DEFAULT_ENCODERS    # DEPRECATED
+DEFAULT_NP_HOOKS = [json_numpy_obj_hook,] + DEFAULT_HOOKS   # DEPRECATED
+
+
diff --git a/libs/json_tricks/np_utils.py b/libs/json_tricks/np_utils.py
new file mode 100644
index 000000000..f2e9936d9
--- /dev/null
+++ b/libs/json_tricks/np_utils.py
@@ -0,0 +1,15 @@
+
+"""
+This file exists for backward compatibility reasons.
+"""
+
+from .utils import hashodict, get_scalar_repr, encode_scalars_inplace
+from .nonp import NoNumpyException
+from . import np
+
+# try:
+# 	from numpy import generic, complex64, complex128
+# except ImportError:
+# 	raise NoNumpyException('Could not load numpy, maybe it is not installed?')
+
+
diff --git a/libs/json_tricks/utils.py b/libs/json_tricks/utils.py
new file mode 100644
index 000000000..ace85d913
--- /dev/null
+++ b/libs/json_tricks/utils.py
@@ -0,0 +1,81 @@
+
+from collections import OrderedDict
+
+
+class hashodict(OrderedDict):
+	"""
+	This dictionary is hashable. It should NOT be mutated, or all kinds of weird
+	bugs may appear. This is not enforced though, it's only used for encoding.
+	"""
+	def __hash__(self):
+		return hash(frozenset(self.items()))
+
+
+try:
+	from inspect import signature
+except ImportError:
+	try:
+		from inspect import getfullargspec
+	except ImportError:
+		from inspect import getargspec
+		def get_arg_names(callable):
+			argspec = getargspec(callable)
+			return set(argspec.args)
+	else:
+		#todo: this is not covered in test case (py 3+ uses `signature`, py2 `getfullargspec`); consider removing it
+		def get_arg_names(callable):
+			argspec = getfullargspec(callable)
+			return set(argspec.args) | set(argspec.kwonlyargs)
+else:
+	def get_arg_names(callable):
+		sig = signature(callable)
+		return set(sig.parameters.keys())
+
+
+def call_with_optional_kwargs(callable, *args, **optional_kwargs):
+	accepted_kwargs = get_arg_names(callable)
+	use_kwargs = {}
+	for key, val in optional_kwargs.items():
+		if key in accepted_kwargs:
+			use_kwargs[key] = val
+	return callable(*args, **use_kwargs)
+
+
+class NoNumpyException(Exception):
+	""" Trying to use numpy features, but numpy cannot be found. """
+
+
+class NoPandasException(Exception):
+	""" Trying to use pandas features, but pandas cannot be found. """
+
+
+def get_scalar_repr(npscalar):
+	return hashodict((
+		('__ndarray__', npscalar.item()),
+		('dtype', str(npscalar.dtype)),
+		('shape', ()),
+	))
+
+
+def encode_scalars_inplace(obj):
+	"""
+	Searches a data structure of lists, tuples and dicts for numpy scalars
+	and replaces them by their dictionary representation, which can be loaded
+	by json-tricks. This happens in-place (the object is changed, use a copy).
+	"""
+	from numpy import generic, complex64, complex128
+	if isinstance(obj, (generic, complex64, complex128)):
+		return get_scalar_repr(obj)
+	if isinstance(obj, dict):
+		for key, val in tuple(obj.items()):
+			obj[key] = encode_scalars_inplace(val)
+		return obj
+	if isinstance(obj, list):
+		for k, val in enumerate(obj):
+			obj[k] = encode_scalars_inplace(val)
+		return obj
+	if isinstance(obj, (tuple, set)):
+		return type(obj)(encode_scalars_inplace(val) for val in obj)
+	return obj
+
+
diff --git a/libs/jstyleson.py b/libs/jstyleson.py
new file mode 100644
index 000000000..dddcff81b
--- /dev/null
+++ b/libs/jstyleson.py
@@ -0,0 +1,124 @@
+import json
+
+
+def dispose(json_str):
+    """Clear all comments in json_str.
+
+    Clear JS-style comments like // and /**/ in json_str.
+    Accept a str or unicode as input.
+
+    Args:
+        json_str: A json string of str or unicode to clean up comment
+
+    Returns:
+        str: The str without comments (or unicode if you pass in unicode)
+    """
+    result_str = list(json_str)
+    escaped = False
+    normal = True
+    sl_comment = False
+    ml_comment = False
+    quoted = False
+
+    a_step_from_comment = False
+    a_step_from_comment_away = False
+
+    former_index = None
+
+    for index, char in enumerate(json_str):
+
+        if escaped:  # We have just met a '\'
+            escaped = False
+            continue
+
+        if a_step_from_comment:  # We have just met a '/'
+            if char != '/' and char != '*':
+                a_step_from_comment = False
+                normal = True
+                continue
+
+        if char == '"':
+            if normal and not escaped:
+                # We are now in a string
+                quoted = True
+                normal = False
+            elif quoted and not escaped:
+                # We are now out of a string
+                quoted = False
+                normal = True
+
+        elif char == '\\':
+            # '\' should not take effect in comment
+            if normal or quoted:
+                escaped = True
+
+        elif char == '/':
+            if a_step_from_comment:
+                # Now we are in single line comment
+                a_step_from_comment = False
+                sl_comment = True
+                normal = False
+                former_index = index - 1
+            elif a_step_from_comment_away:
+                # Now we are out of comment
+                a_step_from_comment_away = False
+                normal = True
+                ml_comment = False
+                for i in range(former_index, index + 1):
+                    result_str[i] = ""
+
+            elif normal:
+                # Now we are just one step away from comment
+                a_step_from_comment = True
+                normal = False
+
+        elif char == '*':
+            if a_step_from_comment:
+                # We are now in multi-line comment
+                a_step_from_comment = False
+                ml_comment = True
+                normal = False
+                former_index = index - 1
+            elif ml_comment:
+                a_step_from_comment_away = True
+        elif char == '\n':
+            if sl_comment:
+                sl_comment = False
+                normal = True
+                for i in range(former_index, index + 1):
+                    result_str[i] = ""
+        elif char == ']' or char == '}':
+            if normal:
+                _remove_last_comma(result_str, index)
+
+    # Show respect to original input if we are in python2
+    return ("" if isinstance(json_str, str) else u"").join(result_str)
+
+
+# There may be performance suffer backtracking the last comma
+def _remove_last_comma(str_list, before_index):
+    i = before_index - 1
+    while str_list[i].isspace() or not str_list[i]:
+        i -= 1
+
+    # This is the first none space char before before_index
+    if str_list[i] == ',':
+        str_list[i] = ''
+
+
+# Below are just some wrapper function around the standard json module.
+
+def loads(text, **kwargs):
+    return json.loads(dispose(text), **kwargs)
+
+
+def load(fp, **kwargs):
+    return loads(fp.read(), **kwargs)
+
+
+def dumps(obj, **kwargs):
+    return json.dumps(obj, **kwargs)
+
+
+def dump(obj, fp, **kwargs):
+    json.dump(obj, fp, **kwargs)
diff --git a/libs/libfilebot/LICENSE b/libs/libfilebot/LICENSE
new file mode 100644
index 000000000..8864d4a39
--- /dev/null
+++ b/libs/libfilebot/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017 
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/libs/libfilebot/README.md b/libs/libfilebot/README.md
new file mode 100644
index 000000000..3356c5a17
--- /dev/null
+++ b/libs/libfilebot/README.md
@@ -0,0 +1,17 @@
+# libfilebot
+
+Returns the `net.filebot.filename` property of a file without binary python package dependencies.
+It instead uses system-provided binaries while *trying* to avoid calling the filebot-jvm-monstrosity.
+
+*This is a quick-hack-excerpt from [Sub-Zero.bundle](https://github.com/pannal/Sub-Zero.bundle), so don't expect constant maintenance or code-quality.*
+
+#### Currently supports:
+
+* `xattr` command on darwin/osx
+* NTFS advanced data streams via python pyADS
+* `getfattr`, `attr` and `filebot` commands for every other OS
+
+
+#### Dependencies
+
+* [pyADS](https://github.com/RobinDavid/pyADS) for Windows
\ No newline at end of file
diff --git a/libs/libfilebot/__init__.py b/libs/libfilebot/__init__.py
new file mode 100644
index 000000000..c734afaef
--- /dev/null
+++ b/libs/libfilebot/__init__.py
@@ -0,0 +1,5 @@
+# coding=utf-8
+
+from main import get_filebot_attrs
+
+__all__ = ["get_filebot_attrs"]
diff --git a/libs/libfilebot/lib.py b/libs/libfilebot/lib.py
new file mode 100644
index 000000000..ac7e469b0
--- /dev/null
+++ b/libs/libfilebot/lib.py
@@ -0,0 +1,38 @@
+# coding=utf-8
+
+import os
+import sys
+
+
+def find_executable(executable, path=None):
+    """Find if 'executable' can be run. Looks for it in 'path'
+    (string that lists directories separated by 'os.pathsep';
+    defaults to os.environ['PATH']). Checks for all executable
+    extensions. Returns full path or None if no command is found.
+    """
+    if path is None:
+        path = os.environ['PATH']
+    paths = path.split(os.pathsep)
+    extlist = ['']
+    if os.name == 'os2':
+        (base, ext) = os.path.splitext(executable)
+        # executable files on OS/2 can have an arbitrary extension, but
+        # .exe is automatically appended if no dot is present in the name
+        if not ext:
+            executable = executable + ".exe"
+    elif sys.platform == 'win32':
+        pathext = os.environ['PATHEXT'].lower().split(os.pathsep)
+        (base, ext) = os.path.splitext(executable)
+        if ext.lower() not in pathext:
+            extlist = pathext
+    for ext in extlist:
+        execname = executable + ext
+        if os.path.isfile(execname):
+            return execname
+        else:
+            for p in paths:
+                f = os.path.join(p, execname)
+                if os.path.isfile(f):
+                    return f
+    else:
+        return None
\ No newline at end of file
diff --git a/libs/libfilebot/main.py b/libs/libfilebot/main.py
new file mode 100644
index 000000000..9a4e685eb
--- /dev/null
+++ b/libs/libfilebot/main.py
@@ -0,0 +1,135 @@
+# coding=utf-8
+
+import subprocess
+import sys
+import traceback
+import logging
+import re
+import binascii
+import types
+import os
+
+from pipes import quote
+from lib import find_executable
+
+mswindows = False
+if sys.platform == "win32":
+    mswindows = True
+    from pyads import ADS
+
+logger = logging.getLogger(__name__)
+
+
+def quote_args(seq):
+    return ' '.join(quote(arg) for arg in seq)
+
+
+def win32_xattr(fn):
+    handler = ADS(fn)
+    try:
+        return handler.get_stream_content("net.filebot.filename")
+    except IOError:
+        pass
+
+
+def default_xattr(fn):
+    if not default_xattr_bin:
+        raise Exception("Neither getfattr, attr nor filebot were found")
+
+    if "getfattr" in default_xattr_bin:
+        return ["getfattr", "-n", "user.net.filebot.filename", fn]
+
+    elif "attr" in default_xattr_bin:
+        return ["attr", "-g", "net.filebot.filename", fn]
+
+    return ["filebot", "-script", "fn:xattr", fn]
+
+
+XATTR_MAP = {
+    "default": (
+        default_xattr,
+        lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)',
+                                 result).group(2)
+    ),
+    # "darwin": (
+    #     lambda fn: ["xattr", "-p", "net.filebot.filename", fn],
+    #     lambda result: binascii.unhexlify(result.strip().replace(' ', '').replace('\r\n', '').replace('\r', '')
+    #                                       .replace('\n', '')).strip("\x00")
+    # ),
+    "darwin": (
+        lambda fn: ["filebot", "-script", "fn:xattr", fn],
+        lambda result: re.search('(?um)(net\.filebot\.filename(?=="|: )[=:" ]+|Attribute.+:\s)([^"\n\r\0]+)',
+                                 result).group(2)
+    ),
+    "win32": (
+        lambda fn: fn,
+        win32_xattr,
+    )
+}
+
+if sys.platform not in XATTR_MAP:
+    default_xattr_bin = find_executable("getfattr") or find_executable("attr") or find_executable("filebot") \
+                        or "filebot"
+
+
+def get_filebot_attrs(fn):
+    """
+    Currently only supports the filebot filename attrs
+    :param fn: filename
+    :return:
+    """
+
+    if sys.platform in XATTR_MAP:
+        logger.debug("Using native xattr calls for %s", sys.platform)
+    else:
+        logger.debug("Using %s for %s", default_xattr_bin, sys.platform)
+
+    args_func, match_func = XATTR_MAP.get(sys.platform, XATTR_MAP["default"])
+
+    args = args_func(fn)
+    if isinstance(args, types.ListType):
+        try:
+            env = dict(os.environ)
+            if not mswindows:
+                env_path = {"PATH": os.pathsep.join(
+                    [
+                        "/usr/local/bin",
+                        "/usr/bin",
+                        "/usr/local/sbin",
+                        "/usr/sbin",
+                        os.environ.get("PATH", "")
+                    ]
+                )
+                }
+                env = dict(os.environ, **env_path)
+
+            env.pop("LD_LIBRARY_PATH", None)
+
+            proc = subprocess.Popen(quote_args(args), stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True,
+                                    env=env)
+            output, errors = proc.communicate()
+
+            if proc.returncode == 1:
+                logger.info(u"%s: Couldn't get filebot original filename, args: %r, output: %r, error: %r", fn, args,
+                            output, errors)
+                return
+
+            output = output.decode()
+
+        except:
+            logger.error(u"%s: Unexpected error while getting filebot original filename: %s", fn,
+                             traceback.format_exc())
+            return
+    else:
+        output = args
+
+    try:
+        orig_fn = match_func(output)
+        return orig_fn.strip()
+    except:
+        logger.info(u"%s: Couldn't get filebot original filename" % fn)
+        logger.debug(u"%s: Result: %r" % (fn, output))
+
+
+if __name__ == "__main__":
+    print get_filebot_attrs(sys.argv[1])
diff --git a/libs/osdefs.h b/libs/osdefs.h
new file mode 100644
index 000000000..d678ca3b4
--- /dev/null
+++ b/libs/osdefs.h
@@ -0,0 +1,48 @@
+// from CPython
+#ifndef Py_OSDEFS_H
+#define Py_OSDEFS_H
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/* Operating system dependencies */
+
+#ifdef MS_WINDOWS
+#define SEP L'\\'
+#define ALTSEP L'/'
+#define MAXPATHLEN 256
+#define DELIM L';'
+#endif
+
+/* Filename separator */
+#ifndef SEP
+#define SEP L'/'
+#endif
+
+/* Max pathname length */
+#ifdef __hpux
+#include <sys/param.h>
+#include <limits.h>
+#ifndef PATH_MAX
+#define PATH_MAX MAXPATHLEN
+#endif
+#endif
+
+#ifndef MAXPATHLEN
+#if defined(PATH_MAX) && PATH_MAX > 1024
+#define MAXPATHLEN PATH_MAX
+#else
+#define MAXPATHLEN 1024
+#endif
+#endif
+
+/* Search path entry delimiter */
+#ifndef DELIM
+#define DELIM L':'
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* !Py_OSDEFS_H */
diff --git a/libs/pkg_resources.py b/libs/pkg_resources.py
new file mode 100644
index 000000000..11debf654
--- /dev/null
+++ b/libs/pkg_resources.py
@@ -0,0 +1,2891 @@
+"""
+Package resource API
+--------------------
+
+A resource is a logical file contained within a package, or a logical
+subdirectory thereof.  The package resource API expects resource names
+to have their path parts separated with ``/``, *not* whatever the local
+path separator is.  Do not use os.path operations to manipulate resource
+names being passed into the API.
+
+The package resource API is designed to work with normal filesystem packages,
+.egg files, and unpacked .egg files.  It can also work in a limited way with
+.zip files and with custom PEP 302 loaders that support the ``get_data()``
+method.
+"""
+
+import sys
+import os
+import time
+import re
+import imp
+import zipfile
+import zipimport
+import warnings
+import stat
+import functools
+import pkgutil
+import token
+import symbol
+import operator
+import platform
+import collections
+import plistlib
+import email.parser
+import tempfile
+from pkgutil import get_importer
+
+try:
+    from urlparse import urlparse, urlunparse
+except ImportError:
+    from urllib.parse import urlparse, urlunparse
+
+try:
+    frozenset
+except NameError:
+    from sets import ImmutableSet as frozenset
+try:
+    basestring
+    next = lambda o: o.next()
+    from cStringIO import StringIO as BytesIO
+except NameError:
+    basestring = str
+    from io import BytesIO
+    def execfile(fn, globs=None, locs=None):
+        if globs is None:
+            globs = globals()
+        if locs is None:
+            locs = globs
+        exec(compile(open(fn).read(), fn, 'exec'), globs, locs)
+
+# capture these to bypass sandboxing
+from os import utime
+try:
+    from os import mkdir, rename, unlink
+    WRITE_SUPPORT = True
+except ImportError:
+    # no write support, probably under GAE
+    WRITE_SUPPORT = False
+
+from os import open as os_open
+from os.path import isdir, split
+
+# Avoid try/except due to potential problems with delayed import mechanisms.
+if sys.version_info >= (3, 3) and sys.implementation.name == "cpython":
+    import importlib._bootstrap as importlib_bootstrap
+else:
+    importlib_bootstrap = None
+
+try:
+    import parser
+except ImportError:
+    pass
+
+def _bypass_ensure_directory(name, mode=0o777):
+    # Sandbox-bypassing version of ensure_directory()
+    if not WRITE_SUPPORT:
+        raise IOError('"os.mkdir" not supported on this platform.')
+    dirname, filename = split(name)
+    if dirname and filename and not isdir(dirname):
+        _bypass_ensure_directory(dirname)
+        mkdir(dirname, mode)
+
+
+_state_vars = {}
+
+def _declare_state(vartype, **kw):
+    globals().update(kw)
+    _state_vars.update(dict.fromkeys(kw, vartype))
+
+def __getstate__():
+    state = {}
+    g = globals()
+    for k, v in _state_vars.items():
+        state[k] = g['_sget_'+v](g[k])
+    return state
+
+def __setstate__(state):
+    g = globals()
+    for k, v in state.items():
+        g['_sset_'+_state_vars[k]](k, g[k], v)
+    return state
+
+def _sget_dict(val):
+    return val.copy()
+
+def _sset_dict(key, ob, state):
+    ob.clear()
+    ob.update(state)
+
+def _sget_object(val):
+    return val.__getstate__()
+
+def _sset_object(key, ob, state):
+    ob.__setstate__(state)
+
+_sget_none = _sset_none = lambda *args: None
+
+
+def get_supported_platform():
+    """Return this platform's maximum compatible version.
+
+    distutils.util.get_platform() normally reports the minimum version
+    of Mac OS X that would be required to *use* extensions produced by
+    distutils.  But what we want when checking compatibility is to know the
+    version of Mac OS X that we are *running*.  To allow usage of packages that
+    explicitly require a newer version of Mac OS X, we must also know the
+    current version of the OS.
+
+    If this condition occurs for any other platform with a version in its
+    platform strings, this function should be extended accordingly.
+    """
+    plat = get_build_platform()
+    m = macosVersionString.match(plat)
+    if m is not None and sys.platform == "darwin":
+        try:
+            plat = 'macosx-%s-%s' % ('.'.join(_macosx_vers()[:2]), m.group(3))
+        except ValueError:
+            # not Mac OS X
+            pass
+    return plat
+
+__all__ = [
+    # Basic resource access and distribution/entry point discovery
+    'require', 'run_script', 'get_provider',  'get_distribution',
+    'load_entry_point', 'get_entry_map', 'get_entry_info',
+    'iter_entry_points',
+    'resource_string', 'resource_stream', 'resource_filename',
+    'resource_listdir', 'resource_exists', 'resource_isdir',
+
+    # Environmental control
+    'declare_namespace', 'working_set', 'add_activation_listener',
+    'find_distributions', 'set_extraction_path', 'cleanup_resources',
+    'get_default_cache',
+
+    # Primary implementation classes
+    'Environment', 'WorkingSet', 'ResourceManager',
+    'Distribution', 'Requirement', 'EntryPoint',
+
+    # Exceptions
+    'ResolutionError', 'VersionConflict', 'DistributionNotFound',
+    'UnknownExtra', 'ExtractionError',
+
+    # Parsing functions and string utilities
+    'parse_requirements', 'parse_version', 'safe_name', 'safe_version',
+    'get_platform', 'compatible_platforms', 'yield_lines', 'split_sections',
+    'safe_extra', 'to_filename', 'invalid_marker', 'evaluate_marker',
+
+    # filesystem utilities
+    'ensure_directory', 'normalize_path',
+
+    # Distribution "precedence" constants
+    'EGG_DIST', 'BINARY_DIST', 'SOURCE_DIST', 'CHECKOUT_DIST', 'DEVELOP_DIST',
+
+    # "Provider" interfaces, implementations, and registration/lookup APIs
+    'IMetadataProvider', 'IResourceProvider', 'FileMetadata',
+    'PathMetadata', 'EggMetadata', 'EmptyProvider', 'empty_provider',
+    'NullProvider', 'EggProvider', 'DefaultProvider', 'ZipProvider',
+    'register_finder', 'register_namespace_handler', 'register_loader_type',
+    'fixup_namespace_packages', 'get_importer',
+
+    # Deprecated/backward compatibility only
+    'run_main', 'AvailableDistributions',
+]
+
+class ResolutionError(Exception):
+    """Abstract base for dependency resolution errors"""
+    def __repr__(self):
+        return self.__class__.__name__+repr(self.args)
+
+class VersionConflict(ResolutionError):
+    """An already-installed version conflicts with the requested version"""
+
+class DistributionNotFound(ResolutionError):
+    """A requested distribution was not found"""
+
+class UnknownExtra(ResolutionError):
+    """Distribution doesn't have an "extra feature" of the given name"""
+_provider_factories = {}
+
+PY_MAJOR = sys.version[:3]
+EGG_DIST = 3
+BINARY_DIST = 2
+SOURCE_DIST = 1
+CHECKOUT_DIST = 0
+DEVELOP_DIST = -1
+
+def register_loader_type(loader_type, provider_factory):
+    """Register `provider_factory` to make providers for `loader_type`
+
+    `loader_type` is the type or class of a PEP 302 ``module.__loader__``,
+    and `provider_factory` is a function that, passed a *module* object,
+    returns an ``IResourceProvider`` for that module.
+    """
+    _provider_factories[loader_type] = provider_factory
+
+def get_provider(moduleOrReq):
+    """Return an IResourceProvider for the named module or requirement"""
+    if isinstance(moduleOrReq, Requirement):
+        return working_set.find(moduleOrReq) or require(str(moduleOrReq))[0]
+    try:
+        module = sys.modules[moduleOrReq]
+    except KeyError:
+        __import__(moduleOrReq)
+        module = sys.modules[moduleOrReq]
+    loader = getattr(module, '__loader__', None)
+    return _find_adapter(_provider_factories, loader)(module)
+
+def _macosx_vers(_cache=[]):
+    if not _cache:
+        version = platform.mac_ver()[0]
+        # fallback for MacPorts
+        if version == '':
+            plist = '/System/Library/CoreServices/SystemVersion.plist'
+            if os.path.exists(plist):
+                if hasattr(plistlib, 'readPlist'):
+                    plist_content = plistlib.readPlist(plist)
+                    if 'ProductVersion' in plist_content:
+                        version = plist_content['ProductVersion']
+
+        _cache.append(version.split('.'))
+    return _cache[0]
+
+def _macosx_arch(machine):
+    return {'PowerPC': 'ppc', 'Power_Macintosh': 'ppc'}.get(machine, machine)
+
+def get_build_platform():
+    """Return this platform's string for platform-specific distributions
+
+    XXX Currently this is the same as ``distutils.util.get_platform()``, but it
+    needs some hacks for Linux and Mac OS X.
+    """
+    try:
+        # Python 2.7 or >=3.2
+        from sysconfig import get_platform
+    except ImportError:
+        from distutils.util import get_platform
+
+    plat = get_platform()
+    if sys.platform == "darwin" and not plat.startswith('macosx-'):
+        try:
+            version = _macosx_vers()
+            machine = os.uname()[4].replace(" ", "_")
+            return "macosx-%d.%d-%s" % (int(version[0]), int(version[1]),
+                _macosx_arch(machine))
+        except ValueError:
+            # if someone is running a non-Mac darwin system, this will fall
+            # through to the default implementation
+            pass
+    return plat
+
+macosVersionString = re.compile(r"macosx-(\d+)\.(\d+)-(.*)")
+darwinVersionString = re.compile(r"darwin-(\d+)\.(\d+)\.(\d+)-(.*)")
+# XXX backward compat
+get_platform = get_build_platform
+
+
+def compatible_platforms(provided, required):
+    """Can code for the `provided` platform run on the `required` platform?
+
+    Returns true if either platform is ``None``, or the platforms are equal.
+
+    XXX Needs compatibility checks for Linux and other unixy OSes.
+    """
+    if provided is None or required is None or provided==required:
+        # easy case
+        return True
+
+    # Mac OS X special cases
+    reqMac = macosVersionString.match(required)
+    if reqMac:
+        provMac = macosVersionString.match(provided)
+
+        # is this a Mac package?
+        if not provMac:
+            # this is backwards compatibility for packages built before
+            # setuptools 0.6. All packages built after this point will
+            # use the new macosx designation.
+            provDarwin = darwinVersionString.match(provided)
+            if provDarwin:
+                dversion = int(provDarwin.group(1))
+                macosversion = "%s.%s" % (reqMac.group(1), reqMac.group(2))
+                if dversion == 7 and macosversion >= "10.3" or \
+                        dversion == 8 and macosversion >= "10.4":
+                    return True
+            # egg isn't macosx or legacy darwin
+            return False
+
+        # are they the same major version and machine type?
+        if provMac.group(1) != reqMac.group(1) or \
+                provMac.group(3) != reqMac.group(3):
+            return False
+
+        # is the required OS major update >= the provided one?
+        if int(provMac.group(2)) > int(reqMac.group(2)):
+            return False
+
+        return True
+
+    # XXX Linux and other platforms' special cases should go here
+    return False
+
+
+def run_script(dist_spec, script_name):
+    """Locate distribution `dist_spec` and run its `script_name` script"""
+    ns = sys._getframe(1).f_globals
+    name = ns['__name__']
+    ns.clear()
+    ns['__name__'] = name
+    require(dist_spec)[0].run_script(script_name, ns)
+
+# backward compatibility
+run_main = run_script
+
+def get_distribution(dist):
+    """Return a current distribution object for a Requirement or string"""
+    if isinstance(dist, basestring):
+        dist = Requirement.parse(dist)
+    if isinstance(dist, Requirement):
+        dist = get_provider(dist)
+    if not isinstance(dist, Distribution):
+        raise TypeError("Expected string, Requirement, or Distribution", dist)
+    return dist
+
+def load_entry_point(dist, group, name):
+    """Return `name` entry point of `group` for `dist` or raise ImportError"""
+    return get_distribution(dist).load_entry_point(group, name)
+
+def get_entry_map(dist, group=None):
+    """Return the entry point map for `group`, or the full entry map"""
+    return get_distribution(dist).get_entry_map(group)
+
+def get_entry_info(dist, group, name):
+    """Return the EntryPoint object for `group`+`name`, or ``None``"""
+    return get_distribution(dist).get_entry_info(group, name)
+
+
+class IMetadataProvider:
+
+    def has_metadata(name):
+        """Does the package's distribution contain the named metadata?"""
+
+    def get_metadata(name):
+        """The named metadata resource as a string"""
+
+    def get_metadata_lines(name):
+        """Yield named metadata resource as list of non-blank non-comment lines
+
+       Leading and trailing whitespace is stripped from each line, and lines
+       with ``#`` as the first non-blank character are omitted."""
+
+    def metadata_isdir(name):
+        """Is the named metadata a directory?  (like ``os.path.isdir()``)"""
+
+    def metadata_listdir(name):
+        """List of metadata names in the directory (like ``os.listdir()``)"""
+
+    def run_script(script_name, namespace):
+        """Execute the named script in the supplied namespace dictionary"""
+
+
+class IResourceProvider(IMetadataProvider):
+    """An object that provides access to package resources"""
+
+    def get_resource_filename(manager, resource_name):
+        """Return a true filesystem path for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_stream(manager, resource_name):
+        """Return a readable file-like object for `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def get_resource_string(manager, resource_name):
+        """Return a string containing the contents of `resource_name`
+
+        `manager` must be an ``IResourceManager``"""
+
+    def has_resource(resource_name):
+        """Does the package contain the named resource?"""
+
+    def resource_isdir(resource_name):
+        """Is the named resource a directory?  (like ``os.path.isdir()``)"""
+
+    def resource_listdir(resource_name):
+        """List of resource names in the directory (like ``os.listdir()``)"""
+
+
+class WorkingSet(object):
+    """A collection of active distributions on sys.path (or a similar list)"""
+
+    def __init__(self, entries=None):
+        """Create working set from list of path entries (default=sys.path)"""
+        self.entries = []
+        self.entry_keys = {}
+        self.by_key = {}
+        self.callbacks = []
+
+        if entries is None:
+            entries = sys.path
+
+        for entry in entries:
+            self.add_entry(entry)
+
+    @classmethod
+    def _build_master(cls):
+        """
+        Prepare the master working set.
+        """
+        ws = cls()
+        try:
+            from __main__ import __requires__
+        except ImportError:
+            # The main program does not list any requirements
+            return ws
+
+        # ensure the requirements are met
+        try:
+            ws.require(__requires__)
+        except VersionConflict:
+            return cls._build_from_requirements(__requires__)
+
+        return ws
+
+    @classmethod
+    def _build_from_requirements(cls, req_spec):
+        """
+        Build a working set from a requirement spec. Rewrites sys.path.
+        """
+        # try it without defaults already on sys.path
+        # by starting with an empty path
+        ws = cls([])
+        reqs = parse_requirements(req_spec)
+        dists = ws.resolve(reqs, Environment())
+        for dist in dists:
+            ws.add(dist)
+
+        # add any missing entries from sys.path
+        for entry in sys.path:
+            if entry not in ws.entries:
+                ws.add_entry(entry)
+
+        # then copy back to sys.path
+        sys.path[:] = ws.entries
+        return ws
+
+    def add_entry(self, entry):
+        """Add a path item to ``.entries``, finding any distributions on it
+
+        ``find_distributions(entry, True)`` is used to find distributions
+        corresponding to the path entry, and they are added.  `entry` is
+        always appended to ``.entries``, even if it is already present.
+        (This is because ``sys.path`` can contain the same value more than
+        once, and the ``.entries`` of the ``sys.path`` WorkingSet should always
+        equal ``sys.path``.)
+        """
+        self.entry_keys.setdefault(entry, [])
+        self.entries.append(entry)
+        for dist in find_distributions(entry, True):
+            self.add(dist, entry, False)
+
+    def __contains__(self, dist):
+        """True if `dist` is the active distribution for its project"""
+        return self.by_key.get(dist.key) == dist
+
+    def find(self, req):
+        """Find a distribution matching requirement `req`
+
+        If there is an active distribution for the requested project, this
+        returns it as long as it meets the version requirement specified by
+        `req`.  But, if there is an active distribution for the project and it
+        does *not* meet the `req` requirement, ``VersionConflict`` is raised.
+        If there is no active distribution for the requested project, ``None``
+        is returned.
+        """
+        dist = self.by_key.get(req.key)
+        if dist is not None and dist not in req:
+            # XXX add more info
+            raise VersionConflict(dist, req)
+        else:
+            return dist
+
+    def iter_entry_points(self, group, name=None):
+        """Yield entry point objects from `group` matching `name`
+
+        If `name` is None, yields all entry points in `group` from all
+        distributions in the working set, otherwise only ones matching
+        both `group` and `name` are yielded (in distribution order).
+        """
+        for dist in self:
+            entries = dist.get_entry_map(group)
+            if name is None:
+                for ep in entries.values():
+                    yield ep
+            elif name in entries:
+                yield entries[name]
+
+    def run_script(self, requires, script_name):
+        """Locate distribution for `requires` and run `script_name` script"""
+        ns = sys._getframe(1).f_globals
+        name = ns['__name__']
+        ns.clear()
+        ns['__name__'] = name
+        self.require(requires)[0].run_script(script_name, ns)
+
+    def __iter__(self):
+        """Yield distributions for non-duplicate projects in the working set
+
+        The yield order is the order in which the items' path entries were
+        added to the working set.
+        """
+        seen = {}
+        for item in self.entries:
+            if item not in self.entry_keys:
+                # workaround a cache issue
+                continue
+
+            for key in self.entry_keys[item]:
+                if key not in seen:
+                    seen[key]=1
+                    yield self.by_key[key]
+
+    def add(self, dist, entry=None, insert=True, replace=False):
+        """Add `dist` to working set, associated with `entry`
+
+        If `entry` is unspecified, it defaults to the ``.location`` of `dist`.
+        On exit from this routine, `entry` is added to the end of the working
+        set's ``.entries`` (if it wasn't already present).
+
+        `dist` is only added to the working set if it's for a project that
+        doesn't already have a distribution in the set, unless `replace=True`.
+        If it's added, any callbacks registered with the ``subscribe()`` method
+        will be called.
+        """
+        if insert:
+            dist.insert_on(self.entries, entry)
+
+        if entry is None:
+            entry = dist.location
+        keys = self.entry_keys.setdefault(entry,[])
+        keys2 = self.entry_keys.setdefault(dist.location,[])
+        if not replace and dist.key in self.by_key:
+            # ignore hidden distros
+            return
+
+        self.by_key[dist.key] = dist
+        if dist.key not in keys:
+            keys.append(dist.key)
+        if dist.key not in keys2:
+            keys2.append(dist.key)
+        self._added_new(dist)
+
+    def resolve(self, requirements, env=None, installer=None,
+            replace_conflicting=False):
+        """List all distributions needed to (recursively) meet `requirements`
+
+        `requirements` must be a sequence of ``Requirement`` objects.  `env`,
+        if supplied, should be an ``Environment`` instance.  If
+        not supplied, it defaults to all distributions available within any
+        entry or distribution in the working set.  `installer`, if supplied,
+        will be invoked with each requirement that cannot be met by an
+        already-installed distribution; it should return a ``Distribution`` or
+        ``None``.
+
+        Unless `replace_conflicting=True`, raises a VersionConflict exception if
+        any requirements are found on the path that have the correct name but
+        the wrong version.  Otherwise, if an `installer` is supplied it will be
+        invoked to obtain the correct version of the requirement and activate
+        it.
+        """
+
+        # set up the stack
+        requirements = list(requirements)[::-1]
+        # set of processed requirements
+        processed = {}
+        # key -> dist
+        best = {}
+        to_activate = []
+
+        while requirements:
+            # process dependencies breadth-first
+            req = requirements.pop(0)
+            if req in processed:
+                # Ignore cyclic or redundant dependencies
+                continue
+            dist = best.get(req.key)
+            if dist is None:
+                # Find the best distribution and add it to the map
+                dist = self.by_key.get(req.key)
+                if dist is None or (dist not in req and replace_conflicting):
+                    ws = self
+                    if env is None:
+                        if dist is None:
+                            env = Environment(self.entries)
+                        else:
+                            # Use an empty environment and workingset to avoid
+                            # any further conflicts with the conflicting
+                            # distribution
+                            env = Environment([])
+                            ws = WorkingSet([])
+                    dist = best[req.key] = env.best_match(req, ws, installer)
+                    if dist is None:
+                        #msg = ("The '%s' distribution was not found on this "
+                        #       "system, and is required by this application.")
+                        #raise DistributionNotFound(msg % req)
+
+                        # unfortunately, zc.buildout uses a str(err)
+                        # to get the name of the distribution here..
+                        raise DistributionNotFound(req)
+                to_activate.append(dist)
+            if dist not in req:
+                # Oops, the "best" so far conflicts with a dependency
+                # XXX put more info here
+                raise VersionConflict(dist, req)
+            requirements.extend(dist.requires(req.extras)[::-1])
+            processed[req] = True
+
+        # return list of distros to activate
+        return to_activate
+
+    def find_plugins(self, plugin_env, full_env=None, installer=None,
+            fallback=True):
+        """Find all activatable distributions in `plugin_env`
+
+        Example usage::
+
+            distributions, errors = working_set.find_plugins(
+                Environment(plugin_dirlist)
+            )
+            # add plugins+libs to sys.path
+            map(working_set.add, distributions)
+            # display errors
+            print('Could not load', errors)
+
+        The `plugin_env` should be an ``Environment`` instance that contains
+        only distributions that are in the project's "plugin directory" or
+        directories. The `full_env`, if supplied, should be an ``Environment``
+        contains all currently-available distributions.  If `full_env` is not
+        supplied, one is created automatically from the ``WorkingSet`` this
+        method is called on, which will typically mean that every directory on
+        ``sys.path`` will be scanned for distributions.
+
+        `installer` is a standard installer callback as used by the
+        ``resolve()`` method. The `fallback` flag indicates whether we should
+        attempt to resolve older versions of a plugin if the newest version
+        cannot be resolved.
+
+        This method returns a 2-tuple: (`distributions`, `error_info`), where
+        `distributions` is a list of the distributions found in `plugin_env`
+        that were loadable, along with any other distributions that are needed
+        to resolve their dependencies.  `error_info` is a dictionary mapping
+        unloadable plugin distributions to an exception instance describing the
+        error that occurred. Usually this will be a ``DistributionNotFound`` or
+        ``VersionConflict`` instance.
+        """
+
+        plugin_projects = list(plugin_env)
+        # scan project names in alphabetic order
+        plugin_projects.sort()
+
+        error_info = {}
+        distributions = {}
+
+        if full_env is None:
+            env = Environment(self.entries)
+            env += plugin_env
+        else:
+            env = full_env + plugin_env
+
+        shadow_set = self.__class__([])
+        # put all our entries in shadow_set
+        list(map(shadow_set.add, self))
+
+        for project_name in plugin_projects:
+
+            for dist in plugin_env[project_name]:
+
+                req = [dist.as_requirement()]
+
+                try:
+                    resolvees = shadow_set.resolve(req, env, installer)
+
+                except ResolutionError:
+                    v = sys.exc_info()[1]
+                    # save error info
+                    error_info[dist] = v
+                    if fallback:
+                        # try the next older version of project
+                        continue
+                    else:
+                        # give up on this project, keep going
+                        break
+
+                else:
+                    list(map(shadow_set.add, resolvees))
+                    distributions.update(dict.fromkeys(resolvees))
+
+                    # success, no need to try any more versions of this project
+                    break
+
+        distributions = list(distributions)
+        distributions.sort()
+
+        return distributions, error_info
+
+    def require(self, *requirements):
+        """Ensure that distributions matching `requirements` are activated
+
+        `requirements` must be a string or a (possibly-nested) sequence
+        thereof, specifying the distributions and versions required.  The
+        return value is a sequence of the distributions that needed to be
+        activated to fulfill the requirements; all relevant distributions are
+        included, even if they were already activated in this working set.
+        """
+        needed = self.resolve(parse_requirements(requirements))
+
+        for dist in needed:
+            self.add(dist)
+
+        return needed
+
+    def subscribe(self, callback):
+        """Invoke `callback` for all distributions (including existing ones)"""
+        if callback in self.callbacks:
+            return
+        self.callbacks.append(callback)
+        for dist in self:
+            callback(dist)
+
+    def _added_new(self, dist):
+        for callback in self.callbacks:
+            callback(dist)
+
+    def __getstate__(self):
+        return (
+            self.entries[:], self.entry_keys.copy(), self.by_key.copy(),
+            self.callbacks[:]
+        )
+
+    def __setstate__(self, e_k_b_c):
+        entries, keys, by_key, callbacks = e_k_b_c
+        self.entries = entries[:]
+        self.entry_keys = keys.copy()
+        self.by_key = by_key.copy()
+        self.callbacks = callbacks[:]
+
+
+class Environment(object):
+    """Searchable snapshot of distributions on a search path"""
+
+    def __init__(self, search_path=None, platform=get_supported_platform(),
+            python=PY_MAJOR):
+        """Snapshot distributions available on a search path
+
+        Any distributions found on `search_path` are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.
+
+        `platform` is an optional string specifying the name of the platform
+        that platform-specific distributions must be compatible with.  If
+        unspecified, it defaults to the current platform.  `python` is an
+        optional string naming the desired version of Python (e.g. ``'3.3'``);
+        it defaults to the current version.
+
+        You may explicitly set `platform` (and/or `python`) to ``None`` if you
+        wish to map *all* distributions, not just those compatible with the
+        running platform or Python version.
+        """
+        self._distmap = {}
+        self.platform = platform
+        self.python = python
+        self.scan(search_path)
+
+    def can_add(self, dist):
+        """Is distribution `dist` acceptable for this environment?
+
+        The distribution must match the platform and python version
+        requirements specified when this environment was created, or False
+        is returned.
+        """
+        return (self.python is None or dist.py_version is None
+            or dist.py_version==self.python) \
+            and compatible_platforms(dist.platform, self.platform)
+
+    def remove(self, dist):
+        """Remove `dist` from the environment"""
+        self._distmap[dist.key].remove(dist)
+
+    def scan(self, search_path=None):
+        """Scan `search_path` for distributions usable in this environment
+
+        Any distributions found are added to the environment.
+        `search_path` should be a sequence of ``sys.path`` items.  If not
+        supplied, ``sys.path`` is used.  Only distributions conforming to
+        the platform/python version defined at initialization are added.
+        """
+        if search_path is None:
+            search_path = sys.path
+
+        for item in search_path:
+            for dist in find_distributions(item):
+                self.add(dist)
+
+    def __getitem__(self, project_name):
+        """Return a newest-to-oldest list of distributions for `project_name`
+
+        Uses case-insensitive `project_name` comparison, assuming all the
+        project's distributions use their project's name converted to all
+        lowercase as their key.
+
+        """
+        distribution_key = project_name.lower()
+        return self._distmap.get(distribution_key, [])
+
+    def add(self, dist):
+        """Add `dist` if we ``can_add()`` it and it has not already been added
+        """
+        if self.can_add(dist) and dist.has_version():
+            dists = self._distmap.setdefault(dist.key, [])
+            if dist not in dists:
+                dists.append(dist)
+                dists.sort(key=operator.attrgetter('hashcmp'), reverse=True)
+
+    def best_match(self, req, working_set, installer=None):
+        """Find distribution best matching `req` and usable on `working_set`
+
+        This calls the ``find(req)`` method of the `working_set` to see if a
+        suitable distribution is already active.  (This may raise
+        ``VersionConflict`` if an unsuitable version of the project is already
+        active in the specified `working_set`.)  If a suitable distribution
+        isn't active, this method returns the newest distribution in the
+        environment that meets the ``Requirement`` in `req`.  If no suitable
+        distribution is found, and `installer` is supplied, then the result of
+        calling the environment's ``obtain(req, installer)`` method will be
+        returned.
+        """
+        dist = working_set.find(req)
+        if dist is not None:
+            return dist
+        for dist in self[req.key]:
+            if dist in req:
+                return dist
+        # try to download/install
+        return self.obtain(req, installer)
+
+    def obtain(self, requirement, installer=None):
+        """Obtain a distribution matching `requirement` (e.g. via download)
+
+        Obtain a distro that matches requirement (e.g. via download).  In the
+        base ``Environment`` class, this routine just returns
+        ``installer(requirement)``, unless `installer` is None, in which case
+        None is returned instead.  This method is a hook that allows subclasses
+        to attempt other ways of obtaining a distribution before falling back
+        to the `installer` argument."""
+        if installer is not None:
+            return installer(requirement)
+
+    def __iter__(self):
+        """Yield the unique project names of the available distributions"""
+        for key in self._distmap.keys():
+            if self[key]:
+                yield key
+
+    def __iadd__(self, other):
+        """In-place addition of a distribution or environment"""
+        if isinstance(other, Distribution):
+            self.add(other)
+        elif isinstance(other, Environment):
+            for project in other:
+                for dist in other[project]:
+                    self.add(dist)
+        else:
+            raise TypeError("Can't add %r to environment" % (other,))
+        return self
+
+    def __add__(self, other):
+        """Add an environment or distribution to an environment"""
+        new = self.__class__([], platform=None, python=None)
+        for env in self, other:
+            new += env
+        return new
+
+
+# XXX backward compatibility
+AvailableDistributions = Environment
+
+
+class ExtractionError(RuntimeError):
+    """An error occurred extracting a resource
+
+    The following attributes are available from instances of this exception:
+
+    manager
+        The resource manager that raised this exception
+
+    cache_path
+        The base directory for resource extraction
+
+    original_error
+        The exception instance that caused extraction to fail
+    """
+
+
+class ResourceManager:
+    """Manage resource extraction and packages"""
+    extraction_path = None
+
+    def __init__(self):
+        self.cached_files = {}
+
+    def resource_exists(self, package_or_requirement, resource_name):
+        """Does the named resource exist?"""
+        return get_provider(package_or_requirement).has_resource(resource_name)
+
+    def resource_isdir(self, package_or_requirement, resource_name):
+        """Is the named resource an existing directory?"""
+        return get_provider(package_or_requirement).resource_isdir(
+            resource_name
+        )
+
+    def resource_filename(self, package_or_requirement, resource_name):
+        """Return a true filesystem path for specified resource"""
+        return get_provider(package_or_requirement).get_resource_filename(
+            self, resource_name
+        )
+
+    def resource_stream(self, package_or_requirement, resource_name):
+        """Return a readable file-like object for specified resource"""
+        return get_provider(package_or_requirement).get_resource_stream(
+            self, resource_name
+        )
+
+    def resource_string(self, package_or_requirement, resource_name):
+        """Return specified resource as a string"""
+        return get_provider(package_or_requirement).get_resource_string(
+            self, resource_name
+        )
+
+    def resource_listdir(self, package_or_requirement, resource_name):
+        """List the contents of the named resource directory"""
+        return get_provider(package_or_requirement).resource_listdir(
+            resource_name
+        )
+
+    def extraction_error(self):
+        """Give an error message for problems extracting file(s)"""
+
+        old_exc = sys.exc_info()[1]
+        cache_path = self.extraction_path or get_default_cache()
+
+        err = ExtractionError("""Can't extract file(s) to egg cache
+
+The following error occurred while trying to extract file(s) to the Python egg
+cache:
+
+  %s
+
+The Python egg cache directory is currently set to:
+
+  %s
+
+Perhaps your account does not have write access to this directory?  You can
+change the cache directory by setting the PYTHON_EGG_CACHE environment
+variable to point to an accessible directory.
+""" % (old_exc, cache_path)
+        )
+        err.manager = self
+        err.cache_path = cache_path
+        err.original_error = old_exc
+        raise err
+
+    def get_cache_path(self, archive_name, names=()):
+        """Return absolute location in cache for `archive_name` and `names`
+
+        The parent directory of the resulting path will be created if it does
+        not already exist.  `archive_name` should be the base filename of the
+        enclosing egg (which may not be the name of the enclosing zipfile!),
+        including its ".egg" extension.  `names`, if provided, should be a
+        sequence of path name parts "under" the egg's extraction location.
+
+        This method should only be called by resource providers that need to
+        obtain an extraction location, and only for names they intend to
+        extract, as it tracks the generated names for possible cleanup later.
+        """
+        extract_path = self.extraction_path or get_default_cache()
+        target_path = os.path.join(extract_path, archive_name+'-tmp', *names)
+        try:
+            _bypass_ensure_directory(target_path)
+        except:
+            self.extraction_error()
+
+        self._warn_unsafe_extraction_path(extract_path)
+
+        self.cached_files[target_path] = 1
+        return target_path
+
+    @staticmethod
+    def _warn_unsafe_extraction_path(path):
+        """
+        If the default extraction path is overridden and set to an insecure
+        location, such as /tmp, it opens up an opportunity for an attacker to
+        replace an extracted file with an unauthorized payload. Warn the user
+        if a known insecure location is used.
+
+        See Distribute #375 for more details.
+        """
+        if os.name == 'nt' and not path.startswith(os.environ['windir']):
+            # On Windows, permissions are generally restrictive by default
+            #  and temp directories are not writable by other users, so
+            #  bypass the warning.
+            return
+        mode = os.stat(path).st_mode
+        if mode & stat.S_IWOTH or mode & stat.S_IWGRP:
+            msg = ("%s is writable by group/others and vulnerable to attack "
+                "when "
+                "used with get_resource_filename. Consider a more secure "
+                "location (set with .set_extraction_path or the "
+                "PYTHON_EGG_CACHE environment variable)." % path)
+            warnings.warn(msg, UserWarning)
+
+    def postprocess(self, tempname, filename):
+        """Perform any platform-specific postprocessing of `tempname`
+
+        This is where Mac header rewrites should be done; other platforms don't
+        have anything special they should do.
+
+        Resource providers should call this method ONLY after successfully
+        extracting a compressed resource.  They must NOT call it on resources
+        that are already in the filesystem.
+
+        `tempname` is the current (temporary) name of the file, and `filename`
+        is the name it will be renamed to by the caller after this routine
+        returns.
+        """
+
+        if os.name == 'posix':
+            # Make the resource executable
+            mode = ((os.stat(tempname).st_mode) | 0o555) & 0o7777
+            os.chmod(tempname, mode)
+
+    def set_extraction_path(self, path):
+        """Set the base path where resources will be extracted to, if needed.
+
+        If you do not call this routine before any extractions take place, the
+        path defaults to the return value of ``get_default_cache()``.  (Which
+        is based on the ``PYTHON_EGG_CACHE`` environment variable, with various
+        platform-specific fallbacks.  See that routine's documentation for more
+        details.)
+
+        Resources are extracted to subdirectories of this path based upon
+        information given by the ``IResourceProvider``.  You may set this to a
+        temporary directory, but then you must call ``cleanup_resources()`` to
+        delete the extracted files when done.  There is no guarantee that
+        ``cleanup_resources()`` will be able to remove all extracted files.
+
+        (Note: you may not change the extraction path for a given resource
+        manager once resources have been extracted, unless you first call
+        ``cleanup_resources()``.)
+        """
+        if self.cached_files:
+            raise ValueError(
+                "Can't change extraction path, files already extracted"
+            )
+
+        self.extraction_path = path
+
+    def cleanup_resources(self, force=False):
+        """
+        Delete all extracted resource files and directories, returning a list
+        of the file and directory names that could not be successfully removed.
+        This function does not have any concurrency protection, so it should
+        generally only be called when the extraction path is a temporary
+        directory exclusive to a single process.  This method is not
+        automatically called; you must call it explicitly or register it as an
+        ``atexit`` function if you wish to ensure cleanup of a temporary
+        directory used for extractions.
+        """
+        # XXX
+
+def get_default_cache():
+    """Determine the default cache location
+
+    This returns the ``PYTHON_EGG_CACHE`` environment variable, if set.
+    Otherwise, on Windows, it returns a "Python-Eggs" subdirectory of the
+    "Application Data" directory.  On all other systems, it's "~/.python-eggs".
+    """
+    try:
+        return os.environ['PYTHON_EGG_CACHE']
+    except KeyError:
+        pass
+
+    if os.name!='nt':
+        return os.path.expanduser('~/.python-eggs')
+
+    # XXX this may be locale-specific!
+    app_data = 'Application Data'
+    app_homes = [
+        # best option, should be locale-safe
+        (('APPDATA',), None),
+        (('USERPROFILE',), app_data),
+        (('HOMEDRIVE','HOMEPATH'), app_data),
+        (('HOMEPATH',), app_data),
+        (('HOME',), None),
+        # 95/98/ME
+        (('WINDIR',), app_data),
+    ]
+
+    for keys, subdir in app_homes:
+        dirname = ''
+        for key in keys:
+            if key in os.environ:
+                dirname = os.path.join(dirname, os.environ[key])
+            else:
+                break
+        else:
+            if subdir:
+                dirname = os.path.join(dirname, subdir)
+            return os.path.join(dirname, 'Python-Eggs')
+    else:
+        raise RuntimeError(
+            "Please set the PYTHON_EGG_CACHE enviroment variable"
+        )
+
+def safe_name(name):
+    """Convert an arbitrary string to a standard distribution name
+
+    Any runs of non-alphanumeric/. characters are replaced with a single '-'.
+    """
+    return re.sub('[^A-Za-z0-9.]+', '-', name)
+
+
+def safe_version(version):
+    """Convert an arbitrary string to a standard version string
+
+    Spaces become dots, and all other non-alphanumeric characters become
+    dashes, with runs of multiple dashes condensed to a single dash.
+    """
+    version = version.replace(' ','.')
+    return re.sub('[^A-Za-z0-9.]+', '-', version)
+
+
+def safe_extra(extra):
+    """Convert an arbitrary string to a standard 'extra' name
+
+    Any runs of non-alphanumeric characters are replaced with a single '_',
+    and the result is always lowercased.
+    """
+    return re.sub('[^A-Za-z0-9.]+', '_', extra).lower()
+
+
+def to_filename(name):
+    """Convert a project or version name to its filename-escaped form
+
+    Any '-' characters are currently replaced with '_'.
+    """
+    return name.replace('-','_')
+
+
+class MarkerEvaluation(object):
+    values = {
+        'os_name': lambda: os.name,
+        'sys_platform': lambda: sys.platform,
+        'python_full_version': platform.python_version,
+        'python_version': lambda: platform.python_version()[:3],
+        'platform_version': platform.version,
+        'platform_machine': platform.machine,
+        'python_implementation': platform.python_implementation,
+    }
+
+    @classmethod
+    def is_invalid_marker(cls, text):
+        """
+        Validate text as a PEP 426 environment marker; return an exception
+        if invalid or False otherwise.
+        """
+        try:
+            cls.evaluate_marker(text)
+        except SyntaxError:
+            return cls.normalize_exception(sys.exc_info()[1])
+        return False
+
+    @staticmethod
+    def normalize_exception(exc):
+        """
+        Given a SyntaxError from a marker evaluation, normalize the error
+        message:
+         - Remove indications of filename and line number.
+         - Replace platform-specific error messages with standard error
+           messages.
+        """
+        subs = {
+            'unexpected EOF while parsing': 'invalid syntax',
+            'parenthesis is never closed': 'invalid syntax',
+        }
+        exc.filename = None
+        exc.lineno = None
+        exc.msg = subs.get(exc.msg, exc.msg)
+        return exc
+
+    @classmethod
+    def and_test(cls, nodelist):
+        # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
+        items = [
+            cls.interpret(nodelist[i])
+            for i in range(1, len(nodelist), 2)
+        ]
+        return functools.reduce(operator.and_, items)
+
+    @classmethod
+    def test(cls, nodelist):
+        # MUST NOT short-circuit evaluation, or invalid syntax can be skipped!
+        items = [
+            cls.interpret(nodelist[i])
+            for i in range(1, len(nodelist), 2)
+        ]
+        return functools.reduce(operator.or_, items)
+
+    @classmethod
+    def atom(cls, nodelist):
+        t = nodelist[1][0]
+        if t == token.LPAR:
+            if nodelist[2][0] == token.RPAR:
+                raise SyntaxError("Empty parentheses")
+            return cls.interpret(nodelist[2])
+        msg = "Language feature not supported in environment markers"
+        raise SyntaxError(msg)
+
+    @classmethod
+    def comparison(cls, nodelist):
+        if len(nodelist) > 4:
+            msg = "Chained comparison not allowed in environment markers"
+            raise SyntaxError(msg)
+        comp = nodelist[2][1]
+        cop = comp[1]
+        if comp[0] == token.NAME:
+            if len(nodelist[2]) == 3:
+                if cop == 'not':
+                    cop = 'not in'
+                else:
+                    cop = 'is not'
+        try:
+            cop = cls.get_op(cop)
+        except KeyError:
+            msg = repr(cop) + " operator not allowed in environment markers"
+            raise SyntaxError(msg)
+        return cop(cls.evaluate(nodelist[1]), cls.evaluate(nodelist[3]))
+
+    @classmethod
+    def get_op(cls, op):
+        ops = {
+            symbol.test: cls.test,
+            symbol.and_test: cls.and_test,
+            symbol.atom: cls.atom,
+            symbol.comparison: cls.comparison,
+            'not in': lambda x, y: x not in y,
+            'in': lambda x, y: x in y,
+            '==': operator.eq,
+            '!=': operator.ne,
+        }
+        if hasattr(symbol, 'or_test'):
+            ops[symbol.or_test] = cls.test
+        return ops[op]
+
+    @classmethod
+    def evaluate_marker(cls, text, extra=None):
+        """
+        Evaluate a PEP 426 environment marker on CPython 2.4+.
+        Return a boolean indicating the marker result in this environment.
+        Raise SyntaxError if marker is invalid.
+
+        This implementation uses the 'parser' module, which is not implemented
+        on
+        Jython and has been superseded by the 'ast' module in Python 2.6 and
+        later.
+        """
+        return cls.interpret(parser.expr(text).totuple(1)[1])
+
+    @classmethod
+    def _markerlib_evaluate(cls, text):
+        """
+        Evaluate a PEP 426 environment marker using markerlib.
+        Return a boolean indicating the marker result in this environment.
+        Raise SyntaxError if marker is invalid.
+        """
+        import _markerlib
+        # markerlib implements Metadata 1.2 (PEP 345) environment markers.
+        # Translate the variables to Metadata 2.0 (PEP 426).
+        env = _markerlib.default_environment()
+        for key in env.keys():
+            new_key = key.replace('.', '_')
+            env[new_key] = env.pop(key)
+        try:
+            result = _markerlib.interpret(text, env)
+        except NameError:
+            e = sys.exc_info()[1]
+            raise SyntaxError(e.args[0])
+        return result
+
+    if 'parser' not in globals():
+        # Fall back to less-complete _markerlib implementation if 'parser' module
+        # is not available.
+        evaluate_marker = _markerlib_evaluate
+
+    @classmethod
+    def interpret(cls, nodelist):
+        while len(nodelist)==2: nodelist = nodelist[1]
+        try:
+            op = cls.get_op(nodelist[0])
+        except KeyError:
+            raise SyntaxError("Comparison or logical expression expected")
+        return op(nodelist)
+
+    @classmethod
+    def evaluate(cls, nodelist):
+        while len(nodelist)==2: nodelist = nodelist[1]
+        kind = nodelist[0]
+        name = nodelist[1]
+        if kind==token.NAME:
+            try:
+                op = cls.values[name]
+            except KeyError:
+                raise SyntaxError("Unknown name %r" % name)
+            return op()
+        if kind==token.STRING:
+            s = nodelist[1]
+            if not cls._safe_string(s):
+                raise SyntaxError(
+                    "Only plain strings allowed in environment markers")
+            return s[1:-1]
+        msg = "Language feature not supported in environment markers"
+        raise SyntaxError(msg)
+
+    @staticmethod
+    def _safe_string(cand):
+        return (
+            cand[:1] in "'\"" and
+            not cand.startswith('"""') and
+            not cand.startswith("'''") and
+            '\\' not in cand
+        )
+
+invalid_marker = MarkerEvaluation.is_invalid_marker
+evaluate_marker = MarkerEvaluation.evaluate_marker
+
+class NullProvider:
+    """Try to implement resources and metadata for arbitrary PEP 302 loaders"""
+
+    egg_name = None
+    egg_info = None
+    loader = None
+
+    def __init__(self, module):
+        self.loader = getattr(module, '__loader__', None)
+        self.module_path = os.path.dirname(getattr(module, '__file__', ''))
+
+    def get_resource_filename(self, manager, resource_name):
+        return self._fn(self.module_path, resource_name)
+
+    def get_resource_stream(self, manager, resource_name):
+        return BytesIO(self.get_resource_string(manager, resource_name))
+
+    def get_resource_string(self, manager, resource_name):
+        return self._get(self._fn(self.module_path, resource_name))
+
+    def has_resource(self, resource_name):
+        return self._has(self._fn(self.module_path, resource_name))
+
+    def has_metadata(self, name):
+        return self.egg_info and self._has(self._fn(self.egg_info, name))
+
+    if sys.version_info <= (3,):
+        def get_metadata(self, name):
+            if not self.egg_info:
+                return ""
+            return self._get(self._fn(self.egg_info, name))
+    else:
+        def get_metadata(self, name):
+            if not self.egg_info:
+                return ""
+            return self._get(self._fn(self.egg_info, name)).decode("utf-8")
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+    def resource_isdir(self, resource_name):
+        return self._isdir(self._fn(self.module_path, resource_name))
+
+    def metadata_isdir(self, name):
+        return self.egg_info and self._isdir(self._fn(self.egg_info, name))
+
+    def resource_listdir(self, resource_name):
+        return self._listdir(self._fn(self.module_path, resource_name))
+
+    def metadata_listdir(self, name):
+        if self.egg_info:
+            return self._listdir(self._fn(self.egg_info, name))
+        return []
+
+    def run_script(self, script_name, namespace):
+        script = 'scripts/'+script_name
+        if not self.has_metadata(script):
+            raise ResolutionError("No script named %r" % script_name)
+        script_text = self.get_metadata(script).replace('\r\n', '\n')
+        script_text = script_text.replace('\r', '\n')
+        script_filename = self._fn(self.egg_info, script)
+        namespace['__file__'] = script_filename
+        if os.path.exists(script_filename):
+            execfile(script_filename, namespace, namespace)
+        else:
+            from linecache import cache
+            cache[script_filename] = (
+                len(script_text), 0, script_text.split('\n'), script_filename
+            )
+            script_code = compile(script_text, script_filename,'exec')
+            exec(script_code, namespace, namespace)
+
+    def _has(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _isdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _listdir(self, path):
+        raise NotImplementedError(
+            "Can't perform this operation for unregistered loader type"
+        )
+
+    def _fn(self, base, resource_name):
+        if resource_name:
+            return os.path.join(base, *resource_name.split('/'))
+        return base
+
+    def _get(self, path):
+        if hasattr(self.loader, 'get_data'):
+            return self.loader.get_data(path)
+        raise NotImplementedError(
+            "Can't perform this operation for loaders without 'get_data()'"
+        )
+
+register_loader_type(object, NullProvider)
+
+
+class EggProvider(NullProvider):
+    """Provider based on a virtual filesystem"""
+
+    def __init__(self, module):
+        NullProvider.__init__(self, module)
+        self._setup_prefix()
+
+    def _setup_prefix(self):
+        # we assume here that our metadata may be nested inside a "basket"
+        # of multiple eggs; that's why we use module_path instead of .archive
+        path = self.module_path
+        old = None
+        while path!=old:
+            if path.lower().endswith('.egg'):
+                self.egg_name = os.path.basename(path)
+                self.egg_info = os.path.join(path, 'EGG-INFO')
+                self.egg_root = path
+                break
+            old = path
+            path, base = os.path.split(path)
+
+class DefaultProvider(EggProvider):
+    """Provides access to package resources in the filesystem"""
+
+    def _has(self, path):
+        return os.path.exists(path)
+
+    def _isdir(self, path):
+        return os.path.isdir(path)
+
+    def _listdir(self, path):
+        return os.listdir(path)
+
+    def get_resource_stream(self, manager, resource_name):
+        return open(self._fn(self.module_path, resource_name), 'rb')
+
+    def _get(self, path):
+        with open(path, 'rb') as stream:
+            return stream.read()
+
+register_loader_type(type(None), DefaultProvider)
+
+if importlib_bootstrap is not None:
+    register_loader_type(importlib_bootstrap.SourceFileLoader, DefaultProvider)
+
+
+class EmptyProvider(NullProvider):
+    """Provider that returns nothing for all requests"""
+
+    _isdir = _has = lambda self, path: False
+    _get = lambda self, path: ''
+    _listdir = lambda self, path: []
+    module_path = None
+
+    def __init__(self):
+        pass
+
+empty_provider = EmptyProvider()
+
+
+class ZipManifests(dict):
+    """
+    zip manifest builder
+    """
+
+    @classmethod
+    def build(cls, path):
+        """
+        Build a dictionary similar to the zipimport directory
+        caches, except instead of tuples, store ZipInfo objects.
+
+        Use a platform-specific path separator (os.sep) for the path keys
+        for compatibility with pypy on Windows.
+        """
+        with ContextualZipFile(path) as zfile:
+            items = (
+                (
+                    name.replace('/', os.sep),
+                    zfile.getinfo(name),
+                )
+                for name in zfile.namelist()
+            )
+            return dict(items)
+
+    load = build
+
+
+class MemoizedZipManifests(ZipManifests):
+    """
+    Memoized zipfile manifests.
+    """
+    manifest_mod = collections.namedtuple('manifest_mod', 'manifest mtime')
+
+    def load(self, path):
+        """
+        Load a manifest at path or return a suitable manifest already loaded.
+        """
+        path = os.path.normpath(path)
+        mtime = os.stat(path).st_mtime
+
+        if path not in self or self[path].mtime != mtime:
+            manifest = self.build(path)
+            self[path] = self.manifest_mod(manifest, mtime)
+
+        return self[path].manifest
+
+
+class ContextualZipFile(zipfile.ZipFile):
+    """
+    Supplement ZipFile class to support context manager for Python 2.6
+    """
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, type, value, traceback):
+        self.close()
+
+    def __new__(cls, *args, **kwargs):
+        """
+        Construct a ZipFile or ContextualZipFile as appropriate
+        """
+        if hasattr(zipfile.ZipFile, '__exit__'):
+            return zipfile.ZipFile(*args, **kwargs)
+        return super(ContextualZipFile, cls).__new__(cls)
+
+
+class ZipProvider(EggProvider):
+    """Resource support for zips and eggs"""
+
+    eagers = None
+    _zip_manifests = (
+        MemoizedZipManifests()
+        if os.environ.get('PKG_RESOURCES_CACHE_ZIP_MANIFESTS') else
+        ZipManifests()
+    )
+
+    def __init__(self, module):
+        EggProvider.__init__(self, module)
+        self.zip_pre = self.loader.archive+os.sep
+
+    def _zipinfo_name(self, fspath):
+        # Convert a virtual filename (full path to file) into a zipfile subpath
+        # usable with the zipimport directory cache for our target archive
+        if fspath.startswith(self.zip_pre):
+            return fspath[len(self.zip_pre):]
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.zip_pre)
+        )
+
+    def _parts(self, zip_path):
+        # Convert a zipfile subpath into an egg-relative path part list.
+        # pseudo-fs path
+        fspath = self.zip_pre+zip_path
+        if fspath.startswith(self.egg_root+os.sep):
+            return fspath[len(self.egg_root)+1:].split(os.sep)
+        raise AssertionError(
+            "%s is not a subpath of %s" % (fspath, self.egg_root)
+        )
+
+    @property
+    def zipinfo(self):
+        return self._zip_manifests.load(self.loader.archive)
+
+    def get_resource_filename(self, manager, resource_name):
+        if not self.egg_name:
+            raise NotImplementedError(
+                "resource_filename() only supported for .egg, not .zip"
+            )
+        # no need to lock for extraction, since we use temp names
+        zip_path = self._resource_to_zip(resource_name)
+        eagers = self._get_eager_resources()
+        if '/'.join(self._parts(zip_path)) in eagers:
+            for name in eagers:
+                self._extract_resource(manager, self._eager_to_zip(name))
+        return self._extract_resource(manager, zip_path)
+
+    @staticmethod
+    def _get_date_and_size(zip_stat):
+        size = zip_stat.file_size
+        # ymdhms+wday, yday, dst
+        date_time = zip_stat.date_time + (0, 0, -1)
+        # 1980 offset already done
+        timestamp = time.mktime(date_time)
+        return timestamp, size
+
+    def _extract_resource(self, manager, zip_path):
+
+        if zip_path in self._index():
+            for name in self._index()[zip_path]:
+                last = self._extract_resource(
+                    manager, os.path.join(zip_path, name)
+                )
+            # return the extracted directory name
+            return os.path.dirname(last)
+
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+
+        if not WRITE_SUPPORT:
+            raise IOError('"os.rename" and "os.unlink" are not supported '
+                          'on this platform')
+        try:
+
+            real_path = manager.get_cache_path(
+                self.egg_name, self._parts(zip_path)
+            )
+
+            if self._is_current(real_path, zip_path):
+                return real_path
+
+            outf, tmpnam = _mkstemp(".$extract", dir=os.path.dirname(real_path))
+            os.write(outf, self.loader.get_data(zip_path))
+            os.close(outf)
+            utime(tmpnam, (timestamp, timestamp))
+            manager.postprocess(tmpnam, real_path)
+
+            try:
+                rename(tmpnam, real_path)
+
+            except os.error:
+                if os.path.isfile(real_path):
+                    if self._is_current(real_path, zip_path):
+                        # the file became current since it was checked above,
+                        #  so proceed.
+                        return real_path
+                    # Windows, del old file and retry
+                    elif os.name=='nt':
+                        unlink(real_path)
+                        rename(tmpnam, real_path)
+                        return real_path
+                raise
+
+        except os.error:
+            # report a user-friendly error
+            manager.extraction_error()
+
+        return real_path
+
+    def _is_current(self, file_path, zip_path):
+        """
+        Return True if the file_path is current for this zip_path
+        """
+        timestamp, size = self._get_date_and_size(self.zipinfo[zip_path])
+        if not os.path.isfile(file_path):
+            return False
+        stat = os.stat(file_path)
+        if stat.st_size!=size or stat.st_mtime!=timestamp:
+            return False
+        # check that the contents match
+        zip_contents = self.loader.get_data(zip_path)
+        with open(file_path, 'rb') as f:
+            file_contents = f.read()
+        return zip_contents == file_contents
+
+    def _get_eager_resources(self):
+        if self.eagers is None:
+            eagers = []
+            for name in ('native_libs.txt', 'eager_resources.txt'):
+                if self.has_metadata(name):
+                    eagers.extend(self.get_metadata_lines(name))
+            self.eagers = eagers
+        return self.eagers
+
+    def _index(self):
+        try:
+            return self._dirindex
+        except AttributeError:
+            ind = {}
+            for path in self.zipinfo:
+                parts = path.split(os.sep)
+                while parts:
+                    parent = os.sep.join(parts[:-1])
+                    if parent in ind:
+                        ind[parent].append(parts[-1])
+                        break
+                    else:
+                        ind[parent] = [parts.pop()]
+            self._dirindex = ind
+            return ind
+
+    def _has(self, fspath):
+        zip_path = self._zipinfo_name(fspath)
+        return zip_path in self.zipinfo or zip_path in self._index()
+
+    def _isdir(self, fspath):
+        return self._zipinfo_name(fspath) in self._index()
+
+    def _listdir(self, fspath):
+        return list(self._index().get(self._zipinfo_name(fspath), ()))
+
+    def _eager_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.egg_root, resource_name))
+
+    def _resource_to_zip(self, resource_name):
+        return self._zipinfo_name(self._fn(self.module_path, resource_name))
+
+register_loader_type(zipimport.zipimporter, ZipProvider)
+
+
+class FileMetadata(EmptyProvider):
+    """Metadata handler for standalone PKG-INFO files
+
+    Usage::
+
+        metadata = FileMetadata("/path/to/PKG-INFO")
+
+    This provider rejects all data and metadata requests except for PKG-INFO,
+    which is treated as existing, and will be the contents of the file at
+    the provided location.
+    """
+
+    def __init__(self, path):
+        self.path = path
+
+    def has_metadata(self, name):
+        return name=='PKG-INFO'
+
+    def get_metadata(self, name):
+        if name=='PKG-INFO':
+            with open(self.path,'rU') as f:
+                metadata = f.read()
+            return metadata
+        raise KeyError("No metadata except PKG-INFO is available")
+
+    def get_metadata_lines(self, name):
+        return yield_lines(self.get_metadata(name))
+
+
+class PathMetadata(DefaultProvider):
+    """Metadata provider for egg directories
+
+    Usage::
+
+        # Development eggs:
+
+        egg_info = "/path/to/PackageName.egg-info"
+        base_dir = os.path.dirname(egg_info)
+        metadata = PathMetadata(base_dir, egg_info)
+        dist_name = os.path.splitext(os.path.basename(egg_info))[0]
+        dist = Distribution(basedir, project_name=dist_name, metadata=metadata)
+
+        # Unpacked egg directories:
+
+        egg_path = "/path/to/PackageName-ver-pyver-etc.egg"
+        metadata = PathMetadata(egg_path, os.path.join(egg_path,'EGG-INFO'))
+        dist = Distribution.from_filename(egg_path, metadata=metadata)
+    """
+
+    def __init__(self, path, egg_info):
+        self.module_path = path
+        self.egg_info = egg_info
+
+
+class EggMetadata(ZipProvider):
+    """Metadata provider for .egg files"""
+
+    def __init__(self, importer):
+        """Create a metadata provider from a zipimporter"""
+
+        self.zip_pre = importer.archive+os.sep
+        self.loader = importer
+        if importer.prefix:
+            self.module_path = os.path.join(importer.archive, importer.prefix)
+        else:
+            self.module_path = importer.archive
+        self._setup_prefix()
+
+_declare_state('dict', _distribution_finders = {})
+
+def register_finder(importer_type, distribution_finder):
+    """Register `distribution_finder` to find distributions in sys.path items
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `distribution_finder` is a callable that, passed a path
+    item and the importer instance, yields ``Distribution`` instances found on
+    that path item.  See ``pkg_resources.find_on_path`` for an example."""
+    _distribution_finders[importer_type] = distribution_finder
+
+
+def find_distributions(path_item, only=False):
+    """Yield distributions accessible via `path_item`"""
+    importer = get_importer(path_item)
+    finder = _find_adapter(_distribution_finders, importer)
+    return finder(importer, path_item, only)
+
+def find_eggs_in_zip(importer, path_item, only=False):
+    """
+    Find eggs in zip files; possibly multiple nested eggs.
+    """
+    if importer.archive.endswith('.whl'):
+        # wheels are not supported with this finder
+        # they don't have PKG-INFO metadata, and won't ever contain eggs
+        return
+    metadata = EggMetadata(importer)
+    if metadata.has_metadata('PKG-INFO'):
+        yield Distribution.from_filename(path_item, metadata=metadata)
+    if only:
+        # don't yield nested distros
+        return
+    for subitem in metadata.resource_listdir('/'):
+        if subitem.endswith('.egg'):
+            subpath = os.path.join(path_item, subitem)
+            for dist in find_eggs_in_zip(zipimport.zipimporter(subpath), subpath):
+                yield dist
+
+register_finder(zipimport.zipimporter, find_eggs_in_zip)
+
+def find_nothing(importer, path_item, only=False):
+    return ()
+register_finder(object, find_nothing)
+
+def find_on_path(importer, path_item, only=False):
+    """Yield distributions accessible on a sys.path directory"""
+    path_item = _normalize_cached(path_item)
+
+    if os.path.isdir(path_item) and os.access(path_item, os.R_OK):
+        if path_item.lower().endswith('.egg'):
+            # unpacked egg
+            yield Distribution.from_filename(
+                path_item, metadata=PathMetadata(
+                    path_item, os.path.join(path_item,'EGG-INFO')
+                )
+            )
+        else:
+            # scan for .egg and .egg-info in directory
+            for entry in os.listdir(path_item):
+                lower = entry.lower()
+                if lower.endswith('.egg-info') or lower.endswith('.dist-info'):
+                    fullpath = os.path.join(path_item, entry)
+                    if os.path.isdir(fullpath):
+                        # egg-info directory, allow getting metadata
+                        metadata = PathMetadata(path_item, fullpath)
+                    else:
+                        metadata = FileMetadata(fullpath)
+                    yield Distribution.from_location(
+                        path_item, entry, metadata, precedence=DEVELOP_DIST
+                    )
+                elif not only and lower.endswith('.egg'):
+                    dists = find_distributions(os.path.join(path_item, entry))
+                    for dist in dists:
+                        yield dist
+                elif not only and lower.endswith('.egg-link'):
+                    with open(os.path.join(path_item, entry)) as entry_file:
+                        entry_lines = entry_file.readlines()
+                    for line in entry_lines:
+                        if not line.strip():
+                            continue
+                        path = os.path.join(path_item, line.rstrip())
+                        dists = find_distributions(path)
+                        for item in dists:
+                            yield item
+                        break
+register_finder(pkgutil.ImpImporter, find_on_path)
+
+if importlib_bootstrap is not None:
+    register_finder(importlib_bootstrap.FileFinder, find_on_path)
+
+_declare_state('dict', _namespace_handlers={})
+_declare_state('dict', _namespace_packages={})
+
+
+def register_namespace_handler(importer_type, namespace_handler):
+    """Register `namespace_handler` to declare namespace packages
+
+    `importer_type` is the type or class of a PEP 302 "Importer" (sys.path item
+    handler), and `namespace_handler` is a callable like this::
+
+        def namespace_handler(importer, path_entry, moduleName, module):
+            # return a path_entry to use for child packages
+
+    Namespace handlers are only called if the importer object has already
+    agreed that it can handle the relevant path item, and they should only
+    return a subpath if the module __path__ does not already contain an
+    equivalent subpath.  For an example namespace handler, see
+    ``pkg_resources.file_ns_handler``.
+    """
+    _namespace_handlers[importer_type] = namespace_handler
+
+def _handle_ns(packageName, path_item):
+    """Ensure that named package includes a subpath of path_item (if needed)"""
+
+    importer = get_importer(path_item)
+    if importer is None:
+        return None
+    loader = importer.find_module(packageName)
+    if loader is None:
+        return None
+    module = sys.modules.get(packageName)
+    if module is None:
+        module = sys.modules[packageName] = imp.new_module(packageName)
+        module.__path__ = []
+        _set_parent_ns(packageName)
+    elif not hasattr(module,'__path__'):
+        raise TypeError("Not a package:", packageName)
+    handler = _find_adapter(_namespace_handlers, importer)
+    subpath = handler(importer, path_item, packageName, module)
+    if subpath is not None:
+        path = module.__path__
+        path.append(subpath)
+        loader.load_module(packageName)
+        for path_item in path:
+            if path_item not in module.__path__:
+                module.__path__.append(path_item)
+    return subpath
+
+def declare_namespace(packageName):
+    """Declare that package 'packageName' is a namespace package"""
+
+    imp.acquire_lock()
+    try:
+        if packageName in _namespace_packages:
+            return
+
+        path, parent = sys.path, None
+        if '.' in packageName:
+            parent = '.'.join(packageName.split('.')[:-1])
+            declare_namespace(parent)
+            if parent not in _namespace_packages:
+                __import__(parent)
+            try:
+                path = sys.modules[parent].__path__
+            except AttributeError:
+                raise TypeError("Not a package:", parent)
+
+        # Track what packages are namespaces, so when new path items are added,
+        # they can be updated
+        _namespace_packages.setdefault(parent,[]).append(packageName)
+        _namespace_packages.setdefault(packageName,[])
+
+        for path_item in path:
+            # Ensure all the parent's path items are reflected in the child,
+            # if they apply
+            _handle_ns(packageName, path_item)
+
+    finally:
+        imp.release_lock()
+
+def fixup_namespace_packages(path_item, parent=None):
+    """Ensure that previously-declared namespace packages include path_item"""
+    imp.acquire_lock()
+    try:
+        for package in _namespace_packages.get(parent,()):
+            subpath = _handle_ns(package, path_item)
+            if subpath:
+                fixup_namespace_packages(subpath, package)
+    finally:
+        imp.release_lock()
+
+def file_ns_handler(importer, path_item, packageName, module):
+    """Compute an ns-package subpath for a filesystem or zipfile importer"""
+
+    subpath = os.path.join(path_item, packageName.split('.')[-1])
+    normalized = _normalize_cached(subpath)
+    for item in module.__path__:
+        if _normalize_cached(item)==normalized:
+            break
+    else:
+        # Only return the path if it's not already there
+        return subpath
+
+register_namespace_handler(pkgutil.ImpImporter, file_ns_handler)
+register_namespace_handler(zipimport.zipimporter, file_ns_handler)
+
+if importlib_bootstrap is not None:
+    register_namespace_handler(importlib_bootstrap.FileFinder, file_ns_handler)
+
+
+def null_ns_handler(importer, path_item, packageName, module):
+    return None
+
+register_namespace_handler(object, null_ns_handler)
+
+
+def normalize_path(filename):
+    """Normalize a file/dir name for comparison purposes"""
+    return os.path.normcase(os.path.realpath(filename))
+
+def _normalize_cached(filename, _cache={}):
+    try:
+        return _cache[filename]
+    except KeyError:
+        _cache[filename] = result = normalize_path(filename)
+        return result
+
+def _set_parent_ns(packageName):
+    parts = packageName.split('.')
+    name = parts.pop()
+    if parts:
+        parent = '.'.join(parts)
+        setattr(sys.modules[parent], name, sys.modules[packageName])
+
+
+def yield_lines(strs):
+    """Yield non-empty/non-comment lines of a ``basestring`` or sequence"""
+    if isinstance(strs, basestring):
+        for s in strs.splitlines():
+            s = s.strip()
+            # skip blank lines/comments
+            if s and not s.startswith('#'):
+                yield s
+    else:
+        for ss in strs:
+            for s in yield_lines(ss):
+                yield s
+
+# whitespace and comment
+LINE_END = re.compile(r"\s*(#.*)?$").match
+# line continuation
+CONTINUE = re.compile(r"\s*\\\s*(#.*)?$").match
+# Distribution or extra
+DISTRO = re.compile(r"\s*((\w|[-.])+)").match
+# ver. info
+VERSION = re.compile(r"\s*(<=?|>=?|==|!=)\s*((\w|[-.])+)").match
+# comma between items
+COMMA = re.compile(r"\s*,").match
+OBRACKET = re.compile(r"\s*\[").match
+CBRACKET = re.compile(r"\s*\]").match
+MODULE = re.compile(r"\w+(\.\w+)*$").match
+EGG_NAME = re.compile(
+    r"(?P<name>[^-]+)"
+    r"( -(?P<ver>[^-]+) (-py(?P<pyver>[^-]+) (-(?P<plat>.+))? )? )?",
+    re.VERBOSE | re.IGNORECASE
+).match
+
+component_re = re.compile(r'(\d+ | [a-z]+ | \.| -)', re.VERBOSE)
+replace = {'pre':'c', 'preview':'c','-':'final-','rc':'c','dev':'@'}.get
+
+def _parse_version_parts(s):
+    for part in component_re.split(s):
+        part = replace(part, part)
+        if not part or part=='.':
+            continue
+        if part[:1] in '0123456789':
+            # pad for numeric comparison
+            yield part.zfill(8)
+        else:
+            yield '*'+part
+
+    # ensure that alpha/beta/candidate are before final
+    yield '*final'
+
+def parse_version(s):
+    """Convert a version string to a chronologically-sortable key
+
+    This is a rough cross between distutils' StrictVersion and LooseVersion;
+    if you give it versions that would work with StrictVersion, then it behaves
+    the same; otherwise it acts like a slightly-smarter LooseVersion. It is
+    *possible* to create pathological version coding schemes that will fool
+    this parser, but they should be very rare in practice.
+
+    The returned value will be a tuple of strings.  Numeric portions of the
+    version are padded to 8 digits so they will compare numerically, but
+    without relying on how numbers compare relative to strings.  Dots are
+    dropped, but dashes are retained.  Trailing zeros between alpha segments
+    or dashes are suppressed, so that e.g. "2.4.0" is considered the same as
+    "2.4". Alphanumeric parts are lower-cased.
+
+    The algorithm assumes that strings like "-" and any alpha string that
+    alphabetically follows "final"  represents a "patch level".  So, "2.4-1"
+    is assumed to be a branch or patch of "2.4", and therefore "2.4.1" is
+    considered newer than "2.4-1", which in turn is newer than "2.4".
+
+    Strings like "a", "b", "c", "alpha", "beta", "candidate" and so on (that
+    come before "final" alphabetically) are assumed to be pre-release versions,
+    so that the version "2.4" is considered newer than "2.4a1".
+
+    Finally, to handle miscellaneous cases, the strings "pre", "preview", and
+    "rc" are treated as if they were "c", i.e. as though they were release
+    candidates, and therefore are not as new as a version string that does not
+    contain them, and "dev" is replaced with an '@' so that it sorts lower than
+    than any other pre-release tag.
+    """
+    parts = []
+    for part in _parse_version_parts(s.lower()):
+        if part.startswith('*'):
+            # remove '-' before a prerelease tag
+            if part < '*final':
+                while parts and parts[-1] == '*final-':
+                    parts.pop()
+            # remove trailing zeros from each series of numeric parts
+            while parts and parts[-1]=='00000000':
+                parts.pop()
+        parts.append(part)
+    return tuple(parts)
+
+
+class EntryPoint(object):
+    """Object representing an advertised importable object"""
+
+    def __init__(self, name, module_name, attrs=(), extras=(), dist=None):
+        if not MODULE(module_name):
+            raise ValueError("Invalid module name", module_name)
+        self.name = name
+        self.module_name = module_name
+        self.attrs = tuple(attrs)
+        self.extras = Requirement.parse(("x[%s]" % ','.join(extras))).extras
+        self.dist = dist
+
+    def __str__(self):
+        s = "%s = %s" % (self.name, self.module_name)
+        if self.attrs:
+            s += ':' + '.'.join(self.attrs)
+        if self.extras:
+            s += ' [%s]' % ','.join(self.extras)
+        return s
+
+    def __repr__(self):
+        return "EntryPoint.parse(%r)" % str(self)
+
+    def load(self, require=True, env=None, installer=None):
+        if require:
+            self.require(env, installer)
+        entry = __import__(self.module_name, globals(), globals(),
+            ['__name__'])
+        for attr in self.attrs:
+            try:
+                entry = getattr(entry, attr)
+            except AttributeError:
+                raise ImportError("%r has no %r attribute" % (entry, attr))
+        return entry
+
+    def require(self, env=None, installer=None):
+        if self.extras and not self.dist:
+            raise UnknownExtra("Can't require() without a distribution", self)
+        reqs = self.dist.requires(self.extras)
+        items = working_set.resolve(reqs, env, installer)
+        list(map(working_set.add, items))
+
+    @classmethod
+    def parse(cls, src, dist=None):
+        """Parse a single entry point from string `src`
+
+        Entry point syntax follows the form::
+
+            name = some.module:some.attr [extra1, extra2]
+
+        The entry name and module name are required, but the ``:attrs`` and
+        ``[extras]`` parts are optional
+        """
+        try:
+            attrs = extras = ()
+            name, value = src.split('=', 1)
+            if '[' in value:
+                value, extras = value.split('[', 1)
+                req = Requirement.parse("x[" + extras)
+                if req.specs:
+                    raise ValueError
+                extras = req.extras
+            if ':' in value:
+                value, attrs = value.split(':', 1)
+                if not MODULE(attrs.rstrip()):
+                    raise ValueError
+                attrs = attrs.rstrip().split('.')
+        except ValueError:
+            msg = "EntryPoint must be in 'name=module:attrs [extras]' format"
+            raise ValueError(msg, src)
+        else:
+            return cls(name.strip(), value.strip(), attrs, extras, dist)
+
+    @classmethod
+    def parse_group(cls, group, lines, dist=None):
+        """Parse an entry point group"""
+        if not MODULE(group):
+            raise ValueError("Invalid group name", group)
+        this = {}
+        for line in yield_lines(lines):
+            ep = cls.parse(line, dist)
+            if ep.name in this:
+                raise ValueError("Duplicate entry point", group, ep.name)
+            this[ep.name]=ep
+        return this
+
+    @classmethod
+    def parse_map(cls, data, dist=None):
+        """Parse a map of entry point groups"""
+        if isinstance(data, dict):
+            data = data.items()
+        else:
+            data = split_sections(data)
+        maps = {}
+        for group, lines in data:
+            if group is None:
+                if not lines:
+                    continue
+                raise ValueError("Entry points must be listed in groups")
+            group = group.strip()
+            if group in maps:
+                raise ValueError("Duplicate group name", group)
+            maps[group] = cls.parse_group(group, lines, dist)
+        return maps
+
+
+def _remove_md5_fragment(location):
+    if not location:
+        return ''
+    parsed = urlparse(location)
+    if parsed[-1].startswith('md5='):
+        return urlunparse(parsed[:-1] + ('',))
+    return location
+
+
+class Distribution(object):
+    """Wrap an actual or potential sys.path entry w/metadata"""
+    PKG_INFO = 'PKG-INFO'
+
+    def __init__(self, location=None, metadata=None, project_name=None,
+            version=None, py_version=PY_MAJOR, platform=None,
+            precedence=EGG_DIST):
+        self.project_name = safe_name(project_name or 'Unknown')
+        if version is not None:
+            self._version = safe_version(version)
+        self.py_version = py_version
+        self.platform = platform
+        self.location = location
+        self.precedence = precedence
+        self._provider = metadata or empty_provider
+
+    @classmethod
+    def from_location(cls, location, basename, metadata=None,**kw):
+        project_name, version, py_version, platform = [None]*4
+        basename, ext = os.path.splitext(basename)
+        if ext.lower() in _distributionImpl:
+            # .dist-info gets much metadata differently
+            match = EGG_NAME(basename)
+            if match:
+                project_name, version, py_version, platform = match.group(
+                    'name','ver','pyver','plat'
+                )
+            cls = _distributionImpl[ext.lower()]
+        return cls(
+            location, metadata, project_name=project_name, version=version,
+            py_version=py_version, platform=platform, **kw
+        )
+
+    @property
+    def hashcmp(self):
+        return (
+            getattr(self, 'parsed_version', ()),
+            self.precedence,
+            self.key,
+            _remove_md5_fragment(self.location),
+            self.py_version,
+            self.platform,
+        )
+
+    def __hash__(self):
+        return hash(self.hashcmp)
+
+    def __lt__(self, other):
+        return self.hashcmp < other.hashcmp
+
+    def __le__(self, other):
+        return self.hashcmp <= other.hashcmp
+
+    def __gt__(self, other):
+        return self.hashcmp > other.hashcmp
+
+    def __ge__(self, other):
+        return self.hashcmp >= other.hashcmp
+
+    def __eq__(self, other):
+        if not isinstance(other, self.__class__):
+            # It's not a Distribution, so they are not equal
+            return False
+        return self.hashcmp == other.hashcmp
+
+    def __ne__(self, other):
+        return not self == other
+
+    # These properties have to be lazy so that we don't have to load any
+    # metadata until/unless it's actually needed.  (i.e., some distributions
+    # may not know their name or version without loading PKG-INFO)
+
+    @property
+    def key(self):
+        try:
+            return self._key
+        except AttributeError:
+            self._key = key = self.project_name.lower()
+            return key
+
+    @property
+    def parsed_version(self):
+        try:
+            return self._parsed_version
+        except AttributeError:
+            self._parsed_version = pv = parse_version(self.version)
+            return pv
+
+    @property
+    def version(self):
+        try:
+            return self._version
+        except AttributeError:
+            for line in self._get_metadata(self.PKG_INFO):
+                if line.lower().startswith('version:'):
+                    self._version = safe_version(line.split(':',1)[1].strip())
+                    return self._version
+            else:
+                tmpl = "Missing 'Version:' header and/or %s file"
+                raise ValueError(tmpl % self.PKG_INFO, self)
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            dm = self.__dep_map = {None: []}
+            for name in 'requires.txt', 'depends.txt':
+                for extra, reqs in split_sections(self._get_metadata(name)):
+                    if extra:
+                        if ':' in extra:
+                            extra, marker = extra.split(':', 1)
+                            if invalid_marker(marker):
+                                # XXX warn
+                                reqs=[]
+                            elif not evaluate_marker(marker):
+                                reqs=[]
+                        extra = safe_extra(extra) or None
+                    dm.setdefault(extra,[]).extend(parse_requirements(reqs))
+            return dm
+
+    def requires(self, extras=()):
+        """List of Requirements needed for this distro if `extras` are used"""
+        dm = self._dep_map
+        deps = []
+        deps.extend(dm.get(None, ()))
+        for ext in extras:
+            try:
+                deps.extend(dm[safe_extra(ext)])
+            except KeyError:
+                raise UnknownExtra(
+                    "%s has no such extra feature %r" % (self, ext)
+                )
+        return deps
+
+    def _get_metadata(self, name):
+        if self.has_metadata(name):
+            for line in self.get_metadata_lines(name):
+                yield line
+
+    def activate(self, path=None):
+        """Ensure distribution is importable on `path` (default=sys.path)"""
+        if path is None:
+            path = sys.path
+        self.insert_on(path)
+        if path is sys.path:
+            fixup_namespace_packages(self.location)
+            for pkg in self._get_metadata('namespace_packages.txt'):
+                if pkg in sys.modules:
+                    declare_namespace(pkg)
+
+    def egg_name(self):
+        """Return what this distribution's standard .egg filename should be"""
+        filename = "%s-%s-py%s" % (
+            to_filename(self.project_name), to_filename(self.version),
+            self.py_version or PY_MAJOR
+        )
+
+        if self.platform:
+            filename += '-' + self.platform
+        return filename
+
+    def __repr__(self):
+        if self.location:
+            return "%s (%s)" % (self, self.location)
+        else:
+            return str(self)
+
+    def __str__(self):
+        try:
+            version = getattr(self, 'version', None)
+        except ValueError:
+            version = None
+        version = version or "[unknown version]"
+        return "%s %s" % (self.project_name, version)
+
+    def __getattr__(self, attr):
+        """Delegate all unrecognized public attributes to .metadata provider"""
+        if attr.startswith('_'):
+            raise AttributeError(attr)
+        return getattr(self._provider, attr)
+
+    @classmethod
+    def from_filename(cls, filename, metadata=None, **kw):
+        return cls.from_location(
+            _normalize_cached(filename), os.path.basename(filename), metadata,
+            **kw
+        )
+
+    def as_requirement(self):
+        """Return a ``Requirement`` that matches this distribution exactly"""
+        return Requirement.parse('%s==%s' % (self.project_name, self.version))
+
+    def load_entry_point(self, group, name):
+        """Return the `name` entry point of `group` or raise ImportError"""
+        ep = self.get_entry_info(group, name)
+        if ep is None:
+            raise ImportError("Entry point %r not found" % ((group, name),))
+        return ep.load()
+
+    def get_entry_map(self, group=None):
+        """Return the entry point map for `group`, or the full entry map"""
+        try:
+            ep_map = self._ep_map
+        except AttributeError:
+            ep_map = self._ep_map = EntryPoint.parse_map(
+                self._get_metadata('entry_points.txt'), self
+            )
+        if group is not None:
+            return ep_map.get(group,{})
+        return ep_map
+
+    def get_entry_info(self, group, name):
+        """Return the EntryPoint object for `group`+`name`, or ``None``"""
+        return self.get_entry_map(group).get(name)
+
+    def insert_on(self, path, loc = None):
+        """Insert self.location in path before its nearest parent directory"""
+
+        loc = loc or self.location
+        if not loc:
+            return
+
+        nloc = _normalize_cached(loc)
+        bdir = os.path.dirname(nloc)
+        npath= [(p and _normalize_cached(p) or p) for p in path]
+
+        for p, item in enumerate(npath):
+            if item == nloc:
+                break
+            elif item == bdir and self.precedence == EGG_DIST:
+                # if it's an .egg, give it precedence over its directory
+                if path is sys.path:
+                    self.check_version_conflict()
+                path.insert(p, loc)
+                npath.insert(p, nloc)
+                break
+        else:
+            if path is sys.path:
+                self.check_version_conflict()
+            path.append(loc)
+            return
+
+        # p is the spot where we found or inserted loc; now remove duplicates
+        while True:
+            try:
+                np = npath.index(nloc, p+1)
+            except ValueError:
+                break
+            else:
+                del npath[np], path[np]
+                # ha!
+                p = np
+
+        return
+
+    def check_version_conflict(self):
+        if self.key == 'setuptools':
+            # ignore the inevitable setuptools self-conflicts  :(
+            return
+
+        nsp = dict.fromkeys(self._get_metadata('namespace_packages.txt'))
+        loc = normalize_path(self.location)
+        for modname in self._get_metadata('top_level.txt'):
+            if (modname not in sys.modules or modname in nsp
+                    or modname in _namespace_packages):
+                continue
+            if modname in ('pkg_resources', 'setuptools', 'site'):
+                continue
+            fn = getattr(sys.modules[modname], '__file__', None)
+            if fn and (normalize_path(fn).startswith(loc) or
+                       fn.startswith(self.location)):
+                continue
+            issue_warning(
+                "Module %s was already imported from %s, but %s is being added"
+                " to sys.path" % (modname, fn, self.location),
+            )
+
+    def has_version(self):
+        try:
+            self.version
+        except ValueError:
+            issue_warning("Unbuilt egg for " + repr(self))
+            return False
+        return True
+
+    def clone(self,**kw):
+        """Copy this distribution, substituting in any changed keyword args"""
+        names = 'project_name version py_version platform location precedence'
+        for attr in names.split():
+            kw.setdefault(attr, getattr(self, attr, None))
+        kw.setdefault('metadata', self._provider)
+        return self.__class__(**kw)
+
+    @property
+    def extras(self):
+        return [dep for dep in self._dep_map if dep]
+
+
+class DistInfoDistribution(Distribution):
+    """Wrap an actual or potential sys.path entry w/metadata, .dist-info style"""
+    PKG_INFO = 'METADATA'
+    EQEQ = re.compile(r"([\(,])\s*(\d.*?)\s*([,\)])")
+
+    @property
+    def _parsed_pkg_info(self):
+        """Parse and cache metadata"""
+        try:
+            return self._pkg_info
+        except AttributeError:
+            metadata = self.get_metadata(self.PKG_INFO)
+            self._pkg_info = email.parser.Parser().parsestr(metadata)
+            return self._pkg_info
+
+    @property
+    def _dep_map(self):
+        try:
+            return self.__dep_map
+        except AttributeError:
+            self.__dep_map = self._compute_dependencies()
+            return self.__dep_map
+
+    def _preparse_requirement(self, requires_dist):
+        """Convert 'Foobar (1); baz' to ('Foobar ==1', 'baz')
+        Split environment marker, add == prefix to version specifiers as
+        necessary, and remove parenthesis.
+        """
+        parts = requires_dist.split(';', 1) + ['']
+        distvers = parts[0].strip()
+        mark = parts[1].strip()
+        distvers = re.sub(self.EQEQ, r"\1==\2\3", distvers)
+        distvers = distvers.replace('(', '').replace(')', '')
+        return (distvers, mark)
+
+    def _compute_dependencies(self):
+        """Recompute this distribution's dependencies."""
+        from _markerlib import compile as compile_marker
+        dm = self.__dep_map = {None: []}
+
+        reqs = []
+        # Including any condition expressions
+        for req in self._parsed_pkg_info.get_all('Requires-Dist') or []:
+            distvers, mark = self._preparse_requirement(req)
+            parsed = next(parse_requirements(distvers))
+            parsed.marker_fn = compile_marker(mark)
+            reqs.append(parsed)
+
+        def reqs_for_extra(extra):
+            for req in reqs:
+                if req.marker_fn(override={'extra':extra}):
+                    yield req
+
+        common = frozenset(reqs_for_extra(None))
+        dm[None].extend(common)
+
+        for extra in self._parsed_pkg_info.get_all('Provides-Extra') or []:
+            extra = safe_extra(extra.strip())
+            dm[extra] = list(frozenset(reqs_for_extra(extra)) - common)
+
+        return dm
+
+
+_distributionImpl = {
+    '.egg': Distribution,
+    '.egg-info': Distribution,
+    '.dist-info': DistInfoDistribution,
+    }
+
+
+def issue_warning(*args,**kw):
+    level = 1
+    g = globals()
+    try:
+        # find the first stack frame that is *not* code in
+        # the pkg_resources module, to use for the warning
+        while sys._getframe(level).f_globals is g:
+            level += 1
+    except ValueError:
+        pass
+    warnings.warn(stacklevel=level + 1, *args, **kw)
+
+
+def parse_requirements(strs):
+    """Yield ``Requirement`` objects for each specification in `strs`
+
+    `strs` must be an instance of ``basestring``, or a (possibly-nested)
+    iterable thereof.
+    """
+    # create a steppable iterator, so we can handle \-continuations
+    lines = iter(yield_lines(strs))
+
+    def scan_list(ITEM, TERMINATOR, line, p, groups, item_name):
+
+        items = []
+
+        while not TERMINATOR(line, p):
+            if CONTINUE(line, p):
+                try:
+                    line = next(lines)
+                    p = 0
+                except StopIteration:
+                    raise ValueError(
+                        "\\ must not appear on the last nonblank line"
+                    )
+
+            match = ITEM(line, p)
+            if not match:
+                msg = "Expected " + item_name + " in"
+                raise ValueError(msg, line, "at", line[p:])
+
+            items.append(match.group(*groups))
+            p = match.end()
+
+            match = COMMA(line, p)
+            if match:
+                # skip the comma
+                p = match.end()
+            elif not TERMINATOR(line, p):
+                msg = "Expected ',' or end-of-list in"
+                raise ValueError(msg, line, "at", line[p:])
+
+        match = TERMINATOR(line, p)
+        # skip the terminator, if any
+        if match:
+            p = match.end()
+        return line, p, items
+
+    for line in lines:
+        match = DISTRO(line)
+        if not match:
+            raise ValueError("Missing distribution spec", line)
+        project_name = match.group(1)
+        p = match.end()
+        extras = []
+
+        match = OBRACKET(line, p)
+        if match:
+            p = match.end()
+            line, p, extras = scan_list(
+                DISTRO, CBRACKET, line, p, (1,), "'extra' name"
+            )
+
+        line, p, specs = scan_list(VERSION, LINE_END, line, p, (1, 2),
+            "version spec")
+        specs = [(op, safe_version(val)) for op, val in specs]
+        yield Requirement(project_name, specs, extras)
+
+
+class Requirement:
+    def __init__(self, project_name, specs, extras):
+        """DO NOT CALL THIS UNDOCUMENTED METHOD; use Requirement.parse()!"""
+        self.unsafe_name, project_name = project_name, safe_name(project_name)
+        self.project_name, self.key = project_name, project_name.lower()
+        index = [
+            (parse_version(v), state_machine[op], op, v)
+            for op, v in specs
+        ]
+        index.sort()
+        self.specs = [(op, ver) for parsed, trans, op, ver in index]
+        self.index, self.extras = index, tuple(map(safe_extra, extras))
+        self.hashCmp = (
+            self.key,
+            tuple((op, parsed) for parsed, trans, op, ver in index),
+            frozenset(self.extras),
+        )
+        self.__hash = hash(self.hashCmp)
+
+    def __str__(self):
+        specs = ','.join([''.join(s) for s in self.specs])
+        extras = ','.join(self.extras)
+        if extras:
+            extras = '[%s]' % extras
+        return '%s%s%s' % (self.project_name, extras, specs)
+
+    def __eq__(self, other):
+        return (
+            isinstance(other, Requirement) and
+            self.hashCmp == other.hashCmp
+        )
+
+    def __contains__(self, item):
+        if isinstance(item, Distribution):
+            if item.key != self.key:
+                return False
+            # only get if we need it
+            if self.index:
+                item = item.parsed_version
+        elif isinstance(item, basestring):
+            item = parse_version(item)
+        last = None
+        # -1, 0, 1
+        compare = lambda a, b: (a > b) - (a < b)
+        for parsed, trans, op, ver in self.index:
+            # Indexing: 0, 1, -1
+            action = trans[compare(item, parsed)]
+            if action == 'F':
+                return False
+            elif action == 'T':
+                return True
+            elif action == '+':
+                last = True
+            elif action == '-' or last is None:
+                last = False
+        # no rules encountered
+        if last is None:
+            last = True
+        return last
+
+    def __hash__(self):
+        return self.__hash
+
+    def __repr__(self): return "Requirement.parse(%r)" % str(self)
+
+    @staticmethod
+    def parse(s):
+        reqs = list(parse_requirements(s))
+        if reqs:
+            if len(reqs) == 1:
+                return reqs[0]
+            raise ValueError("Expected only one requirement", s)
+        raise ValueError("No requirements found", s)
+
+state_machine = {
+    #       =><
+    '<': '--T',
+    '<=': 'T-T',
+    '>': 'F+F',
+    '>=': 'T+F',
+    '==': 'T..',
+    '!=': 'F++',
+}
+
+
+def _get_mro(cls):
+    """Get an mro for a type or classic class"""
+    if not isinstance(cls, type):
+        class cls(cls, object): pass
+        return cls.__mro__[1:]
+    return cls.__mro__
+
+def _find_adapter(registry, ob):
+    """Return an adapter factory for `ob` from `registry`"""
+    for t in _get_mro(getattr(ob, '__class__', type(ob))):
+        if t in registry:
+            return registry[t]
+
+
+def ensure_directory(path):
+    """Ensure that the parent directory of `path` exists"""
+    dirname = os.path.dirname(path)
+    if not os.path.isdir(dirname):
+        os.makedirs(dirname)
+
+def split_sections(s):
+    """Split a string or iterable thereof into (section, content) pairs
+
+    Each ``section`` is a stripped version of the section header ("[section]")
+    and each ``content`` is a list of stripped lines excluding blank lines and
+    comment-only lines.  If there are any such lines before the first section
+    header, they're returned in a first ``section`` of ``None``.
+    """
+    section = None
+    content = []
+    for line in yield_lines(s):
+        if line.startswith("["):
+            if line.endswith("]"):
+                if section or content:
+                    yield section, content
+                section = line[1:-1].strip()
+                content = []
+            else:
+                raise ValueError("Invalid section heading", line)
+        else:
+            content.append(line)
+
+    # wrap up last segment
+    yield section, content
+
+def _mkstemp(*args,**kw):
+    old_open = os.open
+    try:
+        # temporarily bypass sandboxing
+        os.open = os_open
+        return tempfile.mkstemp(*args,**kw)
+    finally:
+        # and then put it back
+        os.open = old_open
+
+
+# Set up global resource manager (deliberately not state-saved)
+_manager = ResourceManager()
+def _initialize(g):
+    for name in dir(_manager):
+        if not name.startswith('_'):
+            g[name] = getattr(_manager, name)
+_initialize(globals())
+
+# Prepare the master working set and make the ``require()`` API available
+working_set = WorkingSet._build_master()
+_declare_state('object', working_set=working_set)
+
+require = working_set.require
+iter_entry_points = working_set.iter_entry_points
+add_activation_listener = working_set.subscribe
+run_script = working_set.run_script
+# backward compatibility
+run_main = run_script
+# Activate all distributions already on sys.path, and ensure that
+# all distributions added to the working set in the future (e.g. by
+# calling ``require()``) will get activated as well.
+add_activation_listener(lambda dist: dist.activate())
+working_set.entries=[]
+# match order
+list(map(working_set.add_entry, sys.path))
diff --git a/libs/plex/__init__.py b/libs/plex/__init__.py
new file mode 100644
index 000000000..ab2d8dcb3
--- /dev/null
+++ b/libs/plex/__init__.py
@@ -0,0 +1,11 @@
+import logging
+
+log = logging.getLogger(__name__)
+
+__version__ = '0.7.0'
+
+
+try:
+    from plex.client import Plex
+except Exception as ex:
+    log.warn('Unable to import submodules - %s', ex, exc_info=True)
diff --git a/libs/plex/client.py b/libs/plex/client.py
new file mode 100644
index 000000000..4664e61ca
--- /dev/null
+++ b/libs/plex/client.py
@@ -0,0 +1,116 @@
+from plex.core.configuration import ConfigurationManager
+from plex.core.http import HttpClient
+from plex.helpers import has_attribute
+from plex.interfaces import construct_map
+from plex.interfaces.core.base import InterfaceProxy
+from plex.lib.six import add_metaclass
+from plex.objects.core.manager import ObjectManager
+
+import logging
+import socket
+
+log = logging.getLogger(__name__)
+
+
+class PlexClient(object):
+    __interfaces = None
+
+    def __init__(self):
+        # Construct interfaces
+        self.http = HttpClient(self)
+        self.configuration = ConfigurationManager()
+
+        self.__interfaces = construct_map(self)
+
+        # Discover modules
+        ObjectManager.construct()
+
+    @property
+    def base_url(self):
+        host = self.configuration.get('server.host', '127.0.0.1')
+        port = self.configuration.get('server.port', 32400)
+
+        return 'http://%s:%s' % (host, port)
+
+    def __getitem__(self, path):
+        parts = path.strip('/').split('/')
+
+        cur = self.__interfaces
+        parameters = []
+
+        while parts and type(cur) is dict:
+            key = parts.pop(0)
+
+            if key == '*':
+                key = None
+            elif key not in cur:
+                if None in cur:
+                    parameters.append(key)
+
+                    cur = cur[None]
+                    continue
+
+                return None
+
+            cur = cur[key]
+
+        while type(cur) is dict:
+            cur = cur.get(None)
+
+        if parts:
+            parameters.extend(parts)
+
+        if parameters:
+            return InterfaceProxy(cur, parameters)
+
+        return cur
+
+    def __getattr__(self, name):
+        interface = self.__interfaces.get(None)
+
+        if not interface:
+            raise Exception("Root interface not found")
+
+        return getattr(interface, name)
+
+
+class PlexMeta(type):
+    @property
+    def client(cls):
+        if cls._client is None:
+            cls.construct()
+
+        return cls._client
+
+    def __getattr__(self, name):
+        if has_attribute(self, name):
+            return super(PlexMeta, self).__getattribute__(name)
+
+        if self.client is None:
+            self.construct()
+
+        return getattr(self.client, name)
+
+    def __setattr__(self, name, value):
+        if has_attribute(self, name):
+            return super(PlexMeta, self).__setattr__(name, value)
+
+        if self.client is None:
+            self.construct()
+
+        setattr(self.client, name, value)
+
+    def __getitem__(self, key):
+        if self.client is None:
+            self.construct()
+
+        return self.client[key]
+
+
+@add_metaclass(PlexMeta)
+class Plex(object):
+    _client = None
+
+    @classmethod
+    def construct(cls):
+        cls._client = PlexClient()
diff --git a/libs/plex/core/__init__.py b/libs/plex/core/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/core/configuration.py b/libs/plex/core/configuration.py
new file mode 100644
index 000000000..e683debe6
--- /dev/null
+++ b/libs/plex/core/configuration.py
@@ -0,0 +1,115 @@
+class ConfigurationManager(object):
+    def __init__(self):
+        self.stack = [
+            Configuration(self)
+        ]
+
+    @property
+    def current(self):
+        return self.stack[-1]
+
+    @property
+    def defaults(self):
+        return self.stack[0]
+
+    def authentication(self, token):
+        return Configuration(self).authentication(token)
+
+    def cache(self, **definitions):
+        return Configuration(self).cache(**definitions)
+
+    def client(self, identifier, product, version):
+        return Configuration(self).client(identifier, product, version)
+
+    def device(self, name, system):
+        return Configuration(self).device(name, system)
+
+    def headers(self, headers):
+        return Configuration(self).headers(headers)
+
+    def platform(self, name, version):
+        return Configuration(self).platform(name, version)
+
+    def server(self, host='127.0.0.1', port=32400):
+        return Configuration(self).server(host, port)
+
+    def get(self, key, default=None):
+        for x in range(len(self.stack) - 1, -1, -1):
+            value = self.stack[x].get(key)
+
+            if value is not None:
+                return value
+
+        return default
+
+    def __getitem__(self, key):
+        return self.get(key)
+
+    def __setitem__(self, key, value):
+        self.current[key] = value
+
+
+class Configuration(object):
+    def __init__(self, manager):
+        self.manager = manager
+
+        self.data = {}
+
+    def authentication(self, token):
+        self.data['authentication.token'] = token
+
+        return self
+
+    def cache(self, **definitions):
+        for key, value in definitions.items():
+            self.data['cache.%s' % key] = value
+
+        return self
+
+    def client(self, identifier, product, version):
+        self.data['client.identifier'] = identifier
+
+        self.data['client.product'] = product
+        self.data['client.version'] = version
+
+        return self
+
+    def device(self, name, system):
+        self.data['device.name'] = name
+        self.data['device.system'] = system
+
+        return self
+
+    def headers(self, headers):
+        self.data['headers'] = headers
+
+        return self
+
+    def platform(self, name, version):
+        self.data['platform.name'] = name
+        self.data['platform.version'] = version
+
+        return self
+
+    def server(self, host='127.0.0.1', port=32400):
+        self.data['server.host'] = host
+        self.data['server.port'] = port
+
+        return self
+
+    def get(self, key, default=None):
+        return self.data.get(key, default)
+
+    def __enter__(self):
+        self.manager.stack.append(self)
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        item = self.manager.stack.pop()
+
+        assert item == self
+
+    def __getitem__(self, key):
+        return self.data[key]
+
+    def __setitem__(self, key, value):
+        self.data[key] = value
diff --git a/libs/plex/core/context.py b/libs/plex/core/context.py
new file mode 100644
index 000000000..21c430bb6
--- /dev/null
+++ b/libs/plex/core/context.py
@@ -0,0 +1,26 @@
+from threading import Lock
+
+
+class Context(object):
+    def __init__(self, **kwargs):
+        self.kwargs = kwargs
+
+    def __getattr__(self, key):
+        return self.kwargs.get(key)
+
+
+class ContextStack(object):
+    def __init__(self):
+        self._list = []
+        self._lock = Lock()
+
+    def pop(self):
+        context = self._list.pop()
+
+        self._lock.release()
+        return context
+
+    def push(self, **kwargs):
+        self._lock.acquire()
+
+        return self._list.append(Context(**kwargs))
diff --git a/libs/plex/core/extension.py b/libs/plex/core/extension.py
new file mode 100644
index 000000000..4625e04c7
--- /dev/null
+++ b/libs/plex/core/extension.py
@@ -0,0 +1,105 @@
+# ExtensionImporter (```flask.exthook```)
+# ----------------------------------
+# :copyright: (c) 2014 by Armin Ronacher.
+# :license: BSD, see LICENSE for more details.
+
+from plex.lib.six import reraise
+
+import os
+import sys
+
+
+class ExtensionImporter(object):
+    """This importer redirects imports from this submodule to other locations.
+    This makes it possible to transition from the old flaskext.name to the
+    newer flask_name without people having a hard time.
+    """
+
+    def __init__(self, module_choices, wrapper_module):
+        self.module_choices = module_choices
+        self.wrapper_module = wrapper_module
+        self.prefix = wrapper_module + '.'
+        self.prefix_cutoff = wrapper_module.count('.') + 1
+
+    def __eq__(self, other):
+        return self.__class__.__module__ == other.__class__.__module__ and \
+               self.__class__.__name__ == other.__class__.__name__ and \
+               self.wrapper_module == other.wrapper_module and \
+               self.module_choices == other.module_choices
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def install(self):
+        sys.meta_path[:] = [x for x in sys.meta_path if self != x] + [self]
+
+    def find_module(self, fullname, path=None):
+        if fullname.startswith(self.prefix):
+            return self
+
+    def load_module(self, fullname):
+        if fullname in sys.modules:
+            return sys.modules[fullname]
+        modname = fullname.split('.', self.prefix_cutoff)[self.prefix_cutoff]
+        for path in self.module_choices:
+            realname = path % modname
+            try:
+                __import__(realname)
+            except ImportError:
+                exc_type, exc_value, tb = sys.exc_info()
+                # since we only establish the entry in sys.modules at the
+                # very this seems to be redundant, but if recursive imports
+                # happen we will call into the move import a second time.
+                # On the second invocation we still don't have an entry for
+                # fullname in sys.modules, but we will end up with the same
+                # fake module name and that import will succeed since this
+                # one already has a temporary entry in the modules dict.
+                # Since this one "succeeded" temporarily that second
+                # invocation now will have created a fullname entry in
+                # sys.modules which we have to kill.
+                sys.modules.pop(fullname, None)
+
+                # If it's an important traceback we reraise it, otherwise
+                # we swallow it and try the next choice.  The skipped frame
+                # is the one from __import__ above which we don't care about
+                if self.is_important_traceback(realname, tb):
+                    reraise(exc_type, exc_value, tb.tb_next)
+                continue
+            module = sys.modules[fullname] = sys.modules[realname]
+            if '.' not in modname:
+                setattr(sys.modules[self.wrapper_module], modname, module)
+            return module
+        raise ImportError('No module named %s' % fullname)
+
+    def is_important_traceback(self, important_module, tb):
+        """Walks a traceback's frames and checks if any of the frames
+        originated in the given important module.  If that is the case then we
+        were able to import the module itself but apparently something went
+        wrong when the module was imported.  (Eg: import of an import failed).
+        """
+        while tb is not None:
+            if self.is_important_frame(important_module, tb):
+                return True
+            tb = tb.tb_next
+        return False
+
+    def is_important_frame(self, important_module, tb):
+        """Checks a single frame if it's important."""
+        g = tb.tb_frame.f_globals
+        if '__name__' not in g:
+            return False
+
+        module_name = g['__name__']
+
+        # Python 2.7 Behavior.  Modules are cleaned up late so the
+        # name shows up properly here.  Success!
+        if module_name == important_module:
+            return True
+
+        # Some python versions will will clean up modules so early that the
+        # module name at that point is no longer set.  Try guessing from
+        # the filename then.
+        filename = os.path.abspath(tb.tb_frame.f_code.co_filename)
+        test_string = os.path.sep + important_module.replace('.', os.path.sep)
+        return test_string + '.py' in filename or \
+               test_string + os.path.sep + '__init__.py' in filename
diff --git a/libs/plex/core/helpers.py b/libs/plex/core/helpers.py
new file mode 100644
index 000000000..9315add55
--- /dev/null
+++ b/libs/plex/core/helpers.py
@@ -0,0 +1,59 @@
+from plex.lib import six
+
+import re
+import unicodedata
+
+def flatten(text):
+    if text is None:
+        return None
+
+    # Normalize `text` to ascii
+    text = normalize(text)
+
+    # Remove special characters
+    text = re.sub('[^A-Za-z0-9\s]+', '', text)
+
+    # Merge duplicate spaces
+    text = ' '.join(text.split())
+
+    # Convert to lower-case
+    return text.lower()
+
+def normalize(text):
+    if text is None:
+        return None
+
+    # Normalize unicode characters
+    if type(text) is six.text_type:
+        text = unicodedata.normalize('NFKD', text)
+
+    # Ensure text is ASCII, ignore unknown characters
+    text = text.encode('ascii', 'ignore')
+
+    # Return decoded `text`
+    return text.decode('ascii')
+
+def to_iterable(value):
+    if value is None:
+        return None
+
+    if isinstance(value, (list, tuple)):
+        return value
+
+    return [value]
+
+
+def synchronized(func):
+    def wrapper(self, *__args, **__kw):
+        self._lock.acquire()
+
+        try:
+            return func(self, *__args, **__kw)
+        finally:
+            self._lock.release()
+
+    wrapper.__name__ = func.__name__
+    wrapper.__dict__ = func.__dict__
+    wrapper.__doc__ = func.__doc__
+
+    return wrapper
diff --git a/libs/plex/core/http.py b/libs/plex/core/http.py
new file mode 100644
index 000000000..f5f3348f5
--- /dev/null
+++ b/libs/plex/core/http.py
@@ -0,0 +1,151 @@
+from plex.core.context import ContextStack
+from plex.core.helpers import synchronized
+from plex.request import PlexRequest
+
+from threading import Condition
+import hashlib
+import logging
+import requests
+import socket
+
+log = logging.getLogger(__name__)
+
+
+class HttpClient(object):
+    def __init__(self, client):
+        self.client = client
+
+        self.configuration = ContextStack()
+
+        self.session = None
+
+        # Private
+        self._lock = Condition()
+
+        # Build requests session
+        self._build()
+
+    @property
+    def cache(self):
+        return self.client.configuration.get('cache.http')
+
+    def configure(self, path=None):
+        self.configuration.push(base_path=path)
+        return self
+
+    def request(self, method, path=None, params=None, query=None, data=None, credentials=None, **kwargs):
+        # retrieve configuration
+        ctx = self.configuration.pop()
+
+        if path is not None and type(path) is not str:
+            # Convert `path` to string (excluding NoneType)
+            path = str(path)
+
+        if ctx.base_path and path:
+            # Prepend `base_path` to relative `path`s
+            if not path.startswith('/'):
+                path = ctx.base_path + '/' + path
+
+        elif ctx.base_path:
+            path = ctx.base_path
+        elif not path:
+            path = ''
+
+        request = PlexRequest(
+            self.client,
+            method=method,
+            path=path,
+
+            params=params,
+            query=query,
+            data=data,
+
+            credentials=credentials,
+            **kwargs
+        )
+
+        prepared = request.prepare()
+
+        # Try retrieve cached response
+        response = self._cache_lookup(prepared)
+
+        if response:
+            return response
+
+        # TODO retrying requests on 502, 503 errors?
+        # try:
+        #     response = self.session.send(prepared)
+        # except socket.gaierror as e:
+        #     code, _ = e
+#
+        #     if code != 8:
+        #         raise e
+#
+        #     log.warn('Encountered socket.gaierror (code: 8)')
+#
+        #     response = self._build().send(prepared)
+        response = request.request.send()
+
+        # Store response in cache
+        self._cache_store(prepared, response)
+
+        return response
+
+    def get(self, path=None, params=None, query=None, data=None, **kwargs):
+        return self.request('GET', path, params, query, data, **kwargs)
+
+    def put(self, path=None, params=None, query=None, data=None, **kwargs):
+        return self.request('PUT', path, params, query, data, **kwargs)
+
+    def post(self, path=None, params=None, query=None, data=None, **kwargs):
+        return self.request('POST', path, params, query, data, **kwargs)
+
+    def delete(self, path=None, params=None, query=None, data=None, **kwargs):
+        return self.request('DELETE', path, params, query, data, **kwargs)
+
+    def _build(self):
+        if self.session:
+            log.info('Rebuilding session and connection pools...')
+
+        # Rebuild the connection pool (old pool has stale connections)
+        self.session = requests.Session()
+
+        return self.session
+
+    @synchronized
+    def _cache_lookup(self, request):
+        if self.cache is None:
+            return None
+
+        if request.method not in ['GET']:
+            return None
+
+        # Retrieve from cache
+        return self.cache.get(self._cache_key(request))
+
+    @synchronized
+    def _cache_store(self, request, response):
+        if self.cache is None:
+            return None
+
+        if request.method not in ['GET']:
+            return None
+
+        # Store in cache
+        self.cache[self._cache_key(request)] = response
+
+    @staticmethod
+    def _cache_key(request):
+        raw = ','.join([request.method, request.url])
+
+        # Generate MD5 hash of key
+        m = hashlib.md5()
+        m.update(raw.encode('utf-8'))
+
+        return m.hexdigest()
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_val, exc_tb):
+        pass
diff --git a/libs/plex/core/idict.py b/libs/plex/core/idict.py
new file mode 100644
index 000000000..354d3bb8f
--- /dev/null
+++ b/libs/plex/core/idict.py
@@ -0,0 +1,54 @@
+from plex.lib.six import string_types
+
+class idict(dict):
+    def __init__(self, initial=None):
+        if initial:
+            self.update(initial)
+
+    def get(self, k, d=None):
+        if isinstance(k, string_types):
+            k = k.lower()
+
+        if super(idict, self).__contains__(k):
+            return self[k]
+
+        return d
+
+    def update(self, E=None, **F):
+        if E:
+            if hasattr(E, 'keys'):
+                # Update with `E` dictionary
+                for k in E:
+                    self[k] = E[k]
+            else:
+                # Update with `E` items
+                for (k, v) in E:
+                    self[k] = v
+
+        # Update with `F` dictionary
+        for k in F:
+            self[k] = F[k]
+
+    def __contains__(self, k):
+        if isinstance(k, string_types):
+            k = k.lower()
+
+        return super(idict, self).__contains__(k)
+
+    def __delitem__(self, k):
+        if isinstance(k, string_types):
+            k = k.lower()
+
+        super(idict, self).__delitem__(k)
+
+    def __getitem__(self, k):
+        if isinstance(k, string_types):
+            k = k.lower()
+
+        return super(idict, self).__getitem__(k)
+
+    def __setitem__(self, k, value):
+        if isinstance(k, string_types):
+            k = k.lower()
+
+        super(idict, self).__setitem__(k, value)
diff --git a/libs/plex/ext/__init__.py b/libs/plex/ext/__init__.py
new file mode 100644
index 000000000..0b1ab5e02
--- /dev/null
+++ b/libs/plex/ext/__init__.py
@@ -0,0 +1,4 @@
+from plex.core.extension import ExtensionImporter
+
+importer = ExtensionImporter(['plex_%s'], __name__)
+importer.install()
diff --git a/libs/plex/helpers.py b/libs/plex/helpers.py
new file mode 100644
index 000000000..4bfdc3d98
--- /dev/null
+++ b/libs/plex/helpers.py
@@ -0,0 +1,6 @@
+def has_attribute(obj, name):
+    try:
+        object.__getattribute__(obj, name)
+        return True
+    except AttributeError:
+        return False
diff --git a/libs/plex/interfaces/__init__.py b/libs/plex/interfaces/__init__.py
new file mode 100644
index 000000000..7bb29b0eb
--- /dev/null
+++ b/libs/plex/interfaces/__init__.py
@@ -0,0 +1,81 @@
+from plex.interfaces.channel import ChannelInterface
+from plex.interfaces.library import LibraryInterface
+from plex.interfaces.library.metadata import LibraryMetadataInterface
+from plex.interfaces.plugin import PluginInterface
+from plex.interfaces.plugin.preferences import PluginPreferencesInterface
+from plex.interfaces.preferences import PreferencesInterface
+from plex.interfaces.root import RootInterface
+from plex.interfaces.section import SectionInterface
+from plex.interfaces.status import StatusInterface
+from plex.interfaces.timeline import TimelineInterface
+
+
+# TODO automatic interface discovery
+
+INTERFACES = [
+    RootInterface,
+
+    # /
+    ChannelInterface,
+    StatusInterface,
+
+    # /library
+    LibraryInterface,
+    LibraryMetadataInterface,
+    SectionInterface,
+
+    # /:
+    PreferencesInterface,
+    TimelineInterface,
+
+    # /:/plugins
+    PluginInterface,
+    PluginPreferencesInterface
+]
+
+
+def get_interfaces():
+    for interface in INTERFACES:
+        if interface.path:
+            path = interface.path.strip('/')
+        else:
+            path = ''
+
+        if path:
+            path = path.split('/')
+        else:
+            path = []
+
+        yield path, interface
+
+
+def construct_map(client, d=None, interfaces=None):
+    if d is None:
+        d = {}
+
+    if interfaces is None:
+        interfaces = get_interfaces()
+
+    for path, interface in interfaces:
+        if len(path) > 0:
+            key = path.pop(0)
+        else:
+            key = None
+
+        if key == '*':
+            key = None
+
+        if len(path) == 0:
+            d[key] = interface(client)
+            continue
+
+        value = d.get(key, {})
+
+        if type(value) is not dict:
+            value = {None: value}
+
+        construct_map(client, value, [(path, interface)])
+
+        d[key] = value
+
+    return d
diff --git a/libs/plex/interfaces/channel.py b/libs/plex/interfaces/channel.py
new file mode 100644
index 000000000..0b3dbfc2a
--- /dev/null
+++ b/libs/plex/interfaces/channel.py
@@ -0,0 +1,8 @@
+from plex.interfaces.core.base import Interface
+
+
+class ChannelInterface(Interface):
+    path = 'channels'
+
+    def all(self):
+        raise NotImplementedError()
diff --git a/libs/plex/interfaces/core/__init__.py b/libs/plex/interfaces/core/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/interfaces/core/base.py b/libs/plex/interfaces/core/base.py
new file mode 100644
index 000000000..f8164568c
--- /dev/null
+++ b/libs/plex/interfaces/core/base.py
@@ -0,0 +1,216 @@
+from plex.lib.six import string_types, StringIO
+from plex.lib.six.moves.urllib_parse import urlparse
+
+from functools import wraps
+import logging
+
+# Import available parser
+PARSER = None
+
+try:
+    from lxml import etree
+    PARSER = 'etree.HTMLParser'
+except ImportError:
+    from xml.etree import ElementTree as etree
+    PARSER = 'etree.XMLParser'
+
+log = logging.getLogger(__name__)
+
+
+class Helpers(object):
+    @staticmethod
+    def get(node, attr):
+        if PARSER == 'etree.HTMLParser':
+            return node.get(attr.lower())
+
+        return node.get(attr)
+
+    @staticmethod
+    def find(node, tag):
+        if PARSER == 'etree.HTMLParser':
+            return node.find(tag.lower())
+
+        return node.find(tag)
+
+    @staticmethod
+    def findall(node, tag):
+        if PARSER == 'etree.HTMLParser':
+            return node.findall(tag.lower())
+
+        return node.findall(tag)
+
+
+class Interface(object):
+    helpers = Helpers
+
+    path = None
+    object_map = {}
+
+    def __init__(self, client):
+        self.client = client
+
+    def __getitem__(self, name):
+        if hasattr(self, name):
+            return getattr(self, name)
+
+        raise ValueError('Unknown action "%s" on %s', name, self)
+
+    @property
+    def http(self):
+        if not self.client:
+            return None
+
+        return self.client.http.configure(self.path)
+
+    def parse(self, response, schema):
+        if response.status_code < 200 or response.status_code >= 300:
+            return None
+
+        try:
+            root = self.__parse_xml(response.content)
+        except SyntaxError as ex:
+            log.error('Unable to parse XML response: %s', ex, exc_info=True, extra={
+                'data': {
+                    'snippet': self.__error_snippet(response, ex)
+                }
+            })
+
+            return None
+        except Exception as ex:
+            log.error('Unable to parse XML response: %s', ex, exc_info=True)
+
+            return None
+
+        url = urlparse(response.url)
+        path = url.path
+
+        return self.__construct(self.client, path, root, schema)
+
+    @staticmethod
+    def __parse_xml(content):
+        if PARSER == 'etree.HTMLParser':
+            html = etree.fromstring(content, parser=etree.HTMLParser())
+            assert html.tag == 'html'
+
+            bodies = [e for e in html if e.tag == 'body']
+            assert len(bodies) == 1
+
+            body = bodies[0]
+            assert len(body) == 1
+
+            return body[0]
+
+        return etree.fromstring(content)
+
+    @staticmethod
+    def __error_snippet(response, ex):
+        # Retrieve the error line
+        position = getattr(ex, 'position', None)
+
+        if not position or len(position) != 2:
+            return None
+
+        n_line, n_column = position
+        snippet = None
+
+        # Create StringIO stream
+        stream = StringIO(response.text)
+
+        # Iterate over `content` to find `n_line`
+        for x, l in enumerate(stream):
+            if x < n_line - 1:
+                continue
+
+            # Line found
+            snippet = l
+            break
+
+        # Close the stream
+        stream.close()
+
+        if not snippet:
+            # Couldn't find the line
+            return None
+
+        # Find an attribute value containing `n_column`
+        start = snippet.find('"', n_column)
+        end = snippet.find('"', start + 1)
+
+        # Trim `snippet` (if attribute value was found)
+        if start >= 0 and end >= 0:
+            return snippet[start:end + 1]
+
+        return snippet
+
+    @classmethod
+    def __construct(cls, client, path, node, schema):
+        if not schema:
+            return None
+
+        # Try retrieve schema for `tag`
+        item = schema.get(node.tag)
+
+        if item is None:
+            raise ValueError('Unknown node with tag "%s"' % node.tag)
+
+        if type(item) is dict:
+            value = cls.helpers.get(node, item.get('_', 'type'))
+
+            if value is None:
+                return None
+
+            item = item.get(value)
+
+            if item is None:
+                raise ValueError('Unknown node type "%s"' % value)
+
+        descriptor = None
+        child_schema = None
+
+        if type(item) is tuple and len(item) == 2:
+            descriptor, child_schema = item
+        else:
+            descriptor = item
+
+        if isinstance(descriptor, string_types):
+            if descriptor not in cls.object_map:
+                raise Exception('Unable to find descriptor by name "%s"' % descriptor)
+
+            descriptor = cls.object_map.get(descriptor)
+
+        if descriptor is None:
+            raise Exception('Unable to find descriptor')
+
+        keys_used, obj = descriptor.construct(client, node, path=path)
+
+        # Lazy-construct children
+        def iter_children():
+            for child_node in node:
+                item = cls.__construct(client, path, child_node, child_schema)
+
+                if item:
+                    yield item
+
+        obj._children = iter_children()
+
+        return obj
+
+
+class InterfaceProxy(object):
+    def __init__(self, interface, args):
+        self.interface = interface
+        self.args = list(args)
+
+    def __getattr__(self, name):
+        value = getattr(self.interface, name)
+
+        if not hasattr(value, '__call__'):
+            return value
+
+        @wraps(value)
+        def wrap(*args, **kwargs):
+            args = self.args + list(args)
+
+            return value(*args, **kwargs)
+
+        return wrap
diff --git a/libs/plex/interfaces/library/__init__.py b/libs/plex/interfaces/library/__init__.py
new file mode 100644
index 000000000..fb334038f
--- /dev/null
+++ b/libs/plex/interfaces/library/__init__.py
@@ -0,0 +1,104 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class LibraryInterface(Interface):
+    path = 'library'
+
+    def metadata(self, rating_key):
+        response = self.http.get('metadata', rating_key)
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': {
+                    'album':    'Album',
+                    'artist':   'Artist',
+
+                    'season':   'Season',
+                    'show':     'Show'
+                },
+                'Video': {
+                    'episode':  'Episode',
+                    'clip':     'Clip',
+                    'movie':    'Movie'
+                },
+
+                'Track': 'Track'
+            }))
+        }))
+
+    def on_deck(self):
+        response = self.http.get('onDeck')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Video': {
+                    'movie':    'Movie',
+                    'episode':  'Episode'
+                }
+            }))
+        }))
+
+    def recently_added(self):
+        response = self.http.get('recentlyAdded')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': {
+                    'album':    'Album',
+                    'season':   'Season'
+                },
+                'Video': {
+                    'movie':    'Movie'
+                }
+            }))
+        }))
+
+    def sections(self):
+        response = self.http.get('sections')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('SectionContainer', idict({
+                'Directory': ('Section', idict({
+                    'Location': 'Location'
+                }))
+            }))
+        }))
+
+    #
+    # Item actions
+    #
+
+    def rate(self, key, rating):
+        response = self.http.get(
+            '/:/rate',
+            query={
+                'identifier': 'com.plexapp.plugins.library',
+                'key': key,
+                'rating': int(round(rating, 0))
+            }
+        )
+
+        return response.status_code == 200
+
+    def scrobble(self, key):
+        response = self.http.get(
+            '/:/scrobble',
+            query={
+                'identifier': 'com.plexapp.plugins.library',
+                'key': key
+            }
+        )
+
+        return response.status_code == 200
+
+    def unscrobble(self, key):
+        response = self.http.get(
+            '/:/unscrobble',
+            query={
+                'identifier': 'com.plexapp.plugins.library',
+                'key': key
+            }
+        )
+
+        return response.status_code == 200
diff --git a/libs/plex/interfaces/library/metadata.py b/libs/plex/interfaces/library/metadata.py
new file mode 100644
index 000000000..b63429755
--- /dev/null
+++ b/libs/plex/interfaces/library/metadata.py
@@ -0,0 +1,65 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class LibraryMetadataInterface(Interface):
+    path = 'library/metadata'
+
+    def refresh(self, key):
+	response = self.http.put(str(key) + "/refresh")
+
+    def all_leaves(self, key):
+        response = self.http.get(key, 'allLeaves')
+
+        return self.parse(response, idict({
+            'MediaContainer': {
+                '_': 'viewGroup',
+
+                'episode': ('ShowLeavesContainer', idict({
+                    'Video': {
+                        'episode': 'Episode'
+                    }
+                })),
+
+                'track': ('ArtistLeavesContainer', idict({
+                    'Track': 'Track'
+                }))
+            }
+        }))
+
+    def children(self, key):
+        response = self.http.get(key, 'children')
+
+        return self.parse(response, idict({
+            'MediaContainer': {
+                '_': 'viewGroup',
+
+                # ---------------------------------------
+                # Music
+                # ---------------------------------------
+                'album': ('ArtistChildrenContainer', idict({
+                    'Directory': {
+                        'album': 'Album'
+                    }
+                })),
+
+                'track': ('AlbumChildrenContainer', idict({
+                    'Track': 'Track'
+                })),
+
+                # ---------------------------------------
+                # TV
+                # ---------------------------------------
+                'season': ('ShowChildrenContainer', idict({
+                    'Directory': {
+                        'season': 'Season'
+                    }
+                })),
+
+                'episode': ('SeasonChildrenContainer', idict({
+                    'Video': {
+                        'episode': 'Episode'
+                    }
+                }))
+            }
+        }))
diff --git a/libs/plex/interfaces/plugin/__init__.py b/libs/plex/interfaces/plugin/__init__.py
new file mode 100644
index 000000000..a51dcde75
--- /dev/null
+++ b/libs/plex/interfaces/plugin/__init__.py
@@ -0,0 +1,13 @@
+from plex.interfaces.core.base import Interface
+
+
+class PluginInterface(Interface):
+    path = ':/plugins'
+
+    def reload_services(self, plugin_id):
+        response = self.http.get(plugin_id, 'services/reload')
+        return response.status_code == 200
+
+    def restart(self, plugin_id):
+        response = self.http.get(plugin_id, 'restart')
+        return response.status_code == 200
diff --git a/libs/plex/interfaces/plugin/preferences.py b/libs/plex/interfaces/plugin/preferences.py
new file mode 100644
index 000000000..46e5f2fcc
--- /dev/null
+++ b/libs/plex/interfaces/plugin/preferences.py
@@ -0,0 +1,40 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class PluginPreferencesInterface(Interface):
+    path = ':/plugins/*/prefs'
+
+    def get(self, plugin_id, id=None):
+        response = self.http.get('/:/plugins/%s/prefs' % plugin_id)
+
+        container = self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Setting': 'Setting'
+            }))
+        }))
+
+        if container is None or id is None:
+            return container
+
+        for setting in container:
+            if setting.id == id:
+                return setting
+
+        return None
+
+    def set(self, plugin_id, id, value):
+        response = self.http.get('/:/plugins/%s/prefs/set' % plugin_id, query={
+            id: self.to_setting_value(value, type(value))
+        })
+
+        return response.status_code == 200
+
+    def to_setting_value(self, value, value_type=None):
+        if value is None:
+            return None
+
+        if value_type is bool:
+            return str(value).lower()
+
+        return str(value)
diff --git a/libs/plex/interfaces/preferences.py b/libs/plex/interfaces/preferences.py
new file mode 100644
index 000000000..240609c60
--- /dev/null
+++ b/libs/plex/interfaces/preferences.py
@@ -0,0 +1,40 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class PreferencesInterface(Interface):
+    path = ':/prefs'
+
+    def get(self, id=None):
+        response = self.http.get()
+
+        container = self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Setting': 'Setting'
+            }))
+        }))
+
+        if container is None or id is None:
+            return container
+
+        for setting in container:
+            if setting.id == id:
+                return setting
+
+        return None
+
+    def set(self, id, value):
+        response = self.http.put(query={
+            id: self.to_setting_value(value, type(value))
+        })
+
+        return response.status_code == 200
+
+    def to_setting_value(self, value, value_type=None):
+        if value is None:
+            return None
+
+        if value_type is bool:
+            return str(value).lower()
+
+        return str(value)
diff --git a/libs/plex/interfaces/root.py b/libs/plex/interfaces/root.py
new file mode 100644
index 000000000..dcc83880a
--- /dev/null
+++ b/libs/plex/interfaces/root.py
@@ -0,0 +1,59 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class RootInterface(Interface):
+    def detail(self):
+        response = self.http.get()
+
+        return self.parse(response, idict({
+            'MediaContainer': ('Detail', idict({
+                'Directory': 'Directory'
+            }))
+        }))
+
+    def version(self):
+        detail = self.detail()
+
+        if not detail:
+            return None
+
+        return detail.version
+
+    def clients(self):
+        response = self.http.get('clients')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('ClientContainer', idict({
+                'Server': 'Client'
+            }))
+        }))
+
+    def players(self):
+        pass
+
+    def servers(self):
+        response = self.http.get('servers')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('Container', idict({
+                'Server': 'Server'
+            }))
+        }))
+
+    def agents(self):
+        response = self.http.get('system/agents')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('Container', idict({
+                'Agent': 'Agent'
+            }))
+        }))
+
+    def primary_agent(self, guid, media_type):
+        response = self.http.get('/system/agents/%s/config/%s' % (guid, media_type))
+        return self.parse(response, idict({
+            'MediaContainer': ('Container', idict({
+                'Agent': 'Agent'
+            }))
+        }))
diff --git a/libs/plex/interfaces/section.py b/libs/plex/interfaces/section.py
new file mode 100644
index 000000000..a5c799ce3
--- /dev/null
+++ b/libs/plex/interfaces/section.py
@@ -0,0 +1,69 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class SectionInterface(Interface):
+    path = 'library/sections'
+
+    def all(self, key):
+        response = self.http.get(key, 'all')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': {
+                    'artist':   'Artist',
+                    'show':     'Show'
+                },
+                'Video': {
+                    'movie':    'Movie'
+                }
+            }))
+        }))
+
+    def recently_added(self, key):
+        response = self.http.get(key, 'recentlyAdded')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': {
+                    'artist':   'Artist',
+                    'show':     'Show'
+                },
+                'Video': {
+                    'movie':    'Movie',
+                    'episode':  'Episode',
+                    'clip':     'Clip',
+                }
+            }))
+        }))
+
+    def first_character(self, key, character=None):
+        if character:
+            response = self.http.get(key, ['firstCharacter', character])
+
+            # somehow plex wrongly returns items of other libraries when character is #
+            return self.parse(response, idict({
+                'MediaContainer': ('MediaContainer', idict({
+                    'Directory': {
+                        'album':    'Album',
+                        'artist':   'Artist',
+
+                        'season':   'Season',
+                        'show':     'Show'
+                    },
+                    'Video': {
+                        'episode':  'Episode',
+                        'clip':     'Clip',
+                        'movie':    'Movie'
+                    },
+                    'Track': 'Track'
+                }))
+            }))
+
+        response = self.http.get(key, 'firstCharacter')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': 'Directory'
+            }))
+        }))
diff --git a/libs/plex/interfaces/status.py b/libs/plex/interfaces/status.py
new file mode 100644
index 000000000..97d3c3b85
--- /dev/null
+++ b/libs/plex/interfaces/status.py
@@ -0,0 +1,21 @@
+from plex.core.idict import idict
+from plex.interfaces.core.base import Interface
+
+
+class StatusInterface(Interface):
+    path = 'status'
+
+    def sessions(self):
+        response = self.http.get('sessions')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('SessionContainer', idict({
+                'Track': 'Track',
+
+                'Video': {
+                    'episode':  'Episode',
+                    'clip':     'Clip',
+                    'movie':    'Movie'
+                }
+            }))
+        }))
diff --git a/libs/plex/interfaces/timeline.py b/libs/plex/interfaces/timeline.py
new file mode 100644
index 000000000..b92709e44
--- /dev/null
+++ b/libs/plex/interfaces/timeline.py
@@ -0,0 +1,36 @@
+from plex.interfaces.core.base import Interface
+
+TIMELINE_STATES = [
+    'buffering',
+    'paused',
+    'playing',
+    'stopped'
+]
+
+
+class TimelineInterface(Interface):
+    path = ':/timeline'
+
+    def update(self, rating_key, state, time, duration, key=None, play_queue_item_id=None):
+        if not rating_key:
+            raise ValueError('Invalid "rating_key" parameter')
+
+        if time is None or duration is None:
+            raise ValueError('"time" and "duration" parameters are required')
+
+        if state not in TIMELINE_STATES:
+            raise ValueError('Unknown "state"')
+
+        response = self.http.get(query=[
+            ('ratingKey', rating_key),
+            ('state', state),
+
+            ('time', time),
+            ('duration', duration),
+
+            # Optional parameters
+            ('key', key),
+            ('playQueueItemID', play_queue_item_id)
+        ])
+
+        return response and response.status_code == 200
diff --git a/libs/plex/lib/__init__.py b/libs/plex/lib/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/lib/six.py b/libs/plex/lib/six.py
new file mode 100644
index 000000000..21b0e8032
--- /dev/null
+++ b/libs/plex/lib/six.py
@@ -0,0 +1,762 @@
+"""Utilities for writing code that runs on Python 2 and 3"""
+
+# Copyright (c) 2010-2014 Benjamin Peterson
+#
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included in all
+# copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+from __future__ import absolute_import
+
+import functools
+import operator
+import sys
+import types
+
+__author__ = "Benjamin Peterson <benjamin@python.org>"
+__version__ = "1.8.0"
+
+
+# Useful for very coarse version differentiation.
+PY2 = sys.version_info[0] == 2
+PY3 = sys.version_info[0] == 3
+
+if PY3:
+    string_types = str,
+    integer_types = int,
+    class_types = type,
+    text_type = str
+    binary_type = bytes
+
+    MAXSIZE = sys.maxsize
+else:
+    string_types = basestring,
+    integer_types = (int, long)
+    class_types = (type, types.ClassType)
+    text_type = unicode
+    binary_type = str
+
+    if sys.platform.startswith("java"):
+        # Jython always uses 32 bits.
+        MAXSIZE = int((1 << 31) - 1)
+    else:
+        # It's possible to have sizeof(long) != sizeof(Py_ssize_t).
+        class X(object):
+            def __len__(self):
+                return 1 << 31
+        try:
+            len(X())
+        except OverflowError:
+            # 32-bit
+            MAXSIZE = int((1 << 31) - 1)
+        else:
+            # 64-bit
+            MAXSIZE = int((1 << 63) - 1)
+        del X
+
+
+def _add_doc(func, doc):
+    """Add documentation to a function."""
+    func.__doc__ = doc
+
+
+def _import_module(name):
+    """Import module, returning the module after the last dot."""
+    __import__(name)
+    return sys.modules[name]
+
+
+class _LazyDescr(object):
+
+    def __init__(self, name):
+        self.name = name
+
+    def __get__(self, obj, tp):
+        result = self._resolve()
+        setattr(obj, self.name, result) # Invokes __set__.
+        # This is a bit ugly, but it avoids running this again.
+        delattr(obj.__class__, self.name)
+        return result
+
+
+class MovedModule(_LazyDescr):
+
+    def __init__(self, name, old, new=None):
+        super(MovedModule, self).__init__(name)
+        if PY3:
+            if new is None:
+                new = name
+            self.mod = new
+        else:
+            self.mod = old
+
+    def _resolve(self):
+        return _import_module(self.mod)
+
+    def __getattr__(self, attr):
+        _module = self._resolve()
+        value = getattr(_module, attr)
+        setattr(self, attr, value)
+        return value
+
+
+class _LazyModule(types.ModuleType):
+
+    def __init__(self, name):
+        super(_LazyModule, self).__init__(name)
+        self.__doc__ = self.__class__.__doc__
+
+    def __dir__(self):
+        attrs = ["__doc__", "__name__"]
+        attrs += [attr.name for attr in self._moved_attributes]
+        return attrs
+
+    # Subclasses should override this
+    _moved_attributes = []
+
+
+class MovedAttribute(_LazyDescr):
+
+    def __init__(self, name, old_mod, new_mod, old_attr=None, new_attr=None):
+        super(MovedAttribute, self).__init__(name)
+        if PY3:
+            if new_mod is None:
+                new_mod = name
+            self.mod = new_mod
+            if new_attr is None:
+                if old_attr is None:
+                    new_attr = name
+                else:
+                    new_attr = old_attr
+            self.attr = new_attr
+        else:
+            self.mod = old_mod
+            if old_attr is None:
+                old_attr = name
+            self.attr = old_attr
+
+    def _resolve(self):
+        module = _import_module(self.mod)
+        return getattr(module, self.attr)
+
+
+class _SixMetaPathImporter(object):
+    """
+    A meta path importer to import six.moves and its submodules.
+
+    This class implements a PEP302 finder and loader. It should be compatible
+    with Python 2.5 and all existing versions of Python3
+    """
+    def __init__(self, six_module_name):
+        self.name = six_module_name
+        self.known_modules = {}
+
+    def _add_module(self, mod, *fullnames):
+        for fullname in fullnames:
+            self.known_modules[self.name + "." + fullname] = mod
+
+    def _get_module(self, fullname):
+        return self.known_modules[self.name + "." + fullname]
+
+    def find_module(self, fullname, path=None):
+        if fullname in self.known_modules:
+            return self
+        return None
+
+    def __get_module(self, fullname):
+        try:
+            return self.known_modules[fullname]
+        except KeyError:
+            raise ImportError("This loader does not know module " + fullname)
+
+    def load_module(self, fullname):
+        try:
+            # in case of a reload
+            return sys.modules[fullname]
+        except KeyError:
+            pass
+        mod = self.__get_module(fullname)
+        if isinstance(mod, MovedModule):
+            mod = mod._resolve()
+        else:
+            mod.__loader__ = self
+        sys.modules[fullname] = mod
+        return mod
+
+    def is_package(self, fullname):
+        """
+        Return true, if the named module is a package.
+
+        We need this method to get correct spec objects with
+        Python 3.4 (see PEP451)
+        """
+        return hasattr(self.__get_module(fullname), "__path__")
+
+    def get_code(self, fullname):
+        """Return None
+
+        Required, if is_package is implemented"""
+        self.__get_module(fullname)  # eventually raises ImportError
+        return None
+    get_source = get_code  # same as get_code
+
+_importer = _SixMetaPathImporter(__name__)
+
+
+class _MovedItems(_LazyModule):
+    """Lazy loading of moved objects"""
+    __path__ = []  # mark as package
+
+
+_moved_attributes = [
+    MovedAttribute("cStringIO", "cStringIO", "io", "StringIO"),
+    MovedAttribute("filter", "itertools", "builtins", "ifilter", "filter"),
+    MovedAttribute("filterfalse", "itertools", "itertools", "ifilterfalse", "filterfalse"),
+    MovedAttribute("input", "__builtin__", "builtins", "raw_input", "input"),
+    MovedAttribute("intern", "__builtin__", "sys"),
+    MovedAttribute("map", "itertools", "builtins", "imap", "map"),
+    MovedAttribute("range", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("reload_module", "__builtin__", "imp", "reload"),
+    MovedAttribute("reduce", "__builtin__", "functools"),
+    MovedAttribute("shlex_quote", "pipes", "shlex", "quote"),
+    MovedAttribute("StringIO", "StringIO", "io"),
+    MovedAttribute("UserDict", "UserDict", "collections"),
+    MovedAttribute("UserList", "UserList", "collections"),
+    MovedAttribute("UserString", "UserString", "collections"),
+    MovedAttribute("xrange", "__builtin__", "builtins", "xrange", "range"),
+    MovedAttribute("zip", "itertools", "builtins", "izip", "zip"),
+    MovedAttribute("zip_longest", "itertools", "itertools", "izip_longest", "zip_longest"),
+
+    MovedModule("builtins", "__builtin__"),
+    MovedModule("configparser", "ConfigParser"),
+    MovedModule("copyreg", "copy_reg"),
+    MovedModule("dbm_gnu", "gdbm", "dbm.gnu"),
+    MovedModule("_dummy_thread", "dummy_thread", "_dummy_thread"),
+    MovedModule("http_cookiejar", "cookielib", "http.cookiejar"),
+    MovedModule("http_cookies", "Cookie", "http.cookies"),
+    MovedModule("html_entities", "htmlentitydefs", "html.entities"),
+    MovedModule("html_parser", "HTMLParser", "html.parser"),
+    MovedModule("http_client", "httplib", "http.client"),
+    MovedModule("email_mime_multipart", "email.MIMEMultipart", "email.mime.multipart"),
+    MovedModule("email_mime_nonmultipart", "email.MIMENonMultipart", "email.mime.nonmultipart"),
+    MovedModule("email_mime_text", "email.MIMEText", "email.mime.text"),
+    MovedModule("email_mime_base", "email.MIMEBase", "email.mime.base"),
+    MovedModule("BaseHTTPServer", "BaseHTTPServer", "http.server"),
+    MovedModule("CGIHTTPServer", "CGIHTTPServer", "http.server"),
+    MovedModule("SimpleHTTPServer", "SimpleHTTPServer", "http.server"),
+    MovedModule("cPickle", "cPickle", "pickle"),
+    MovedModule("queue", "Queue"),
+    MovedModule("reprlib", "repr"),
+    MovedModule("socketserver", "SocketServer"),
+    MovedModule("_thread", "thread", "_thread"),
+    MovedModule("tkinter", "Tkinter"),
+    MovedModule("tkinter_dialog", "Dialog", "tkinter.dialog"),
+    MovedModule("tkinter_filedialog", "FileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_scrolledtext", "ScrolledText", "tkinter.scrolledtext"),
+    MovedModule("tkinter_simpledialog", "SimpleDialog", "tkinter.simpledialog"),
+    MovedModule("tkinter_tix", "Tix", "tkinter.tix"),
+    MovedModule("tkinter_ttk", "ttk", "tkinter.ttk"),
+    MovedModule("tkinter_constants", "Tkconstants", "tkinter.constants"),
+    MovedModule("tkinter_dnd", "Tkdnd", "tkinter.dnd"),
+    MovedModule("tkinter_colorchooser", "tkColorChooser",
+                "tkinter.colorchooser"),
+    MovedModule("tkinter_commondialog", "tkCommonDialog",
+                "tkinter.commondialog"),
+    MovedModule("tkinter_tkfiledialog", "tkFileDialog", "tkinter.filedialog"),
+    MovedModule("tkinter_font", "tkFont", "tkinter.font"),
+    MovedModule("tkinter_messagebox", "tkMessageBox", "tkinter.messagebox"),
+    MovedModule("tkinter_tksimpledialog", "tkSimpleDialog",
+                "tkinter.simpledialog"),
+    MovedModule("urllib_parse", __name__ + ".moves.urllib_parse", "urllib.parse"),
+    MovedModule("urllib_error", __name__ + ".moves.urllib_error", "urllib.error"),
+    MovedModule("urllib", __name__ + ".moves.urllib", __name__ + ".moves.urllib"),
+    MovedModule("urllib_robotparser", "robotparser", "urllib.robotparser"),
+    MovedModule("xmlrpc_client", "xmlrpclib", "xmlrpc.client"),
+    MovedModule("xmlrpc_server", "SimpleXMLRPCServer", "xmlrpc.server"),
+    MovedModule("winreg", "_winreg"),
+]
+for attr in _moved_attributes:
+    setattr(_MovedItems, attr.name, attr)
+    if isinstance(attr, MovedModule):
+        _importer._add_module(attr, "moves." + attr.name)
+del attr
+
+_MovedItems._moved_attributes = _moved_attributes
+
+moves = _MovedItems(__name__ + ".moves")
+_importer._add_module(moves, "moves")
+
+
+class Module_six_moves_urllib_parse(_LazyModule):
+    """Lazy loading of moved objects in six.moves.urllib_parse"""
+
+
+_urllib_parse_moved_attributes = [
+    MovedAttribute("ParseResult", "urlparse", "urllib.parse"),
+    MovedAttribute("SplitResult", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qs", "urlparse", "urllib.parse"),
+    MovedAttribute("parse_qsl", "urlparse", "urllib.parse"),
+    MovedAttribute("urldefrag", "urlparse", "urllib.parse"),
+    MovedAttribute("urljoin", "urlparse", "urllib.parse"),
+    MovedAttribute("urlparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunparse", "urlparse", "urllib.parse"),
+    MovedAttribute("urlunsplit", "urlparse", "urllib.parse"),
+    MovedAttribute("quote", "urllib", "urllib.parse"),
+    MovedAttribute("quote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("unquote", "urllib", "urllib.parse"),
+    MovedAttribute("unquote_plus", "urllib", "urllib.parse"),
+    MovedAttribute("urlencode", "urllib", "urllib.parse"),
+    MovedAttribute("splitquery", "urllib", "urllib.parse"),
+    MovedAttribute("splittag", "urllib", "urllib.parse"),
+    MovedAttribute("splituser", "urllib", "urllib.parse"),
+    MovedAttribute("uses_fragment", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_netloc", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_params", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_query", "urlparse", "urllib.parse"),
+    MovedAttribute("uses_relative", "urlparse", "urllib.parse"),
+]
+for attr in _urllib_parse_moved_attributes:
+    setattr(Module_six_moves_urllib_parse, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_parse._moved_attributes = _urllib_parse_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_parse(__name__ + ".moves.urllib_parse"),
+                      "moves.urllib_parse", "moves.urllib.parse")
+
+
+class Module_six_moves_urllib_error(_LazyModule):
+    """Lazy loading of moved objects in six.moves.urllib_error"""
+
+
+_urllib_error_moved_attributes = [
+    MovedAttribute("URLError", "urllib2", "urllib.error"),
+    MovedAttribute("HTTPError", "urllib2", "urllib.error"),
+    MovedAttribute("ContentTooShortError", "urllib", "urllib.error"),
+]
+for attr in _urllib_error_moved_attributes:
+    setattr(Module_six_moves_urllib_error, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_error._moved_attributes = _urllib_error_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_error(__name__ + ".moves.urllib.error"),
+                      "moves.urllib_error", "moves.urllib.error")
+
+
+class Module_six_moves_urllib_request(_LazyModule):
+    """Lazy loading of moved objects in six.moves.urllib_request"""
+
+
+_urllib_request_moved_attributes = [
+    MovedAttribute("urlopen", "urllib2", "urllib.request"),
+    MovedAttribute("install_opener", "urllib2", "urllib.request"),
+    MovedAttribute("build_opener", "urllib2", "urllib.request"),
+    MovedAttribute("pathname2url", "urllib", "urllib.request"),
+    MovedAttribute("url2pathname", "urllib", "urllib.request"),
+    MovedAttribute("getproxies", "urllib", "urllib.request"),
+    MovedAttribute("Request", "urllib2", "urllib.request"),
+    MovedAttribute("OpenerDirector", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDefaultErrorHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPRedirectHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPCookieProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyHandler", "urllib2", "urllib.request"),
+    MovedAttribute("BaseHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgr", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPPasswordMgrWithDefaultRealm", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyBasicAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("AbstractDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("ProxyDigestAuthHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPSHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FileHandler", "urllib2", "urllib.request"),
+    MovedAttribute("FTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("CacheFTPHandler", "urllib2", "urllib.request"),
+    MovedAttribute("UnknownHandler", "urllib2", "urllib.request"),
+    MovedAttribute("HTTPErrorProcessor", "urllib2", "urllib.request"),
+    MovedAttribute("urlretrieve", "urllib", "urllib.request"),
+    MovedAttribute("urlcleanup", "urllib", "urllib.request"),
+    MovedAttribute("URLopener", "urllib", "urllib.request"),
+    MovedAttribute("FancyURLopener", "urllib", "urllib.request"),
+    MovedAttribute("proxy_bypass", "urllib", "urllib.request"),
+]
+for attr in _urllib_request_moved_attributes:
+    setattr(Module_six_moves_urllib_request, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_request._moved_attributes = _urllib_request_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_request(__name__ + ".moves.urllib.request"),
+                      "moves.urllib_request", "moves.urllib.request")
+
+
+class Module_six_moves_urllib_response(_LazyModule):
+    """Lazy loading of moved objects in six.moves.urllib_response"""
+
+
+_urllib_response_moved_attributes = [
+    MovedAttribute("addbase", "urllib", "urllib.response"),
+    MovedAttribute("addclosehook", "urllib", "urllib.response"),
+    MovedAttribute("addinfo", "urllib", "urllib.response"),
+    MovedAttribute("addinfourl", "urllib", "urllib.response"),
+]
+for attr in _urllib_response_moved_attributes:
+    setattr(Module_six_moves_urllib_response, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_response._moved_attributes = _urllib_response_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_response(__name__ + ".moves.urllib.response"),
+                      "moves.urllib_response", "moves.urllib.response")
+
+
+class Module_six_moves_urllib_robotparser(_LazyModule):
+    """Lazy loading of moved objects in six.moves.urllib_robotparser"""
+
+
+_urllib_robotparser_moved_attributes = [
+    MovedAttribute("RobotFileParser", "robotparser", "urllib.robotparser"),
+]
+for attr in _urllib_robotparser_moved_attributes:
+    setattr(Module_six_moves_urllib_robotparser, attr.name, attr)
+del attr
+
+Module_six_moves_urllib_robotparser._moved_attributes = _urllib_robotparser_moved_attributes
+
+_importer._add_module(Module_six_moves_urllib_robotparser(__name__ + ".moves.urllib.robotparser"),
+                      "moves.urllib_robotparser", "moves.urllib.robotparser")
+
+
+class Module_six_moves_urllib(types.ModuleType):
+    """Create a six.moves.urllib namespace that resembles the Python 3 namespace"""
+    __path__ = []  # mark as package
+    parse = _importer._get_module("moves.urllib_parse")
+    error = _importer._get_module("moves.urllib_error")
+    request = _importer._get_module("moves.urllib_request")
+    response = _importer._get_module("moves.urllib_response")
+    robotparser = _importer._get_module("moves.urllib_robotparser")
+
+    def __dir__(self):
+        return ['parse', 'error', 'request', 'response', 'robotparser']
+
+_importer._add_module(Module_six_moves_urllib(__name__ + ".moves.urllib"),
+                      "moves.urllib")
+
+
+def add_move(move):
+    """Add an item to six.moves."""
+    setattr(_MovedItems, move.name, move)
+
+
+def remove_move(name):
+    """Remove item from six.moves."""
+    try:
+        delattr(_MovedItems, name)
+    except AttributeError:
+        try:
+            del moves.__dict__[name]
+        except KeyError:
+            raise AttributeError("no such move, %r" % (name,))
+
+
+if PY3:
+    _meth_func = "__func__"
+    _meth_self = "__self__"
+
+    _func_closure = "__closure__"
+    _func_code = "__code__"
+    _func_defaults = "__defaults__"
+    _func_globals = "__globals__"
+else:
+    _meth_func = "im_func"
+    _meth_self = "im_self"
+
+    _func_closure = "func_closure"
+    _func_code = "func_code"
+    _func_defaults = "func_defaults"
+    _func_globals = "func_globals"
+
+
+try:
+    advance_iterator = next
+except NameError:
+    def advance_iterator(it):
+        return it.next()
+next = advance_iterator
+
+
+try:
+    callable = callable
+except NameError:
+    def callable(obj):
+        return any("__call__" in klass.__dict__ for klass in type(obj).__mro__)
+
+
+if PY3:
+    def get_unbound_function(unbound):
+        return unbound
+
+    create_bound_method = types.MethodType
+
+    Iterator = object
+else:
+    def get_unbound_function(unbound):
+        return unbound.im_func
+
+    def create_bound_method(func, obj):
+        return types.MethodType(func, obj, obj.__class__)
+
+    class Iterator(object):
+
+        def next(self):
+            return type(self).__next__(self)
+
+    callable = callable
+_add_doc(get_unbound_function,
+         """Get the function out of a possibly unbound function""")
+
+
+get_method_function = operator.attrgetter(_meth_func)
+get_method_self = operator.attrgetter(_meth_self)
+get_function_closure = operator.attrgetter(_func_closure)
+get_function_code = operator.attrgetter(_func_code)
+get_function_defaults = operator.attrgetter(_func_defaults)
+get_function_globals = operator.attrgetter(_func_globals)
+
+
+if PY3:
+    def iterkeys(d, **kw):
+        return iter(d.keys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.values(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.items(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.lists(**kw))
+else:
+    def iterkeys(d, **kw):
+        return iter(d.iterkeys(**kw))
+
+    def itervalues(d, **kw):
+        return iter(d.itervalues(**kw))
+
+    def iteritems(d, **kw):
+        return iter(d.iteritems(**kw))
+
+    def iterlists(d, **kw):
+        return iter(d.iterlists(**kw))
+
+_add_doc(iterkeys, "Return an iterator over the keys of a dictionary.")
+_add_doc(itervalues, "Return an iterator over the values of a dictionary.")
+_add_doc(iteritems,
+         "Return an iterator over the (key, value) pairs of a dictionary.")
+_add_doc(iterlists,
+         "Return an iterator over the (key, [values]) pairs of a dictionary.")
+
+
+if PY3:
+    def b(s):
+        return s.encode("latin-1")
+    def u(s):
+        return s
+    unichr = chr
+    if sys.version_info[1] <= 1:
+        def int2byte(i):
+            return bytes((i,))
+    else:
+        # This is about 2x faster than the implementation above on 3.2+
+        int2byte = operator.methodcaller("to_bytes", 1, "big")
+    byte2int = operator.itemgetter(0)
+    indexbytes = operator.getitem
+    iterbytes = iter
+    import io
+    StringIO = io.StringIO
+    BytesIO = io.BytesIO
+else:
+    def b(s):
+        return s
+    # Workaround for standalone backslash
+    def u(s):
+        return unicode(s.replace(r'\\', r'\\\\'), "unicode_escape")
+    unichr = unichr
+    int2byte = chr
+    def byte2int(bs):
+        return ord(bs[0])
+    def indexbytes(buf, i):
+        return ord(buf[i])
+    def iterbytes(buf):
+        return (ord(byte) for byte in buf)
+    import StringIO
+    StringIO = BytesIO = StringIO.StringIO
+_add_doc(b, """Byte literal""")
+_add_doc(u, """Text literal""")
+
+
+if PY3:
+    exec_ = getattr(moves.builtins, "exec")
+
+
+    def reraise(tp, value, tb=None):
+        if value is None:
+            value = tp()
+        if value.__traceback__ is not tb:
+            raise value.with_traceback(tb)
+        raise value
+
+else:
+    def exec_(_code_, _globs_=None, _locs_=None):
+        """Execute code in a namespace."""
+        if _globs_ is None:
+            frame = sys._getframe(1)
+            _globs_ = frame.f_globals
+            if _locs_ is None:
+                _locs_ = frame.f_locals
+            del frame
+        elif _locs_ is None:
+            _locs_ = _globs_
+        exec("""exec _code_ in _globs_, _locs_""")
+
+
+    exec_("""def reraise(tp, value, tb=None):
+    raise tp, value, tb
+""")
+
+
+print_ = getattr(moves.builtins, "print", None)
+if print_ is None:
+    def print_(*args, **kwargs):
+        """The new-style print function for Python 2.4 and 2.5."""
+        fp = kwargs.pop("file", sys.stdout)
+        if fp is None:
+            return
+        def write(data):
+            if not isinstance(data, basestring):
+                data = str(data)
+            # If the file has an encoding, encode unicode with it.
+            if (isinstance(fp, file) and
+                isinstance(data, unicode) and
+                fp.encoding is not None):
+                errors = getattr(fp, "errors", None)
+                if errors is None:
+                    errors = "strict"
+                data = data.encode(fp.encoding, errors)
+            fp.write(data)
+        want_unicode = False
+        sep = kwargs.pop("sep", None)
+        if sep is not None:
+            if isinstance(sep, unicode):
+                want_unicode = True
+            elif not isinstance(sep, str):
+                raise TypeError("sep must be None or a string")
+        end = kwargs.pop("end", None)
+        if end is not None:
+            if isinstance(end, unicode):
+                want_unicode = True
+            elif not isinstance(end, str):
+                raise TypeError("end must be None or a string")
+        if kwargs:
+            raise TypeError("invalid keyword arguments to print()")
+        if not want_unicode:
+            for arg in args:
+                if isinstance(arg, unicode):
+                    want_unicode = True
+                    break
+        if want_unicode:
+            newline = unicode("\n")
+            space = unicode(" ")
+        else:
+            newline = "\n"
+            space = " "
+        if sep is None:
+            sep = space
+        if end is None:
+            end = newline
+        for i, arg in enumerate(args):
+            if i:
+                write(sep)
+            write(arg)
+        write(end)
+
+_add_doc(reraise, """Reraise an exception.""")
+
+if sys.version_info[0:2] < (3, 4):
+    def wraps(wrapped, assigned=functools.WRAPPER_ASSIGNMENTS,
+              updated=functools.WRAPPER_UPDATES):
+        def wrapper(f):
+            f = functools.wraps(wrapped)(f)
+            f.__wrapped__ = wrapped
+            return f
+        return wrapper
+else:
+    wraps = functools.wraps
+
+def with_metaclass(meta, *bases):
+    """Create a base class with a metaclass."""
+    # This requires a bit of explanation: the basic idea is to make a dummy
+    # metaclass for one level of class instantiation that replaces itself with
+    # the actual metaclass.
+    class metaclass(meta):
+        def __new__(cls, name, this_bases, d):
+            return meta(name, bases, d)
+    return type.__new__(metaclass, 'temporary_class', (), {})
+
+
+def add_metaclass(metaclass):
+    """Class decorator for creating a class with a metaclass."""
+    def wrapper(cls):
+        orig_vars = cls.__dict__.copy()
+        slots = orig_vars.get('__slots__')
+        if slots is not None:
+            if isinstance(slots, str):
+                slots = [slots]
+            for slots_var in slots:
+                orig_vars.pop(slots_var)
+        orig_vars.pop('__dict__', None)
+        orig_vars.pop('__weakref__', None)
+        return metaclass(cls.__name__, cls.__bases__, orig_vars)
+    return wrapper
+
+# Complete the moves implementation.
+# This code is at the end of this module to speed up module loading.
+# Turn this module into a package.
+__path__ = []  # required for PEP 302 and PEP 451
+__package__ = __name__  # see PEP 366 @ReservedAssignment
+if globals().get("__spec__") is not None:
+    __spec__.submodule_search_locations = []  # PEP 451 @UndefinedVariable
+# Remove other six meta path importers, since they cause problems. This can
+# happen if six is removed from sys.modules and then reloaded. (Setuptools does
+# this for some reason.)
+if sys.meta_path:
+    for i, importer in enumerate(sys.meta_path):
+        # Here's some real nastiness: Another "instance" of the six module might
+        # be floating around. Therefore, we can't use isinstance() to check for
+        # the six meta path importer, since the other six instance will have
+        # inserted an importer with different class.
+        if (type(importer).__name__ == "_SixMetaPathImporter" and
+            importer.name == __name__):
+            del sys.meta_path[i]
+            break
+    del i, importer
+# Finally, add the importer to the meta path import hook.
+sys.meta_path.append(_importer)
diff --git a/libs/plex/objects/__init__.py b/libs/plex/objects/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/agent.py b/libs/plex/objects/agent.py
new file mode 100644
index 000000000..ae3706090
--- /dev/null
+++ b/libs/plex/objects/agent.py
@@ -0,0 +1,29 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class MediaType(Descriptor):
+    name = Property
+    media_type = Property("mediaType", type=int)
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for t in cls.helpers.findall(node, 'MediaType'):
+            _, obj = MediaType.construct(client, t, child=True)
+
+            items.append(obj)
+
+        return [], items
+
+
+class Agent(Descriptor):
+    name = Property
+    enabled = Property(type=int)
+    identifier = Property
+    primary = Property(type=int)
+    has_prefs = Property("hasPrefs", type=int)
+    has_attribution = Property("hasAttribution", type=int)
+
+    media_types = Property(resolver=lambda: MediaType.from_node)
+
diff --git a/libs/plex/objects/client.py b/libs/plex/objects/client.py
new file mode 100644
index 000000000..2dbca4adc
--- /dev/null
+++ b/libs/plex/objects/client.py
@@ -0,0 +1,32 @@
+from plex.core.helpers import to_iterable
+from plex.objects.container import Container
+from plex.objects.core.base import Property
+from plex.objects.server import Server
+
+
+class Client(Server):
+    product = Property
+    device_class = Property('deviceClass')
+
+    protocol = Property
+    protocol_version = Property('protocolVersion', type=int)
+    protocol_capabilities = Property('protocolCapabilities')
+
+
+class ClientContainer(Container):
+    filter_passes = lambda _, allowed, value: allowed is None or value in allowed
+
+    def filter(self, identifiers=None):
+        identifiers = to_iterable(identifiers)
+
+        for client in self:
+            if not self.filter_passes(identifiers, client.machine_identifier):
+                continue
+
+            yield client
+
+    def get(self, identifier):
+        for item in self.filter(identifier):
+            return item
+
+        return None
diff --git a/libs/plex/objects/container.py b/libs/plex/objects/container.py
new file mode 100644
index 000000000..9123cef27
--- /dev/null
+++ b/libs/plex/objects/container.py
@@ -0,0 +1,7 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Container(Descriptor):
+    size = Property(type=int)
+
+    updated_at = Property('updatedAt', int)
diff --git a/libs/plex/objects/core/__init__.py b/libs/plex/objects/core/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/core/base.py b/libs/plex/objects/core/base.py
new file mode 100644
index 000000000..deb527036
--- /dev/null
+++ b/libs/plex/objects/core/base.py
@@ -0,0 +1,168 @@
+from plex.lib.six import add_metaclass
+from plex.interfaces.core.base import Interface
+
+import logging
+import traceback
+import types
+
+log = logging.getLogger(__name__)
+
+
+class Property(object):
+    helpers = Interface.helpers
+
+    def __init__(self, name=None, type=None, resolver=None):
+        self.name = name
+        self.type = type
+        self.resolver = resolver
+
+    def value(self, client, key, node, keys_used):
+        if self.resolver is not None:
+            return self.value_func(client, node, keys_used)
+
+        return self.value_node(key, node, keys_used)
+
+    def value_node(self, key, node, keys_used):
+        value = self.helpers.get(node, key)
+        keys_used.append(key.lower())
+
+        if value is None:
+            return None
+
+        return self.value_convert(value)
+
+    def value_convert(self, value):
+        if not self.type:
+            return value
+
+        types = self.type if type(self.type) is list else [self.type]
+        result = value
+
+        for target_type in types:
+            try:
+                result = target_type(result)
+            except:
+                return None
+
+        return result
+
+    def value_func(self, client, node, keys_used):
+        func = self.resolver()
+
+        try:
+            keys, value = func(client, node)
+
+            keys_used.extend([k.lower() for k in keys])
+            return value
+        except Exception as ex:
+            log.warn('Exception in value function (%s): %s - %s', func, ex, traceback.format_exc())
+            return None
+
+
+class DescriptorMeta(type):
+    def __init__(self, name, bases, attrs):
+        super(DescriptorMeta, self).__init__(name, bases, attrs)
+
+        Interface.object_map[self.__name__] = self
+
+
+@add_metaclass(DescriptorMeta)
+class Descriptor(Interface):
+    attribute_map = None
+
+    def __init__(self, client, path):
+        super(Descriptor, self).__init__(client)
+        self.path = path
+
+        self._children = None
+
+    @classmethod
+    def properties(cls):
+        keys = [k for k in dir(cls) if not k.startswith('_')]
+
+        #log.debug('%s - keys: %s', self, keys)
+
+        for key in keys:
+            if key.startswith('_'):
+                continue
+
+            value = getattr(cls, key)
+
+            if value is Property:
+                yield key, Property(key)
+            elif isinstance(value, Property):
+                yield key, value
+
+    @classmethod
+    def construct(cls, client, node, attribute_map=None, path=None, child=False):
+        if node is None:
+            return [], None
+
+        keys_available = [k.lower() for k in node.keys()]
+        keys_used = []
+
+        if attribute_map is None:
+            attribute_map = cls.attribute_map or {}
+
+        require_map = attribute_map.get('*') != '*'
+
+        # Determine path from object "key"
+        key = cls.helpers.get(node, 'key')
+
+        if key is not None:
+            path = key[:key.rfind('/')]
+
+        # Construct object
+        obj = cls(client, path)
+
+        #log.debug('%s - Properties: %s', cls.__name__, list(obj.properties()))
+
+        for key, prop in cls.properties():
+            node_key = prop.name or key
+
+            if attribute_map:
+                if node_key in attribute_map:
+                    node_key = attribute_map.get(node_key)
+                elif require_map:
+                    setattr(obj, key, None)
+                    continue
+
+            #log.debug('%s - Found property "%s"', cls.__name__, key)
+            setattr(obj, key, prop.value(client, node_key, node, keys_used))
+
+        # Post-fill transformation
+        obj.__transform__()
+
+        # Look for omitted keys
+        omitted = list(set(keys_available) - set(keys_used))
+        omitted.sort()
+
+        if omitted and not child:
+            log.warn('%s - Omitted attributes: %s', cls.__name__, ', '.join(omitted))
+
+        return keys_used, obj
+
+    def __transform__(self):
+        pass
+
+    def __iter__(self):
+        return self._children or []
+
+    def __getstate__(self):
+        data = self.__dict__
+
+        def build():
+            for key, value in data.items():
+                if isinstance(value, types.GeneratorType):
+                    value = list(value)
+
+                if key in ['client']:
+                    continue
+
+                yield key, value
+
+        return dict(build())
+
+
+class DescriptorMixin(Descriptor):
+    pass
diff --git a/libs/plex/objects/core/manager.py b/libs/plex/objects/core/manager.py
new file mode 100644
index 000000000..d694926f0
--- /dev/null
+++ b/libs/plex/objects/core/manager.py
@@ -0,0 +1,89 @@
+import inspect
+import logging
+import os
+
+log = logging.getLogger(__name__)
+
+UNC_PREFIX = '\\\\?\\'
+
+
+class ObjectManager(object):
+    base_dir = None
+    objects_dir = None
+    objects_map = {}
+
+    ignore_files = [
+        '__init__.py'
+    ]
+    ignore_paths = [
+        'plex\\objects\\core\\base.py',
+        'plex\\objects\\core\\manager.py'
+    ]
+
+    @classmethod
+    def discover(cls):
+        cls.objects_dir = os.path.join(cls.base_dir, 'plex', 'objects')
+
+        # Walk plex/objects directory
+        for current, directories, files in os.walk(cls.objects_dir):
+
+            # Iterate files, yield valid paths
+            for filename in files:
+                if not filename.endswith('.py'):
+                    continue
+
+                # Ensure filename is not in ignore list
+                if filename in cls.ignore_files:
+                    continue
+
+                path = os.path.join(current, filename)
+
+                # Ensure path is not in ignore list
+                if not all([not path.endswith(p) for p in cls.ignore_paths]):
+                    continue
+
+                # Remove UNC prefix (if it exists)
+                if path.startswith(UNC_PREFIX):
+                    path = path[len(UNC_PREFIX):]
+
+                path = os.path.relpath(path, cls.base_dir)
+                name = os.path.splitext(path)[0].replace(os.path.sep, '.')
+
+                yield path, name
+
+    @classmethod
+    def load(cls):
+        for path, name in cls.discover():
+            try:
+                mod = __import__(name, fromlist=['*'])
+            except Exception as ex:
+                log.warn('Unable to import "%s" - %s', name, ex)
+                continue
+
+            # Get classes in module
+            classes = [
+                (key, getattr(mod, key)) for key in dir(mod)
+                if not key.startswith('_')
+            ]
+
+            # Filter to module-specific classes
+            classes = [
+                (key, value) for (key, value) in classes
+                if inspect.isclass(value) and value.__module__ == name
+            ]
+
+            yield classes
+
+    @classmethod
+    def construct(cls):
+        log.debug('Loading descriptors...')
+
+        cls.base_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../../', '..'))
+
+        # Load modules, find descriptor classes
+        for classes in cls.load():
+            # Update object map
+            for key, value in classes:
+                cls.objects_map[key] = value
+
+        log.debug('Loaded %s descriptors (%s)', len(cls.objects_map), ', '.join(sorted(cls.objects_map.keys())))
diff --git a/libs/plex/objects/detail.py b/libs/plex/objects/detail.py
new file mode 100644
index 000000000..f16c2c13d
--- /dev/null
+++ b/libs/plex/objects/detail.py
@@ -0,0 +1,62 @@
+from plex.objects.core.base import Descriptor, Property
+from plex.objects.container import Container
+
+
+class Detail(Container):
+    myplex = Property(resolver=lambda: Detail.construct_myplex)
+    transcoder = Property(resolver=lambda: Detail.construct_transcoder)
+
+    friendly_name = Property('friendlyName')
+
+    machine_identifier = Property('machineIdentifier')
+    version = Property
+
+    platform = Property
+    platform_version = Property('platformVersion')
+
+    allow_camera_upload = Property('allowCameraUpload', [int, bool])
+    allow_channel_access = Property('allowChannelAccess', [int, bool])
+    allow_sync = Property('allowSync', [int, bool])
+
+    certificate = Property(type=[int, bool])
+    multiuser = Property(type=[int, bool])
+    sync = Property(type=[int, bool])
+
+    start_state = Property('startState')
+
+    silverlight = Property('silverlightInstalled', [int, bool])
+    soundflower = Property('soundflowerInstalled', [int, bool])
+    flash = Property('flashInstalled', [int, bool])
+    webkit = Property(type=[int, bool])
+
+    cookie_parameters = Property('requestParametersInCookie', [int, bool])
+
+    @staticmethod
+    def construct_myplex(client, node):
+        return MyPlexDetail.construct(client, node, child=True)
+
+    @staticmethod
+    def construct_transcoder(client, node):
+        return TranscoderDetail.construct(client, node, child=True)
+
+
+class MyPlexDetail(Descriptor):
+    enabled = Property('myPlex', type=bool)
+
+    username = Property('myPlexUsername')
+
+    mapping_state = Property('myPlexMappingState')
+    signin_state = Property('myPlexSigninState')
+
+    subscription = Property('myPlexSubscription', [int, bool])
+
+
+class TranscoderDetail(Descriptor):
+    audio = Property('transcoderAudio', [int, bool])
+    video = Property('transcoderVideo', [int, bool])
+
+    video_bitrates = Property('transcoderVideoBitrates')
+    video_qualities = Property('transcoderVideoQualities')
+    video_resolutions = Property('transcoderVideoResolutions')
+
+    active_video_sessions = Property('transcoderActiveVideoSessions', int)
diff --git a/libs/plex/objects/directory.py b/libs/plex/objects/directory.py
new file mode 100644
index 000000000..27ebb75aa
--- /dev/null
+++ b/libs/plex/objects/directory.py
@@ -0,0 +1,16 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Directory(Descriptor):
+    key = Property
+    type = Property
+
+    title = Property
+
+    size = Property
+
+    art = Property
+    thumb = Property
+
+    allow_sync = Property('allowSync', bool)
+    updated_at = Property('updatedAt', int)
diff --git a/libs/plex/objects/library/__init__.py b/libs/plex/objects/library/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/library/container.py b/libs/plex/objects/library/container.py
new file mode 100644
index 000000000..c7a7a676d
--- /dev/null
+++ b/libs/plex/objects/library/container.py
@@ -0,0 +1,80 @@
+from plex.core.helpers import flatten, to_iterable
+from plex.objects.core.base import Property
+from plex.objects.container import Container
+from plex.objects.library.section import Section
+
+
+class MediaContainer(Container):
+    section = Property(resolver=lambda: MediaContainer.construct_section)
+
+    title1 = Property
+    title2 = Property
+
+    identifier = Property
+
+    art = Property
+    thumb = Property
+
+    view_group = Property('viewGroup')
+    view_mode = Property('viewMode', int)
+
+    media_tag_prefix = Property('mediaTagPrefix')
+    media_tag_version = Property('mediaTagVersion')
+
+    size = Property('size', int)
+    total_size = Property('totalSize', int)
+
+    allow_sync = Property('allowSync', bool)
+    mixed_parents = Property('mixedParents', bool)
+    no_cache = Property('nocache', bool)
+    sort_asc = Property('sortAsc', bool)
+
+    @staticmethod
+    def construct_section(client, node):
+        attribute_map = {
+            'key': 'librarySectionID',
+            'uuid': 'librarySectionUUID',
+            'title': 'librarySectionTitle'
+        }
+
+        return Section.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(MediaContainer, self).__iter__():
+            item.section = self.section
+
+            yield item
+
+
+class ChildrenContainer(MediaContainer):
+    pass
+
+
+class LeavesContainer(MediaContainer):
+    pass
+
+
+class SectionContainer(MediaContainer):
+    filter_passes = lambda _, allowed, value: allowed is None or value in allowed
+
+    def filter(self, types=None, keys=None, titles=None):
+        types = to_iterable(types)
+        keys = to_iterable(keys)
+
+        titles = to_iterable(titles)
+
+        if titles:
+            # Flatten titles
+            titles = [flatten(x) for x in titles]
+
+        for section in self:
+            if not self.filter_passes(types, section.type):
+                continue
+
+            if not self.filter_passes(keys, section.key):
+                continue
+
+            if not self.filter_passes(titles, flatten(section.title)):
+                continue
+
+            yield section
diff --git a/libs/plex/objects/library/extra/__init__.py b/libs/plex/objects/library/extra/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/library/extra/country.py b/libs/plex/objects/library/extra/country.py
new file mode 100644
index 000000000..560a290bd
--- /dev/null
+++ b/libs/plex/objects/library/extra/country.py
@@ -0,0 +1,10 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Country(Descriptor):
+    id = Property(type=int)
+    tag = Property
+
+    @classmethod
+    def from_node(cls, client, node):
+        return cls.construct(client, cls.helpers.find(node, 'Country'), child=True)
diff --git a/libs/plex/objects/library/extra/director.py b/libs/plex/objects/library/extra/director.py
new file mode 100644
index 000000000..ea01fd564
--- /dev/null
+++ b/libs/plex/objects/library/extra/director.py
@@ -0,0 +1,10 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Director(Descriptor):
+    id = Property(type=int)
+    tag = Property
+
+    @classmethod
+    def from_node(cls, client, node):
+        return cls.construct(client, cls.helpers.find(node, 'Director'), child=True)
diff --git a/libs/plex/objects/library/extra/genre.py b/libs/plex/objects/library/extra/genre.py
new file mode 100644
index 000000000..37dcf716a
--- /dev/null
+++ b/libs/plex/objects/library/extra/genre.py
@@ -0,0 +1,17 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Genre(Descriptor):
+    id = Property(type=int)
+    tag = Property
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Genre'):
+            _, obj = Genre.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/extra/role.py b/libs/plex/objects/library/extra/role.py
new file mode 100644
index 000000000..0dc951f7c
--- /dev/null
+++ b/libs/plex/objects/library/extra/role.py
@@ -0,0 +1,20 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Role(Descriptor):
+    id = Property(type=int)
+    tag = Property
+
+    role = Property
+    thumb = Property
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Role'):
+            _, obj = Role.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/extra/writer.py b/libs/plex/objects/library/extra/writer.py
new file mode 100644
index 000000000..6877aa33f
--- /dev/null
+++ b/libs/plex/objects/library/extra/writer.py
@@ -0,0 +1,17 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Writer(Descriptor):
+    id = Property(type=int)
+    tag = Property
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Writer'):
+            _, obj = Writer.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/location.py b/libs/plex/objects/library/location.py
new file mode 100644
index 000000000..6316fd8dc
--- /dev/null
+++ b/libs/plex/objects/library/location.py
@@ -0,0 +1,6 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Location(Descriptor):
+    id = Property
+    path = Property
diff --git a/libs/plex/objects/library/media.py b/libs/plex/objects/library/media.py
new file mode 100644
index 000000000..3749ad849
--- /dev/null
+++ b/libs/plex/objects/library/media.py
@@ -0,0 +1,39 @@
+from plex.objects.core.base import Descriptor, Property
+from plex.objects.library.part import Part
+
+
+class Media(Descriptor):
+    parts = Property(resolver=lambda: Part.from_node)
+
+    id = Property(type=int)
+
+    video_codec = Property('videoCodec')
+    video_frame_rate = Property('videoFrameRate')
+    video_resolution = Property('videoResolution')
+
+    audio_channels = Property('audioChannels', type=int)
+    audio_codec = Property('audioCodec')
+
+    container = Property
+
+    width = Property(type=int)
+    height = Property(type=int)
+
+    aspect_ratio = Property('aspectRatio', type=float)
+    bitrate = Property(type=int)
+    duration = Property(type=int)
+
+    #@classmethod
+    #def from_node(cls, client, node):
+    #    return cls.construct(client, cls.helpers.find(node, 'Media'), child=True)
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Media'):
+            _, obj = Media.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/metadata/__init__.py b/libs/plex/objects/library/metadata/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/library/metadata/album.py b/libs/plex/objects/library/metadata/album.py
new file mode 100644
index 000000000..db0651010
--- /dev/null
+++ b/libs/plex/objects/library/metadata/album.py
@@ -0,0 +1,68 @@
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+from plex.objects.library.container import ChildrenContainer
+from plex.objects.library.extra.genre import Genre
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.library.metadata.artist import Artist
+from plex.objects.mixins.rate import RateMixin
+
+
+class Album(Directory, Metadata, RateMixin):
+    artist = Property(resolver=lambda: Album.construct_artist)
+    genres = Property(resolver=lambda: Genre.from_node)
+
+    index = Property(type=int)
+
+    year = Property(type=int)
+    originally_available_at = Property('originallyAvailableAt')
+
+    track_count = Property('leafCount', int)
+    viewed_track_count = Property('viewedLeafCount', int)
+
+    def children(self):
+        return self.client['library/metadata'].children(self.rating_key)
+
+    @staticmethod
+    def construct_artist(client, node):
+        attribute_map = {
+            'key':          'parentKey',
+            'ratingKey':    'parentRatingKey',
+
+            'title':        'parentTitle',
+            'thumb':        'parentThumb'
+        }
+
+        return Artist.construct(client, node, attribute_map, child=True)
+
+
+class AlbumChildrenContainer(ChildrenContainer):
+    artist = Property(resolver=lambda: AlbumChildrenContainer.construct_artist)
+    album = Property(resolver=lambda: AlbumChildrenContainer.construct_album)
+
+    key = Property
+
+    @staticmethod
+    def construct_artist(client, node):
+        attribute_map = {
+            'title': 'grandparentTitle'
+        }
+
+        return Artist.construct(client, node, attribute_map, child=True)
+
+    @staticmethod
+    def construct_album(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+
+            'title': 'parentTitle',
+            'year' : 'parentYear'
+        }
+
+        return Album.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(ChildrenContainer, self).__iter__():
+            item.artist = self.artist
+            item.album = self.album
+
+            yield item
diff --git a/libs/plex/objects/library/metadata/artist.py b/libs/plex/objects/library/metadata/artist.py
new file mode 100644
index 000000000..e7ffbe5ae
--- /dev/null
+++ b/libs/plex/objects/library/metadata/artist.py
@@ -0,0 +1,58 @@
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+from plex.objects.library.container import LeavesContainer, ChildrenContainer
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.mixins.rate import RateMixin
+
+
+class Artist(Directory, Metadata, RateMixin):
+    index = Property(type=int)
+
+    def all_leaves(self):
+        return self.client['library/metadata'].all_leaves(self.rating_key)
+
+    def children(self):
+        return self.client['library/metadata'].children(self.rating_key)
+
+
+class ArtistChildrenContainer(ChildrenContainer):
+    artist = Property(resolver=lambda: ArtistChildrenContainer.construct_artist)
+
+    key = Property
+    summary = Property
+
+    @staticmethod
+    def construct_artist(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+            'title': 'parentTitle'
+        }
+
+        return Artist.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(ChildrenContainer, self).__iter__():
+            item.artist = self.artist
+
+            yield item
+
+
+class ArtistLeavesContainer(LeavesContainer):
+    artist = Property(resolver=lambda: ArtistLeavesContainer.construct_artist)
+
+    key = Property
+
+    @staticmethod
+    def construct_artist(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+            'title': 'parentTitle'
+        }
+
+        return Artist.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(LeavesContainer, self).__iter__():
+            item.artist = self.artist
+
+            yield item
diff --git a/libs/plex/objects/library/metadata/base.py b/libs/plex/objects/library/metadata/base.py
new file mode 100644
index 000000000..71fcb167a
--- /dev/null
+++ b/libs/plex/objects/library/metadata/base.py
@@ -0,0 +1,38 @@
+from plex.objects.core.base import Descriptor, Property
+from plex.objects.library.section import Section
+
+
+class Metadata(Descriptor):
+    section = Property(resolver=lambda: Metadata.construct_section)
+
+    # somehow section doesn't resolve on onDeck, add key manually
+    section_key = Property('librarySectionID')
+
+    key = Property
+    guid = Property
+    rating_key = Property('ratingKey')
+    extra_key = Property('primaryExtraKey')
+
+    title = Property
+    title_sort = Property('titleSort')
+    title_original = Property('originalTitle')
+
+    summary = Property
+
+    thumb = Property
+
+    source_title = Property('sourceTitle')
+
+    added_at = Property('addedAt', int)
+    last_viewed_at = Property('lastViewedAt', int)
+
+    @staticmethod
+    def construct_section(client, node):
+        attribute_map = {
+            'key': 'librarySectionID',
+            'uuid': 'librarySectionUUID',
+            'title': 'librarySectionTitle'
+        }
+
+        return Section.construct(client, node, attribute_map, child=True)
+
diff --git a/libs/plex/objects/library/metadata/clip.py b/libs/plex/objects/library/metadata/clip.py
new file mode 100644
index 000000000..8e94dbdb3
--- /dev/null
+++ b/libs/plex/objects/library/metadata/clip.py
@@ -0,0 +1,9 @@
+from plex.objects.core.base import Property
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.library.video import Video
+
+
+class Clip(Video, Metadata):
+    extra_type = Property('extraType', type=int)
+
+    index = Property(type=int)
diff --git a/libs/plex/objects/library/metadata/episode.py b/libs/plex/objects/library/metadata/episode.py
new file mode 100644
index 000000000..e7cce4688
--- /dev/null
+++ b/libs/plex/objects/library/metadata/episode.py
@@ -0,0 +1,48 @@
+from plex.objects.core.base import Property
+from plex.objects.library.metadata.season import Season
+from plex.objects.library.metadata.show import Show
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.library.video import Video
+from plex.objects.mixins.rate import RateMixin
+from plex.objects.mixins.scrobble import ScrobbleMixin
+
+
+class Episode(Video, Metadata, RateMixin, ScrobbleMixin):
+    show = Property(resolver=lambda: Episode.construct_show)
+    season = Property(resolver=lambda: Episode.construct_season)
+
+    index = Property(type=int)
+
+    studio = Property
+    audience_rating = Property('audienceRating', float)
+    content_rating = Property('contentRating')
+
+    year = Property(type=int)
+    originally_available_at = Property('originallyAvailableAt')
+
+    @staticmethod
+    def construct_show(client, node):
+        attribute_map = {
+            'key':          'grandparentKey',
+            'ratingKey':    'grandparentRatingKey',
+
+            'title':        'grandparentTitle',
+
+            'art':          'grandparentArt',
+            'theme':        'grandparentTheme',
+            'thumb':        'grandparentThumb'
+        }
+
+        return Show.construct(client, node, attribute_map, child=True)
+
+    @staticmethod
+    def construct_season(client, node):
+        attribute_map = {
+            'index':        'parentIndex',
+            'key':          'parentKey',
+            'ratingKey':    'parentRatingKey',
+
+            'thumb':        'parentThumb'
+        }
+
+        return Season.construct(client, node, attribute_map, child=True)
diff --git a/libs/plex/objects/library/metadata/movie.py b/libs/plex/objects/library/metadata/movie.py
new file mode 100644
index 000000000..fb807f243
--- /dev/null
+++ b/libs/plex/objects/library/metadata/movie.py
@@ -0,0 +1,22 @@
+from plex.objects.core.base import Property
+from plex.objects.library.extra.country import Country
+from plex.objects.library.extra.genre import Genre
+from plex.objects.library.extra.role import Role
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.library.video import Video
+from plex.objects.mixins.rate import RateMixin
+from plex.objects.mixins.scrobble import ScrobbleMixin
+
+
+class Movie(Video, Metadata, RateMixin, ScrobbleMixin):
+    country = Property(resolver=lambda: Country.from_node)
+    genres = Property(resolver=lambda: Genre.from_node)
+    roles = Property(resolver=lambda: Role.from_node)
+
+    studio = Property
+    content_rating = Property('contentRating')
+
+    year = Property(type=int)
+    originally_available_at = Property('originallyAvailableAt')
+
+    tagline = Property
diff --git a/libs/plex/objects/library/metadata/season.py b/libs/plex/objects/library/metadata/season.py
new file mode 100644
index 000000000..f309027ea
--- /dev/null
+++ b/libs/plex/objects/library/metadata/season.py
@@ -0,0 +1,78 @@
+from plex.objects.core.base import Property
+from plex.objects.library.container import ChildrenContainer
+from plex.objects.library.metadata.show import Show
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.library.video import Directory
+
+
+class Season(Directory, Metadata):
+    show = Property(resolver=lambda: Season.construct_show)
+
+    index = Property(type=int)
+
+    banner = Property
+    theme = Property
+
+    year = Property(type=int)
+
+    episode_count = Property('leafCount', int)
+    viewed_episode_count = Property('viewedLeafCount', int)
+
+    view_count = Property('viewCount', type=int)
+
+    def children(self):
+        return self.client['library/metadata'].children(self.rating_key)
+
+    @staticmethod
+    def construct_show(client, node):
+        attribute_map = {
+            'index'    : 'parentIndex',
+            'key'      : 'parentKey',
+            'ratingKey': 'parentRatingKey',
+
+            'title'    : 'parentTitle',
+            'summary'  : 'parentSummary',
+            'thumb'    : 'parentThumb',
+
+            'theme'    : 'parentTheme'
+        }
+
+        return Show.construct(client, node, attribute_map, child=True)
+
+
+class SeasonChildrenContainer(ChildrenContainer):
+    show = Property(resolver=lambda: SeasonChildrenContainer.construct_show)
+    season = Property(resolver=lambda: SeasonChildrenContainer.construct_season)
+
+    key = Property
+
+    banner = Property
+    theme = Property
+
+    @staticmethod
+    def construct_show(client, node):
+        attribute_map = {
+            'title'        : 'grandparentTitle',
+
+            'contentRating': 'grandparentContentRating',
+            'studio'       : 'grandparentStudio',
+            'theme'        : 'grandparentTheme'
+        }
+
+        return Show.construct(client, node, attribute_map, child=True)
+
+    @staticmethod
+    def construct_season(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+            'title': 'parentTitle'
+        }
+
+        return Season.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(ChildrenContainer, self).__iter__():
+            item.show = self.show
+            item.season = self.season
+
+            yield item
diff --git a/libs/plex/objects/library/metadata/show.py b/libs/plex/objects/library/metadata/show.py
new file mode 100644
index 000000000..39640583a
--- /dev/null
+++ b/libs/plex/objects/library/metadata/show.py
@@ -0,0 +1,85 @@
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+from plex.objects.library.container import LeavesContainer, ChildrenContainer
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.mixins.rate import RateMixin
+
+
+class Show(Directory, Metadata, RateMixin):
+    index = Property(type=int)
+    duration = Property(type=int)
+
+    studio = Property
+    content_rating = Property('contentRating')
+
+    banner = Property
+    theme = Property
+
+    year = Property(type=int)
+    originally_available_at = Property('originallyAvailableAt')
+
+    season_count = Property('childCount', int)
+
+    episode_count = Property('leafCount', int)
+    viewed_episode_count = Property('viewedLeafCount', int)
+
+    view_count = Property('viewCount', int)
+
+    def all_leaves(self):
+        return self.client['library/metadata'].all_leaves(self.rating_key)
+
+    def children(self):
+        return self.client['library/metadata'].children(self.rating_key)
+
+
+class ShowChildrenContainer(ChildrenContainer):
+    show = Property(resolver=lambda: ShowLeavesContainer.construct_show)
+
+    key = Property
+    summary = Property
+
+    banner = Property
+    theme = Property
+
+    @staticmethod
+    def construct_show(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+
+            'title': 'parentTitle',
+            'year' : 'parentYear'
+        }
+
+        return Show.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(ChildrenContainer, self).__iter__():
+            item.show = self.show
+
+            yield item
+
+
+class ShowLeavesContainer(LeavesContainer):
+    show = Property(resolver=lambda: ShowLeavesContainer.construct_show)
+
+    key = Property
+
+    banner = Property
+    theme = Property
+
+    @staticmethod
+    def construct_show(client, node):
+        attribute_map = {
+            'index': 'parentIndex',
+
+            'title': 'parentTitle',
+            'year' : 'parentYear'
+        }
+
+        return Show.construct(client, node, attribute_map, child=True)
+
+    def __iter__(self):
+        for item in super(LeavesContainer, self).__iter__():
+            item.show = self.show
+
+            yield item
diff --git a/libs/plex/objects/library/metadata/track.py b/libs/plex/objects/library/metadata/track.py
new file mode 100644
index 000000000..8d380375f
--- /dev/null
+++ b/libs/plex/objects/library/metadata/track.py
@@ -0,0 +1,47 @@
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+from plex.objects.library.metadata.album import Album
+from plex.objects.library.metadata.artist import Artist
+from plex.objects.library.metadata.base import Metadata
+from plex.objects.mixins.scrobble import ScrobbleMixin
+from plex.objects.mixins.session import SessionMixin
+
+
+class Track(Directory, Metadata, SessionMixin, ScrobbleMixin):
+    artist = Property(resolver=lambda: Track.construct_artist)
+    album = Property(resolver=lambda: Track.construct_album)
+
+    index = Property(type=int)
+
+    view_count = Property('viewCount', type=int)
+    view_offset = Property('viewOffset', type=int)
+
+    duration = Property(type=int)
+
+    @staticmethod
+    def construct_artist(client, node):
+        attribute_map = {
+            'key':          'grandparentKey',
+            'ratingKey':    'grandparentRatingKey',
+
+            'title':        'grandparentTitle',
+
+            'thumb':        'grandparentThumb'
+        }
+
+        return Artist.construct(client, node, attribute_map, child=True)
+
+    @staticmethod
+    def construct_album(client, node):
+        attribute_map = {
+            'index':        'parentIndex',
+            'key':          'parentKey',
+            'ratingKey':    'parentRatingKey',
+
+            'title':        'parentTitle',
+            'year':         'parentYear',
+
+            'thumb':        'parentThumb'
+        }
+
+        return Album.construct(client, node, attribute_map, child=True)
diff --git a/libs/plex/objects/library/part.py b/libs/plex/objects/library/part.py
new file mode 100644
index 000000000..fe1fc058a
--- /dev/null
+++ b/libs/plex/objects/library/part.py
@@ -0,0 +1,26 @@
+from plex.objects.core.base import Descriptor, Property
+from plex.objects.library.stream import Stream
+
+
+class Part(Descriptor):
+    streams = Property(resolver=lambda: Stream.from_node)
+
+    id = Property(type=int)
+    key = Property
+
+    file = Property
+    container = Property
+
+    duration = Property(type=int)
+    size = Property(type=int)
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Part'):
+            _, obj = Part.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/section.py b/libs/plex/objects/library/section.py
new file mode 100644
index 000000000..7339ff0e3
--- /dev/null
+++ b/libs/plex/objects/library/section.py
@@ -0,0 +1,37 @@
+from plex.core.idict import idict
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+
+
+class Section(Directory):
+    uuid = Property
+
+    filters = Property(type=bool)
+    refreshing = Property(type=bool)
+
+    agent = Property
+    scanner = Property
+    language = Property
+
+    composite = Property
+    type = Property
+
+    created_at = Property('createdAt', int)
+
+    def __transform__(self):
+        self.path = '/library/sections/%s' % self.key
+
+    def all(self):
+        response = self.http.get('all')
+
+        return self.parse(response, idict({
+            'MediaContainer': ('MediaContainer', idict({
+                'Directory': {
+                    'artist':    'Artist',
+                    'show':     'Show'
+                },
+                'Video': {
+                    'movie':    'Movie'
+                }
+            }))
+        }))
diff --git a/libs/plex/objects/library/stream.py b/libs/plex/objects/library/stream.py
new file mode 100644
index 000000000..1acd55818
--- /dev/null
+++ b/libs/plex/objects/library/stream.py
@@ -0,0 +1,56 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Stream(Descriptor):
+    id = Property(type=int)
+    index = Property(type=int)
+
+    stream_key = Property('key')
+
+    stream_type = Property('streamType', type=int)
+    selected = Property(type=bool)
+
+    forced = Property(type=bool)
+    default = Property(type=bool)
+
+    title = Property
+    duration = Property(type=int)
+
+    codec = Property
+    codec_id = Property('codecID')
+
+    bit_depth = Property('bitDepth', type=int)
+    chroma_subsampling = Property('chromaSubsampling')
+    color_space = Property('colorSpace')
+
+    width = Property(type=int)
+    height = Property(type=int)
+
+    bitrate = Property(type=int)
+    bitrate_mode = Property('bitrateMode')
+
+    channels = Property(type=int)
+    sampling_rate = Property('samplingRate', type=int)
+
+    frame_rate = Property('frameRate')
+    profile = Property
+    scan_type = Property('scanType')
+
+    language = Property('language')
+    language_code = Property('languageCode')
+
+    bvop = Property(type=int)
+    gmc = Property(type=int)
+    level = Property(type=int)
+    qpel = Property(type=int)
+
+    @classmethod
+    def from_node(cls, client, node):
+        items = []
+
+        for genre in cls.helpers.findall(node, 'Stream'):
+            _, obj = Stream.construct(client, genre, child=True)
+
+            items.append(obj)
+
+        return [], items
diff --git a/libs/plex/objects/library/video.py b/libs/plex/objects/library/video.py
new file mode 100644
index 000000000..123375364
--- /dev/null
+++ b/libs/plex/objects/library/video.py
@@ -0,0 +1,22 @@
+from plex.objects.core.base import Property
+from plex.objects.directory import Directory
+from plex.objects.library.extra.director import Director
+from plex.objects.library.extra.writer import Writer
+from plex.objects.library.media import Media
+from plex.objects.mixins.session import SessionMixin
+
+
+class Video(Directory, SessionMixin):
+    director = Property(resolver=lambda: Director.from_node)
+    media = Property(resolver=lambda: Media.from_node)
+    writers = Property(resolver=lambda: Writer.from_node)
+
+    view_count = Property('viewCount', type=int)
+    view_offset = Property('viewOffset', type=int)
+
+    chapter_source = Property('chapterSource')
+    duration = Property(type=int)
+
+    @property
+    def seen(self):
+        return self.view_count and self.view_count >= 1
diff --git a/libs/plex/objects/mixins/__init__.py b/libs/plex/objects/mixins/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex/objects/mixins/rate.py b/libs/plex/objects/mixins/rate.py
new file mode 100644
index 000000000..b14ecb2a5
--- /dev/null
+++ b/libs/plex/objects/mixins/rate.py
@@ -0,0 +1,10 @@
+from plex import Plex
+from plex.objects.core.base import Property, DescriptorMixin
+
+
+class RateMixin(DescriptorMixin):
+    rating = Property(type=float)
+    user_rating = Property('userRating', type=float)
+
+    def rate(self, value):
+        return Plex['library'].rate(self.rating_key, value)
diff --git a/libs/plex/objects/mixins/scrobble.py b/libs/plex/objects/mixins/scrobble.py
new file mode 100644
index 000000000..bfdfad118
--- /dev/null
+++ b/libs/plex/objects/mixins/scrobble.py
@@ -0,0 +1,7 @@
+from plex import Plex
+from plex.objects.core.base import DescriptorMixin
+
+
+class ScrobbleMixin(DescriptorMixin):
+    def scrobble(self):
+        return Plex['library'].scrobble(self.rating_key)
diff --git a/libs/plex/objects/mixins/session.py b/libs/plex/objects/mixins/session.py
new file mode 100644
index 000000000..9f2038d6e
--- /dev/null
+++ b/libs/plex/objects/mixins/session.py
@@ -0,0 +1,32 @@
+from plex.objects.core.base import Descriptor, Property, DescriptorMixin
+from plex.objects.player import Player
+from plex.objects.transcode_session import TranscodeSession
+from plex.objects.user import User
+
+
+class SessionMixin(DescriptorMixin):
+    session = Property(resolver=lambda: SessionMixin.construct_session)
+
+    @staticmethod
+    def construct_session(client, node):
+        return Session.construct(client, node, child=True)
+
+
+class Session(Descriptor):
+    key = Property('sessionKey', int)
+
+    user = Property(resolver=lambda: Session.construct_user)
+    player = Property(resolver=lambda: Session.construct_player)
+    transcode_session = Property(resolver=lambda: Session.construct_transcode_session)
+
+    @classmethod
+    def construct_user(cls, client, node):
+        return User.construct(client, cls.helpers.find(node, 'User'), child=True)
+
+    @classmethod
+    def construct_player(cls, client, node):
+        return Player.construct(client, cls.helpers.find(node, 'Player'), child=True)
+
+    @classmethod
+    def construct_transcode_session(cls, client, node):
+        return TranscodeSession.construct(client, cls.helpers.find(node, 'TranscodeSession'), child=True)
diff --git a/libs/plex/objects/player.py b/libs/plex/objects/player.py
new file mode 100644
index 000000000..891ccb6e0
--- /dev/null
+++ b/libs/plex/objects/player.py
@@ -0,0 +1,11 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Player(Descriptor):
+    title = Property
+    machine_identifier = Property('machineIdentifier')
+
+    state = Property
+
+    platform = Property
+    product = Property
diff --git a/libs/plex/objects/server.py b/libs/plex/objects/server.py
new file mode 100644
index 000000000..0e8dda99f
--- /dev/null
+++ b/libs/plex/objects/server.py
@@ -0,0 +1,12 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Server(Descriptor):
+    name = Property
+    host = Property
+
+    address = Property
+    port = Property(type=int)
+
+    machine_identifier = Property('machineIdentifier')
+    version = Property
diff --git a/libs/plex/objects/session.py b/libs/plex/objects/session.py
new file mode 100644
index 000000000..af6a7a5af
--- /dev/null
+++ b/libs/plex/objects/session.py
@@ -0,0 +1,21 @@
+from plex.core.helpers import to_iterable
+from plex.objects.library.container import MediaContainer
+
+
+class SessionContainer(MediaContainer):
+    filter_passes = lambda _, allowed, value: allowed is None or value in allowed
+
+    def filter(self, keys=None):
+        keys = to_iterable(keys)
+
+        for item in self:
+            if not self.filter_passes(keys, item.session.key):
+                continue
+
+            yield item
+
+    def get(self, key):
+        for item in self.filter(key):
+            return item
+
+        return None
diff --git a/libs/plex/objects/setting.py b/libs/plex/objects/setting.py
new file mode 100644
index 000000000..a2b7cc46b
--- /dev/null
+++ b/libs/plex/objects/setting.py
@@ -0,0 +1,53 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class Setting(Descriptor):
+    id = Property
+
+    label = Property
+    summary = Property
+
+    type = Property
+    group = Property
+
+    value = Property(resolver=lambda: Setting.parse_value)
+    default = Property(resolver=lambda: Setting.parse_default)
+    options = Property('enumValues', resolver=lambda: Setting.parse_options)
+
+    hidden = Property(type=[int, bool])
+    advanced = Property(type=[int, bool])
+
+    @classmethod
+    def parse_value(cls, client, node):
+        type = cls.helpers.get(node, 'type')
+        value = cls.helpers.get(node, 'value')
+
+        return ['value'], Setting.convert(type, value)
+
+    @classmethod
+    def parse_default(cls, client, node):
+        type = cls.helpers.get(node, 'type')
+        default = cls.helpers.get(node, 'default')
+
+        return ['default'], Setting.convert(type, default)
+
+    @classmethod
+    def parse_options(cls, client, node):
+        value = cls.helpers.get(node, 'enumValues')
+
+        if not value:
+            return [], None
+
+        return ['enumValues'], [
+            tuple(option.split(':', 2)) for option in value.split('|')
+        ]
+
+    @staticmethod
+    def convert(type, value):
+        if type == 'bool':
+            value = value.lower()
+            value = value == 'true'
+        elif type == 'int':
+            value = int(value)
+
+        return value
diff --git a/libs/plex/objects/transcode_session.py b/libs/plex/objects/transcode_session.py
new file mode 100644
index 000000000..c3ea4a5ab
--- /dev/null
+++ b/libs/plex/objects/transcode_session.py
@@ -0,0 +1,24 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class TranscodeSession(Descriptor):
+    key = Property
+
+    progress = Property(type=float)
+    speed = Property(type=float)
+    duration = Property(type=int)
+
+    protocol = Property
+    throttled = Property(type=int)  # TODO this needs to cast: str -> int -> bool
+
+    container = Property('container')
+
+    video_codec = Property('videoCodec')
+    video_decision = Property('videoDecision')
+
+    audio_codec = Property('audioCodec')
+    audio_channels = Property('audioChannels', int)
+    audio_decision = Property('audioDecision')
+
+    width = Property(type=int)
+    height = Property(type=int)
diff --git a/libs/plex/objects/user.py b/libs/plex/objects/user.py
new file mode 100644
index 000000000..5718bd8fb
--- /dev/null
+++ b/libs/plex/objects/user.py
@@ -0,0 +1,8 @@
+from plex.objects.core.base import Descriptor, Property
+
+
+class User(Descriptor):
+    id = Property(type=int)
+
+    title = Property
+    thumb = Property
diff --git a/libs/plex/request.py b/libs/plex/request.py
new file mode 100644
index 000000000..5eb24361d
--- /dev/null
+++ b/libs/plex/request.py
@@ -0,0 +1,121 @@
+from plex.lib.six.moves.urllib_parse import urlencode
+
+from requests import Request
+import json
+
+
+class PlexRequest(object):
+    def __init__(self, client, **kwargs):
+        self.client = client
+        self.kwargs = kwargs
+
+        self.request = None
+
+        # Parsed Attributes
+        self.path = None
+        self.params = None
+
+        self.data = None
+        self.headers = None
+        self.method = None
+
+    def prepare(self):
+        self.request = Request()
+
+        self.transform_parameters()
+        self.request.url = self.construct_url()
+
+        self.request.data = self.transform_data()
+        self.request.headers = self.transform_headers()
+        self.request.method = self.transform_method()
+
+        return self.request.prepare()
+
+    def construct_url(self):
+        """Construct a full plex request URI, with `params`."""
+        path = [self.path]
+        path.extend([str(x) for x in self.params])
+
+        url = self.client.base_url + '/'.join(x for x in path if x)
+        query = self.kwargs.get('query')
+
+        if query:
+            # Dict -> List
+            if type(query) is dict:
+                query = query.items()
+
+            # Remove items with `None` value
+            query = [
+                (k, v) for (k, v) in query
+                if v is not None
+            ]
+
+            # Encode query, append to URL
+            url += '?' + urlencode(query)
+
+        return url
+
+    def transform_parameters(self):
+        # Transform `path`
+        self.path = self.kwargs.get('path')
+
+        if not self.path.startswith('/'):
+            self.path = '/' + self.path
+
+        if self.path.endswith('/'):
+            self.path = self.path[:-1]
+
+        # Transform `params` into list
+        self.params = self.kwargs.get('params') or []
+
+        if type(self.params) is not list:
+            self.params = [self.params]
+
+    def transform_data(self):
+        self.data = self.kwargs.get('data')
+
+        if self.data is None:
+            return None
+
+        return json.dumps(self.data)
+
+    def transform_headers(self):
+        self.headers = self.kwargs.get('headers') or {}
+
+        # Authentication
+        self.headers['X-Plex-Token'] = self.client.configuration['authentication.token']
+
+        # Client
+        self.headers['X-Plex-Client-Identifier'] = self.client.configuration['client.identifier']
+
+        self.headers['X-Plex-Product'] = self.client.configuration['client.product']
+        self.headers['X-Plex-Version'] = self.client.configuration['client.version']
+
+        # Device
+        self.headers['X-Device'] = self.client.configuration['device.system']
+        self.headers['X-Device-Name'] = self.client.configuration['device.name']
+
+        # Platform
+        self.headers['X-Platform'] = self.client.configuration['platform.name']
+        self.headers['X-Platform-Version'] = self.client.configuration['platform.version']
+
+        # Update with extra headers from configuration
+        c_headers = self.client.configuration['headers']
+
+        if c_headers:
+            self.headers.update(c_headers)
+
+        # Only return headers with valid values
+        return dict([
+            (k, v) for (k, v) in self.headers.items()
+            if v is not None
+        ])
+
+    def transform_method(self):
+        self.method = self.kwargs.get('method')
+
+        # Pick `method` (if not provided)
+        if not self.method:
+            self.method = 'POST' if self.data else 'GET'
+
+        return self.method
diff --git a/libs/plex/serializer.py b/libs/plex/serializer.py
new file mode 100644
index 000000000..4e58e0acc
--- /dev/null
+++ b/libs/plex/serializer.py
@@ -0,0 +1,17 @@
+import jsonpickle
+
+
+class Serializer(object):
+    @classmethod
+    def encode(cls, value):
+        return jsonpickle.encode(value)
+
+    @classmethod
+    def decode(cls, value, client=None):
+        try:
+            result = jsonpickle.decode(value)
+            result.client = client
+
+            return result
+        except:
+            return None
diff --git a/libs/plex_activity/__init__.py b/libs/plex_activity/__init__.py
new file mode 100644
index 000000000..4da218f59
--- /dev/null
+++ b/libs/plex_activity/__init__.py
@@ -0,0 +1,15 @@
+import logging
+import traceback
+
+log = logging.getLogger(__name__)
+
+__version__ = '0.7.1'
+
+
+try:
+    from plex_activity import activity
+
+    # Global objects (using defaults)
+    Activity = activity.Activity()
+except Exception as ex:
+    log.warn('Unable to import submodules: %s - %s', ex, traceback.format_exc())
diff --git a/libs/plex_activity/activity.py b/libs/plex_activity/activity.py
new file mode 100644
index 000000000..f85632a5e
--- /dev/null
+++ b/libs/plex_activity/activity.py
@@ -0,0 +1,96 @@
+from plex.lib import six as six
+from plex.lib.six.moves import xrange
+from plex_activity.sources import Logging, WebSocket
+
+from pyemitter import Emitter
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class ActivityMeta(type):
+    def __getitem__(self, key):
+        for (weight, source) in self.registered:
+            if source.name == key:
+                return source
+
+        return None
+
+
+@six.add_metaclass(ActivityMeta)
+class Activity(Emitter):
+    registered = []
+
+    def __init__(self, sources=None):
+        self.available = self.get_available(sources)
+        self.enabled = []
+
+    def start(self, sources=None):
+        # TODO async start
+
+        if sources is not None:
+            self.available = self.get_available(sources)
+
+        # Test methods until an available method is found
+        for weight, source in self.available:
+            if weight is None:
+                # None = always start
+                self.start_source(source)
+            elif source.test():
+                # Test passed
+                self.start_source(source)
+            else:
+                log.info('activity source "%s" is not available', source.name)
+
+        log.info(
+            'Finished starting %s method(s): %s',
+            len(self.enabled),
+            ', '.join([('"%s"' % source.name) for source in self.enabled])
+        )
+
+    def start_source(self, source):
+        instance = source(self)
+        instance.start()
+
+        self.enabled.append(instance)
+
+    def __getitem__(self, key):
+        for (weight, source) in self.registered:
+            if source.name == key:
+                return source
+
+        return None
+
+    @classmethod
+    def get_available(cls, sources):
+        if sources:
+            return [
+                (weight, source) for (weight, source) in cls.registered
+                if source.name in sources
+            ]
+
+        return cls.registered
+
+    @classmethod
+    def register(cls, source, weight=None):
+        item = (weight, source)
+
+        # weight = None, highest priority
+        if weight is None:
+            cls.registered.insert(0, item)
+            return
+
+        # insert in DESC order
+        for x in xrange(len(cls.registered)):
+            w, _ = cls.registered[x]
+
+            if w is not None and w < weight:
+                cls.registered.insert(x, item)
+                return
+
+        # otherwise append
+        cls.registered.append(item)
+
+# Register activity sources
+Activity.register(WebSocket)
+Activity.register(Logging, weight=1)
diff --git a/libs/plex_activity/core/__init__.py b/libs/plex_activity/core/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/plex_activity/core/helpers.py b/libs/plex_activity/core/helpers.py
new file mode 100644
index 000000000..8ce99c65e
--- /dev/null
+++ b/libs/plex_activity/core/helpers.py
@@ -0,0 +1,44 @@
+def str_format(s, *args, **kwargs):
+    """Return a formatted version of S, using substitutions from args and kwargs.
+
+    (Roughly matches the functionality of str.format but ensures compatibility with Python 2.5)
+    """
+
+    args = list(args)
+
+    x = 0
+    while x < len(s):
+        # Skip non-start token characters
+        if s[x] != '{':
+            x += 1
+            continue
+
+        end_pos = s.find('}', x)
+
+        # If end character can't be found, move to next character
+        if end_pos == -1:
+            x += 1
+            continue
+
+        name = s[x + 1:end_pos]
+
+        # Ensure token name is alpha numeric
+        if not name.isalnum():
+            x += 1
+            continue
+
+        # Try find value for token
+        value = args.pop(0) if args else kwargs.get(name)
+
+        if value:
+            value = str(value)
+
+            # Replace token with value
+            s = s[:x] + value + s[end_pos + 1:]
+
+            # Update current position
+            x = x + len(value) - 1
+
+        x += 1
+
+    return s
diff --git a/libs/plex_activity/sources/__init__.py b/libs/plex_activity/sources/__init__.py
new file mode 100644
index 000000000..adc1c937e
--- /dev/null
+++ b/libs/plex_activity/sources/__init__.py
@@ -0,0 +1,4 @@
+from plex_activity.sources.s_logging import Logging
+from plex_activity.sources.s_websocket import WebSocket
+
+__all__ = ['Logging', 'WebSocket']
diff --git a/libs/plex_activity/sources/base.py b/libs/plex_activity/sources/base.py
new file mode 100644
index 000000000..773126afd
--- /dev/null
+++ b/libs/plex_activity/sources/base.py
@@ -0,0 +1,24 @@
+from pyemitter import Emitter
+from threading import Thread
+import logging
+
+log = logging.getLogger(__name__)
+
+
+class Source(Emitter):
+    name = None
+
+    def __init__(self):
+        self.thread = Thread(target=self._run_wrapper)
+
+    def start(self):
+        self.thread.start()
+
+    def run(self):
+        pass
+
+    def _run_wrapper(self):
+        try:
+            self.run()
+        except Exception as ex:
+            log.error('Exception raised in "%s" activity source: %s', self.name, ex, exc_info=True)
diff --git a/libs/plex_activity/sources/s_logging/__init__.py b/libs/plex_activity/sources/s_logging/__init__.py
new file mode 100644
index 000000000..949d13b34
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/__init__.py
@@ -0,0 +1,3 @@
+from plex_activity.sources.s_logging.main import Logging
+
+__all__ = ['Logging']
diff --git a/libs/plex_activity/sources/s_logging/main.py b/libs/plex_activity/sources/s_logging/main.py
new file mode 100644
index 000000000..1cae499c7
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/main.py
@@ -0,0 +1,249 @@
+from plex import Plex
+from plex_activity.sources.base import Source
+from plex_activity.sources.s_logging.parsers import NowPlayingParser, ScrobbleParser
+
+from asio import ASIO
+from asio.file import SEEK_ORIGIN_CURRENT
+from io import BufferedReader
+import inspect
+import logging
+import os
+import platform
+import time
+
+log = logging.getLogger(__name__)
+
+PATH_HINTS = {
+    'Darwin': [
+        lambda: os.path.join(os.getenv('HOME'), 'Library/Logs/Plex Media Server.log')
+    ],
+    'FreeBSD': [
+        # FreeBSD
+        '/usr/local/plexdata/Plex Media Server/Logs/Plex Media Server.log',
+        '/usr/local/plexdata-plexpass/Plex Media Server/Logs/Plex Media Server.log',
+
+        # FreeNAS
+        '/usr/pbi/plexmediaserver-amd64/plexdata/Plex Media Server/Logs/Plex Media Server.log',
+        '/var/db/plexdata/Plex Media Server/Logs/Plex Media Server.log',
+        '/var/db/plexdata-plexpass/Plex Media Server/Logs/Plex Media Server.log'
+    ],
+    'Linux': [
+        # QNAP
+        '/share/HDA_DATA/.qpkg/PlexMediaServer/Library/Plex Media Server/Logs/Plex Media Server.log',
+
+        # Debian
+        '/var/lib/plexmediaserver/Library/Application Support/Plex Media Server/Logs/Plex Media Server.log'
+    ],
+    'Windows': [
+        lambda: os.path.join(os.getenv('LOCALAPPDATA'), 'Plex Media Server\\Logs\\Plex Media Server.log')
+    ]
+}
+
+
+class Logging(Source):
+    name = 'logging'
+    events = [
+        'logging.playing',
+        'logging.action.played',
+        'logging.action.unplayed'
+    ]
+
+    parsers = []
+
+    path = None
+    path_hints = PATH_HINTS
+
+    def __init__(self, activity):
+        super(Logging, self).__init__()
+
+        self.parsers = [p(self) for p in Logging.parsers]
+
+        self.file = None
+        self.reader = None
+
+        self.path = None
+
+        # Pipe events to the main activity instance
+        self.pipe(self.events, activity)
+
+    def run(self):
+        line = self.read_line_retry(ping=True, stale_sleep=0.5)
+        if not line:
+            log.info('Unable to read log file')
+            return
+
+        log.debug('Ready')
+
+        while True:
+            # Grab the next line of the log
+            line = self.read_line_retry(ping=True)
+
+            if line:
+                self.process(line)
+            else:
+                log.info('Unable to read log file')
+
+    def process(self, line):
+        for parser in self.parsers:
+            if parser.process(line):
+                return True
+
+        return False
+
+    def read_line(self):
+        if not self.file:
+            path = self.get_path()
+            if not path:
+                raise Exception('Unable to find the location of "Plex Media Server.log"')
+
+            # Open file
+            self.file = ASIO.open(path, opener=False)
+            self.file.seek(self.file.get_size(), SEEK_ORIGIN_CURRENT)
+
+            # Create buffered reader
+            self.reader = BufferedReader(self.file)
+
+            self.path = self.file.get_path()
+            log.info('Opened file path: "%s"' % self.path)
+
+        return self.reader.readline()
+
+    def read_line_retry(self, timeout=60, ping=False, stale_sleep=1.0):
+        line = None
+        stale_since = None
+
+        while not line:
+            line = self.read_line()
+
+            if line:
+                stale_since = None
+                time.sleep(0.05)
+                break
+
+            if stale_since is None:
+                stale_since = time.time()
+                time.sleep(stale_sleep)
+                continue
+            elif (time.time() - stale_since) > timeout:
+                return None
+            elif (time.time() - stale_since) > timeout / 2:
+                # Nothing returned for 5 seconds
+                if self.file.get_path() != self.path:
+                    log.debug("Log file moved (probably rotated), closing")
+                    self.close()
+                elif ping:
+                    # Ping server to see if server is still active
+                    Plex.detail()
+                    ping = False
+
+            time.sleep(stale_sleep)
+
+        return line
+
+    def close(self):
+        if not self.file:
+            return
+
+        try:
+            # Close the buffered reader
+            self.reader.close()
+        except Exception as ex:
+            log.error('reader.close() - raised exception: %s', ex, exc_info=True)
+        finally:
+            self.reader = None
+
+        try:
+            # Close the file handle
+            self.file.close()
+        except OSError as ex:
+            if ex.errno == 9:
+                # Bad file descriptor, already closed?
+                log.info('file.close() - ignoring raised exception: %s (already closed)', ex)
+            else:
+                log.error('file.close() - raised exception: %s', ex, exc_info=True)
+        except Exception as ex:
+            log.error('file.close() - raised exception: %s', ex, exc_info=True)
+        finally:
+            self.file = None
+
+    @classmethod
+    def get_path(cls):
+        if cls.path:
+            return cls.path
+
+        hints = cls.get_hints()
+
+        log.debug('hints: %r', hints)
+
+        if not hints:
+            log.error('Unable to find any hints for "%s", operating system not supported', platform.system())
+            return None
+
+        for hint in hints:
+            log.debug('Testing if "%s" exists', hint)
+
+            if os.path.exists(hint):
+                cls.path = hint
+                break
+
+        if cls.path:
+            log.debug('Using the path: %r', cls.path)
+        else:
+            log.error('Unable to find a valid path for "Plex Media Server.log"', extra={
+                'data': {
+                    'hints': hints
+                }
+            })
+
+        return cls.path
+
+    @classmethod
+    def add_hint(cls, path, system=None):
+        if system not in cls.path_hints:
+            cls.path_hints[system] = []
+
+        cls.path_hints[system].append(path)
+
+    @classmethod
+    def get_hints(cls):
+        # Retrieve system hints
+        hints_system = PATH_HINTS.get(platform.system(), [])
+
+        # Retrieve global hints
+        hints_global = PATH_HINTS.get(None, [])
+
+        # Retrieve hint from server preferences (if available)
+        data_path = Plex[':/prefs'].get('LocalAppDataPath')
+
+        if data_path:
+            hints_global.append(os.path.join(data_path.value, "Plex Media Server", "Logs", "Plex Media Server.log"))
+        else:
+            log.info('Unable to retrieve "LocalAppDataPath" from server')
+
+        hints = []
+
+        for hint in (hints_global + hints_system):
+            # Resolve hint function
+            if inspect.isfunction(hint):
+                hint = hint()
+
+            # Check for duplicate
+            if hint in hints:
+                continue
+
+            hints.append(hint)
+
+        return hints
+
+    @classmethod
+    def test(cls):
+        # TODO "Logging" source testing
+        return True
+
+    @classmethod
+    def register(cls, parser):
+        cls.parsers.append(parser)
+
+
+Logging.register(NowPlayingParser)
+Logging.register(ScrobbleParser)
diff --git a/libs/plex_activity/sources/s_logging/parsers/__init__.py b/libs/plex_activity/sources/s_logging/parsers/__init__.py
new file mode 100644
index 000000000..4792a4548
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/parsers/__init__.py
@@ -0,0 +1,4 @@
+from plex_activity.sources.s_logging.parsers.now_playing import NowPlayingParser
+from plex_activity.sources.s_logging.parsers.scrobble import ScrobbleParser
+
+__all__ = ['NowPlayingParser', 'ScrobbleParser']
diff --git a/libs/plex_activity/sources/s_logging/parsers/base.py b/libs/plex_activity/sources/s_logging/parsers/base.py
new file mode 100644
index 000000000..b8fecf04d
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/parsers/base.py
@@ -0,0 +1,96 @@
+from plex.lib.six.moves import urllib_parse as urlparse
+from plex_activity.core.helpers import str_format
+
+from pyemitter import Emitter
+import logging
+import re
+
+log = logging.getLogger(__name__)
+
+LOG_PATTERN = r'^.*?\[\w+\]\s\w+\s-\s{message}$'
+REQUEST_HEADER_PATTERN = str_format(LOG_PATTERN, message=r"Request: (\[(?P<address>.*?):(?P<port>\d+)[^]]*\]\s)?{method} {path}.*?")
+
+IGNORE_PATTERNS = [
+    r'error parsing allowedNetworks.*?',
+    r'Comparing request from.*?',
+    r'(Auth: )?We found auth token (.*?), enabling token-based authentication\.',
+    r'(Auth: )?Came in with a super-token, authorization succeeded\.',
+    r'(Auth: )?Refreshing tokens inside the token-based authentication filter\.',
+    r'\[Now\] Updated play state for .*?',
+    r'Play progress on .*? - got played .*? ms by account .*?!',
+    r'(Statistics: )?\(.*?\) Reporting active playback in state \d+ of type \d+ \(.*?\) for account \d+',
+    r'Request: \[.*?\] (GET|PUT) /video/:/transcode/.*?',
+    r'Received transcode session ping for session .*?'
+]
+
+IGNORE_REGEX = re.compile(str_format(LOG_PATTERN, message='(%s)' % ('|'.join('(%s)' % x for x in IGNORE_PATTERNS))), re.IGNORECASE)
+
+
+PARAM_REGEX = re.compile(str_format(LOG_PATTERN, message=r' \* (?P<key>.*?) =\> (?P<value>.*?)'), re.IGNORECASE)
+
+
+class Parser(Emitter):
+    def __init__(self, core):
+        self.core = core
+
+    def read_parameters(self, *match_functions):
+        match_functions = [self.parameter_match] + list(match_functions)
+
+        info = {}
+
+        while True:
+            line = self.core.read_line_retry(timeout=5)
+            if not line:
+                log.info('Unable to read log file')
+                return {}
+
+            # Run through each match function to find a result
+            match = None
+            for func in match_functions:
+                match = func(line)
+
+                if match is not None:
+                    break
+
+            # Update info dict with result, otherwise finish reading
+            if match:
+                info.update(match)
+            elif match is None and IGNORE_REGEX.match(line.strip()) is None:
+                log.debug('break on "%s"', line.strip())
+                break
+
+        return info
+
+    def process(self, line):
+        raise NotImplementedError()
+
+    @staticmethod
+    def parameter_match(line):
+        match = PARAM_REGEX.match(line.strip())
+        if not match:
+            return None
+
+        match = match.groupdict()
+
+        return {match['key']: match['value']}
+
+    @staticmethod
+    def regex_match(regex, line):
+        match = regex.match(line.strip())
+        if not match:
+            return None
+
+        return match.groupdict()
+
+    @staticmethod
+    def query(match, value):
+        if not value:
+            return
+
+        try:
+            parameters = urlparse.parse_qsl(value, strict_parsing=True)
+        except ValueError:
+            return
+
+        for key, value in parameters:
+            match.setdefault(key, value)
diff --git a/libs/plex_activity/sources/s_logging/parsers/now_playing.py b/libs/plex_activity/sources/s_logging/parsers/now_playing.py
new file mode 100644
index 000000000..c7242414c
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/parsers/now_playing.py
@@ -0,0 +1,116 @@
+from plex_activity.core.helpers import str_format
+from plex_activity.sources.s_logging.parsers.base import Parser, LOG_PATTERN, REQUEST_HEADER_PATTERN
+
+import logging
+import re
+
+log = logging.getLogger(__name__)
+
+PLAYING_HEADER_PATTERN = str_format(REQUEST_HEADER_PATTERN, method="GET", path="/:/(?P<type>timeline|progress)/?(?:\?(?P<query>.*?))?\s")
+PLAYING_HEADER_REGEX = re.compile(PLAYING_HEADER_PATTERN, re.IGNORECASE)
+
+RANGE_REGEX = re.compile(str_format(LOG_PATTERN, message=r'Request range: \d+ to \d+'), re.IGNORECASE)
+CLIENT_REGEX = re.compile(str_format(LOG_PATTERN, message=r'Client \[(?P<machineIdentifier>.*?)\].*?'), re.IGNORECASE)
+
+NOW_USER_REGEX = re.compile(str_format(LOG_PATTERN, message=r'\[Now\] User is (?P<user_name>.+) \(ID: (?P<user_id>\d+)\)'), re.IGNORECASE)
+NOW_CLIENT_REGEX = re.compile(str_format(LOG_PATTERN, message=r'\[Now\] Device is (?P<product>.+?) \((?P<client>.+)\)\.'), re.IGNORECASE)
+
+
+class NowPlayingParser(Parser):
+    required_info = [
+        'ratingKey',
+        'state', 'time'
+    ]
+
+    extra_info = [
+        'duration',
+
+        'user_name', 'user_id',
+        'machineIdentifier', 'client'
+    ]
+
+    events = [
+        'logging.playing'
+    ]
+
+    def __init__(self, main):
+        super(NowPlayingParser, self).__init__(main)
+
+        # Pipe events to the main logging activity instance
+        self.pipe(self.events, main)
+
+    def process(self, line):
+        header_match = PLAYING_HEADER_REGEX.match(line)
+        if not header_match:
+            return False
+
+        activity_type = header_match.group('type')
+
+        # Get a match from the activity entries
+        if activity_type == 'timeline':
+            match = self.timeline()
+        elif activity_type == 'progress':
+            match = self.progress()
+        else:
+            log.warn('Unknown activity type "%s"', activity_type)
+            return True
+
+        print match, activity_type
+
+        if match is None:
+            match = {}
+
+        # Extend match with query info
+        self.query(match, header_match.group('query'))
+
+        # Ensure we successfully matched a result
+        if not match:
+            return True
+
+        # Sanitize the activity result
+        info = {
+            'address': header_match.group('address'),
+            'port': header_match.group('port')
+        }
+
+        # - Get required info parameters
+        for key in self.required_info:
+            if key in match and match[key] is not None:
+                info[key] = match[key]
+            else:
+                log.info('Invalid activity match, missing key %s (matched keys: %s)', key, match.keys())
+                return True
+
+        # - Add in any extra info parameters
+        for key in self.extra_info:
+            if key in match:
+                info[key] = match[key]
+            else:
+                info[key] = None
+
+        # Update the scrobbler with the current state
+        self.emit('logging.playing', info)
+        return True
+
+    def timeline(self):
+        return self.read_parameters(
+            lambda line: self.regex_match(CLIENT_REGEX, line),
+            lambda line: self.regex_match(RANGE_REGEX, line),
+
+            # [Now]* entries
+            lambda line: self.regex_match(NOW_USER_REGEX, line),
+            lambda line: self.regex_match(NOW_CLIENT_REGEX, line),
+        )
+
+    def progress(self):
+        data = self.read_parameters()
+
+        if not data:
+            return {}
+
+        # Translate parameters into timeline-style form
+        return {
+            'state': data.get('state'),
+            'ratingKey': data.get('key'),
+            'time': data.get('time')
+        }
diff --git a/libs/plex_activity/sources/s_logging/parsers/scrobble.py b/libs/plex_activity/sources/s_logging/parsers/scrobble.py
new file mode 100644
index 000000000..a1b2c93f4
--- /dev/null
+++ b/libs/plex_activity/sources/s_logging/parsers/scrobble.py
@@ -0,0 +1,38 @@
+from plex_activity.core.helpers import str_format
+from plex_activity.sources.s_logging.parsers.base import Parser, LOG_PATTERN
+
+import re
+
+
+class ScrobbleParser(Parser):
+    pattern = str_format(LOG_PATTERN, message=r'Library item (?P<rating_key>\d+) \'(?P<title>.*?)\' got (?P<action>(?:un)?played) by account (?P<account_key>\d+)!.*?')
+    regex = re.compile(pattern, re.IGNORECASE)
+
+    events = [
+        'logging.action.played',
+        'logging.action.unplayed'
+    ]
+
+    def __init__(self, main):
+        super(ScrobbleParser, self).__init__(main)
+
+        # Pipe events to the main logging activity instance
+        self.pipe(self.events, main)
+
+    def process(self, line):
+        match = self.regex.match(line)
+        if not match:
+            return False
+
+        action = match.group('action')
+        if not action:
+            return False
+
+        self.emit('logging.action.%s' % action, {
+            'account_key': match.group('account_key'),
+            'rating_key': match.group('rating_key'),
+
+            'title': match.group('title')
+        })
+
+        return True
diff --git a/libs/plex_activity/sources/s_websocket/__init__.py b/libs/plex_activity/sources/s_websocket/__init__.py
new file mode 100644
index 000000000..2657b37a9
--- /dev/null
+++ b/libs/plex_activity/sources/s_websocket/__init__.py
@@ -0,0 +1,3 @@
+from plex_activity.sources.s_websocket.main import WebSocket
+
+__all__ = ['WebSocket']
diff --git a/libs/plex_activity/sources/s_websocket/main.py b/libs/plex_activity/sources/s_websocket/main.py
new file mode 100644
index 000000000..429498fc3
--- /dev/null
+++ b/libs/plex_activity/sources/s_websocket/main.py
@@ -0,0 +1,298 @@
+from plex import Plex
+from plex.lib.six.moves.urllib_parse import urlencode
+from plex_activity.sources.base import Source
+
+import json
+import logging
+import re
+import time
+import websocket
+
+log = logging.getLogger(__name__)
+
+SCANNING_REGEX = re.compile('Scanning the "(?P<section>.*?)" section', re.IGNORECASE)
+SCAN_COMPLETE_REGEX = re.compile('Library scan complete', re.IGNORECASE)
+
+TIMELINE_STATES = {
+    0: 'created',
+    2: 'matching',
+    3: 'downloading',
+    4: 'loading',
+    5: 'finished',
+    6: 'analyzing',
+    9: 'deleted'
+}
+
+
+class WebSocket(Source):
+    name = 'websocket'
+    events = [
+        'websocket.playing',
+
+        'websocket.scanner.started',
+        'websocket.scanner.progress',
+        'websocket.scanner.finished',
+
+        'websocket.timeline.created',
+        'websocket.timeline.matching',
+        'websocket.timeline.downloading',
+        'websocket.timeline.loading',
+        'websocket.timeline.finished',
+        'websocket.timeline.analyzing',
+        'websocket.timeline.deleted'
+    ]
+
+    opcode_data = (websocket.ABNF.OPCODE_TEXT, websocket.ABNF.OPCODE_BINARY)
+
+    def __init__(self, activity):
+        super(WebSocket, self).__init__()
+
+        self.ws = None
+        self.reconnects = 0
+
+        # Pipe events to the main activity instance
+        self.pipe(self.events, activity)
+
+    def connect(self):
+        uri = 'ws://%s:%s/:/websockets/notifications' % (
+            Plex.configuration.get('server.host', '127.0.0.1'),
+            Plex.configuration.get('server.port', 32400)
+        )
+
+        params = {}
+
+        # Set authentication token (if one is available)
+        if Plex.configuration['authentication.token']:
+            params['X-Plex-Token'] = Plex.configuration['authentication.token']
+
+        # Append parameters to uri
+        if params:
+            uri += '?' + urlencode(params)
+
+        # Create websocket connection
+        self.ws = websocket.create_connection(uri)
+
+    def run(self):
+        self.connect()
+
+        log.debug('Ready')
+
+        while True:
+            try:
+                self.process(*self.receive())
+
+                # successfully received data, reset reconnects counter
+                self.reconnects = 0
+            except websocket.WebSocketConnectionClosedException:
+                if self.reconnects <= 5:
+                    self.reconnects += 1
+
+                    # Increasing sleep interval between reconnections
+                    if self.reconnects > 1:
+                        time.sleep(2 * (self.reconnects - 1))
+
+                    log.info('WebSocket connection has closed, reconnecting...')
+                    self.connect()
+                else:
+                    log.error('WebSocket connection unavailable, activity monitoring not available')
+                    break
+
+    def receive(self):
+        frame = self.ws.recv_frame()
+
+        if not frame:
+            raise websocket.WebSocketException("Not a valid frame %s" % frame)
+        elif frame.opcode in self.opcode_data:
+            return frame.opcode, frame.data
+        elif frame.opcode == websocket.ABNF.OPCODE_CLOSE:
+            self.ws.send_close()
+            return frame.opcode, None
+        elif frame.opcode == websocket.ABNF.OPCODE_PING:
+            self.ws.pong("Hi!")
+
+        return None, None
+
+    def process(self, opcode, data):
+        if opcode not in self.opcode_data:
+            return False
+
+        try:
+            info = json.loads(data)
+        except UnicodeDecodeError as ex:
+            log.warn('Error decoding message from websocket: %s' % ex, extra={
+                'event': {
+                    'module': __name__,
+                    'name': 'process.loads.unicode_decode_error',
+                    'key': '%s:%s' % (ex.encoding, ex.reason)
+                }
+            })
+            log.debug(data)
+            return False
+        except Exception as ex:
+            log.warn('Error decoding message from websocket: %s' % ex, extra={
+                'event': {
+                    'module': __name__,
+                    'name': 'process.load_exception',
+                    'key': ex.message
+                }
+            })
+            log.debug(data)
+            return False
+
+        # Handle modern messages (PMS 1.3.0+)
+        if type(info.get('NotificationContainer')) is dict:
+            info = info['NotificationContainer']
+
+        # Process  message
+        m_type = info.get('type')
+
+        if not m_type:
+            log.debug('Received message with no "type" parameter: %r', info)
+            return False
+
+        # Pre-process message (if function exists)
+        process_func = getattr(self, 'process_%s' % m_type, None)
+
+        if process_func and process_func(info):
+            return True
+
+        # Emit raw message
+        return self.emit_notification('%s.notification.%s' % (self.name, m_type), info)
+
+    def process_playing(self, info):
+        children = info.get('_children') or info.get('PlaySessionStateNotification')
+
+        if not children:
+            log.debug('Received "playing" message with no children: %r', info)
+            return False
+
+        return self.emit_notification('%s.playing' % self.name, children)
+
+    def process_progress(self, info):
+        children = info.get('_children') or info.get('ProgressNotification')
+
+        if not children:
+            log.debug('Received "progress" message with no children: %r', info)
+            return False
+
+        for notification in children:
+            self.emit('%s.scanner.progress' % self.name, {
+                'message': notification.get('message')
+            })
+
+        return True
+
+    def process_status(self, info):
+        children = info.get('_children') or info.get('StatusNotification')
+
+        if not children:
+            log.debug('Received "status" message with no children: %r', info)
+            return False
+
+        # Process children
+        count = 0
+
+        for notification in children:
+            title = notification.get('title')
+
+            if not title:
+                continue
+
+            # Scan complete message
+            if SCAN_COMPLETE_REGEX.match(title):
+                self.emit('%s.scanner.finished' % self.name)
+                count += 1
+                continue
+
+            # Scanning message
+            match = SCANNING_REGEX.match(title)
+
+            if not match:
+                continue
+
+            section = match.group('section')
+
+            if not section:
+                continue
+
+            self.emit('%s.scanner.started' % self.name, {'section': section})
+            count += 1
+
+        # Validate result
+        if count < 1:
+            log.debug('Received "status" message with no valid children: %r', info)
+            return False
+
+        return True
+
+    def process_timeline(self, info):
+        children = info.get('_children') or info.get('TimelineEntry')
+
+        if not children:
+            log.debug('Received "timeline" message with no children: %r', info)
+            return False
+
+        # Process children
+        count = 0
+
+        for entry in children:
+            state = TIMELINE_STATES.get(entry.get('state'))
+
+            if not state:
+                continue
+
+            self.emit('%s.timeline.%s' % (self.name, state), entry)
+            count += 1
+
+        # Validate result
+        if count < 1:
+            log.debug('Received "timeline" message with no valid children: %r', info)
+            return False
+
+        return True
+
+    #
+    # Helpers
+    #
+
+    def emit_notification(self, name, info=None):
+        if info is None:
+            info = {}
+
+        # Emit children
+        children = self._get_children(info)
+
+        if children:
+            for child in children:
+                self.emit(name, child)
+
+            return True
+
+        # Emit objects
+        if info:
+            self.emit(name, info)
+        else:
+            self.emit(name)
+
+        return True
+
+    @staticmethod
+    def _get_children(info):
+        if type(info) is list:
+            return info
+
+        if type(info) is not dict:
+            return None
+
+        # Return legacy children
+        if info.get('_children'):
+            return info['_children']
+
+        # Search for modern children container
+        for key, value in info.items():
+            key = key.lower()
+
+            if (key.endswith('entry') or key.endswith('notification')) and type(value) is list:
+                return value
+
+        return None
diff --git a/libs/pyads.py b/libs/pyads.py
new file mode 100644
index 000000000..5f8e6a10b
--- /dev/null
+++ b/libs/pyads.py
@@ -0,0 +1,124 @@
+# -*- coding: utf-8 -*-
+'''
+Copyright © 2015, Robin David - MIT-Licensed
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
+documentation files (the "Software"), to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and
+to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+The Software is provided "as is", without warranty of any kind, express or implied, including but not limited
+to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall
+the authors or copyright holders X be liable for any claim, damages or other liability, whether in an action
+of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other
+dealings in the Software.
+Except as contained in this notice, the name of the Robin David shall not be used in advertising or otherwise
+to promote the sale, use or other dealings in this Software without prior written authorization from the Robin David.
+'''
+from ctypes import *
+
+import sys, os
+kernel32 = windll.kernel32
+
+LPSTR     = c_wchar_p
+DWORD     = c_ulong
+LONG      = c_ulong
+WCHAR     = c_wchar * 296
+LONGLONG  = c_longlong
+
+class LARGE_INTEGER_UNION(Structure):
+    _fields_ = [
+        ("LowPart", DWORD),
+        ("HighPart", LONG),]
+
+class LARGE_INTEGER(Union):
+    _fields_ = [
+        ("large1", LARGE_INTEGER_UNION),
+        ("large2", LARGE_INTEGER_UNION),
+        ("QuadPart",    LONGLONG),
+    ]
+
+class WIN32_FIND_STREAM_DATA(Structure):
+    _fields_ = [
+        ("StreamSize", LARGE_INTEGER),
+        ("cStreamName", WCHAR),
+    ]
+    '''
+    typedef struct _WIN32_FIND_STREAM_DATA {
+      LARGE_INTEGER StreamSize;
+      WCHAR         cStreamName[MAX_PATH + 36];
+    } WIN32_FIND_STREAM_DATA, *PWIN32_FIND_STREAM_DATA;
+    '''
+
+class ADS():
+    def __init__(self, filename):
+        self.filename = filename
+        self.streams = self.init_streams()
+
+    def init_streams(self):
+        file_infos = WIN32_FIND_STREAM_DATA()
+        streamlist = list()
+        myhandler = kernel32.FindFirstStreamW (LPSTR(self.filename), 0, byref(file_infos), 0)
+        '''
+        HANDLE WINAPI FindFirstStreamW(
+          __in        LPCWSTR lpFileName,
+          __in        STREAM_INFO_LEVELS InfoLevel, (0 standard, 1 max infos)
+          __out       LPVOID lpFindStreamData, (return information about file in a WIN32_FIND_STREAM_DATA if 0 is given in infos_level
+          __reserved  DWORD dwFlags (Reserved for future use. This parameter must be zero.) cf: doc
+        );
+        https://msdn.microsoft.com/en-us/library/aa364424(v=vs.85).aspx
+        '''
+
+        if file_infos.cStreamName:
+            streamname = file_infos.cStreamName.split(":")[1]
+            if streamname: streamlist.append(streamname)
+
+            while kernel32.FindNextStreamW(myhandler, byref(file_infos)):
+                streamlist.append(file_infos.cStreamName.split(":")[1])
+
+        kernel32.FindClose(myhandler) #Close the handle
+
+        return streamlist
+
+    def __iter__(self):
+        return iter(self.streams)
+
+    def has_streams(self):
+        return len(self.streams) > 0
+
+    def full_filename(self, stream):
+        return "%s:%s" % (self.filename, stream)
+
+    def add_stream_from_file(self, filename):
+        if os.path.exists(filename):
+            with open(filename, "rb") as f:
+                content = f.read()
+            return self.add_stream_from_string(filename, content)
+        else:
+            print("Could not find file: {0}".format(filename))
+            return False
+
+    def add_stream_from_string(self, stream_name, string):
+        fullname = self.full_filename(os.path.basename(stream_name))
+        if os.path.exists(fullname):
+            print("Stream name already exists")
+            return False
+        else:
+            fd = open(fullname, "wb")
+            fd.write(string)
+            fd.close()
+            self.streams.append(stream_name)
+            return True
+
+    def delete_stream(self, stream):
+        try:
+            os.remove(self.full_filename(stream))
+            self.streams.remove(stream)
+            return True
+        except:
+            return False
+
+    def get_stream_content(self, stream):
+        fd = open(self.full_filename(stream), "rb")
+        content = fd.read()
+        fd.close()
+        return content
diff --git a/libs/pyemitter.py b/libs/pyemitter.py
new file mode 100644
index 000000000..c17c43d45
--- /dev/null
+++ b/libs/pyemitter.py
@@ -0,0 +1,235 @@
+import logging
+
+# concurrent.futures is optional
+try:
+    from concurrent.futures import ThreadPoolExecutor
+except ImportError:
+    ThreadPoolExecutor = None
+
+
+log = logging.getLogger(__name__)
+
+
+class Emitter(object):
+    threading = False
+    threading_workers = 2
+
+    __constructed = False
+    __name = None
+
+    __callbacks = None
+    __threading_pool = None
+
+    def __ensure_constructed(self):
+        if self.__constructed:
+            return
+
+        self.__callbacks = {}
+        self.__constructed = True
+
+        if self.threading:
+            if ThreadPoolExecutor is None:
+                raise Exception('concurrent.futures is required for threading')
+
+            self.__threading_pool = ThreadPoolExecutor(max_workers=self.threading_workers)
+
+    def __log(self, message, *args, **kwargs):
+        if self.__name is None:
+            self.__name = '%s.%s' % (
+                self.__module__,
+                self.__class__.__name__
+            )
+
+        log.debug(
+            ('[%s]:' % self.__name.ljust(34)) + str(message),
+            *args, **kwargs
+        )
+
+    def __wrap(self, callback, *args, **kwargs):
+        def wrap(func):
+            callback(func=func, *args, **kwargs)
+            return func
+
+        return wrap
+
+    def on(self, events, func=None, on_bound=None):
+        if not func:
+            # assume decorator, wrap
+            return self.__wrap(self.on, events, on_bound=on_bound)
+
+        if not isinstance(events, (list, tuple)):
+            events = [events]
+
+        self.__log('on(events: %s, func: %s)', repr(events), repr(func))
+
+        self.__ensure_constructed()
+
+        for event in events:
+            if event not in self.__callbacks:
+                self.__callbacks[event] = []
+
+            # Bind callback to event
+            self.__callbacks[event].append(func)
+
+        # Call 'on_bound' callback
+        if on_bound:
+            self.__call(on_bound, kwargs={
+                'func': func
+            })
+
+        return self
+
+    def once(self, event, func=None):
+        if not func:
+            # assume decorator, wrap
+            return self.__wrap(self.once, event)
+
+        self.__log('once(event: %s, func: %s)', repr(event), repr(func))
+
+        def once_callback(*args, **kwargs):
+            self.off(event, once_callback)
+            func(*args, **kwargs)
+
+        self.on(event, once_callback)
+
+        return self
+
+    def off(self, event=None, func=None):
+        self.__log('off(event: %s, func: %s)', repr(event), repr(func))
+
+        self.__ensure_constructed()
+
+        if event and event not in self.__callbacks:
+            return self
+
+        if func and func not in self.__callbacks[event]:
+            return self
+
+        if event and func:
+            self.__callbacks[event].remove(func)
+        elif event:
+            self.__callbacks[event] = []
+        elif func:
+            raise ValueError('"event" is required if "func" is specified')
+        else:
+            self.__callbacks = {}
+
+        return self
+
+    def emit(self, event, *args, **kwargs):
+        suppress = kwargs.pop('__suppress', False)
+
+        if not suppress:
+            self.__log('emit(event: %s, args: %s, kwargs: %s)', repr(event), repr_trim(args), repr_trim(kwargs))
+
+        self.__ensure_constructed()
+
+        if event not in self.__callbacks:
+            return
+
+        for callback in list(self.__callbacks[event]):
+            self.__call(callback, args, kwargs, event)
+
+        return self
+
+    def emit_on(self, event, *args, **kwargs):
+        func = kwargs.pop('func', None)
+
+        if not func:
+            # assume decorator, wrap
+            return self.__wrap(self.emit_on, event, *args, **kwargs)
+
+        self.__log('emit_on(event: %s, func: %s, args: %s, kwargs: %s)', repr(event), repr(func), repr(args), repr(kwargs))
+
+        # Bind func from wrapper
+        self.on(event, func)
+
+        # Emit event (calling 'func')
+        self.emit(event, *args, **kwargs)
+
+    def pipe(self, events, other):
+        if type(events) is not list:
+            events = [events]
+
+        self.__log('pipe(events: %s, other: %s)', repr(events), repr(other))
+
+        self.__ensure_constructed()
+
+        for event in events:
+            self.on(event, PipeHandler(event, other.emit))
+
+        return self
+
+    def __call(self, callback, args=None, kwargs=None, event=None):
+        args = args or ()
+        kwargs = kwargs or {}
+
+        if self.threading:
+            return self.__call_async(callback, args, kwargs, event)
+
+        return self.__call_sync(callback, args, kwargs, event)
+
+    @classmethod
+    def __call_sync(cls, callback, args=None, kwargs=None, event=None):
+        try:
+            callback(*args, **kwargs)
+            return True
+        except Exception as ex:
+            log.warn('[%s] Exception raised in: %s - %s' % (event, cls.__function_name(callback), ex), exc_info=True)
+            return False
+
+    def __call_async(self, callback, args=None, kwargs=None, event=None):
+        self.__threading_pool.submit(self.__call_sync, callback, args, kwargs, event)
+
+    @staticmethod
+    def __function_name(func):
+        fragments = []
+
+        # Try append class name
+        cls = getattr(func, 'im_class', None)
+
+        if cls and hasattr(cls, '__name__'):
+            fragments.append(cls.__name__)
+
+        # Append function name
+        fragments.append(func.__name__)
+
+        return '.'.join(fragments)
+
+
+class PipeHandler(object):
+    def __init__(self, event, callback):
+        self.event = event
+        self.callback = callback
+
+    def __call__(self, *args, **kwargs):
+        self.callback(self.event, *args, **kwargs)
+
+
+def on(emitter, event, func=None):
+    emitter.on(event, func)
+
+    return {
+        'destroy': lambda: emitter.off(event, func)
+    }
+
+
+def once(emitter, event, func=None):
+    return emitter.once(event, func)
+
+
+def off(emitter, event, func=None):
+    return emitter.off(event, func)
+
+
+def emit(emitter, event, *args, **kwargs):
+    return emitter.emit(event, *args, **kwargs)
+
+
+def repr_trim(value, length=1000):
+    value = repr(value)
+
+    if len(value) < length:
+        return value
+
+    return '<%s - %s characters>' % (type(value).__name__, len(value))
diff --git a/libs/pyga/__init__.py b/libs/pyga/__init__.py
new file mode 100644
index 000000000..103d0ccbf
--- /dev/null
+++ b/libs/pyga/__init__.py
@@ -0,0 +1,8 @@
+from pyga.requests import Q
+
+def shutdown():
+    '''
+    Fire all stored GIF requests One by One.
+    You should call this if you set Config.queue_requests = True
+    '''
+    map(lambda func: func(), Q.REQ_ARRAY)
diff --git a/libs/pyga/entities.py b/libs/pyga/entities.py
new file mode 100644
index 000000000..130c8db46
--- /dev/null
+++ b/libs/pyga/entities.py
@@ -0,0 +1,506 @@
+# -*- coding: utf-8 -*-
+
+from datetime import datetime
+from operator import itemgetter
+import six
+from pyga import utils
+from pyga import exceptions
+
+__author__ = "Arun KR (kra3) <the1.arun@gmail.com>"
+__license__ = "Simplified BSD"
+
+
+class Campaign(object):
+    '''
+    A representation of Campaign
+
+    Properties:
+    _type -- See TYPE_* constants, will be mapped to "__utmz" parameter.
+    creation_time --  Time of the creation of this campaign, will be mapped to "__utmz" parameter.
+    response_count -- Response Count, will be mapped to "__utmz" parameter.
+        Is also used to determine whether the campaign is new or repeated,
+        which will be mapped to "utmcn" and "utmcr" parameters.
+    id -- Campaign ID, a.k.a. "utm_id" query parameter for ga.js
+           Will be mapped to "__utmz" parameter.
+    source -- Source, a.k.a. "utm_source" query parameter for ga.js.
+              Will be mapped to "utmcsr" key in "__utmz" parameter.
+    g_click_id -- Google AdWords Click ID, a.k.a. "gclid" query parameter for ga.js.
+                  Will be mapped to "utmgclid" key in "__utmz" parameter.
+    d_click_id -- DoubleClick (?) Click ID. Will be mapped to "utmdclid" key in "__utmz" parameter.
+    name --  Name, a.k.a. "utm_campaign" query parameter for ga.js.
+             Will be mapped to "utmccn" key in "__utmz" parameter.
+    medium -- Medium, a.k.a. "utm_medium" query parameter for ga.js.
+              Will be mapped to "utmcmd" key in "__utmz" parameter.
+    term -- Terms/Keywords, a.k.a. "utm_term" query parameter for ga.js.
+            Will be mapped to "utmctr" key in "__utmz" parameter.
+    content -- Ad Content Description, a.k.a. "utm_content" query parameter for ga.js.
+               Will be mapped to "utmcct" key in "__utmz" parameter.
+
+    '''
+
+    TYPE_DIRECT = 'direct'
+    TYPE_ORGANIC = 'organic'
+    TYPE_REFERRAL = 'referral'
+
+    CAMPAIGN_DELIMITER = '|'
+
+    UTMZ_PARAM_MAP = {
+        'utmcid': 'id',
+        'utmcsr': 'source',
+        'utmgclid': 'g_click_id',
+        'utmdclid': 'd_click_id',
+        'utmccn': 'name',
+        'utmcmd': 'medium',
+        'utmctr': 'term',
+        'utmcct': 'content',
+    }
+
+    def __init__(self, typ):
+        self._type = None
+        self.creation_time = None
+        self.response_count = 0
+        self.id = None
+        self.source = None
+        self.g_click_id = None
+        self.d_click_id = None
+        self.name = None
+        self.medium = None
+        self.term = None
+        self.content = None
+
+        if typ:
+            if typ not in ('direct', 'organic', 'referral'):
+                raise ValueError('Campaign type has to be one of the Campaign::TYPE_* constant values.')
+
+            self._type = typ
+            if typ == Campaign.TYPE_DIRECT:
+                self.name = '(direct)'
+                self.source = '(direct)'
+                self.medium = '(none)'
+            elif typ == Campaign.TYPE_REFERRAL:
+                self.name = '(referral)'
+                self.medium = 'referral'
+            elif typ == Campaign.TYPE_ORGANIC:
+                self.name = '(organic)'
+                self.medium = 'organic'
+            else:
+                self._type = None
+
+        self.creation_time = datetime.utcnow()
+
+    def validate(self):
+        if not self.source:
+            raise exceptions.ValidationError('Campaigns need to have at least the "source" attribute defined.')
+
+    @staticmethod
+    def create_from_referrer(url):
+        obj = Campaign(Campaign.TYPE_REFERRAL)
+        parse_rslt = six.moves.urllib.parse.urlparse(url)
+        obj.source = parse_rslt.netloc
+        obj.content = parse_rslt.path
+        return obj
+
+    def extract_from_utmz(self, utmz):
+        parts = utmz.split('.', 4)
+
+        if len(parts) != 5:
+            raise ValueError('The given "__utmz" cookie value is invalid.')
+
+        self.creation_time = utils.convert_ga_timestamp(parts[1])
+        self.response_count = int(parts[3])
+        params = parts[4].split(Campaign.CAMPAIGN_DELIMITER)
+
+        for param in params:
+            key, val = param.split('=')
+
+            try:
+                setattr(self, self.UTMZ_PARAM_MAP[key], six.moves.urllib.parse.unquote_plus(val))
+            except KeyError:
+                continue
+
+        return self
+
+
+class CustomVariable(object):
+    '''
+    Represent a Custom Variable
+
+    Properties:
+    index -- Is the slot, you have 5 slots
+    name -- Name given to custom variable
+    value -- Value for the variable
+    scope -- Scope can be any one of 1, 2 or 3.
+
+    WATCH OUT: It's a known issue that GA will not decode URL-encoded
+    characters in custom variable names and values properly, so spaces
+    will show up as "%20" in the interface etc. (applicable to name & value)
+    http://www.google.com/support/forum/p/Google%20Analytics/thread?tid=2cdb3ec0be32e078
+
+    '''
+
+    SCOPE_VISITOR = 1
+    SCOPE_SESSION = 2
+    SCOPE_PAGE = 3
+
+    def __init__(self, index=None, name=None, value=None, scope=3):
+        self.index = index
+        self.name = name
+        self.value = value
+        self.scope = CustomVariable.SCOPE_PAGE
+        if scope:
+            self.scope = scope
+
+    def __setattr__(self, name, value):
+        if name == 'scope':
+            if value and value not in range(1, 4):
+                raise ValueError('Custom Variable scope has to be one of the 1,2 or 3')
+
+        if name == 'index':
+            # Custom Variables are limited to five slots officially, but there seems to be a
+            # trick to allow for more of them which we could investigate at a later time (see
+            # http://analyticsimpact.com/2010/05/24/get-more-than-5-custom-variables-in-google-analytics/
+            if value and (value < 0 or value > 5):
+                raise ValueError('Custom Variable index has to be between 1 and 5.')
+
+        object.__setattr__(self, name, value)
+
+    def validate(self):
+        '''
+        According to the GA documentation, there is a limit to the combined size of
+        name and value of 64 bytes after URL encoding,
+        see http://code.google.com/apis/analytics/docs/tracking/gaTrackingCustomVariables.html#varTypes
+        and http://xahlee.org/js/google_analytics_tracker_2010-07-01_expanded.js line 563
+        This limit was increased to 128 bytes BEFORE encoding with the 2012-01 release of ga.js however,
+        see http://code.google.com/apis/analytics/community/gajs_changelog.html
+        '''
+        if len('%s%s' % (self.name, self.value)) > 128:
+            raise exceptions.ValidationError('Custom Variable combined name and value length must not be larger than 128 bytes.')
+
+
+class Event(object):
+    '''
+    Represents an Event
+    https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
+
+    Properties:
+    category -- The general event category
+    action -- The action for the event
+    label -- An optional descriptor for the event
+    value -- An optional value associated with the event. You can see your
+             event values in the Overview, Categories, and Actions reports,
+             where they are listed by event or aggregated across events,
+             depending upon your report view.
+    noninteraction -- By default, event hits will impact a visitor's bounce rate.
+                      By setting this parameter to true, this event hit
+                      will not be used in bounce rate calculations.
+                      (default False)
+    '''
+
+    def __init__(self, category=None, action=None, label=None, value=None, noninteraction=False):
+        self.category = category
+        self.action = action
+        self.label = label
+        self.value = value
+        self.noninteraction = bool(noninteraction)
+
+        if self.noninteraction and not self.value:
+            self.value = 0
+
+    def validate(self):
+        if not(self.category and self.action):
+            raise exceptions.ValidationError('Events, at least need to have a category and action defined.')
+
+
+class Item(object):
+    '''
+    Represents an Item in Transaction
+
+    Properties:
+    order_id -- Order ID, will be mapped to "utmtid" parameter
+    sku -- Product Code. This is the sku code for a given product, will be mapped to "utmipc" parameter
+    name -- Product Name, will be mapped to "utmipn" parameter
+    variation -- Variations on an item, will be mapped to "utmiva" parameter
+    price -- Unit Price. Value is set to numbers only, will be mapped to "utmipr" parameter
+    quantity -- Unit Quantity, will be mapped to "utmiqt" parameter
+
+    '''
+
+    def __init__(self):
+        self.order_id = None
+        self.sku = None
+        self.name = None
+        self.variation = None
+        self.price = None
+        self.quantity = 1
+
+    def validate(self):
+        if not self.sku:
+            raise exceptions.ValidationError('sku/product is a required parameter')
+
+
+class Page(object):
+    '''
+    Contains all parameters needed for tracking a page
+
+    Properties:
+    path -- Page request URI, will be mapped to "utmp" parameter
+    title -- Page title, will be mapped to "utmdt" parameter
+    charset -- Charset encoding, will be mapped to "utmcs" parameter
+    referrer -- Referer URL, will be mapped to "utmr" parameter
+    load_time -- Page load time in milliseconds, will be encoded into "utme" parameter.
+
+    '''
+    REFERRER_INTERNAL = '0'
+
+    def __init__(self, path):
+        self.path = None
+        self.title = None
+        self.charset = None
+        self.referrer = None
+        self.load_time = None
+
+        if path:
+            self.path = path
+
+    def __setattr__(self, name, value):
+        if name == 'path':
+            if value and value != '':
+                if value[0] != '/':
+                    raise ValueError('The page path should always start with a slash ("/").')
+        elif name == 'load_time':
+            if value and not isinstance(value, int):
+                raise ValueError('Page load time must be specified in integer milliseconds.')
+
+        object.__setattr__(self, name, value)
+
+
+class Session(object):
+    '''
+    You should serialize this object and store it in the user session to keep it
+    persistent between requests (similar to the "__umtb" cookie of the GA Javascript client).
+
+    Properties:
+    session_id -- A unique per-session ID, will be mapped to "utmhid" parameter
+    track_count -- The amount of pageviews that were tracked within this session so far,
+                   will be part of the "__utmb" cookie parameter.
+                   Will get incremented automatically upon each request
+    start_time -- Timestamp of the start of this new session, will be part of the "__utmb" cookie parameter
+
+    '''
+    def __init__(self):
+        self.session_id = utils.get_32bit_random_num()
+        self.track_count = 0
+        self.start_time = datetime.utcnow()
+
+    @staticmethod
+    def generate_session_id():
+        return utils.get_32bit_random_num()
+
+    def extract_from_utmb(self, utmb):
+        '''
+        Will extract information for the "trackCount" and "startTime"
+        properties from the given "__utmb" cookie value.
+        '''
+        parts = utmb.split('.')
+        if len(parts) != 4:
+            raise ValueError('The given "__utmb" cookie value is invalid.')
+
+        self.track_count = int(parts[1])
+        self.start_time = utils.convert_ga_timestamp(parts[3])
+
+        return self
+
+
+class SocialInteraction(object):
+    '''
+
+    Properties:
+    action -- Required. A string representing the social action being tracked,
+              will be mapped to "utmsa" parameter
+    network -- Required. A string representing the social network being tracked,
+               will be mapped to "utmsn" parameter
+    target -- Optional. A string representing the URL (or resource) which receives the action.
+
+    '''
+
+    def __init__(self, action=None, network=None, target=None):
+        self.action = action
+        self.network = network
+        self.target = target
+
+    def validate(self):
+        if not(self.action and self.network):
+            raise exceptions.ValidationError('Social interactions need to have at least the "network" and "action" attributes defined.')
+
+
+class Transaction(object):
+    '''
+    Represents parameters for a Transaction call
+
+    Properties:
+    order_id -- Order ID, will be mapped to "utmtid" parameter
+    affiliation -- Affiliation, Will be mapped to "utmtst" parameter
+    total -- Total Cost, will be mapped to "utmtto" parameter
+    tax -- Tax Cost, will be mapped to "utmttx" parameter
+    shipping -- Shipping Cost, values as for unit and price, will be mapped to "utmtsp" parameter
+    city -- Billing City, will be mapped to "utmtci" parameter
+    state -- Billing Region, will be mapped to "utmtrg" parameter
+    country -- Billing Country, will be mapped to "utmtco" parameter
+    items -- @entity.Items in a transaction
+
+    '''
+    def __init__(self):
+        self.items = []
+        self.order_id = None
+        self.affiliation = None
+        self.total = None
+        self.tax = None
+        self.shipping = None
+        self.city = None
+        self.state = None
+        self.country = None
+
+    def __setattr__(self, name, value):
+        if name == 'order_id':
+            for itm in self.items:
+                itm.order_id = value
+        object.__setattr__(self, name, value)
+
+    def validate(self):
+        if len(self.items) == 0:
+            raise exceptions.ValidationError('Transaction need to consist of at least one item')
+
+    def add_item(self, item):
+        ''' item of type entities.Item '''
+        if isinstance(item, Item):
+            item.order_id = self.order_id
+            self.items.append(item)
+
+
+class Visitor(object):
+    '''
+    You should serialize this object and store it in the user database to keep it
+    persistent for the same user permanently (similar to the "__umta" cookie of
+    the GA Javascript client).
+
+    Properties:
+    unique_id -- Unique user ID, will be part of the "__utma" cookie parameter
+    first_visit_time -- Time of the very first visit of this user, will be part of the "__utma" cookie parameter
+    previous_visit_time -- Time of the previous visit of this user, will be part of the "__utma" cookie parameter
+    current_visit_time -- Time of the current visit of this user, will be part of the "__utma" cookie parameter
+    visit_count -- Amount of total visits by this user, will be part of the "__utma" cookie parameter
+    ip_address -- IP Address of the end user, will be mapped to "utmip" parameter and "X-Forwarded-For" request header
+    user_agent -- User agent string of the end user, will be mapped to "User-Agent" request header
+    locale -- Locale string (country part optional) will be mapped to "utmul" parameter
+    flash_version -- Visitor's Flash version, will be maped to "utmfl" parameter
+    java_enabled -- Visitor's Java support, will be mapped to "utmje" parameter
+    screen_colour_depth -- Visitor's screen color depth, will be mapped to "utmsc" parameter
+    screen_resolution -- Visitor's screen resolution, will be mapped to "utmsr" parameter
+    '''
+    def __init__(self):
+        now = datetime.utcnow()
+
+        self.unique_id = None
+        self.first_visit_time = now
+        self.previous_visit_time = now
+        self.current_visit_time = now
+        self.visit_count = 1
+        self.ip_address = None
+        self.user_agent = None
+        self.locale = None
+        self.flash_version = None
+        self.java_enabled = None
+        self.screen_colour_depth = None
+        self.screen_resolution = None
+
+    def __setattr__(self, name, value):
+        if name == 'unique_id':
+            if value and (value < 0 or value > 0x7fffffff):
+                raise ValueError('Visitor unique ID has to be a 32-bit integer between 0 and 0x7fffffff')
+        object.__setattr__(self, name, value)
+
+    def __getattribute__(self, name):
+        if name == 'unique_id':
+            tmp = object.__getattribute__(self, name)
+            if tmp is None:
+                self.unique_id = self.generate_unique_id()
+        return object.__getattribute__(self, name)
+
+    def __getstate__(self):
+        state = self.__dict__
+        if state.get('user_agent') is None:
+            state['unique_id'] = self.generate_unique_id()
+
+        return state
+
+    def extract_from_utma(self, utma):
+        '''
+        Will extract information for the "unique_id", "first_visit_time", "previous_visit_time",
+        "current_visit_time" and "visit_count" properties from the given "__utma" cookie value.
+        '''
+        parts = utma.split('.')
+        if len(parts) != 6:
+            raise ValueError('The given "__utma" cookie value is invalid.')
+
+        self.unique_id = int(parts[1])
+        self.first_visit_time = utils.convert_ga_timestamp(parts[2])
+        self.previous_visit_time = utils.convert_ga_timestamp(parts[3])
+        self.current_visit_time = utils.convert_ga_timestamp(parts[4])
+        self.visit_count = int(parts[5])
+
+        return self
+
+    def extract_from_server_meta(self, meta):
+        '''
+        Will extract information for the "ip_address", "user_agent" and "locale"
+        properties from the given WSGI REQUEST META variable or equivalent.
+        '''
+        if 'REMOTE_ADDR' in meta and meta['REMOTE_ADDR']:
+            ip = None
+            for key in ('HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'):
+                if key in meta and not ip:
+                    ips = meta.get(key, '').split(',')
+                    ip = ips[-1].strip()
+                    if not utils.is_valid_ip(ip):
+                        ip = ''
+                    if utils.is_private_ip(ip):
+                        ip = ''
+            if ip:
+                self.ip_address = ip
+
+        if 'HTTP_USER_AGENT' in meta and meta['HTTP_USER_AGENT']:
+            self.user_agent = meta['HTTP_USER_AGENT']
+
+        if 'HTTP_ACCEPT_LANGUAGE' in meta and meta['HTTP_ACCEPT_LANGUAGE']:
+            user_locals = []
+            matched_locales = utils.validate_locale(meta['HTTP_ACCEPT_LANGUAGE'])
+            if matched_locales:
+                lang_lst = map((lambda x: x.replace('-', '_')), (i[1] for i in matched_locales))
+                quality_lst = map((lambda x: x and x or 1), (float(i[4] and i[4] or '0') for i in matched_locales))
+                lang_quality_map = map((lambda x, y: (x, y)), lang_lst, quality_lst)
+                user_locals = [x[0] for x in sorted(lang_quality_map, key=itemgetter(1), reverse=True)]
+
+            if user_locals:
+                self.locale = user_locals[0]
+
+        return self
+
+    def generate_hash(self):
+        '''Generates a hashed value from user-specific properties.'''
+        tmpstr = "%s%s%s" % (self.user_agent, self.screen_resolution, self.screen_colour_depth)
+        return utils.generate_hash(tmpstr)
+
+    def generate_unique_id(self):
+        '''Generates a unique user ID from the current user-specific properties.'''
+        return ((utils.get_32bit_random_num() ^ self.generate_hash()) & 0x7fffffff)
+
+    def add_session(self, session):
+        '''
+        Updates the "previousVisitTime", "currentVisitTime" and "visitCount"
+        fields based on the given session object.
+        '''
+        start_time = session.start_time
+        if start_time != self.current_visit_time:
+            self.previous_visit_time = self.current_visit_time
+            self.current_visit_time = start_time
+            self.visit_count = self.visit_count + 1
diff --git a/libs/pyga/exceptions.py b/libs/pyga/exceptions.py
new file mode 100644
index 000000000..15e676c5d
--- /dev/null
+++ b/libs/pyga/exceptions.py
@@ -0,0 +1,2 @@
+class ValidationError(Exception):
+    pass
diff --git a/libs/pyga/requests.py b/libs/pyga/requests.py
new file mode 100644
index 000000000..f0a97b929
--- /dev/null
+++ b/libs/pyga/requests.py
@@ -0,0 +1,1039 @@
+# -*- coding: utf-8 -*-
+
+import logging
+import calendar
+from math import floor
+from pyga.entities import Campaign, CustomVariable, Event, Item, Page, Session, SocialInteraction, Transaction, Visitor
+import pyga.utils as utils
+import six
+
+__author__ = "Arun KR (kra3) <the1.arun@gmail.com>"
+__license__ = "Simplified BSD"
+__version__ = '2.5.1'
+
+logger = logging.getLogger(__name__)
+
+
+class Q(object):
+    REQ_ARRAY = []
+
+    def add_wrapped_request(self, req_wrapper):
+        self.REQ_ARRAY.append(req_wrapper)
+
+
+class GIFRequest(object):
+    '''
+
+    Properties:
+    type -- Indicates the type of request, will be mapped to "utmt" parameter
+    config -- base.Config object
+    x_forwarded_for --
+    user_agent -- User Agent String
+
+    '''
+    def __init__(self, config):
+        self.type = None
+        self.config = None
+        self.x_forwarded_for = None
+        self.user_agent = None
+        self.__Q = Q()
+        if isinstance(config, Config):
+            self.config = config
+
+    def build_http_request(self):
+        params = self.build_parameters()
+        query_string = six.moves.urllib.parse.urlencode(params.get_parameters())
+        query_string = query_string.replace('+', '%20')
+
+        # Mimic Javascript's encodeURIComponent() encoding for the query
+        # string just to be sure we are 100% consistent with GA's Javascript client
+        query_string = utils.convert_to_uri_component_encoding(query_string)
+
+        # Recent versions of ga.js use HTTP POST requests if the query string is too long
+        use_post = len(query_string) > 2036
+
+        if not use_post:
+            url = '%s?%s' % (self.config.endpoint, query_string)
+            post = None
+        else:
+            url = self.config.endpoint
+            post = query_string
+
+        headers = {}
+        headers['Host'] = self.config.endpoint.split('/')[2]
+        headers['User-Agent'] = self.user_agent
+        headers['X-Forwarded-For'] = self.x_forwarded_for and self.x_forwarded_for or ''
+
+        if use_post:
+            # Don't ask me why "text/plain", but ga.js says so :)
+            headers['Content-Type'] = 'text/plain'
+            headers['Content-Length'] = len(query_string)
+
+        logger.debug(url)
+        if post:
+            logger.debug(post)
+        return six.moves.urllib.request.Request(url, post, headers)
+
+    def build_parameters(self):
+        '''Marker implementation'''
+        return Parameters()
+
+    def __send(self):
+        request = self.build_http_request()
+        response = None
+
+        #  Do not actually send the request if endpoint host is set to null
+        if self.config.endpoint:
+            response = six.moves.urllib.request.urlopen(
+                request, timeout=self.config.request_timeout)
+
+        return response
+
+    def fire(self):
+        '''
+        Simply delegates to send() if config option "queue_requests" is disabled
+        else enqueues the request into Q object: you should call pyga.shutdowon
+        as last statement, to actually send out all queued requests.
+        '''
+        if self.config.queue_requests:
+            # Queuing results. You should call pyga.shutdown as last statement to send out requests.
+            self.__Q.add_wrapped_request((lambda: self.__send()))
+        else:
+            self.__send()
+
+
+class Request(GIFRequest):
+    TYPE_PAGE = None
+    TYPE_EVENT = 'event'
+    TYPE_TRANSACTION = 'tran'
+    TYPE_ITEM = 'item'
+    TYPE_SOCIAL = 'social'
+
+    '''
+    This type of request is deprecated in favor of encoding custom variables
+    within the "utme" parameter, but we include it here for completeness
+    '''
+    TYPE_CUSTOMVARIABLE = 'var'
+
+    X10_CUSTOMVAR_NAME_PROJECT_ID = 8
+    X10_CUSTOMVAR_VALUE_PROJCT_ID = 9
+    X10_CUSTOMVAR_SCOPE_PROJECT_ID = 11
+
+    def __init__(self, config, tracker, visitor, session):
+        super(Request, self).__init__(config)
+        self.tracker = tracker
+        self.visitor = visitor
+        self.session = session
+
+    def build_http_request(self):
+        self.x_forwarded_for = self.visitor.ip_address
+        self.user_agent = self.visitor.user_agent
+
+        # Increment session track counter for each request
+        self.session.track_count = self.session.track_count + 1
+
+        #http://code.google.com/intl/de-DE/apis/analytics/docs/tracking/eventTrackerGuide.html#implementationConsiderations
+        if self.session.track_count > 500:
+            logger.warning('Google Analytics does not guarantee to process more than 500 requests per session.')
+
+        if self.tracker.campaign:
+            self.tracker.campaign.response_count = self.tracker.campaign.response_count + 1
+
+        return super(Request, self).build_http_request()
+
+    def build_parameters(self):
+        params = Parameters()
+        params.utmac = self.tracker.account_id
+        params.utmhn = self.tracker.domain_name
+        params.utmt = self.get_type()
+        params.utmn = utils.get_32bit_random_num()
+        '''
+        The "utmip" parameter is only relevant if a mobile analytics ID
+        (MO-XXXXXX-X) was given
+        '''
+        params.utmip = self.visitor.ip_address
+        params.aip = self.tracker.config.anonimize_ip_address and 1 or None
+
+        # Add override User-Agent parameter (&ua) and override IP address
+        # parameter (&uip). Note that the override IP address parameter is
+        # always anonymized, as if &aip were present (see
+        # https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#uip)
+        params.ua = self.visitor.user_agent
+        params.uip = utils.anonymize_ip(self.visitor.ip_address)
+
+        if params.aip:
+            # If anonimization of ip enabled? then!
+            params.utmip = utils.anonymize_ip(params.utmip)
+
+        params.utmhid = self.session.session_id
+        params.utms = self.session.track_count
+        params = self.build_visitor_parameters(params)
+        params = self.build_custom_variable_parameters(params)
+        params = self.build_campaign_parameters(params)
+        params = self.build_cookie_parameters(params)
+        return params
+
+    def build_visitor_parameters(self, params):
+        if self.visitor.locale:
+            params.utmul = self.visitor.locale.replace('_', '-').lower()
+
+        if self.visitor.flash_version:
+            params.utmfl = self.visitor.flash_version
+
+        if self.visitor.java_enabled:
+            params.utje = self.visitor.java_enabled
+
+        if self.visitor.screen_colour_depth:
+            params.utmsc = '%s-bit' % (self.visitor.screen_colour_depth)
+
+        if self.visitor.screen_resolution:
+            params.utmsr = self.visitor.screen_resolution
+
+        return params
+
+    def build_custom_variable_parameters(self, params):
+        custom_vars = self.tracker.custom_variables
+
+        if custom_vars:
+            if len(custom_vars) > 5:
+                logger.warning('The sum of all custom variables cannot exceed 5 in any given request.')
+
+            x10 = X10()
+            x10.clear_key(self.X10_CUSTOMVAR_NAME_PROJECT_ID)
+            x10.clear_key(self.X10_CUSTOMVAR_VALUE_PROJCT_ID)
+            x10.clear_key(self.X10_CUSTOMVAR_SCOPE_PROJECT_ID)
+
+            for cvar in custom_vars.itervalues():
+                name = utils.encode_uri_components(cvar.name)
+                value = utils.encode_uri_components(cvar.value)
+                x10.set_key(
+                    self.X10_CUSTOMVAR_NAME_PROJECT_ID, cvar.index, name)
+                x10.set_key(
+                    self.X10_CUSTOMVAR_VALUE_PROJCT_ID, cvar.index, value)
+
+                if cvar.scope and cvar.scope != CustomVariable.SCOPE_PAGE:
+                    x10.set_key(self.X10_CUSTOMVAR_SCOPE_PROJECT_ID,
+                                cvar.index, cvar.scope)
+
+            params.utme = '%s%s' % (params.utme, x10.render_url_string())
+
+        return params
+
+    def build_campaign_parameters(self, params):
+        campaign = self.tracker.campaign
+        if campaign:
+            params._utmz = '%s.%s.%s.%s.' % (
+                self._generate_domain_hash(),
+                calendar.timegm(campaign.creation_time.timetuple()),
+                self.visitor.visit_count,
+                campaign.response_count,
+            )
+
+            param_map = {
+                'utmcid': campaign.id,
+                'utmcsr': campaign.source,
+                'utmgclid': campaign.g_click_id,
+                'utmdclid': campaign.d_click_id,
+                'utmccn': campaign.name,
+                'utmcmd': campaign.medium,
+                'utmctr': campaign.term,
+                'utmcct': campaign.content,
+            }
+
+            for k, v in param_map.iteritems():
+                if v:
+                    # Only spaces and pluses get escaped in gaforflash and ga.js, so we do the same
+                    params._utmz = '%s%s=%s%s' % (params._utmz, k,
+                                                  v.replace('+', '%20').replace(' ', '%20'),
+                                                  Campaign.CAMPAIGN_DELIMITER
+                                                  )
+
+            params._utmz = params._utmz.rstrip(Campaign.CAMPAIGN_DELIMITER)
+
+        return params
+
+    def build_cookie_parameters(self, params):
+        domain_hash = self._generate_domain_hash()
+        params._utma = "%s.%s.%s.%s.%s.%s" % (
+            domain_hash,
+            self.visitor.unique_id,
+            calendar.timegm(self.visitor.first_visit_time.timetuple()),
+            calendar.timegm(self.visitor.previous_visit_time.timetuple()),
+            calendar.timegm(self.visitor.current_visit_time.timetuple()),
+            self.visitor.visit_count
+        )
+        params._utmb = '%s.%s.10.%s' % (
+            domain_hash,
+            self.session.track_count,
+            calendar.timegm(self.session.start_time.timetuple()),
+        )
+        params._utmc = domain_hash
+        cookies = []
+        cookies.append('__utma=%s;' % params._utma)
+        if params._utmz:
+            cookies.append('__utmz=%s;' % params._utmz)
+        if params._utmv:
+            cookies.append('__utmv=%s;' % params._utmv)
+
+        params.utmcc = '+'.join(cookies)
+        return params
+
+    def _generate_domain_hash(self):
+        hash_val = 1
+        if self.tracker.allow_hash:
+            hash_val = utils.generate_hash(self.tracker.domain_name)
+
+        return hash_val
+
+
+class ItemRequest(Request):
+    def __init__(self, config, tracker, visitor, session, item):
+        super(ItemRequest, self).__init__(config, tracker, visitor, session)
+        self.item = item
+
+    def get_type(self):
+        return ItemRequest.TYPE_ITEM
+
+    def build_parameters(self):
+        params = super(ItemRequest, self).build_parameters()
+        params.utmtid = self.item.order_id
+        params.utmipc = self.item.sku
+        params.utmipn = self.item.name
+        params.utmiva = self.item.variation
+        params.utmipr = self.item.price
+        params.utmiqt = self.item.quantity
+        return params
+
+    def build_visitor_parameters(self, parameters):
+        '''
+        The GA Javascript client doesn't send any visitor information for
+        e-commerce requests, so we don't either.
+        '''
+        return parameters
+
+    def build_custom_variable_parameters(self, parameters):
+        '''
+        The GA Javascript client doesn't send any custom variables for
+        e-commerce requests, so we don't either.
+        '''
+        return parameters
+
+
+class PageViewRequest(Request):
+    X10_SITESPEED_PROJECT_ID = 14
+
+    def __init__(self, config, tracker, visitor, session, page):
+        super(
+            PageViewRequest, self).__init__(config, tracker, visitor, session)
+        self.page = page
+
+    def get_type(self):
+        return PageViewRequest.TYPE_PAGE
+
+    def build_parameters(self):
+        params = super(PageViewRequest, self).build_parameters()
+        params.utmp = self.page.path
+        params.utmdt = self.page.title
+
+        if self.page.charset:
+            params.utmcs = self.page.charset
+
+        if self.page.referrer:
+            params.utmr = self.page.referrer
+
+        if self.page.load_time:
+            if params.utmn % 100 < self.config.site_speed_sample_rate:
+                x10 = X10()
+                x10.clear_key(self.X10_SITESPEED_PROJECT_ID)
+                x10.clear_value(self.X10_SITESPEED_PROJECT_ID)
+
+                # from ga.js
+                key = max(min(floor(self.page.load_time / 100), 5000), 0) * 100
+                x10.set_key(
+                    self.X10_SITESPEED_PROJECT_ID, X10.OBJECT_KEY_NUM, key)
+                x10.set_value(self.X10_SITESPEED_PROJECT_ID,
+                              X10.VALUE_VALUE_NUM, self.page.load_time)
+                params.utme = '%s%s' % (params.utme, x10.render_url_string())
+
+        return params
+
+
+class EventRequest(Request):
+    X10_EVENT_PROJECT_ID = 5
+
+    def __init__(self, config, tracker, visitor, session, event):
+        super(EventRequest, self).__init__(config, tracker, visitor, session)
+        self.event = event
+
+    def get_type(self):
+        return EventRequest.TYPE_EVENT
+
+    def build_parameters(self):
+        params = super(EventRequest, self).build_parameters()
+        x10 = X10()
+        x10.clear_key(self.X10_EVENT_PROJECT_ID)
+        x10.clear_value(self.X10_EVENT_PROJECT_ID)
+        x10.set_key(self.X10_EVENT_PROJECT_ID, X10.OBJECT_KEY_NUM,
+                    self.event.category)
+        x10.set_key(
+            self.X10_EVENT_PROJECT_ID, X10.TYPE_KEY_NUM, self.event.action)
+
+        if self.event.label:
+            x10.set_key(self.X10_EVENT_PROJECT_ID,
+                        X10.LABEL_KEY_NUM, self.event.label)
+
+        if self.event.value:
+            x10.set_value(self.X10_EVENT_PROJECT_ID,
+                          X10.VALUE_VALUE_NUM, self.event.value)
+
+        params.utme = "%s%s" % (params.utme, x10.render_url_string())
+
+        if self.event.noninteraction:
+            params.utmni = 1
+
+        return params
+
+
+class SocialInteractionRequest(Request):
+    def __init__(self, config, tracker, visitor, session, social_interaction, page):
+        super(SocialInteractionRequest, self).__init__(config,
+                                                       tracker, visitor, session)
+        self.social_interaction = social_interaction
+        self.page = page
+
+    def get_type(self):
+        return SocialInteractionRequest.TYPE_SOCIAL
+
+    def build_parameters(self):
+        params = super(SocialInteractionRequest, self).build_parameters()
+
+        tmppagepath = self.social_interaction.target
+        if tmppagepath is None:
+            tmppagepath = self.page.path
+
+        params.utmsn = self.social_interaction.network
+        params.utmsa = self.social_interaction.action
+        params.utmsid = tmppagepath
+        return params
+
+
+class TransactionRequest(Request):
+    def __init__(self, config, tracker, visitor, session, transaction):
+        super(TransactionRequest, self).__init__(config, tracker,
+                                                 visitor, session)
+        self.transaction = transaction
+
+    def get_type(self):
+        return TransactionRequest.TYPE_TRANSACTION
+
+    def build_parameters(self):
+        params = super(TransactionRequest, self).build_parameters()
+        params.utmtid = self.transaction.order_id
+        params.utmtst = self.transaction.affiliation
+        params.utmtto = self.transaction.total
+        params.utmttx = self.transaction.tax
+        params.utmtsp = self.transaction.shipping
+        params.utmtci = self.transaction.city
+        params.utmtrg = self.transaction.state
+        params.utmtco = self.transaction.country
+        return params
+
+    def build_visitor_parameters(self, parameters):
+        '''
+        The GA Javascript client doesn't send any visitor information for
+        e-commerce requests, so we don't either.
+        '''
+        return parameters
+
+    def build_custom_variable_parameters(self, parameters):
+        '''
+        The GA Javascript client doesn't send any custom variables for
+        e-commerce requests, so we don't either.
+        '''
+        return parameters
+
+
+class Config(object):
+    '''
+    Configurations for Google Analytics: Server Side
+
+    Properties:
+    error_severity -- How strict should errors get handled? After all,
+        we do just do some tracking stuff here, and errors shouldn't
+        break an application's functionality in production.
+        RECOMMENDATION: Exceptions during deveopment, warnings in production.
+    queue_requests --  Whether to just queue all requests on HttpRequest.fire()
+        and actually send them on shutdown after all other tasks are done.
+        This has two advantages:
+        1) It effectively doesn't affect app performance
+        2) It can e.g. handle custom variables that were set after scheduling a request
+    fire_and_forget -- Whether to make asynchronous requests to GA without
+        waiting for any response (speeds up doing requests).
+    logging_callback -- Logging callback, registered via setLoggingCallback().
+        Will be fired whenever a request gets sent out and receives the
+        full HTTP request as the first and the full HTTP response
+        (or null if the "fireAndForget" option or simulation mode are used) as the 2nd argument.
+    request_timeout -- Seconds (float allowed) to wait until timeout when
+        connecting to the Google analytics endpoint host.
+    endpoint -- Google Analytics tracking request endpoint. Can be set to null to
+        silently simulate (and log) requests without actually sending them.
+    anonimize_ip_address -- Whether to anonymize IP addresses within Google Analytics
+        by stripping the last IP address block, will be mapped to "aip" parameter.
+    site_speed_sample_rate -- Defines a new sample set size (0-100) for
+        Site Speed data collection. By default, a fixed 1% sampling of your site
+        visitors make up the data pool from which the Site Speed metrics are derived.
+
+    '''
+    ERROR_SEVERITY_SILECE = 0
+    ERROR_SEVERITY_PRINT = 1
+    ERROR_SEVERITY_RAISE = 2
+
+    def __init__(self):
+        self.error_severity = Config.ERROR_SEVERITY_RAISE
+        self.queue_requests = False
+        # self.fire_and_forget = False      # not supported as of now
+        # self.logging_callback = False     # not supported as of now
+        self.request_timeout = 1
+        self.endpoint = 'http://www.google-analytics.com/__utm.gif'
+        self.anonimize_ip_address = False
+        self.site_speed_sample_rate = 1
+
+    def __setattr__(self, name, value):
+        if name == 'site_speed_sample_rate':
+            if value and (value < 0 or value > 100):
+                raise ValueError('For consistency with ga.js, sample rates must be specified as a number between 0 and 100.')
+        object.__setattr__(self, name, value)
+
+
+class Parameters(object):
+    '''
+    This simple class is mainly meant to be a well-documented overview
+    of all possible GA tracking parameters.
+
+    http://code.google.com/apis/analytics/docs/tracking/gaTrackingTroubleshooting.html#gifParameters
+
+    General Parameters:
+    utmwv -- Google Analytics client version
+    utmac -- Google Analytics account ID
+    utmhn -- Host Name
+    utmt -- Indicates the type of request, which is one of null (for page),
+            "event", "tran", "item", "social", "var" (deprecated) or "error"
+            (used by ga.js for internal client error logging).
+    utms -- Contains the amount of requests done in this session. Added in ga.js v4.9.2.
+    utmn -- Unique ID (random number) generated for each GIF request
+    utmcc -- Contains all cookie values, see below
+    utme -- Extensible Parameter, used for events and custom variables
+    utmni -- Event "non-interaction" parameter. By default, the event hit will impact a visitor's bounce rate.
+             By setting this parameter to 1, this event hit will not be used in bounce rate calculations.
+    aip -- Whether to anonymize IP addresses within Google Analytics by stripping the last IP address block, either null or 1
+    utmu --  Used for GA-internal statistical client function usage and error tracking,
+             not implemented in php-ga as of now, but here for documentation completeness.
+             http://glucik.blogspot.com/2011/02/utmu-google-analytics-request-parameter.html
+
+    Page Parameters:
+    utmp -- Page request URI
+    utmdt -- Page title
+    utmcs -- Charset encoding (default "-")
+    utmr -- Referer URL (default "-" or "0" for internal purposes)
+
+    Visitor Parameters:
+    utmip -- IP Address of the end user, found in GA for Mobile examples, but sadly seems to be ignored in normal GA use
+    utmul -- Visitor's locale string (all lower-case, country part optional)
+    utmfl -- Visitor's Flash version (default "-")
+    utmje -- Visitor's Java support, either 0 or 1 (default "-")
+    utmsc -- Visitor's screen color depth
+    utmsr -- Visitor's screen resolution
+    _utma -- Visitor tracking cookie parameter.
+
+    Session Parameters:
+    utmhid -- Hit id for revenue per page tracking for AdSense, a random per-session ID
+    _utmb -- Session timeout cookie parameter.
+    _utmc -- Session tracking cookie parameter.
+    utmipc -- Product Code. This is the sku code for a given product.
+    utmipn -- Product Name
+    utmipr -- Unit Price. Value is set to numbers only.
+    utmiqt -- Unit Quantity.
+    utmiva -- Variations on an item.
+    utmtid -- Order ID.
+    utmtst -- Affiliation
+    utmtto -- Total Cost
+    utmttx -- Tax Cost
+    utmtsp -- Shipping Cost
+    utmtci -- Billing City
+    utmtrg -- Billing Region
+    utmtco -- Billing Country
+
+    Campaign Parameters:
+    utmcn -- Starts a new campaign session. Either utmcn or utmcr is present on any given request,
+             but never both at the same time. Changes the campaign tracking data;
+             but does not start a new session. Either 1 or not set.
+             Found in gaforflash but not in ga.js, so we do not use it,
+             but it will stay here for documentation completeness.
+    utmcr -- Indicates a repeat campaign visit. This is set when any subsequent clicks occur on the
+             same link. Either utmcn or utmcr is present on any given request,
+             but never both at the same time. Either 1 or not set.
+             Found in gaforflash but not in ga.js, so we do not use it,
+             but it will stay here for documentation completeness.
+    utmcid -- Campaign ID, a.k.a. "utm_id" query parameter for ga.js
+    utmcsr -- Source, a.k.a. "utm_source" query parameter for ga.js
+    utmgclid -- Google AdWords Click ID, a.k.a. "gclid" query parameter for ga.js
+    utmdclid -- Not known for sure, but expected to be a DoubleClick Ad Click ID.
+    utmccn -- Name, a.k.a. "utm_campaign" query parameter for ga.js
+    utmcmd -- Medium, a.k.a. "utm_medium" query parameter for ga.js
+    utmctr -- Terms/Keywords, a.k.a. "utm_term" query parameter for ga.js
+    utmcct -- Ad Content Description, a.k.a. "utm_content" query parameter for ga.js
+    utmcvr -- Unknown so far. Found in ga.js.
+    _utmz -- Campaign tracking cookie parameter.
+
+    Social Tracking Parameters:
+    utmsn -- The network on which the action occurs
+    utmsa -- The type of action that happens
+    utmsid -- The page URL from which the action occurred.
+
+    Google Website Optimizer (GWO) parameters:
+    _utmx -- Website Optimizer cookie parameter.
+
+    Custom Variables parameters (deprecated):
+    _utmv -- Deprecated custom variables cookie parameter.
+
+    '''
+
+    def __init__(self):
+        # General Parameters
+        self.utmwv = Tracker.VERSION
+        self.utmac = ''
+        self.utmhn = ''
+        self.utmt = ''
+        self.utms = ''
+        self.utmn = ''
+        self.utmcc = ''
+        self.utme = ''
+        self.utmni = ''
+        self.aip = ''
+        self.utmu = ''
+
+        # Page Parameters
+        self.utmp = ''
+        self.utmdt = ''
+        self.utmcs = '-'
+        self.utmr = '-'
+
+        # Visitor Parameters
+        self.utmip = ''
+        self.utmul = ''
+        self.utmfl = '-'
+        self.utmje = '-'
+        self.utmsc = ''
+        self.utmsr = ''
+        '''
+        Visitor tracking cookie __utma
+
+         This cookie is typically written to the browser upon the first
+         visit to your site from that web browser. If the cookie has been
+         deleted by the browser operator, and the browser subsequently
+         visits your site, a new __utma cookie is written with a different unique ID.
+
+         This cookie is used to determine unique visitors to your site and
+         it is updated with each page view. Additionally, this cookie is
+         provided with a unique ID that Google Analytics uses to ensure both the
+         validity and accessibility of the cookie as an extra security measure.
+
+        Expiration: 2 years from set/update.
+        Format: __utma=<domainHash>.<uniqueId>.<firstTime>.<lastTime>.<currentTime>.<sessionCount>
+        '''
+        self._utma = ''
+
+        # Session Parameters
+        self.utmhid = ''
+        '''
+        Session timeout cookie parameter __utmb
+
+        Will never be sent with requests, but stays here for documentation completeness.
+
+        This cookie is used to establish and continue a user session with your site.
+        When a user views a page on your site, the Google Analytics code attempts to update this cookie.
+        If it does not find the cookie, a new one is written and a new session is established.
+
+        Each time a user visits a different page on your site, this cookie is updated to expire in 30 minutes,
+        thus continuing a single session for as long as user activity continues within 30-minute intervals.
+
+        This cookie expires when a user pauses on a page on your site for longer than 30 minutes.
+        You can modify the default length of a user session with the setSessionTimeout() method.
+
+        Expiration: 30 minutes from set/update.
+
+        Format: __utmb=<domainHash>.<trackCount>.<token>.<lastTime>
+
+        '''
+        self._utmb = ''
+        '''
+        Session tracking cookie parameter __utmc
+
+        Will never be sent with requests, but stays here for documentation completeness.
+
+        This cookie operates in conjunction with the __utmb cookie to
+        determine whether or not to establish a new session for the user.
+        In particular, this cookie is not provided with an expiration date,
+        so it expires when the user exits the browser.
+
+        Should a user visit your site, exit the browser and then return to your website within 30 minutes,
+        the absence of the __utmc cookie indicates that a new session needs to be established,
+        despite the fact that the __utmb cookie has not yet expired.
+
+        Expiration: Not set.
+
+        Format: __utmc=<domainHash>
+
+        '''
+        self._utmc = ''
+        self.utmipc = ''
+        self.utmipn = ''
+        self.utmipr = ''
+        self.utmiqt = ''
+        self.utmiva = ''
+        self.utmtid = ''
+        self.utmtst = ''
+        self.utmtto = ''
+        self.utmttx = ''
+        self.utmtsp = ''
+        self.utmtci = ''
+        self.utmtrg = ''
+        self.utmtco = ''
+
+        # Campaign Parameters
+        self.utmcn = ''
+        self.utmcr = ''
+        self.utmcid = ''
+        self.utmcsr = ''
+        self.utmgclid = ''
+        self.utmdclid = ''
+        self.utmccn = ''
+        self.utmcmd = ''
+        self.utmctr = ''
+        self.utmcct = ''
+        self.utmcvr = ''
+        '''
+        Campaign tracking cookie parameter.
+
+        This cookie stores the type of referral used by the visitor to reach your site,
+        whether via a direct method, a referring link, a website search, or a campaign such as an ad or an email link.
+
+        It is used to calculate search engine traffic, ad campaigns and page navigation within your own site.
+        The cookie is updated with each page view to your site.
+
+        Expiration: 6 months from set/update.
+
+        Format: __utmz=<domainHash>.<campaignCreation>.<campaignSessions>.<responseCount>.<campaignTracking>
+
+        '''
+        self._utmz = ''
+
+        # Social Tracking Parameters
+        self.utmsn = ''
+        self.utmsa = ''
+        self.utmsid = ''
+
+        # Google Website Optimizer (GWO) parameters
+        '''
+        Website Optimizer cookie parameter.
+
+        This cookie is used by Website Optimizer and only set when Website
+        Optimizer is used in combination with GA.
+        See the Google Website Optimizer Help Center for details.
+
+        Expiration: 2 years from set/update.
+        '''
+        self._utmx = ''
+
+        # Custom Variables parameters (deprecated)
+        '''
+        Deprecated custom variables cookie parameter.
+
+        This cookie parameter is no longer relevant as of migration from setVar() to
+        setCustomVar() and hence not supported by this library,
+        but will stay here for documentation completeness.
+
+        The __utmv cookie passes the information provided via the setVar() method,
+        which you use to create a custom user segment.
+
+        Expiration: 2 years from set/update.
+
+        Format: __utmv=<domainHash>.<value>
+
+        '''
+        self._utmv = ''
+
+    def get_parameters(self):
+        '''
+        Get all gif request parameters out of the class in a dict form.
+        Attributes starting with _ are cookie names, so we dont need them.
+        '''
+        params = {}
+        attribs = vars(self)
+        for attr in attribs:
+            if attr[0] != '_':
+                val = getattr(self, attr)
+                if val:
+                    params[attr] = val
+
+        return params
+
+
+class Tracker(object):
+    '''
+    Act like a Manager of all files
+
+    Properties:
+    account_id -- Google Analytics account ID, will be mapped to "utmac" parameter
+    domain_name -- Host Name, will be mapped to "utmhn" parameter
+    allow_hash --  Whether to generate a unique domain hash,
+                   default is true to be consistent with the GA Javascript Client
+    custom_variables -- CustomVariable instances
+    campaign -- Campaign instance
+    '''
+
+    '''
+    Google Analytics client version on which this library is built upon,
+    will be mapped to "utmwv" parameter.
+
+    This doesn't necessarily mean that all features of the corresponding
+    ga.js version are implemented but rather that the requests comply
+    with these of ga.js.
+
+    http://code.google.com/apis/analytics/docs/gaJS/changelog.html
+    '''
+    VERSION = '5.3.0'
+    config = Config()
+
+    def __init__(self, account_id='', domain_name='', conf=None):
+        self.account_id = account_id
+        self.domain_name = domain_name
+        self.allow_hash = True
+        self.custom_variables = {}
+        self.campaign = None
+        if isinstance(conf, Config):
+            Tracker.config = conf
+
+    def __setattr__(self, name, value):
+        if name == 'account_id':
+            if value and not utils.is_valid_google_account(value):
+                raise ValueError(
+                    'Given Google Analytics account ID is not valid')
+
+        elif name == 'campaign':
+            if isinstance(value, Campaign):
+                value.validate()
+            else:
+                value = None
+
+        object.__setattr__(self, name, value)
+
+    def add_custom_variable(self, custom_var):
+        '''
+        Equivalent of _setCustomVar() in GA Javascript client
+        http://code.google.com/apis/analytics/docs/tracking/gaTrackingCustomVariables.html
+        '''
+        if not isinstance(custom_var, CustomVariable):
+            return
+
+        custom_var.validate()
+        index = custom_var.index
+        self.custom_variables[index] = custom_var
+
+    def remove_custom_variable(self, index):
+        '''Equivalent of _deleteCustomVar() in GA Javascript client.'''
+        if index in self.custom_variables:
+            del self.custom_variables[index]
+
+    def track_pageview(self, page, session, visitor):
+        '''Equivalent of _trackPageview() in GA Javascript client.'''
+        params = {
+            'config': self.config,
+            'tracker': self,
+            'visitor': visitor,
+            'session': session,
+            'page': page,
+        }
+        request = PageViewRequest(**params)
+        request.fire()
+
+    def track_event(self, event, session, visitor):
+        '''Equivalent of _trackEvent() in GA Javascript client.'''
+        event.validate()
+
+        params = {
+            'config': self.config,
+            'tracker': self,
+            'visitor': visitor,
+            'session': session,
+            'event': event,
+        }
+        request = EventRequest(**params)
+        request.fire()
+
+    def track_transaction(self, transaction, session, visitor):
+        '''Combines _addTrans(), _addItem() (indirectly) and _trackTrans() of GA Javascript client.'''
+        transaction.validate()
+
+        params = {
+            'config': self.config,
+            'tracker': self,
+            'visitor': visitor,
+            'session': session,
+            'transaction': transaction,
+        }
+        request = TransactionRequest(**params)
+        request.fire()
+
+        for item in transaction.items:
+            item.validate()
+
+            params = {
+                'config': self.config,
+                'tracker': self,
+                'visitor': visitor,
+                'session': session,
+                'item': item,
+            }
+            request = ItemRequest(**params)
+            request.fire()
+
+    def track_social(self, social_interaction, page, session, visitor):
+        '''Equivalent of _trackSocial() in GA Javascript client.'''
+        params = {
+            'config': self.config,
+            'tracker': self,
+            'visitor': visitor,
+            'session': session,
+            'social_interaction': social_interaction,
+            'page': page,
+        }
+        request = SocialInteractionRequest(**params)
+        request.fire()
+
+
+class X10(object):
+    __KEY = 'k'
+    __VALUE = 'v'
+    __DELIM_BEGIN = '('
+    __DELIM_END = ')'
+    __DELIM_SET = '*'
+    __DELIM_NUM_VALUE = '!'
+    __ESCAPE_CHAR_MAP = {
+        "'": "'0",
+        ')': "'1",
+        '*': "'2",
+        '!': "'3",
+    }
+    __MINIMUM = 1
+
+    OBJECT_KEY_NUM = 1
+    TYPE_KEY_NUM = 2
+    LABEL_KEY_NUM = 3
+    VALUE_VALUE_NUM = 1
+
+    def __init__(self):
+        self.project_data = {}
+
+    def has_project(self, project_id):
+        return project_id in self.project_data
+
+    def set_key(self, project_id, num, value):
+        self.__set_internal(project_id, X10.__KEY, num, value)
+
+    def get_key(self, project_id, num):
+        return self.__get_internal(project_id, X10.__KEY, num)
+
+    def clear_key(self, project_id):
+        self.__clear_internal(project_id, X10.__KEY)
+
+    def set_value(self, project_id, num, value):
+        self.__set_internal(project_id, X10.__VALUE, num, value)
+
+    def get_value(self, project_id, num):
+        return self.__get_internal(project_id, X10.__VALUE, num)
+
+    def clear_value(self, project_id):
+        self.__clear_internal(project_id, X10.__VALUE)
+
+    def __set_internal(self, project_id, _type, num, value):
+        '''Shared internal implementation for setting an X10 data type.'''
+        if project_id not in self.project_data:
+            self.project_data[project_id] = {}
+
+        if _type not in self.project_data[project_id]:
+            self.project_data[project_id][_type] = {}
+
+        self.project_data[project_id][_type][num] = value
+
+    def __get_internal(self, project_id, _type, num):
+        ''' Shared internal implementation for getting an X10 data type.'''
+        if num in self.project_data.get(project_id, {}).get(_type, {}):
+            return self.project_data[project_id][_type][num]
+        return None
+
+    def __clear_internal(self, project_id, _type):
+        '''
+        Shared internal implementation for clearing all X10 data
+        of a type from a certain project.
+        '''
+        if project_id in self.project_data and _type in self.project_data[project_id]:
+            del self.project_data[project_id][_type]
+
+    def __escape_extensible_value(self, value):
+        '''Escape X10 string values to remove ambiguity for special characters.'''
+        def _translate(char):
+            try:
+                return self.__ESCAPE_CHAR_MAP[char]
+            except KeyError:
+                return char
+
+        return u''.join(map(_translate, value)).encode('utf-8', 'ignore')
+
+    def __render_data_type(self, data):
+        '''Given a data array for a certain type, render its string encoding.'''
+        result = []
+        last_indx = 0
+
+        for indx, entry in sorted(data.items()):
+            if entry:
+                tmpstr = ''
+
+                # Check if we need to append the number. If the last number was
+                # outputted, or if this is the assumed minimum, then we don't.
+                if indx != X10.__MINIMUM and indx - 1 != last_indx:
+                    tmpstr = '%s%s%s' % (tmpstr, indx, X10.__DELIM_NUM_VALUE)
+
+                tmpstr = '%s%s' % (
+                    tmpstr, self.__escape_extensible_value(entry))
+                result.append(tmpstr)
+
+            last_indx = indx
+
+        return "%s%s%s" % (X10.__DELIM_BEGIN, X10.__DELIM_SET.join(result), X10.__DELIM_END)
+
+    def __render_project(self, project):
+        '''Given a project array, render its string encoding.'''
+        result = ''
+        need_type_qualifier = False
+
+        for val in X10.__KEY, X10.__VALUE:
+            if val in project:
+                data = project[val]
+                if need_type_qualifier:
+                    result = '%s%s' % (result, val)
+
+                result = '%s%s' % (result, self.__render_data_type(data))
+                need_type_qualifier = False
+            else:
+                need_type_qualifier = True
+
+        return result
+
+    def render_url_string(self):
+        result = ''
+        for project_id, project in self.project_data.iteritems():
+            result = '%s%s%s' % (
+                result, project_id, self.__render_project(project))
+
+        return result
diff --git a/libs/pyga/utils.py b/libs/pyga/utils.py
new file mode 100644
index 000000000..67249762e
--- /dev/null
+++ b/libs/pyga/utils.py
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+import logging
+from random import randint
+import re
+import six
+import os
+from datetime import datetime
+
+__author__ = "Arun KR (kra3) <the1.arun@gmail.com>"
+__license__ = "Simplified BSD"
+
+RE_IP = re.compile(r'^[\d+]{1,3}\.[\d+]{1,3}\.[\d+]{1,3}\.[\d+]{1,3}$', re.I)
+RE_PRIV_IP = re.compile(r'^(?:127\.0\.0\.1|10\.|192\.168\.|172\.(?:1[6-9]|2[0-9]|3[0-1])\.)')
+RE_LOCALE = re.compile(r'(^|\s*,\s*)([a-zA-Z]{1,8}(-[a-zA-Z]{1,8})*)\s*(;\s*q\s*=\s*(1(\.0{0,3})?|0(\.[0-9]{0,3})))?', re.I)
+RE_GA_ACCOUNT_ID = re.compile(r'^(UA|MO)-[0-9]*-[0-9]*$')
+RE_FIRST_THREE_OCTETS_OF_IP = re.compile(r'^((\d{1,3}\.){3})\d{1,3}$')
+
+def convert_ga_timestamp(timestamp_string):
+    timestamp = float(timestamp_string)
+    if timestamp > ((2 ** 31) - 1):
+        timestamp /= 1000
+    return datetime.utcfromtimestamp(timestamp)
+
+def get_32bit_random_num():
+    return randint(0, 0x7fffffff)
+
+def is_valid_ip(ip):
+    return True if RE_IP.match(str(ip)) else False
+
+def is_private_ip(ip):
+    return True if RE_PRIV_IP.match(str(ip)) else False
+
+def validate_locale(locale):
+    return RE_LOCALE.findall(str(locale))
+
+def is_valid_google_account(account):
+    return True if RE_GA_ACCOUNT_ID.match(str(account)) else False
+
+def generate_hash(tmpstr):
+    hash_val = 1
+
+    if tmpstr:
+        hash_val = 0
+        for ordinal in map(ord, tmpstr[::-1]):
+            hash_val = ((hash_val << 6) & 0xfffffff) + ordinal + (ordinal << 14)
+            left_most_7 = hash_val & 0xfe00000
+            if left_most_7 != 0:
+                hash_val ^= left_most_7 >> 21
+
+    return hash_val
+
+def anonymize_ip(ip):
+    if ip:
+        match = RE_FIRST_THREE_OCTETS_OF_IP.findall(str(ip))
+        if match:
+            return '%s%s' % (match[0][0], '0')
+
+    return ''
+
+def encode_uri_components(value):
+    '''Mimics Javascript's encodeURIComponent() function for consistency with the GA Javascript client.'''
+    return convert_to_uri_component_encoding(six.moves.urllib.parse.quote(value))
+
+def convert_to_uri_component_encoding(value):
+    return value.replace('%21', '!').replace('%2A', '*').replace('%27', "'").replace('%28', '(').replace('%29', ')')
+
+# Taken from expicient.com BJs repo.
+def stringify(s, stype=None, fn=None):
+    ''' Converts elements of a complex data structure to strings
+
+    The data structure can be a multi-tiered one - with tuples and lists etc
+    This method will loop through each and convert everything to string.
+    For example - it can be -
+    [[{'a1': {'a2': {'a3': ('a4', timedelta(0, 563)), 'a5': {'a6': datetime()}}}}]]
+    which will be converted to -
+    [[{'a1': {'a2': {'a3': ('a4', '0:09:23'), 'a5': {'a6': '2009-05-27 16:19:52.401500' }}}}]]
+
+    @param stype: If only one type of data element needs to be converted to
+        string without affecting others, stype can be used.
+        In the earlier example, if it is called with stringify(s, stype=datetime.timedelta)
+        the result would be
+        [[{'a1': {'a2': {'a3': ('a4', '0:09:23'), 'a5': {'a6': datetime() }}}}]]
+
+    Also, even though the name is stringify, any function can be run on it, based on
+    parameter fn. If fn is None, it will be stringified.
+
+    '''
+
+    if type(s) in [list, set, dict, tuple]:
+        if isinstance(s, dict):
+            for k in s:
+                s[k] = stringify(s[k], stype, fn)
+        elif type(s) in [list, set]:
+            for i, k in enumerate(s):
+                s[i] = stringify(k, stype, fn)
+        else: #tuple
+            tmp = []
+            for k in s:
+                tmp.append(stringify(k, stype, fn))
+            s = tuple(tmp)
+    else:
+        if fn:
+            if not stype or (stype == type(s)):
+                return fn(s)
+        else:
+            # To do str(s). But, str() can fail on unicode. So, use .encode instead
+            if not stype or (stype == type(s)):
+                try:
+                    return six.text_type(s)
+                    #return s.encode('ascii', 'replace')
+                except AttributeError:
+                    return str(s)
+                except UnicodeDecodeError:
+                    return s.decode('ascii', 'replace')
+    return s
diff --git a/libs/pysubs2/__init__.py b/libs/pysubs2/__init__.py
new file mode 100644
index 000000000..55ec2ede5
--- /dev/null
+++ b/libs/pysubs2/__init__.py
@@ -0,0 +1,12 @@
+from .ssafile import SSAFile
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from . import time, formats, cli
+from .exceptions import *
+from .common import Color, VERSION
+
+#: Alias for :meth:`SSAFile.load()`.
+load = SSAFile.load
+
+#: Alias for :meth:`pysubs2.time.make_time()`.
+make_time = time.make_time
diff --git a/libs/pysubs2/__main__.py b/libs/pysubs2/__main__.py
new file mode 100644
index 000000000..60c863896
--- /dev/null
+++ b/libs/pysubs2/__main__.py
@@ -0,0 +1,7 @@
+import sys
+from .cli import Pysubs2CLI
+
+if __name__ == "__main__":
+    cli = Pysubs2CLI()
+    rv = cli(sys.argv[1:])
+    sys.exit(rv)
diff --git a/libs/pysubs2/cli.py b/libs/pysubs2/cli.py
new file mode 100644
index 000000000..f28cfcba6
--- /dev/null
+++ b/libs/pysubs2/cli.py
@@ -0,0 +1,165 @@
+from __future__ import unicode_literals, print_function
+import argparse
+import codecs
+import os
+import re
+import os.path as op
+import io
+from io import open
+import sys
+from textwrap import dedent
+from .formats import get_file_extension
+from .time import make_time
+from .ssafile import SSAFile
+from .common import PY3, VERSION
+
+
+def positive_float(s):
+    x = float(s)
+    if not x > 0:
+        raise argparse.ArgumentTypeError("%r is not a positive number" % s)
+    return x
+
+def character_encoding(s):
+    try:
+        codecs.lookup(s)
+        return s
+    except LookupError:
+        raise argparse.ArgumentError
+
+def time(s):
+    d = {}
+    for v, k in re.findall(r"(\d*\.?\d*)(ms|m|s|h)", s):
+        d[k] = float(v)
+    return make_time(**d)
+
+
+def change_ext(path, ext):
+    base, _ = op.splitext(path)
+    return base + ext
+
+
+class Pysubs2CLI(object):
+    def __init__(self):
+        parser = self.parser = argparse.ArgumentParser(formatter_class=argparse.RawDescriptionHelpFormatter,
+                                                       prog="pysubs2",
+                                                       description=dedent("""
+                                                       The pysubs2 CLI for processing subtitle files.
+                                                       https://github.com/tkarabela/pysubs2
+                                                       """),
+                                                       epilog=dedent("""
+                                                       usage examples:
+                                                         python -m pysubs2 --to srt *.ass
+                                                         python -m pysubs2 --to microdvd --fps 23.976 *.ass
+                                                         python -m pysubs2 --shift 0.3s *.srt
+                                                         python -m pysubs2 --shift 0.3s <my_file.srt >retimed_file.srt
+                                                         python -m pysubs2 --shift-back 0.3s --output-dir retimed *.srt
+                                                         python -m pysubs2 --transform-framerate 25 23.976 *.srt"""))
+
+        parser.add_argument("files", nargs="*", metavar="FILE",
+                            help="Input subtitle files. Can be in SubStation Alpha (*.ass, *.ssa), SubRip (*.srt) or "
+                                 "MicroDVD (*.sub) formats. When no files are specified, pysubs2 will work as a pipe, "
+                                 "reading from standard input and writing to standard output.")
+
+        parser.add_argument("-v", "--version", action="version", version="pysubs2 %s" % VERSION)
+
+        parser.add_argument("-f", "--from", choices=["ass", "ssa", "srt", "microdvd", "json"], dest="input_format",
+                            help="By default, subtitle format is detected from the file. This option can be used to "
+                                 "skip autodetection and force specific format. Generally, it should never be needed.")
+        parser.add_argument("-t", "--to", choices=["ass", "ssa", "srt", "microdvd", "json"], dest="output_format",
+                            help="Convert subtitle files to given format. By default, each file is saved in its "
+                                 "original format.")
+        parser.add_argument("--input-enc", metavar="ENCODING", default="iso-8859-1", type=character_encoding,
+                            help="Character encoding for input files. By default, ISO-8859-1 is used for both "
+                                 "input and output, which should generally work (for 8-bit encodings).")
+        parser.add_argument("--output-enc", metavar="ENCODING", type=character_encoding,
+                            help="Character encoding for output files. By default, it is the same as input encoding. "
+                                 "If you wish to convert between encodings, make sure --input-enc is set correctly! "
+                                 "Otherwise, your output files will probably be corrupted. It's a good idea to "
+                                 "back up your files or use the -o option.")
+        parser.add_argument("--fps", metavar="FPS", type=positive_float,
+                            help="This argument specifies framerate for MicroDVD files. By default, framerate "
+                                 "is detected from the file. Use this when framerate specification is missing "
+                                 "or to force different framerate.")
+        parser.add_argument("-o", "--output-dir", metavar="DIR",
+                            help="Use this to save all files to given directory. By default, every file is saved to its parent directory, "
+                                 "ie. unless it's being saved in different subtitle format (and thus with different file extension), "
+                                 "it overwrites the original file.")
+
+        group = parser.add_mutually_exclusive_group()
+
+        group.add_argument("--shift", metavar="TIME", type=time,
+                           help="Delay all subtitles by given time amount. Time is specified like this: '1m30s', '0.5s', ...")
+        group.add_argument("--shift-back", metavar="TIME", type=time,
+                           help="The opposite of --shift (subtitles will appear sooner).")
+        group.add_argument("--transform-framerate", nargs=2, metavar=("FPS1", "FPS2"), type=positive_float,
+                           help="Multiply all timestamps by FPS1/FPS2 ratio.")
+
+    def __call__(self, argv):
+        try:
+            self.main(argv)
+        except KeyboardInterrupt:
+            exit("\nAborted by user.")
+
+    def main(self, argv):
+        args = self.parser.parse_args(argv)
+        errors = 0
+
+        if args.output_dir and not op.exists(args.output_dir):
+            os.makedirs(args.output_dir)
+
+        if args.output_enc is None:
+            args.output_enc = args.input_enc
+
+        if args.files:
+            for path in args.files:
+                if not op.exists(path):
+                    print("Skipping", path, "(does not exist)")
+                    errors += 1
+                elif not op.isfile(path):
+                    print("Skipping", path, "(not a file)")
+                    errors += 1
+                else:
+                    with open(path, encoding=args.input_enc) as infile:
+                        subs = SSAFile.from_file(infile, args.input_format, args.fps)
+
+                    self.process(subs, args)
+
+                    if args.output_format is None:
+                        outpath = path
+                        output_format = subs.format
+                    else:
+                        ext = get_file_extension(args.output_format)
+                        outpath = change_ext(path, ext)
+                        output_format = args.output_format
+
+                    if args.output_dir is not None:
+                        _, filename = op.split(outpath)
+                        outpath = op.join(args.output_dir, filename)
+
+                    with open(outpath, "w", encoding=args.output_enc) as outfile:
+                        subs.to_file(outfile, output_format, args.fps)
+        else:
+            if PY3:
+                infile = io.TextIOWrapper(sys.stdin.buffer, args.input_enc)
+                outfile = io.TextIOWrapper(sys.stdout.buffer, args.output_enc)
+            else:
+                infile = io.TextIOWrapper(sys.stdin, args.input_enc)
+                outfile = io.TextIOWrapper(sys.stdout, args.output_enc)
+
+            subs = SSAFile.from_file(infile, args.input_format, args.fps)
+            self.process(subs, args)
+            output_format = args.output_format or subs.format
+            subs.to_file(outfile, output_format, args.fps)
+
+        return (0 if errors == 0 else 1)
+
+    @staticmethod
+    def process(subs, args):
+        if args.shift is not None:
+            subs.shift(ms=args.shift)
+        elif args.shift_back is not None:
+            subs.shift(ms=-args.shift_back)
+        elif args.transform_framerate is not None:
+            in_fps, out_fps = args.transform_framerate
+            subs.transform_framerate(in_fps, out_fps)
diff --git a/libs/pysubs2/common.py b/libs/pysubs2/common.py
new file mode 100644
index 000000000..08738eb5c
--- /dev/null
+++ b/libs/pysubs2/common.py
@@ -0,0 +1,28 @@
+from collections import namedtuple
+import sys
+
+_Color = namedtuple("Color", "r g b a")
+
+class Color(_Color):
+    """
+    (r, g, b, a) namedtuple for 8-bit RGB color with alpha channel.
+
+    All values are ints from 0 to 255.
+    """
+    def __new__(cls, r, g, b, a=0):
+        for value in r, g, b, a:
+            if value not in range(256):
+                raise ValueError("Color channels must have values 0-255")
+
+        return _Color.__new__(cls, r, g, b, a)
+
+#: Version of the pysubs2 library.
+VERSION = "0.2.1"
+
+
+PY3 = sys.version_info.major == 3
+
+if PY3:
+    text_type = str
+else:
+    text_type = unicode
diff --git a/libs/pysubs2/exceptions.py b/libs/pysubs2/exceptions.py
new file mode 100644
index 000000000..e0c9312fb
--- /dev/null
+++ b/libs/pysubs2/exceptions.py
@@ -0,0 +1,14 @@
+class Pysubs2Error(Exception):
+    """Base class for pysubs2 exceptions."""
+
+class UnknownFPSError(Pysubs2Error):
+    """Framerate was not specified and couldn't be inferred otherwise."""
+
+class UnknownFileExtensionError(Pysubs2Error):
+    """File extension does not pertain to any known subtitle format."""
+
+class UnknownFormatIdentifierError(Pysubs2Error):
+    """Unknown subtitle format identifier (ie. string like ``"srt"``)."""
+
+class FormatAutodetectionError(Pysubs2Error):
+    """Subtitle format is ambiguous or unknown."""
diff --git a/libs/pysubs2/formatbase.py b/libs/pysubs2/formatbase.py
new file mode 100644
index 000000000..1f336618a
--- /dev/null
+++ b/libs/pysubs2/formatbase.py
@@ -0,0 +1,76 @@
+class FormatBase(object):
+    """
+    Base class for subtitle format implementations.
+
+    How to implement a new subtitle format:
+
+    1. Create a subclass of FormatBase and override the methods you want to support.
+    2. Decide on a format identifier, like the ``"srt"`` or ``"microdvd"`` already used in the library.
+    3. Add your identifier and class to :data:`pysubs2.formats.FORMAT_IDENTIFIER_TO_FORMAT_CLASS`.
+    4. (optional) Add your file extension and class to :data:`pysubs2.formats.FILE_EXTENSION_TO_FORMAT_IDENTIFIER`.
+
+    After finishing these steps, you can call :meth:`SSAFile.load()` and :meth:`SSAFile.save()` with your
+    format, including autodetection from content and file extension (if you provided these).
+
+    """
+    @classmethod
+    def from_file(cls, subs, fp, format_, **kwargs):
+        """
+        Load subtitle file into an empty SSAFile.
+
+        If the parser autodetects framerate, set it as ``subs.fps``.
+
+        Arguments:
+            subs (SSAFile): An empty :class:`SSAFile`.
+            fp (file object): Text file object, the subtitle file.
+            format_ (str): Format identifier. Used when one format class
+                implements multiple formats (see :class:`SubstationFormat`).
+            kwargs: Extra options, eg. `fps`.
+
+        Returns:
+            None
+
+        Raises:
+            pysubs2.exceptions.UnknownFPSError: Framerate was not provided and cannot
+                be detected.
+        """
+        raise NotImplementedError("Parsing is not supported for this format")
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, **kwargs):
+        """
+        Write SSAFile into a file.
+
+        If you need framerate and it is not passed in keyword arguments,
+        use ``subs.fps``.
+
+        Arguments:
+            subs (SSAFile): Subtitle file to write.
+            fp (file object): Text file object used as output.
+            format_ (str): Format identifier of desired output format.
+                Used when one format class implements multiple formats
+                (see :class:`SubstationFormat`).
+            kwargs: Extra options, eg. `fps`.
+
+        Returns:
+            None
+
+        Raises:
+            pysubs2.exceptions.UnknownFPSError: Framerate was not provided and
+                ``subs.fps is None``.
+        """
+        raise NotImplementedError("Writing is not supported for this format")
+
+    @classmethod
+    def guess_format(self, text):
+        """
+        Return format identifier of recognized format, or None.
+
+        Arguments:
+            text (str): Content of subtitle file. When the file is long,
+                this may be only its first few thousand characters.
+
+        Returns:
+            format identifier (eg. ``"srt"``) or None (unknown format)
+        """
+        return None
diff --git a/libs/pysubs2/formats.py b/libs/pysubs2/formats.py
new file mode 100644
index 000000000..03fba8e60
--- /dev/null
+++ b/libs/pysubs2/formats.py
@@ -0,0 +1,68 @@
+from .formatbase import FormatBase
+from .microdvd import MicroDVDFormat
+from .subrip import SubripFormat
+from .jsonformat import JSONFormat
+from .substation import SubstationFormat
+from .txt_generic import TXTGenericFormat, MPL2Format
+from .exceptions import *
+
+#: Dict mapping file extensions to format identifiers.
+FILE_EXTENSION_TO_FORMAT_IDENTIFIER = {
+    ".srt": "srt",
+    ".ass": "ass",
+    ".ssa": "ssa",
+    ".sub": "microdvd",
+    ".json": "json",
+    ".txt": "txt_generic",
+}
+
+#: Dict mapping format identifiers to implementations (FormatBase subclasses).
+FORMAT_IDENTIFIER_TO_FORMAT_CLASS = {
+    "srt": SubripFormat,
+    "ass": SubstationFormat,
+    "ssa": SubstationFormat,
+    "microdvd": MicroDVDFormat,
+    "json": JSONFormat,
+    "txt_generic": TXTGenericFormat,
+    "mpl2": MPL2Format,
+}
+
+def get_format_class(format_):
+    """Format identifier -> format class (ie. subclass of FormatBase)"""
+    try:
+        return FORMAT_IDENTIFIER_TO_FORMAT_CLASS[format_]
+    except KeyError:
+        raise UnknownFormatIdentifierError(format_)
+
+def get_format_identifier(ext):
+    """File extension -> format identifier"""
+    try:
+        return FILE_EXTENSION_TO_FORMAT_IDENTIFIER[ext]
+    except KeyError:
+        raise UnknownFileExtensionError(ext)
+
+def get_file_extension(format_):
+    """Format identifier -> file extension"""
+    if format_ not in FORMAT_IDENTIFIER_TO_FORMAT_CLASS:
+        raise UnknownFormatIdentifierError(format_)
+
+    for ext, f in FILE_EXTENSION_TO_FORMAT_IDENTIFIER.items():
+        if f == format_:
+            return ext
+
+    raise RuntimeError("No file extension for format %r" % format_)
+
+def autodetect_format(content):
+    """Return format identifier for given fragment or raise FormatAutodetectionError."""
+    formats = set()
+    for impl in FORMAT_IDENTIFIER_TO_FORMAT_CLASS.values():
+        guess = impl.guess_format(content)
+        if guess is not None:
+            formats.add(guess)
+
+    if len(formats) == 1:
+        return formats.pop()
+    elif not formats:
+        raise FormatAutodetectionError("No suitable formats")
+    else:
+        raise FormatAutodetectionError("Multiple suitable formats (%r)" % formats)
diff --git a/libs/pysubs2/jsonformat.py b/libs/pysubs2/jsonformat.py
new file mode 100644
index 000000000..cbd8c29c8
--- /dev/null
+++ b/libs/pysubs2/jsonformat.py
@@ -0,0 +1,46 @@
+from __future__ import unicode_literals, print_function
+
+import json
+from .common import Color, PY3
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from .formatbase import FormatBase
+
+
+class JSONFormat(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        if text.startswith("{\""):
+            return "json"
+
+    @classmethod
+    def from_file(cls, subs, fp, format_, **kwargs):
+        data = json.load(fp)
+
+        subs.info.clear()
+        subs.info.update(data["info"])
+
+        subs.styles.clear()
+        for name, fields in data["styles"].items():
+            subs.styles[name] = sty = SSAStyle()
+            for k, v in fields.items():
+                if "color" in k:
+                    setattr(sty, k, Color(*v))
+                else:
+                    setattr(sty, k, v)
+
+        subs.events = [SSAEvent(**fields) for fields in data["events"]]
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, **kwargs):
+        data = {
+            "info": dict(**subs.info),
+            "styles": {name: sty.as_dict() for name, sty in subs.styles.items()},
+            "events": [ev.as_dict() for ev in subs.events]
+        }
+
+        if PY3:
+            json.dump(data, fp)
+        else:
+            text = json.dumps(data, fp)
+            fp.write(unicode(text))
diff --git a/libs/pysubs2/microdvd.py b/libs/pysubs2/microdvd.py
new file mode 100644
index 000000000..04b769be0
--- /dev/null
+++ b/libs/pysubs2/microdvd.py
@@ -0,0 +1,103 @@
+from __future__ import unicode_literals, print_function
+
+from functools import partial
+import re
+from .common import text_type
+from .exceptions import UnknownFPSError
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from .formatbase import FormatBase
+from .substation import parse_tags
+from .time import ms_to_frames, frames_to_ms
+
+#: Matches a MicroDVD line.
+MICRODVD_LINE = re.compile(r" *\{ *(\d+) *\} *\{ *(\d+) *\}(.+)")
+
+
+class MicroDVDFormat(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        if any(map(MICRODVD_LINE.match, text.splitlines())):
+            return "microdvd"
+
+    @classmethod
+    def from_file(cls, subs, fp, format_, fps=None, **kwargs):
+        for line in fp:
+            match = MICRODVD_LINE.match(line)
+            if not match:
+                continue
+
+            fstart, fend, text = match.groups()
+            fstart, fend = map(int, (fstart, fend))
+
+            if fps is None:
+                # We don't know the framerate, but it is customary to include
+                # it as text of the first subtitle. In that case, we skip
+                # this auxiliary subtitle and proceed with reading.
+                try:
+                    fps = float(text)
+                    subs.fps = fps
+                    continue
+                except ValueError:
+                    raise UnknownFPSError("Framerate was not specified and "
+                                          "cannot be read from "
+                                          "the MicroDVD file.")
+
+            start, end = map(partial(frames_to_ms, fps=fps), (fstart, fend))
+
+            def prepare_text(text):
+                text = text.replace("|", r"\N")
+
+                def style_replacer(match):
+                    tags = [c for c in "biu" if c in match.group(0)]
+                    return "{%s}" % "".join(r"\%s1" % c for c in tags)
+
+                text = re.sub(r"\{[Yy]:[^}]+\}", style_replacer, text)
+                text = re.sub(r"\{[Ff]:([^}]+)\}", r"{\\fn\1}", text)
+                text = re.sub(r"\{[Ss]:([^}]+)\}", r"{\\fs\1}", text)
+                text = re.sub(r"\{P:(\d+),(\d+)\}", r"{\\pos(\1,\2)}", text)
+
+                return text.strip()
+
+            ev = SSAEvent(start=start, end=end, text=prepare_text(text))
+            subs.append(ev)
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, fps=None, write_fps_declaration=True, **kwargs):
+        if fps is None:
+            fps = subs.fps
+
+        if fps is None:
+            raise UnknownFPSError("Framerate must be specified when writing MicroDVD.")
+        to_frames = partial(ms_to_frames, fps=fps)
+
+        def is_entirely_italic(line):
+            style = subs.styles.get(line.style, SSAStyle.DEFAULT_STYLE)
+            for fragment, sty in parse_tags(line.text, style, subs.styles):
+                fragment = fragment.replace(r"\h", " ")
+                fragment = fragment.replace(r"\n", "\n")
+                fragment = fragment.replace(r"\N", "\n")
+                if not sty.italic and fragment and not fragment.isspace():
+                    return False
+            return True
+
+        # insert an artificial first line telling the framerate
+        if write_fps_declaration:
+            subs.insert(0, SSAEvent(start=0, end=0, text=text_type(fps)))
+
+        for line in (ev for ev in subs if not ev.is_comment):
+            text = "|".join(line.plaintext.splitlines())
+            if is_entirely_italic(line):
+                text = "{Y:i}" + text
+
+            start, end = map(to_frames, (line.start, line.end))
+
+            # XXX warn on underflow?
+            if start < 0: start = 0
+            if end < 0: end = 0
+
+            print("{%d}{%d}%s" % (start, end, text), file=fp)
+
+        # remove the artificial framerate-telling line
+        if write_fps_declaration:
+            subs.pop(0)
diff --git a/libs/pysubs2/ssaevent.py b/libs/pysubs2/ssaevent.py
new file mode 100644
index 000000000..4d9dac809
--- /dev/null
+++ b/libs/pysubs2/ssaevent.py
@@ -0,0 +1,153 @@
+from __future__ import unicode_literals
+import re
+from .time import ms_to_str, make_time
+from .common import PY3
+
+
+class SSAEvent(object):
+    """
+    A SubStation Event, ie. one subtitle.
+
+    In SubStation, each subtitle consists of multiple "fields" like Start, End and Text.
+    These are exposed as attributes (note that they are lowercase; see :attr:`SSAEvent.FIELDS` for a list).
+    Additionaly, there are some convenience properties like :attr:`SSAEvent.plaintext` or :attr:`SSAEvent.duration`.
+
+    This class defines an ordering with respect to (start, end) timestamps.
+
+    .. tip :: Use :func:`pysubs2.make_time()` to get times in milliseconds.
+
+    Example::
+
+        >>> ev = SSAEvent(start=make_time(s=1), end=make_time(s=2.5), text="Hello World!")
+
+    """
+    OVERRIDE_SEQUENCE = re.compile(r"{[^}]*}")
+
+    #: All fields in SSAEvent.
+    FIELDS = frozenset([
+        "start", "end", "text", "marked", "layer", "style",
+        "name", "marginl", "marginr", "marginv", "effect", "type"
+    ])
+
+    def __init__(self, **fields):
+        self.start = 0 #: Subtitle start time (in milliseconds)
+        self.end = 10000 #: Subtitle end time (in milliseconds)
+        self.text = "" #: Text of subtitle (with SubStation override tags)
+        self.marked = False #: (SSA only)
+        self.layer = 0 #: Layer number, 0 is the lowest layer (ASS only)
+        self.style = "Default" #: Style name
+        self.name = "" #: Actor name
+        self.marginl = 0 #: Left margin
+        self.marginr = 0 #: Right margin
+        self.marginv = 0 #: Vertical margin
+        self.effect = "" #: Line effect
+        self.type = "Dialogue" #: Line type (Dialogue/Comment)
+
+        for k, v in fields.items():
+            if k in self.FIELDS:
+                setattr(self, k, v)
+            else:
+                raise ValueError("SSAEvent has no field named %r" % k)
+
+    @property
+    def duration(self):
+        """
+        Subtitle duration in milliseconds (read/write property).
+
+        Writing to this property adjusts :attr:`SSAEvent.end`.
+        Setting negative durations raises :exc:`ValueError`.
+        """
+        return self.end - self.start
+
+    @duration.setter
+    def duration(self, ms):
+        if ms >= 0:
+            self.end = self.start + ms
+        else:
+            raise ValueError("Subtitle duration cannot be negative")
+
+    @property
+    def is_comment(self):
+        """
+        When true, the subtitle is a comment, ie. not visible (read/write property).
+
+        Setting this property is equivalent to changing
+        :attr:`SSAEvent.type` to ``"Dialogue"`` or ``"Comment"``.
+        """
+        return self.type == "Comment"
+
+    @is_comment.setter
+    def is_comment(self, value):
+        if value:
+            self.type = "Comment"
+        else:
+            self.type = "Dialogue"
+
+    @property
+    def plaintext(self):
+        """
+        Subtitle text as multi-line string with no tags (read/write property).
+
+        Writing to this property replaces :attr:`SSAEvent.text` with given plain
+        text. Newlines are converted to ``\\N`` tags.
+        """
+        text = self.text
+        text = self.OVERRIDE_SEQUENCE.sub("", text)
+        text = text.replace(r"\h", " ")
+        text = text.replace(r"\n", "\n")
+        text = text.replace(r"\N", "\n")
+        return text
+
+    @plaintext.setter
+    def plaintext(self, text):
+        self.text = text.replace("\n", r"\N")
+
+    def shift(self, h=0, m=0, s=0, ms=0, frames=None, fps=None):
+        """
+        Shift start and end times.
+
+        See :meth:`SSAFile.shift()` for full description.
+
+        """
+        delta = make_time(h=h, m=m, s=s, ms=ms, frames=frames, fps=fps)
+        self.start += delta
+        self.end += delta
+
+    def copy(self):
+        """Return a copy of the SSAEvent."""
+        return SSAEvent(**self.as_dict())
+
+    def as_dict(self):
+        return {field: getattr(self, field) for field in self.FIELDS}
+
+    def equals(self, other):
+        """Field-based equality for SSAEvents."""
+        if isinstance(other, SSAEvent):
+            return self.as_dict() == other.as_dict()
+        else:
+            raise TypeError("Cannot compare to non-SSAEvent object")
+
+    def __eq__(self, other):
+        # XXX document this
+        return self.start == other.start and self.end == other.end
+
+    def __ne__(self, other):
+        return self.start != other.start or self.end != other.end
+
+    def __lt__(self, other):
+        return (self.start, self.end) < (other.start, other.end)
+
+    def __le__(self, other):
+        return (self.start, self.end) <= (other.start, other.end)
+
+    def __gt__(self, other):
+        return (self.start, self.end) > (other.start, other.end)
+
+    def __ge__(self, other):
+        return (self.start, self.end) >= (other.start, other.end)
+
+    def __repr__(self):
+        s = "<SSAEvent type={self.type} start={start} end={end} text='{self.text}'>".format(
+                self=self, start=ms_to_str(self.start), end=ms_to_str(self.end))
+        if not PY3: s = s.encode("utf-8")
+        return s
diff --git a/libs/pysubs2/ssafile.py b/libs/pysubs2/ssafile.py
new file mode 100644
index 000000000..c6a668439
--- /dev/null
+++ b/libs/pysubs2/ssafile.py
@@ -0,0 +1,419 @@
+from __future__ import print_function, unicode_literals, division
+from collections import MutableSequence, OrderedDict
+import io
+from io import open
+from itertools import starmap, chain
+import os.path
+import logging
+from .formats import autodetect_format, get_format_class, get_format_identifier
+from .substation import is_valid_field_content
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from .time import make_time, ms_to_str
+from .common import PY3
+
+
+class SSAFile(MutableSequence):
+    """
+    Subtitle file in SubStation Alpha format.
+
+    This class has a list-like interface which exposes :attr:`SSAFile.events`,
+    list of subtitles in the file::
+
+        subs = SSAFile.load("subtitles.srt")
+
+        for line in subs:
+            print(line.text)
+
+        subs.insert(0, SSAEvent(start=0, end=make_time(s=2.5), text="New first subtitle"))
+
+        del subs[0]
+
+    """
+
+    DEFAULT_INFO = OrderedDict([
+        ("WrapStyle", "0"),
+        ("ScaledBorderAndShadow", "yes"),
+        ("Collisions", "Normal")])
+
+    def __init__(self):
+        self.events = [] #: List of :class:`SSAEvent` instances, ie. individual subtitles.
+        self.styles = OrderedDict([("Default", SSAStyle.DEFAULT_STYLE.copy())]) #: Dict of :class:`SSAStyle` instances.
+        self.info = self.DEFAULT_INFO.copy() #: Dict with script metadata, ie. ``[Script Info]``.
+        self.aegisub_project = OrderedDict() #: Dict with Aegisub project, ie. ``[Aegisub Project Garbage]``.
+        self.fps = None #: Framerate used when reading the file, if applicable.
+        self.format = None #: Format of source subtitle file, if applicable, eg. ``"srt"``.
+
+    # ------------------------------------------------------------------------
+    # I/O methods
+    # ------------------------------------------------------------------------
+
+    @classmethod
+    def load(cls, path, encoding="utf-8", format_=None, fps=None, **kwargs):
+        """
+        Load subtitle file from given path.
+
+        Arguments:
+            path (str): Path to subtitle file.
+            encoding (str): Character encoding of input file.
+                Defaults to UTF-8, you may need to change this.
+            format_ (str): Optional, forces use of specific parser
+                (eg. `"srt"`, `"ass"`). Otherwise, format is detected
+                automatically from file contents. This argument should
+                be rarely needed.
+            fps (float): Framerate for frame-based formats (MicroDVD),
+                for other formats this argument is ignored. Framerate might
+                be detected from the file, in which case you don't need
+                to specify it here (when given, this argument overrides
+                autodetection).
+            kwargs: Extra options for the parser.
+
+        Returns:
+            SSAFile
+
+        Raises:
+            IOError
+            UnicodeDecodeError
+            pysubs2.exceptions.UnknownFPSError
+            pysubs2.exceptions.UnknownFormatIdentifierError
+            pysubs2.exceptions.FormatAutodetectionError
+
+        Note:
+            pysubs2 may autodetect subtitle format and/or framerate. These
+            values are set as :attr:`SSAFile.format` and :attr:`SSAFile.fps`
+            attributes.
+
+        Example:
+            >>> subs1 = pysubs2.load("subrip-subtitles.srt")
+            >>> subs2 = pysubs2.load("microdvd-subtitles.sub", fps=23.976)
+
+        """
+        with open(path, encoding=encoding) as fp:
+            return cls.from_file(fp, format_, fps=fps, **kwargs)
+
+    @classmethod
+    def from_string(cls, string, format_=None, fps=None, **kwargs):
+        """
+        Load subtitle file from string.
+
+        See :meth:`SSAFile.load()` for full description.
+
+        Arguments:
+            string (str): Subtitle file in a string. Note that the string
+                must be Unicode (in Python 2).
+
+        Returns:
+            SSAFile
+
+        Example:
+            >>> text = '''
+            ... 1
+            ... 00:00:00,000 --> 00:00:05,000
+            ... An example SubRip file.
+            ... '''
+            >>> subs = SSAFile.from_string(text)
+
+        """
+        fp = io.StringIO(string)
+        return cls.from_file(fp, format_, fps=fps, **kwargs)
+
+    @classmethod
+    def from_file(cls, fp, format_=None, fps=None, **kwargs):
+        """
+        Read subtitle file from file object.
+
+        See :meth:`SSAFile.load()` for full description.
+
+        Note:
+            This is a low-level method. Usually, one of :meth:`SSAFile.load()`
+            or :meth:`SSAFile.from_string()` is preferable.
+
+        Arguments:
+            fp (file object): A file object, ie. :class:`io.TextIOBase` instance.
+                Note that the file must be opened in text mode (as opposed to binary).
+
+        Returns:
+            SSAFile
+
+        """
+        if format_ is None:
+            # Autodetect subtitle format, then read again using correct parser.
+            # The file might be a pipe and we need to read it twice,
+            # so just buffer everything.
+            text = fp.read()
+            fragment = text[:10000]
+            format_ = autodetect_format(fragment)
+            fp = io.StringIO(text)
+
+        impl = get_format_class(format_)
+        subs = cls() # an empty subtitle file
+        subs.format = format_
+        subs.fps = fps
+        impl.from_file(subs, fp, format_, fps=fps, **kwargs)
+        return subs
+
+    def save(self, path, encoding="utf-8", format_=None, fps=None, **kwargs):
+        """
+        Save subtitle file to given path.
+
+        Arguments:
+            path (str): Path to subtitle file.
+            encoding (str): Character encoding of output file.
+                Defaults to UTF-8, which should be fine for most purposes.
+            format_ (str): Optional, specifies desired subtitle format
+                (eg. `"srt"`, `"ass"`). Otherwise, format is detected
+                automatically from file extension. Thus, this argument
+                is rarely needed.
+            fps (float): Framerate for frame-based formats (MicroDVD),
+                for other formats this argument is ignored. When omitted,
+                :attr:`SSAFile.fps` value is used (ie. the framerate used
+                for loading the file, if any). When the :class:`SSAFile`
+                wasn't loaded from MicroDVD, or if you wish save it with
+                different framerate, use this argument. See also
+                :meth:`SSAFile.transform_framerate()` for fixing bad
+                frame-based to time-based conversions.
+            kwargs: Extra options for the writer.
+
+        Raises:
+            IOError
+            UnicodeEncodeError
+            pysubs2.exceptions.UnknownFPSError
+            pysubs2.exceptions.UnknownFormatIdentifierError
+            pysubs2.exceptions.UnknownFileExtensionError
+
+        """
+        if format_ is None:
+            ext = os.path.splitext(path)[1].lower()
+            format_ = get_format_identifier(ext)
+
+        with open(path, "w", encoding=encoding) as fp:
+            self.to_file(fp, format_, fps=fps, **kwargs)
+
+    def to_string(self, format_, fps=None, **kwargs):
+        """
+        Get subtitle file as a string.
+
+        See :meth:`SSAFile.save()` for full description.
+
+        Returns:
+            str
+
+        """
+        fp = io.StringIO()
+        self.to_file(fp, format_, fps=fps, **kwargs)
+        return fp.getvalue()
+
+    def to_file(self, fp, format_, fps=None, **kwargs):
+        """
+        Write subtitle file to file object.
+
+        See :meth:`SSAFile.save()` for full description.
+
+        Note:
+            This is a low-level method. Usually, one of :meth:`SSAFile.save()`
+            or :meth:`SSAFile.to_string()` is preferable.
+
+        Arguments:
+            fp (file object): A file object, ie. :class:`io.TextIOBase` instance.
+                Note that the file must be opened in text mode (as opposed to binary).
+
+        """
+        impl = get_format_class(format_)
+        impl.to_file(self, fp, format_, fps=fps, **kwargs)
+
+    # ------------------------------------------------------------------------
+    # Retiming subtitles
+    # ------------------------------------------------------------------------
+
+    def shift(self, h=0, m=0, s=0, ms=0, frames=None, fps=None):
+        """
+        Shift all subtitles by constant time amount.
+
+        Shift may be time-based (the default) or frame-based. In the latter
+        case, specify both frames and fps. h, m, s, ms will be ignored.
+
+        Arguments:
+            h, m, s, ms: Integer or float values, may be positive or negative.
+            frames (int): When specified, must be an integer number of frames.
+                May be positive or negative. fps must be also specified.
+            fps (float): When specified, must be a positive number.
+
+        Raises:
+            ValueError: Invalid fps or missing number of frames.
+
+        """
+        delta = make_time(h=h, m=m, s=s, ms=ms, frames=frames, fps=fps)
+        for line in self:
+            line.start += delta
+            line.end += delta
+
+    def transform_framerate(self, in_fps, out_fps):
+        """
+        Rescale all timestamps by ratio of in_fps/out_fps.
+
+        Can be used to fix files converted from frame-based to time-based
+        with wrongly assumed framerate.
+
+        Arguments:
+            in_fps (float)
+            out_fps (float)
+
+        Raises:
+            ValueError: Non-positive framerate given.
+
+        """
+        if in_fps <= 0 or out_fps <= 0:
+            raise ValueError("Framerates must be positive, cannot transform %f -> %f" % (in_fps, out_fps))
+
+        ratio = in_fps / out_fps
+        for line in self:
+            line.start = int(round(line.start * ratio))
+            line.end = int(round(line.end * ratio))
+
+    # ------------------------------------------------------------------------
+    # Working with styles
+    # ------------------------------------------------------------------------
+
+    def rename_style(self, old_name, new_name):
+        """
+        Rename a style, including references to it.
+
+        Arguments:
+            old_name (str): Style to be renamed.
+            new_name (str): New name for the style (must be unused).
+
+        Raises:
+            KeyError: No style named old_name.
+            ValueError: new_name is not a legal name (cannot use commas)
+                or new_name is taken.
+
+        """
+        if old_name not in self.styles:
+            raise KeyError("Style %r not found" % old_name)
+        if new_name in self.styles:
+            raise ValueError("There is already a style called %r" % new_name)
+        if not is_valid_field_content(new_name):
+            raise ValueError("%r is not a valid name" % new_name)
+
+        self.styles[new_name] = self.styles[old_name]
+        del self.styles[old_name]
+
+        for line in self:
+            # XXX also handle \r override tag
+            if line.style == old_name:
+                line.style = new_name
+
+    def import_styles(self, subs, overwrite=True):
+        """
+        Merge in styles from other SSAFile.
+
+        Arguments:
+            subs (SSAFile): Subtitle file imported from.
+            overwrite (bool): On name conflict, use style from the other file
+                (default: True).
+
+        """
+        if not isinstance(subs, SSAFile):
+            raise TypeError("Must supply an SSAFile.")
+
+        for name, style in subs.styles.items():
+            if name not in self.styles or overwrite:
+                self.styles[name] = style
+
+    # ------------------------------------------------------------------------
+    # Helper methods
+    # ------------------------------------------------------------------------
+
+    def equals(self, other):
+        """
+        Equality of two SSAFiles.
+
+        Compares :attr:`SSAFile.info`, :attr:`SSAFile.styles` and :attr:`SSAFile.events`.
+        Order of entries in OrderedDicts does not matter. "ScriptType" key in info is
+        considered an implementation detail and thus ignored.
+
+        Useful mostly in unit tests. Differences are logged at DEBUG level.
+
+        """
+
+        if isinstance(other, SSAFile):
+            for key in set(chain(self.info.keys(), other.info.keys())) - {"ScriptType"}:
+                sv, ov = self.info.get(key), other.info.get(key)
+                if sv is None:
+                    logging.debug("%r missing in self.info", key)
+                    return False
+                elif ov is None:
+                    logging.debug("%r missing in other.info", key)
+                    return False
+                elif sv != ov:
+                    logging.debug("info %r differs (self=%r, other=%r)", key, sv, ov)
+                    return False
+
+            for key in set(chain(self.styles.keys(), other.styles.keys())):
+                sv, ov = self.styles.get(key), other.styles.get(key)
+                if sv is None:
+                    logging.debug("%r missing in self.styles", key)
+                    return False
+                elif ov is None:
+                    logging.debug("%r missing in other.styles", key)
+                    return False
+                elif sv != ov:
+                    for k in sv.FIELDS:
+                        if getattr(sv, k) != getattr(ov, k): logging.debug("difference in field %r", k)
+                    logging.debug("style %r differs (self=%r, other=%r)", key, sv.as_dict(), ov.as_dict())
+                    return False
+
+            if len(self) != len(other):
+                logging.debug("different # of subtitles (self=%d, other=%d)", len(self), len(other))
+                return False
+
+            for i, (se, oe) in enumerate(zip(self.events, other.events)):
+                if not se.equals(oe):
+                    for k in se.FIELDS:
+                        if getattr(se, k) != getattr(oe, k): logging.debug("difference in field %r", k)
+                    logging.debug("event %d differs (self=%r, other=%r)", i, se.as_dict(), oe.as_dict())
+                    return False
+
+            return True
+        else:
+            raise TypeError("Cannot compare to non-SSAFile object")
+
+    def __repr__(self):
+        if self.events:
+            max_time = max(ev.end for ev in self)
+            s = "<SSAFile with %d events and %d styles, last timestamp %s>" % \
+                    (len(self), len(self.styles), ms_to_str(max_time))
+        else:
+            s = "<SSAFile with 0 events and %d styles>" % len(self.styles)
+
+        if not PY3: s = s.encode("utf-8")
+        return s
+
+    # ------------------------------------------------------------------------
+    # MutableSequence implementation + sort()
+    # ------------------------------------------------------------------------
+
+    def sort(self):
+        """Sort subtitles time-wise, in-place."""
+        self.events.sort()
+
+    def __getitem__(self, item):
+        return self.events[item]
+
+    def __setitem__(self, key, value):
+        if isinstance(value, SSAEvent):
+            self.events[key] = value
+        else:
+            raise TypeError("SSAFile.events must contain only SSAEvent objects")
+
+    def __delitem__(self, key):
+        del self.events[key]
+
+    def __len__(self):
+        return len(self.events)
+
+    def insert(self, index, value):
+        if isinstance(value, SSAEvent):
+            self.events.insert(index, value)
+        else:
+            raise TypeError("SSAFile.events must contain only SSAEvent objects")
diff --git a/libs/pysubs2/ssastyle.py b/libs/pysubs2/ssastyle.py
new file mode 100644
index 000000000..e43e1ff07
--- /dev/null
+++ b/libs/pysubs2/ssastyle.py
@@ -0,0 +1,86 @@
+from __future__ import unicode_literals
+from .common import Color, PY3
+
+
+class SSAStyle(object):
+    """
+    A SubStation Style.
+
+    In SubStation, each subtitle (:class:`SSAEvent`) is associated with a style which defines its font, color, etc.
+    Like a subtitle event, a style also consists of "fields"; see :attr:`SSAStyle.FIELDS` for a list
+    (note the spelling, which is different from SubStation proper).
+
+    Subtitles and styles are connected via an :class:`SSAFile` they belong to. :attr:`SSAEvent.style` is a string
+    which is (or should be) a key in the :attr:`SSAFile.styles` dict. Note that style name is stored separately;
+    a given :class:`SSAStyle` instance has no particular name itself.
+
+    This class defines equality (equality of all fields).
+
+    """
+    DEFAULT_STYLE = None
+
+    #: All fields in SSAStyle.
+    FIELDS = frozenset([
+        "fontname", "fontsize", "primarycolor", "secondarycolor",
+        "tertiarycolor", "outlinecolor", "backcolor",
+        "bold", "italic", "underline", "strikeout",
+        "scalex", "scaley", "spacing", "angle", "borderstyle",
+        "outline", "shadow", "alignment",
+        "marginl", "marginr", "marginv", "alphalevel", "encoding"
+    ])
+
+    def __init__(self, **fields):
+        self.fontname = "Arial" #: Font name
+        self.fontsize = 20.0 #: Font size (in pixels)
+        self.primarycolor = Color(255, 255, 255, 0) #: Primary color (:class:`pysubs2.Color` instance)
+        self.secondarycolor = Color(255, 0, 0, 0) #: Secondary color (:class:`pysubs2.Color` instance)
+        self.tertiarycolor = Color(0, 0, 0, 0) #: Tertiary color (:class:`pysubs2.Color` instance)
+        self.outlinecolor = Color(0, 0, 0, 0) #: Outline color (:class:`pysubs2.Color` instance)
+        self.backcolor = Color(0, 0, 0, 0) #: Back, ie. shadow color (:class:`pysubs2.Color` instance)
+        self.bold = False #: Bold
+        self.italic = False #: Italic
+        self.underline = False #: Underline (ASS only)
+        self.strikeout = False #: Strikeout (ASS only)
+        self.scalex = 100.0 #: Horizontal scaling (ASS only)
+        self.scaley = 100.0 #: Vertical scaling (ASS only)
+        self.spacing = 0.0 #: Letter spacing (ASS only)
+        self.angle = 0.0 #: Rotation (ASS only)
+        self.borderstyle = 1 #: Border style
+        self.outline = 2.0 #: Outline width (in pixels)
+        self.shadow = 2.0 #: Shadow depth (in pixels)
+        self.alignment = 2 #: Numpad-style alignment, eg. 7 is "top left" (that is, ASS alignment semantics)
+        self.marginl = 10 #: Left margin (in pixels)
+        self.marginr = 10 #: Right margin (in pixels)
+        self.marginv = 10 #: Vertical margin (in pixels)
+        self.alphalevel = 0 #: Old, unused SSA-only field
+        self.encoding = 1 #: Charset
+
+        for k, v in fields.items():
+            if k in self.FIELDS:
+                setattr(self, k, v)
+            else:
+                raise ValueError("SSAStyle has no field named %r" % k)
+
+    def copy(self):
+        return SSAStyle(**self.as_dict())
+
+    def as_dict(self):
+        return {field: getattr(self, field) for field in self.FIELDS}
+
+    def __eq__(self, other):
+        return self.as_dict() == other.as_dict()
+
+    def __ne__(self, other):
+        return not self == other
+
+    def __repr__(self):
+        s = "<SSAStyle "
+        s += "%rpx " % self.fontsize
+        if self.bold: s += "bold "
+        if self.italic: s += "italic "
+        s += "'%s'>" % self.fontname
+        if not PY3: s = s.encode("utf-8")
+        return s
+
+
+SSAStyle.DEFAULT_STYLE = SSAStyle()
diff --git a/libs/pysubs2/subrip.py b/libs/pysubs2/subrip.py
new file mode 100644
index 000000000..7fa3f29b2
--- /dev/null
+++ b/libs/pysubs2/subrip.py
@@ -0,0 +1,89 @@
+from __future__ import print_function, unicode_literals
+
+import re
+from .formatbase import FormatBase
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from .substation import parse_tags
+from .time import ms_to_times, make_time, TIMESTAMP, timestamp_to_ms
+
+#: Largest timestamp allowed in SubRip, ie. 99:59:59,999.
+MAX_REPRESENTABLE_TIME = make_time(h=100) - 1
+
+def ms_to_timestamp(ms):
+    """Convert ms to 'HH:MM:SS,mmm'"""
+    # XXX throw on overflow/underflow?
+    if ms < 0: ms = 0
+    if ms > MAX_REPRESENTABLE_TIME: ms = MAX_REPRESENTABLE_TIME
+    h, m, s, ms = ms_to_times(ms)
+    return "%02d:%02d:%02d,%03d" % (h, m, s, ms)
+
+
+class SubripFormat(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        if "[Script Info]" in text or "[V4+ Styles]" in text:
+            # disambiguation vs. SSA/ASS
+            return None
+
+        for line in text.splitlines():
+            if len(TIMESTAMP.findall(line)) == 2:
+                return "srt"
+
+    @classmethod
+    def from_file(cls, subs, fp, format_, **kwargs):
+        timestamps = [] # (start, end)
+        following_lines = [] # contains lists of lines following each timestamp
+
+        for line in fp:
+            stamps = TIMESTAMP.findall(line)
+            if len(stamps) == 2: # timestamp line
+                start, end = map(timestamp_to_ms, stamps)
+                timestamps.append((start, end))
+                following_lines.append([])
+            else:
+                if timestamps:
+                    following_lines[-1].append(line)
+
+        def prepare_text(lines):
+            s = "".join(lines).strip()
+            s = re.sub(r"\n* *\d+ *$", "", s) # strip number of next subtitle
+            s = re.sub(r"< *i *>", r"{\i1}", s)
+            s = re.sub(r"< */ *i *>", r"{\i0}", s)
+            s = re.sub(r"< *s *>", r"{\s1}", s)
+            s = re.sub(r"< */ *s *>", r"{\s0}", s)
+            s = re.sub(r"< *u *>", "{\\u1}", s) # not r" for Python 2.7 compat, triggers unicodeescape
+            s = re.sub(r"< */ *u *>", "{\\u0}", s)
+            s = re.sub(r"< */? *[a-zA-Z][^>]*>", "", s) # strip other HTML tags
+            s = re.sub(r"\r", "", s)  # convert newlines
+            s = re.sub(r"\n", r"\N", s) # convert newlines
+            return s
+
+        subs.events = [SSAEvent(start=start, end=end, text=prepare_text(lines))
+                       for (start, end), lines in zip(timestamps, following_lines)]
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, **kwargs):
+        def prepare_text(text, style):
+            body = []
+            for fragment, sty in parse_tags(text, style, subs.styles):
+                fragment = fragment.replace(r"\h", " ")
+                fragment = fragment.replace(r"\n", "\n")
+                fragment = fragment.replace(r"\N", "\n")
+                if sty.italic: fragment = "<i>%s</i>" % fragment
+                if sty.underline: fragment = "<u>%s</u>" % fragment
+                if sty.strikeout: fragment = "<s>%s</s>" % fragment
+                body.append(fragment)
+
+            return re.sub("\n+", "\n", "".join(body).strip())
+
+        visible_lines = (line for line in subs if not line.is_comment)
+
+        for i, line in enumerate(visible_lines, 1):
+            start = ms_to_timestamp(line.start)
+            end = ms_to_timestamp(line.end)
+            text = prepare_text(line.text, subs.styles.get(line.style, SSAStyle.DEFAULT_STYLE))
+
+            print("%d" % i, file=fp) # Python 2.7 compat
+            print(start, "-->", end, file=fp)
+            print(text, end="\n\n", file=fp)
diff --git a/libs/pysubs2/substation.py b/libs/pysubs2/substation.py
new file mode 100644
index 000000000..0e5a1b707
--- /dev/null
+++ b/libs/pysubs2/substation.py
@@ -0,0 +1,255 @@
+from __future__ import print_function, division, unicode_literals
+import re
+from numbers import Number
+from .formatbase import FormatBase
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+from .common import text_type, Color
+from .time import make_time, ms_to_times, timestamp_to_ms, TIMESTAMP
+
+SSA_ALIGNMENT = (1, 2, 3, 9, 10, 11, 5, 6, 7)
+
+def ass_to_ssa_alignment(i):
+    return SSA_ALIGNMENT[i-1]
+
+def ssa_to_ass_alignment(i):
+    return SSA_ALIGNMENT.index(i) + 1
+
+SECTION_HEADING = re.compile(r"^.{,3}\[[^\]]+\]") # allow for UTF-8 BOM, which is 3 bytes
+
+STYLE_FORMAT_LINE = {
+    "ass": "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic,"
+           " Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment,"
+           " MarginL, MarginR, MarginV, Encoding",
+    "ssa": "Format: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, TertiaryColour, BackColour, Bold, Italic,"
+           " BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, AlphaLevel, Encoding"
+}
+
+STYLE_FIELDS = {
+    "ass": ["fontname", "fontsize", "primarycolor", "secondarycolor", "outlinecolor", "backcolor", "bold", "italic",
+            "underline", "strikeout", "scalex", "scaley", "spacing", "angle", "borderstyle", "outline", "shadow",
+            "alignment", "marginl", "marginr", "marginv", "encoding"],
+    "ssa": ["fontname", "fontsize", "primarycolor", "secondarycolor", "tertiarycolor", "backcolor", "bold", "italic",
+            "borderstyle", "outline", "shadow", "alignment", "marginl", "marginr", "marginv", "alphalevel", "encoding"]
+}
+
+EVENT_FORMAT_LINE = {
+    "ass": "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text",
+    "ssa": "Format: Marked, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text"
+}
+
+EVENT_FIELDS = {
+    "ass": ["layer", "start", "end", "style", "name", "marginl", "marginr", "marginv", "effect", "text"],
+    "ssa": ["marked", "start", "end", "style", "name", "marginl", "marginr", "marginv", "effect", "text"]
+}
+
+#: Largest timestamp allowed in SubStation, ie. 9:59:59.99.
+MAX_REPRESENTABLE_TIME = make_time(h=10) - 10
+
+def ms_to_timestamp(ms):
+    """Convert ms to 'H:MM:SS.cc'"""
+    # XXX throw on overflow/underflow?
+    if ms < 0: ms = 0
+    if ms > MAX_REPRESENTABLE_TIME: ms = MAX_REPRESENTABLE_TIME
+    h, m, s, ms = ms_to_times(ms)
+    return "%01d:%02d:%02d.%02d" % (h, m, s, ms//10)
+
+def color_to_ass_rgba(c):
+    return "&H%08X" % ((c.a << 24) | (c.b << 16) | (c.g << 8) | c.r)
+
+def color_to_ssa_rgb(c):
+    return "%d" % ((c.b << 16) | (c.g << 8) | c.r)
+
+def ass_rgba_to_color(s):
+    x = int(s[2:], base=16)
+    r = x & 0xff
+    g = (x >> 8) & 0xff
+    b = (x >> 16) & 0xff
+    a = (x >> 24) & 0xff
+    return Color(r, g, b, a)
+
+def ssa_rgb_to_color(s):
+    x = int(s)
+    r = x & 0xff
+    g = (x >> 8) & 0xff
+    b = (x >> 16) & 0xff
+    return Color(r, g, b)
+
+def is_valid_field_content(s):
+    """
+    Returns True if string s can be stored in a SubStation field.
+
+    Fields are written in CSV-like manner, thus commas and/or newlines
+    are not acceptable in the string.
+
+    """
+    return "\n" not in s and "," not in s
+
+
+def parse_tags(text, style=SSAStyle.DEFAULT_STYLE, styles={}):
+    """
+    Split text into fragments with computed SSAStyles.
+    
+    Returns list of tuples (fragment, style), where fragment is a part of text
+    between two brace-delimited override sequences, and style is the computed
+    styling of the fragment, ie. the original style modified by all override
+    sequences before the fragment.
+    
+    Newline and non-breakable space overrides are left as-is.
+    
+    Supported override tags:
+    
+    - i, b, u, s
+    - r (with or without style name)
+    
+    """
+    
+    fragments = SSAEvent.OVERRIDE_SEQUENCE.split(text)
+    if len(fragments) == 1:
+        return [(text, style)]
+    
+    def apply_overrides(all_overrides):
+        s = style.copy()
+        for tag in re.findall(r"\\[ibus][10]|\\r[a-zA-Z_0-9 ]*", all_overrides):
+            if tag == r"\r":
+                s = style.copy() # reset to original line style
+            elif tag.startswith(r"\r"):
+                name = tag[2:]
+                if name in styles:
+                    s = styles[name].copy() # reset to named style
+            else:
+                if "i" in tag: s.italic = "1" in tag
+                elif "b" in tag: s.bold = "1" in tag
+                elif "u" in tag: s.underline = "1" in tag
+                elif "s" in tag: s.strikeout = "1" in tag
+        return s
+    
+    overrides = SSAEvent.OVERRIDE_SEQUENCE.findall(text)
+    overrides_prefix_sum = ["".join(overrides[:i]) for i in range(len(overrides) + 1)]
+    computed_styles = map(apply_overrides, overrides_prefix_sum)
+    return list(zip(fragments, computed_styles))
+
+
+NOTICE = "Script generated by pysubs2\nhttps://pypi.python.org/pypi/pysubs2"
+
+class SubstationFormat(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        if "V4+ Styles" in text:
+            return "ass"
+        elif "V4 Styles" in text:
+            return "ssa"
+
+    @classmethod
+    def from_file(cls, subs, fp, format_, **kwargs):
+
+        def string_to_field(f, v):
+            if f in {"start", "end"}:
+                return timestamp_to_ms(TIMESTAMP.match(v).groups())
+            elif "color" in f:
+                if format_ == "ass":
+                    return ass_rgba_to_color(v)
+                else:
+                    return ssa_rgb_to_color(v)
+            elif f in {"bold", "underline", "italic", "strikeout"}:
+                return v == "-1"
+            elif f in {"borderstyle", "encoding", "marginl", "marginr", "marginv", "layer", "alphalevel"}:
+                return int(v)
+            elif f in {"fontsize", "scalex", "scaley", "spacing", "angle", "outline", "shadow"}:
+                return float(v)
+            elif f == "marked":
+                return v.endswith("1")
+            elif f == "alignment":
+                i = int(v)
+                if format_ == "ass":
+                    return i
+                else:
+                    return ssa_to_ass_alignment(i)
+            else:
+                return v
+
+        subs.info.clear()
+        subs.aegisub_project.clear()
+        subs.styles.clear()
+
+        inside_info_section = False
+        inside_aegisub_section = False
+
+        for line in fp:
+            line = line.strip()
+
+            if SECTION_HEADING.match(line):
+                inside_info_section = "Info" in line
+                inside_aegisub_section = "Aegisub" in line
+            elif inside_info_section or inside_aegisub_section:
+                if line.startswith(";"): continue # skip comments
+                try:
+                    k, v = line.split(": ", 1)
+                    if inside_info_section:
+                        subs.info[k] = v
+                    elif inside_aegisub_section:
+                        subs.aegisub_project[k] = v
+                except ValueError:
+                    pass
+            elif line.startswith("Style:"):
+                _, rest = line.split(": ", 1)
+                buf = rest.strip().split(",")
+                name, raw_fields = buf[0], buf[1:] # splat workaround for Python 2.7
+                field_dict = {f: string_to_field(f, v) for f, v in zip(STYLE_FIELDS[format_], raw_fields)}
+                sty = SSAStyle(**field_dict)
+                subs.styles[name] = sty
+            elif line.startswith("Dialogue:") or line.startswith("Comment:"):
+                ev_type, rest = line.split(": ", 1)
+                raw_fields = rest.strip().split(",", len(EVENT_FIELDS[format_])-1)
+                field_dict = {f: string_to_field(f, v) for f, v in zip(EVENT_FIELDS[format_], raw_fields)}
+                field_dict["type"] = ev_type
+                ev = SSAEvent(**field_dict)
+                subs.events.append(ev)
+
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, header_notice=NOTICE, **kwargs):
+        print("[Script Info]", file=fp)
+        for line in header_notice.splitlines(False):
+            print(";", line, file=fp)
+
+        subs.info["ScriptType"] = "v4.00+" if format_ == "ass" else "v4.00"
+        for k, v in subs.info.items():
+            print(k, v, sep=": ", file=fp)
+
+        if subs.aegisub_project:
+            print("\n[Aegisub Project Garbage]", file=fp)
+            for k, v in subs.aegisub_project.items():
+                print(k, v, sep=": ", file=fp)
+
+        def field_to_string(f, v):
+            if f in {"start", "end"}:
+                return ms_to_timestamp(v)
+            elif f == "marked":
+                return "Marked=%d" % v
+            elif f == "alignment" and format_ == "ssa":
+                return text_type(ass_to_ssa_alignment(v))
+            elif isinstance(v, bool):
+                return "-1" if v else "0"
+            elif isinstance(v, (text_type, Number)):
+                return text_type(v)
+            elif isinstance(v, Color):
+                if format_ == "ass":
+                    return color_to_ass_rgba(v)
+                else:
+                    return color_to_ssa_rgb(v)
+            else:
+                raise TypeError("Unexpected type when writing a SubStation field")
+
+        print("\n[V4+ Styles]" if format_ == "ass" else "\n[V4 Styles]", file=fp)
+        print(STYLE_FORMAT_LINE[format_], file=fp)
+        for name, sty in subs.styles.items():
+            fields = [field_to_string(f, getattr(sty, f)) for f in STYLE_FIELDS[format_]]
+            print("Style: %s" % name, *fields, sep=",", file=fp)
+
+        print("\n[Events]", file=fp)
+        print(EVENT_FORMAT_LINE[format_], file=fp)
+        for ev in subs.events:
+            fields = [field_to_string(f, getattr(ev, f)) for f in EVENT_FIELDS[format_]]
+            print(ev.type, end=": ", file=fp)
+            print(*fields, sep=",", file=fp)
diff --git a/libs/pysubs2/time.py b/libs/pysubs2/time.py
new file mode 100644
index 000000000..46d349f85
--- /dev/null
+++ b/libs/pysubs2/time.py
@@ -0,0 +1,147 @@
+from __future__ import division
+
+from collections import namedtuple
+import re
+
+
+#: Pattern that matches both SubStation and SubRip timestamps.
+TIMESTAMP = re.compile(r"(\d{1,2}):(\d{2}):(\d{2})[.,](\d{2,3})")
+
+Times = namedtuple("Times", ["h", "m", "s", "ms"])
+
+def make_time(h=0, m=0, s=0, ms=0, frames=None, fps=None):
+    """
+    Convert time to milliseconds.
+
+    See :func:`pysubs2.time.times_to_ms()`. When both frames and fps are specified,
+    :func:`pysubs2.time.frames_to_ms()` is called instead.
+
+    Raises:
+        ValueError: Invalid fps, or one of frames/fps is missing.
+
+    Example:
+        >>> make_time(s=1.5)
+        1500
+        >>> make_time(frames=50, fps=25)
+        2000
+
+    """
+    if frames is None and fps is None:
+        return times_to_ms(h, m, s, ms)
+    elif frames is not None and fps is not None:
+        return frames_to_ms(frames, fps)
+    else:
+        raise ValueError("Both fps and frames must be specified")
+
+def timestamp_to_ms(groups):
+    """
+    Convert groups from :data:`pysubs2.time.TIMESTAMP` match to milliseconds.
+    
+    Example:
+        >>> timestamp_to_ms(TIMESTAMP.match("0:00:00.42").groups())
+        420
+    
+    """
+    h, m, s, frac = map(int, groups)
+    ms = frac * 10**(3 - len(groups[-1]))
+    ms += s * 1000
+    ms += m * 60000
+    ms += h * 3600000
+    return ms
+
+def times_to_ms(h=0, m=0, s=0, ms=0):
+    """
+    Convert hours, minutes, seconds to milliseconds.
+    
+    Arguments may be positive or negative, int or float,
+    need not be normalized (``s=120`` is okay).
+    
+    Returns:
+        Number of milliseconds (rounded to int).
+    
+    """
+    ms += s * 1000
+    ms += m * 60000
+    ms += h * 3600000
+    return int(round(ms))
+
+def frames_to_ms(frames, fps):
+    """
+    Convert frame-based duration to milliseconds.
+    
+    Arguments:
+        frames: Number of frames (should be int).
+        fps: Framerate (must be a positive number, eg. 23.976).
+    
+    Returns:
+        Number of milliseconds (rounded to int).
+        
+    Raises:
+        ValueError: fps was negative or zero.
+    
+    """
+    if fps <= 0:
+        raise ValueError("Framerate must be positive number (%f)." % fps)
+
+    return int(round(frames * (1000 / fps)))
+
+def ms_to_frames(ms, fps):
+    """
+    Convert milliseconds to number of frames.
+    
+    Arguments:
+        ms: Number of milliseconds (may be int, float or other numeric class).
+        fps: Framerate (must be a positive number, eg. 23.976).
+    
+    Returns:
+        Number of frames (int).
+        
+    Raises:
+        ValueError: fps was negative or zero.
+    
+    """
+    if fps <= 0:
+        raise ValueError("Framerate must be positive number (%f)." % fps)
+
+    return int(round((ms / 1000) * fps))
+
+def ms_to_times(ms):
+    """
+    Convert milliseconds to normalized tuple (h, m, s, ms).
+    
+    Arguments:
+        ms: Number of milliseconds (may be int, float or other numeric class).
+            Should be non-negative.
+    
+    Returns:
+        Named tuple (h, m, s, ms) of ints.
+        Invariants: ``ms in range(1000) and s in range(60) and m in range(60)``
+    
+    """
+    ms = int(round(ms))
+    h, ms = divmod(ms, 3600000)
+    m, ms = divmod(ms, 60000)
+    s, ms = divmod(ms, 1000)
+    return Times(h, m, s, ms)
+
+def ms_to_str(ms, fractions=False):
+    """
+    Prettyprint milliseconds to [-]H:MM:SS[.mmm]
+    
+    Handles huge and/or negative times. Non-negative times with ``fractions=True``
+    are matched by :data:`pysubs2.time.TIMESTAMP`.
+    
+    Arguments:
+        ms: Number of milliseconds (int, float or other numeric class).
+        fractions: Whether to print up to millisecond precision.
+    
+    Returns:
+        str
+    
+    """
+    sgn = "-" if ms < 0 else ""
+    h, m, s, ms = ms_to_times(abs(ms))
+    if fractions:
+        return sgn + "{:01d}:{:02d}:{:02d}.{:03d}".format(h, m, s, ms)
+    else:
+        return sgn + "{:01d}:{:02d}:{:02d}".format(h, m, s)
diff --git a/libs/pysubs2/txt_generic.py b/libs/pysubs2/txt_generic.py
new file mode 100644
index 000000000..70bf3e31c
--- /dev/null
+++ b/libs/pysubs2/txt_generic.py
@@ -0,0 +1,45 @@
+# coding=utf-8
+
+from __future__ import print_function, division, unicode_literals
+import re
+from numbers import Number
+
+from pysubs2.time import times_to_ms
+from .formatbase import FormatBase
+from .ssaevent import SSAEvent
+from .ssastyle import SSAStyle
+
+
+# thanks to http://otsaloma.io/gaupol/doc/api/aeidon.files.mpl2_source.html
+MPL2_FORMAT = re.compile(r"^(?um)\[(-?\d+)\]\[(-?\d+)\](.*?)$")
+
+
+class TXTGenericFormat(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        if MPL2_FORMAT.match(text):
+            return "mpl2"
+
+
+class MPL2Format(FormatBase):
+    @classmethod
+    def guess_format(cls, text):
+        return TXTGenericFormat.guess_format(text)
+
+    @classmethod
+    def from_file(cls, subs, fp, format_, **kwargs):
+        def prepare_text(lines):
+            out = []
+            for s in lines.split("|"):
+                if s.startswith("/"):
+                    out.append(r"{\i1}%s{\i0}" % s[1:])
+                    continue
+                out.append(s)
+            return "\n".join(out)
+
+        subs.events = [SSAEvent(start=times_to_ms(s=float(start) / 10), end=times_to_ms(s=float(end) / 10),
+                       text=prepare_text(text)) for start, end, text in MPL2_FORMAT.findall(fp.getvalue())]
+
+    @classmethod
+    def to_file(cls, subs, fp, format_, **kwargs):
+        raise NotImplemented
diff --git a/libs/pytz/__init__.py b/libs/pytz/__init__.py
index 120fab47c..13c83b113 100644
--- a/libs/pytz/__init__.py
+++ b/libs/pytz/__init__.py
@@ -8,25 +8,12 @@ See the datetime section of the Python Library Reference for information
 on how to use these modules.
 '''
 
-import sys
-import datetime
-import os.path
-
-from pytz.exceptions import AmbiguousTimeError
-from pytz.exceptions import InvalidTimeError
-from pytz.exceptions import NonExistentTimeError
-from pytz.exceptions import UnknownTimeZoneError
-from pytz.lazy import LazyDict, LazyList, LazySet
-from pytz.tzinfo import unpickler, BaseTzInfo
-from pytz.tzfile import build_tzinfo
-
-
 # The IANA (nee Olson) database is updated several times a year.
-OLSON_VERSION = '2018e'
-VERSION = '2018.5'  # pip compatible version number.
+OLSON_VERSION = '2017b'
+VERSION = '2017.2'  # Switching to pip compatible version numbering.
 __version__ = VERSION
 
-OLSEN_VERSION = OLSON_VERSION  # Old releases had this misspelling
+OLSEN_VERSION = OLSON_VERSION # Old releases had this misspelling
 
 __all__ = [
     'timezone', 'utc', 'country_timezones', 'country_names',
@@ -34,10 +21,23 @@ __all__ = [
     'NonExistentTimeError', 'UnknownTimeZoneError',
     'all_timezones', 'all_timezones_set',
     'common_timezones', 'common_timezones_set',
-]
+    ]
+
+import sys, datetime, os.path, gettext
+
+from pytz.exceptions import AmbiguousTimeError
+from pytz.exceptions import InvalidTimeError
+from pytz.exceptions import NonExistentTimeError
+from pytz.exceptions import UnknownTimeZoneError
+from pytz.lazy import LazyDict, LazyList, LazySet
+from pytz.tzinfo import unpickler
+from pytz.tzfile import build_tzinfo, _byte_string
 
 
-if sys.version_info[0] > 2:  # Python 3.x
+try:
+    unicode
+
+except NameError: # Python 3.x
 
     # Python 3.x doesn't have unicode(), making writing code
     # for Python 2.3 and Python 3.x a pain.
@@ -52,13 +52,10 @@ if sys.version_info[0] > 2:  # Python 3.x
             ...
         UnicodeEncodeError: ...
         """
-        if type(s) == bytes:
-            s = s.decode('ASCII')
-        else:
-            s.encode('ASCII')  # Raise an exception if not ASCII
-        return s  # But the string - not a byte string.
+        s.encode('ASCII') # Raise an exception if not ASCII
+        return s # But return the original string - not a byte string.
 
-else:  # Python 2.x
+else: # Python 2.x
 
     def ascii(s):
         r"""
@@ -79,31 +76,24 @@ def open_resource(name):
 
     Uses the pkg_resources module if available and no standard file
     found at the calculated location.
-
-    It is possible to specify different location for zoneinfo
-    subdir by using the PYTZ_TZDATADIR environment variable.
     """
     name_parts = name.lstrip('/').split('/')
     for part in name_parts:
         if part == os.path.pardir or os.path.sep in part:
             raise ValueError('Bad path segment: %r' % part)
-    zoneinfo_dir = os.environ.get('PYTZ_TZDATADIR', None)
-    if zoneinfo_dir is not None:
-        filename = os.path.join(zoneinfo_dir, *name_parts)
-    else:
-        filename = os.path.join(os.path.dirname(__file__),
-                                'zoneinfo', *name_parts)
-        if not os.path.exists(filename):
-            # http://bugs.launchpad.net/bugs/383171 - we avoid using this
-            # unless absolutely necessary to help when a broken version of
-            # pkg_resources is installed.
-            try:
-                from pkg_resources import resource_stream
-            except ImportError:
-                resource_stream = None
+    filename = os.path.join(os.path.dirname(__file__),
+                            'zoneinfo', *name_parts)
+    if not os.path.exists(filename):
+        # http://bugs.launchpad.net/bugs/383171 - we avoid using this
+        # unless absolutely necessary to help when a broken version of
+        # pkg_resources is installed.
+        try:
+            from pkg_resources import resource_stream
+        except ImportError:
+            resource_stream = None
 
-            if resource_stream is not None:
-                return resource_stream(__name__, 'zoneinfo/' + name)
+        if resource_stream is not None:
+            return resource_stream(__name__, 'zoneinfo/' + name)
     return open(filename, 'rb')
 
 
@@ -116,9 +106,23 @@ def resource_exists(name):
         return False
 
 
-_tzinfo_cache = {}
+# Enable this when we get some translations?
+# We want an i18n API that is useful to programs using Python's gettext
+# module, as well as the Zope3 i18n package. Perhaps we should just provide
+# the POT file and translations, and leave it up to callers to make use
+# of them.
+#
+# t = gettext.translation(
+#         'pytz', os.path.join(os.path.dirname(__file__), 'locales'),
+#         fallback=True
+#         )
+# def _(timezone_name):
+#     """Translate a timezone name using the current locale, returning Unicode"""
+#     return t.ugettext(timezone_name)
 
 
+_tzinfo_cache = {}
+
 def timezone(zone):
     r''' Return a datetime.tzinfo implementation for the given timezone
 
@@ -188,7 +192,7 @@ ZERO = datetime.timedelta(0)
 HOUR = datetime.timedelta(hours=1)
 
 
-class UTC(BaseTzInfo):
+class UTC(datetime.tzinfo):
     """UTC
 
     Optimized UTC implementation. It unpickles using the single module global
@@ -284,6 +288,7 @@ def _p(*args):
 _p.__safe_for_unpickling__ = True
 
 
+
 class _CountryTimezoneDict(LazyDict):
     """Map ISO 3166 country code to a list of timezone names commonly used
     in that country.
@@ -369,7 +374,7 @@ country_names = _CountryNameDict()
 
 class _FixedOffset(datetime.tzinfo):
 
-    zone = None  # to match the standard pytz API
+    zone = None # to match the standard pytz API
 
     def __init__(self, minutes):
         if abs(minutes) >= 1440:
@@ -407,24 +412,24 @@ class _FixedOffset(datetime.tzinfo):
         return dt.astimezone(self)
 
 
-def FixedOffset(offset, _tzinfos={}):
+def FixedOffset(offset, _tzinfos = {}):
     """return a fixed-offset timezone based off a number of minutes.
 
         >>> one = FixedOffset(-330)
         >>> one
         pytz.FixedOffset(-330)
-        >>> str(one.utcoffset(datetime.datetime.now()))
-        '-1 day, 18:30:00'
-        >>> str(one.dst(datetime.datetime.now()))
-        '0:00:00'
+        >>> one.utcoffset(datetime.datetime.now())
+        datetime.timedelta(-1, 66600)
+        >>> one.dst(datetime.datetime.now())
+        datetime.timedelta(0)
 
         >>> two = FixedOffset(1380)
         >>> two
         pytz.FixedOffset(1380)
-        >>> str(two.utcoffset(datetime.datetime.now()))
-        '23:00:00'
-        >>> str(two.dst(datetime.datetime.now()))
-        '0:00:00'
+        >>> two.utcoffset(datetime.datetime.now())
+        datetime.timedelta(0, 82800)
+        >>> two.dst(datetime.datetime.now())
+        datetime.timedelta(0)
 
     The datetime.timedelta must be between the range of -1 and 1 day,
     non-inclusive.
@@ -477,13 +482,14 @@ FixedOffset.__safe_for_unpickling__ = True
 
 
 def _test():
-    import doctest
+    import doctest, os, sys
     sys.path.insert(0, os.pardir)
     import pytz
     return doctest.testmod(pytz)
 
 if __name__ == '__main__':
     _test()
+
 all_timezones = \
 ['Africa/Abidjan',
  'Africa/Accra',
@@ -859,6 +865,7 @@ all_timezones = \
  'CST6CDT',
  'Canada/Atlantic',
  'Canada/Central',
+ 'Canada/East-Saskatchewan',
  'Canada/Eastern',
  'Canada/Mountain',
  'Canada/Newfoundland',
@@ -1070,6 +1077,7 @@ all_timezones = \
  'US/Michigan',
  'US/Mountain',
  'US/Pacific',
+ 'US/Pacific-New',
  'US/Samoa',
  'UTC',
  'Universal',
diff --git a/libs/pytz/exceptions.py b/libs/pytz/exceptions.py
index 18df33e86..0376108e1 100644
--- a/libs/pytz/exceptions.py
+++ b/libs/pytz/exceptions.py
@@ -5,7 +5,7 @@ Custom exceptions raised by pytz.
 __all__ = [
     'UnknownTimeZoneError', 'InvalidTimeError', 'AmbiguousTimeError',
     'NonExistentTimeError',
-]
+    ]
 
 
 class UnknownTimeZoneError(KeyError):
diff --git a/libs/pytz/lazy.py b/libs/pytz/lazy.py
index 39344fc1f..f7fc597cf 100644
--- a/libs/pytz/lazy.py
+++ b/libs/pytz/lazy.py
@@ -1,11 +1,8 @@
 from threading import RLock
 try:
-    from collections.abc import Mapping as DictMixin
-except ImportError:  # Python < 3.3
-    try:
-        from UserDict import DictMixin  # Python 2
-    except ImportError:  # Python 3.0-3.3
-        from collections import Mapping as DictMixin
+    from UserDict import DictMixin
+except ImportError:
+    from collections import Mapping as DictMixin
 
 
 # With lazy loading, we might end up with multiple threads triggering
@@ -16,7 +13,6 @@ _fill_lock = RLock()
 class LazyDict(DictMixin):
     """Dictionary populated on first use."""
     data = None
-
     def __getitem__(self, key):
         if self.data is None:
             _fill_lock.acquire()
diff --git a/libs/pytz/reference.py b/libs/pytz/reference.py
index f765ca0af..3dda13e75 100644
--- a/libs/pytz/reference.py
+++ b/libs/pytz/reference.py
@@ -5,28 +5,17 @@ Used for testing against as they are only correct for the years
 '''
 
 from datetime import tzinfo, timedelta, datetime
-from pytz import HOUR, ZERO, UTC
-
-__all__ = [
-    'FixedOffset',
-    'LocalTimezone',
-    'USTimeZone',
-    'Eastern',
-    'Central',
-    'Mountain',
-    'Pacific',
-    'UTC'
-]
-
+from pytz import utc, UTC, HOUR, ZERO
 
 # A class building tzinfo objects for fixed-offset time zones.
 # Note that FixedOffset(0, "UTC") is a different way to build a
 # UTC tzinfo object.
+
 class FixedOffset(tzinfo):
     """Fixed offset in minutes east from UTC."""
 
     def __init__(self, offset, name):
-        self.__offset = timedelta(minutes=offset)
+        self.__offset = timedelta(minutes = offset)
         self.__name = name
 
     def utcoffset(self, dt):
@@ -38,19 +27,18 @@ class FixedOffset(tzinfo):
     def dst(self, dt):
         return ZERO
 
+# A class capturing the platform's idea of local time.
 
 import time as _time
 
-STDOFFSET = timedelta(seconds=-_time.timezone)
+STDOFFSET = timedelta(seconds = -_time.timezone)
 if _time.daylight:
-    DSTOFFSET = timedelta(seconds=-_time.altzone)
+    DSTOFFSET = timedelta(seconds = -_time.altzone)
 else:
     DSTOFFSET = STDOFFSET
 
 DSTDIFF = DSTOFFSET - STDOFFSET
 
-
-# A class capturing the platform's idea of local time.
 class LocalTimezone(tzinfo):
 
     def utcoffset(self, dt):
@@ -78,6 +66,7 @@ class LocalTimezone(tzinfo):
 
 Local = LocalTimezone()
 
+# A complete implementation of current DST rules for major US time zones.
 
 def first_sunday_on_or_after(dt):
     days_to_go = 6 - dt.weekday()
@@ -85,15 +74,12 @@ def first_sunday_on_or_after(dt):
         dt += timedelta(days_to_go)
     return dt
 
-
 # In the US, DST starts at 2am (standard time) on the first Sunday in April.
 DSTSTART = datetime(1, 4, 1, 2)
 # and ends at 2am (DST time; 1am standard time) on the last Sunday of Oct.
 # which is the first Sunday on or after Oct 25.
 DSTEND = datetime(1, 10, 25, 1)
 
-
-# A complete implementation of current DST rules for major US time zones.
 class USTimeZone(tzinfo):
 
     def __init__(self, hours, reprname, stdname, dstname):
@@ -134,7 +120,8 @@ class USTimeZone(tzinfo):
         else:
             return ZERO
 
-Eastern = USTimeZone(-5, "Eastern", "EST", "EDT")
-Central = USTimeZone(-6, "Central", "CST", "CDT")
+Eastern  = USTimeZone(-5, "Eastern",  "EST", "EDT")
+Central  = USTimeZone(-6, "Central",  "CST", "CDT")
 Mountain = USTimeZone(-7, "Mountain", "MST", "MDT")
-Pacific = USTimeZone(-8, "Pacific", "PST", "PDT")
+Pacific  = USTimeZone(-8, "Pacific",  "PST", "PDT")
+
diff --git a/libs/pytz/tests/test_docs.py b/libs/pytz/tests/test_docs.py
new file mode 100644
index 000000000..ae189d31e
--- /dev/null
+++ b/libs/pytz/tests/test_docs.py
@@ -0,0 +1,34 @@
+# -*- coding: ascii -*-
+
+from doctest import DocFileSuite
+import unittest, os.path, sys
+
+THIS_DIR = os.path.dirname(__file__)
+
+README = os.path.join(THIS_DIR, os.pardir, os.pardir, 'README.txt')
+
+
+class DocumentationTestCase(unittest.TestCase):
+    def test_readme_encoding(self):
+        '''Confirm the README.txt is pure ASCII.'''
+        f = open(README, 'rb')
+        try:
+            f.read().decode('ASCII')
+        finally:
+            f.close()
+
+
+def test_suite():
+    "For the Z3 test runner"
+    return unittest.TestSuite((
+        DocumentationTestCase('test_readme_encoding'),
+        DocFileSuite(os.path.join(os.pardir, os.pardir, 'README.txt'))))
+
+
+if __name__ == '__main__':
+    sys.path.insert(0, os.path.abspath(os.path.join(
+        THIS_DIR, os.pardir, os.pardir
+        )))
+    unittest.main(defaultTest='test_suite')
+
+
diff --git a/libs/pytz/tests/test_lazy.py b/libs/pytz/tests/test_lazy.py
new file mode 100644
index 000000000..3a4afa63b
--- /dev/null
+++ b/libs/pytz/tests/test_lazy.py
@@ -0,0 +1,313 @@
+from operator import *
+import os.path
+import sys
+import unittest
+import warnings
+
+
+if __name__ == '__main__':
+    # Only munge path if invoked as a script. Testrunners should have setup
+    # the paths already
+    sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, os.pardir)))
+
+
+from pytz.lazy import LazyList, LazySet
+
+
+class LazyListTestCase(unittest.TestCase):
+    initial_data = [3,2,1]
+
+    def setUp(self):
+        self.base = [3, 2, 1]
+        self.lesser = [2, 1, 0]
+        self.greater = [4, 3, 2]
+
+        self.lazy = LazyList(iter(list(self.base)))
+
+    def test_unary_ops(self):
+        unary_ops = [str, repr, len, bool, not_]
+        try:
+            unary_ops.append(unicode)
+        except NameError:
+            pass  # unicode no longer exists in Python 3.
+
+        for op in unary_ops:
+            self.assertEqual(
+                op(self.lazy),
+                op(self.base), str(op))
+
+    def test_binary_ops(self):
+        binary_ops = [eq, ge, gt, le, lt, ne, add, concat]
+        try:
+            binary_ops.append(cmp)
+        except NameError:
+            pass  # cmp no longer exists in Python 3.
+
+        for op in binary_ops:
+            self.assertEqual(
+                op(self.lazy, self.lazy),
+                op(self.base, self.base), str(op))
+            for other in [self.base, self.lesser, self.greater]:
+                self.assertEqual(
+                    op(self.lazy, other),
+                    op(self.base, other), '%s %s' % (op, other))
+                self.assertEqual(
+                    op(other, self.lazy),
+                    op(other, self.base), '%s %s' % (op, other))
+
+        # Multiplication
+        self.assertEqual(self.lazy * 3, self.base * 3)
+        self.assertEqual(3 * self.lazy, 3 * self.base)
+
+        # Contains
+        self.assertTrue(2 in self.lazy)
+        self.assertFalse(42 in self.lazy)
+
+    def test_iadd(self):
+        self.lazy += [1]
+        self.base += [1]
+        self.assertEqual(self.lazy, self.base)
+
+    def test_bool(self):
+        self.assertTrue(bool(self.lazy))
+        self.assertFalse(bool(LazyList()))
+        self.assertFalse(bool(LazyList(iter([]))))
+
+    def test_hash(self):
+        self.assertRaises(TypeError, hash, self.lazy)
+
+    def test_isinstance(self):
+        self.assertTrue(isinstance(self.lazy, list))
+        self.assertFalse(isinstance(self.lazy, tuple))
+
+    def test_callable(self):
+        try:
+            callable
+        except NameError:
+            return  # No longer exists with Python 3.
+        self.assertFalse(callable(self.lazy))
+
+    def test_append(self):
+        self.base.append('extra')
+        self.lazy.append('extra')
+        self.assertEqual(self.lazy, self.base)
+
+    def test_count(self):
+        self.assertEqual(self.lazy.count(2), 1)
+
+    def test_index(self):
+        self.assertEqual(self.lazy.index(2), 1)
+
+    def test_extend(self):
+        self.base.extend([6, 7])
+        self.lazy.extend([6, 7])
+        self.assertEqual(self.lazy, self.base)
+
+    def test_insert(self):
+        self.base.insert(0, 'ping')
+        self.lazy.insert(0, 'ping')
+        self.assertEqual(self.lazy, self.base)
+
+    def test_pop(self):
+        self.assertEqual(self.lazy.pop(), self.base.pop())
+        self.assertEqual(self.lazy, self.base)
+
+    def test_remove(self):
+        self.base.remove(2)
+        self.lazy.remove(2)
+        self.assertEqual(self.lazy, self.base)
+
+    def test_reverse(self):
+        self.base.reverse()
+        self.lazy.reverse()
+        self.assertEqual(self.lazy, self.base)
+
+    def test_reversed(self):
+        self.assertEqual(list(reversed(self.lazy)), list(reversed(self.base)))
+
+    def test_sort(self):
+        self.base.sort()
+        self.assertNotEqual(self.lazy, self.base, 'Test data already sorted')
+        self.lazy.sort()
+        self.assertEqual(self.lazy, self.base)
+
+    def test_sorted(self):
+        self.assertEqual(sorted(self.lazy), sorted(self.base))
+
+    def test_getitem(self):
+        for idx in range(-len(self.base), len(self.base)):
+            self.assertEqual(self.lazy[idx], self.base[idx])
+
+    def test_setitem(self):
+        for idx in range(-len(self.base), len(self.base)):
+            self.base[idx] = idx + 1000
+            self.assertNotEqual(self.lazy, self.base)
+            self.lazy[idx] = idx + 1000
+            self.assertEqual(self.lazy, self.base)
+
+    def test_delitem(self):
+        del self.base[0]
+        self.assertNotEqual(self.lazy, self.base)
+        del self.lazy[0]
+        self.assertEqual(self.lazy, self.base)
+
+        del self.base[-2]
+        self.assertNotEqual(self.lazy, self.base)
+        del self.lazy[-2]
+        self.assertEqual(self.lazy, self.base)
+
+    def test_iter(self):
+        self.assertEqual(list(iter(self.lazy)), list(iter(self.base)))
+
+    def test_getslice(self):
+        for i in range(-len(self.base), len(self.base)):
+            for j in range(-len(self.base), len(self.base)):
+                for step in [-1, 1]:
+                    self.assertEqual(self.lazy[i:j:step], self.base[i:j:step])
+
+    def test_setslice(self):
+        for i in range(-len(self.base), len(self.base)):
+            for j in range(-len(self.base), len(self.base)):
+                for step in [-1, 1]:
+                    replacement = range(0, len(self.base[i:j:step]))
+                    self.base[i:j:step] = replacement
+                    self.lazy[i:j:step] = replacement
+                    self.assertEqual(self.lazy, self.base)
+
+    def test_delslice(self):
+        del self.base[0:1]
+        del self.lazy[0:1]
+        self.assertEqual(self.lazy, self.base)
+
+        del self.base[-1:1:-1]
+        del self.lazy[-1:1:-1]
+        self.assertEqual(self.lazy, self.base)
+
+
+class LazySetTestCase(unittest.TestCase):
+    initial_data = set([3,2,1])
+
+    def setUp(self):
+        self.base = set([3, 2, 1])
+        self.lazy = LazySet(iter(set(self.base)))
+
+    def test_unary_ops(self):
+        # These ops just need to work.
+        unary_ops = [str, repr]
+        try:
+            unary_ops.append(unicode)
+        except NameError:
+            pass  # unicode no longer exists in Python 3.
+
+        for op in unary_ops:
+            op(self.lazy)  # These ops just need to work.
+
+        # These ops should return identical values as a real set.
+        unary_ops = [len, bool, not_]
+
+        for op in unary_ops:
+            self.assertEqual(
+                op(self.lazy),
+                op(self.base), '%s(lazy) == %r' % (op, op(self.lazy)))
+
+    def test_binary_ops(self):
+        binary_ops = [eq, ge, gt, le, lt, ne, sub, and_, or_, xor]
+        try:
+            binary_ops.append(cmp)
+        except NameError:
+            pass  # cmp no longer exists in Python 3.
+
+        for op in binary_ops:
+            self.assertEqual(
+                op(self.lazy, self.lazy),
+                op(self.base, self.base), str(op))
+            self.assertEqual(
+                op(self.lazy, self.base),
+                op(self.base, self.base), str(op))
+            self.assertEqual(
+                op(self.base, self.lazy),
+                op(self.base, self.base), str(op))
+
+        # Contains
+        self.assertTrue(2 in self.lazy)
+        self.assertFalse(42 in self.lazy)
+
+    def test_iops(self):
+        try:
+            iops = [isub, iand, ior, ixor]
+        except NameError:
+            return  # Don't exist in older Python versions.
+        for op in iops:
+            # Mutating operators, so make fresh copies.
+            lazy = LazySet(self.base)
+            base = self.base.copy()
+            op(lazy, set([1]))
+            op(base, set([1]))
+            self.assertEqual(lazy, base, str(op))
+
+    def test_bool(self):
+        self.assertTrue(bool(self.lazy))
+        self.assertFalse(bool(LazySet()))
+        self.assertFalse(bool(LazySet(iter([]))))
+
+    def test_hash(self):
+        self.assertRaises(TypeError, hash, self.lazy)
+
+    def test_isinstance(self):
+        self.assertTrue(isinstance(self.lazy, set))
+
+    def test_callable(self):
+        try:
+            callable
+        except NameError:
+            return  # No longer exists with Python 3.
+        self.assertFalse(callable(self.lazy))
+
+    def test_add(self):
+        self.base.add('extra')
+        self.lazy.add('extra')
+        self.assertEqual(self.lazy, self.base)
+
+    def test_copy(self):
+        self.assertEqual(self.lazy.copy(), self.base)
+
+    def test_method_ops(self):
+        ops = [
+            'difference', 'intersection', 'isdisjoint',
+            'issubset', 'issuperset', 'symmetric_difference', 'union',
+            'difference_update', 'intersection_update',
+            'symmetric_difference_update', 'update']
+        for op in ops:
+            if not hasattr(set, op):
+                continue  # Not in this version of Python.
+            # Make a copy, as some of the ops are mutating.
+            lazy = LazySet(set(self.base))
+            base = set(self.base)
+            self.assertEqual(
+                getattr(self.lazy, op)(set([1])),
+                getattr(self.base, op)(set([1])), op)
+            self.assertEqual(self.lazy, self.base, op)
+
+    def test_discard(self):
+        self.base.discard(1)
+        self.assertNotEqual(self.lazy, self.base)
+        self.lazy.discard(1)
+        self.assertEqual(self.lazy, self.base)
+
+    def test_pop(self):
+        self.assertEqual(self.lazy.pop(), self.base.pop())
+        self.assertEqual(self.lazy, self.base)
+
+    def test_remove(self):
+        self.base.remove(2)
+        self.lazy.remove(2)
+        self.assertEqual(self.lazy, self.base)
+
+    def test_clear(self):
+        self.lazy.clear()
+        self.assertEqual(self.lazy, set())
+
+
+if __name__ == '__main__':
+    warnings.simplefilter("error") # Warnings should be fatal in tests.
+    unittest.main()
diff --git a/libs/pytz/tests/test_tzinfo.py b/libs/pytz/tests/test_tzinfo.py
new file mode 100644
index 000000000..3166322d2
--- /dev/null
+++ b/libs/pytz/tests/test_tzinfo.py
@@ -0,0 +1,844 @@
+# -*- coding: ascii -*-
+
+import sys, os, os.path
+import unittest, doctest
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+from datetime import datetime, time, timedelta, tzinfo
+import warnings
+
+if __name__ == '__main__':
+    # Only munge path if invoked as a script. Testrunners should have setup
+    # the paths already
+    sys.path.insert(0, os.path.abspath(os.path.join(os.pardir, os.pardir)))
+
+import pytz
+from pytz import reference
+from pytz.tzfile import _byte_string
+from pytz.tzinfo import DstTzInfo, StaticTzInfo
+
+# I test for expected version to ensure the correct version of pytz is
+# actually being tested.
+EXPECTED_VERSION='2017.2'
+EXPECTED_OLSON_VERSION='2017b'
+
+fmt = '%Y-%m-%d %H:%M:%S %Z%z'
+
+NOTIME = timedelta(0)
+
+# GMT is a tzinfo.StaticTzInfo--the class we primarily want to test--while
+# UTC is reference implementation.  They both have the same timezone meaning.
+UTC = pytz.timezone('UTC')
+GMT = pytz.timezone('GMT')
+assert isinstance(GMT, StaticTzInfo), 'GMT is no longer a StaticTzInfo'
+
+def prettydt(dt):
+    """datetime as a string using a known format.
+
+    We don't use strftime as it doesn't handle years earlier than 1900
+    per http://bugs.python.org/issue1777412
+    """
+    if dt.utcoffset() >= timedelta(0):
+        offset = '+%s' % (dt.utcoffset(),)
+    else:
+        offset = '-%s' % (-1 * dt.utcoffset(),)
+    return '%04d-%02d-%02d %02d:%02d:%02d %s %s' % (
+        dt.year, dt.month, dt.day,
+        dt.hour, dt.minute, dt.second,
+        dt.tzname(), offset)
+
+
+try:
+    unicode
+except NameError:
+    # Python 3.x doesn't have unicode(), making writing code
+    # for Python 2.3 and Python 3.x a pain.
+    unicode = str
+
+
+class BasicTest(unittest.TestCase):
+
+    def testVersion(self):
+        # Ensuring the correct version of pytz has been loaded
+        self.assertEqual(EXPECTED_VERSION, pytz.__version__,
+                'Incorrect pytz version loaded. Import path is stuffed '
+                'or this test needs updating. (Wanted %s, got %s)'
+                % (EXPECTED_VERSION, pytz.__version__))
+
+        self.assertEqual(EXPECTED_OLSON_VERSION, pytz.OLSON_VERSION,
+                'Incorrect pytz version loaded. Import path is stuffed '
+                'or this test needs updating. (Wanted %s, got %s)'
+                % (EXPECTED_OLSON_VERSION, pytz.OLSON_VERSION))
+
+    def testGMT(self):
+        now = datetime.now(tz=GMT)
+        self.assertTrue(now.utcoffset() == NOTIME)
+        self.assertTrue(now.dst() == NOTIME)
+        self.assertTrue(now.timetuple() == now.utctimetuple())
+        self.assertTrue(now==now.replace(tzinfo=UTC))
+
+    def testReferenceUTC(self):
+        now = datetime.now(tz=UTC)
+        self.assertTrue(now.utcoffset() == NOTIME)
+        self.assertTrue(now.dst() == NOTIME)
+        self.assertTrue(now.timetuple() == now.utctimetuple())
+
+    def testUnknownOffsets(self):
+        # This tzinfo behavior is required to make
+        # datetime.time.{utcoffset, dst, tzname} work as documented.
+
+        dst_tz = pytz.timezone('US/Eastern')
+
+        # This information is not known when we don't have a date,
+        # so return None per API.
+        self.assertTrue(dst_tz.utcoffset(None) is None)
+        self.assertTrue(dst_tz.dst(None) is None)
+        # We don't know the abbreviation, but this is still a valid
+        # tzname per the Python documentation.
+        self.assertEqual(dst_tz.tzname(None), 'US/Eastern')
+
+    def clearCache(self):
+        pytz._tzinfo_cache.clear()
+
+    def testUnicodeTimezone(self):
+        # We need to ensure that cold lookups work for both Unicode
+        # and traditional strings, and that the desired singleton is
+        # returned.
+        self.clearCache()
+        eastern = pytz.timezone(unicode('US/Eastern'))
+        self.assertTrue(eastern is pytz.timezone('US/Eastern'))
+
+        self.clearCache()
+        eastern = pytz.timezone('US/Eastern')
+        self.assertTrue(eastern is pytz.timezone(unicode('US/Eastern')))
+
+    def testStaticTzInfo(self):
+        # Ensure that static timezones are correctly detected,
+        # per lp:1602807
+        static = pytz.timezone('Etc/GMT-4')
+        self.assertTrue(isinstance(static, StaticTzInfo))
+
+
+class PicklingTest(unittest.TestCase):
+
+    def _roundtrip_tzinfo(self, tz):
+        p = pickle.dumps(tz)
+        unpickled_tz = pickle.loads(p)
+        self.assertTrue(tz is unpickled_tz, '%s did not roundtrip' % tz.zone)
+
+    def _roundtrip_datetime(self, dt):
+        # Ensure that the tzinfo attached to a datetime instance
+        # is identical to the one returned. This is important for
+        # DST timezones, as some state is stored in the tzinfo.
+        tz = dt.tzinfo
+        p = pickle.dumps(dt)
+        unpickled_dt = pickle.loads(p)
+        unpickled_tz = unpickled_dt.tzinfo
+        self.assertTrue(tz is unpickled_tz, '%s did not roundtrip' % tz.zone)
+
+    def testDst(self):
+        tz = pytz.timezone('Europe/Amsterdam')
+        dt = datetime(2004, 2, 1, 0, 0, 0)
+
+        for localized_tz in tz._tzinfos.values():
+            self._roundtrip_tzinfo(localized_tz)
+            self._roundtrip_datetime(dt.replace(tzinfo=localized_tz))
+
+    def testRoundtrip(self):
+        dt = datetime(2004, 2, 1, 0, 0, 0)
+        for zone in pytz.all_timezones:
+            tz = pytz.timezone(zone)
+            self._roundtrip_tzinfo(tz)
+
+    def testDatabaseFixes(self):
+        # Hack the pickle to make it refer to a timezone abbreviation
+        # that does not match anything. The unpickler should be able
+        # to repair this case
+        tz = pytz.timezone('Australia/Melbourne')
+        p = pickle.dumps(tz)
+        tzname = tz._tzname
+        hacked_p = p.replace(_byte_string(tzname),
+                             _byte_string('?'*len(tzname)))
+        self.assertNotEqual(p, hacked_p)
+        unpickled_tz = pickle.loads(hacked_p)
+        self.assertTrue(tz is unpickled_tz)
+
+        # Simulate a database correction. In this case, the incorrect
+        # data will continue to be used.
+        p = pickle.dumps(tz)
+        new_utcoffset = tz._utcoffset.seconds + 42
+
+        # Python 3 introduced a new pickle protocol where numbers are stored in
+        # hexadecimal representation. Here we extract the pickle
+        # representation of the number for the current Python version.
+        old_pickle_pattern = pickle.dumps(tz._utcoffset.seconds)[3:-1]
+        new_pickle_pattern = pickle.dumps(new_utcoffset)[3:-1]
+        hacked_p = p.replace(old_pickle_pattern, new_pickle_pattern)
+
+        self.assertNotEqual(p, hacked_p)
+        unpickled_tz = pickle.loads(hacked_p)
+        self.assertEqual(unpickled_tz._utcoffset.seconds, new_utcoffset)
+        self.assertTrue(tz is not unpickled_tz)
+
+    def testOldPickles(self):
+        # Ensure that applications serializing pytz instances as pickles
+        # have no troubles upgrading to a new pytz release. These pickles
+        # where created with pytz2006j
+        east1 = pickle.loads(_byte_string(
+            "cpytz\n_p\np1\n(S'US/Eastern'\np2\nI-18000\n"
+            "I0\nS'EST'\np3\ntRp4\n."
+            ))
+        east2 = pytz.timezone('US/Eastern').localize(
+            datetime(2006, 1, 1)).tzinfo
+        self.assertTrue(east1 is east2)
+
+        # Confirm changes in name munging between 2006j and 2007c cause
+        # no problems.
+        pap1 = pickle.loads(_byte_string(
+            "cpytz\n_p\np1\n(S'America/Port_minus_au_minus_Prince'"
+            "\np2\nI-17340\nI0\nS'PPMT'\np3\ntRp4\n."))
+        pap2 = pytz.timezone('America/Port-au-Prince').localize(
+            datetime(1910, 1, 1)).tzinfo
+        self.assertTrue(pap1 is pap2)
+
+        gmt1 = pickle.loads(_byte_string(
+            "cpytz\n_p\np1\n(S'Etc/GMT_plus_10'\np2\ntRp3\n."))
+        gmt2 = pytz.timezone('Etc/GMT+10')
+        self.assertTrue(gmt1 is gmt2)
+
+
+class USEasternDSTStartTestCase(unittest.TestCase):
+    tzinfo = pytz.timezone('US/Eastern')
+
+    # 24 hours before DST changeover
+    transition_time = datetime(2002, 4, 7, 7, 0, 0, tzinfo=UTC)
+
+    # Increase for 'flexible' DST transitions due to 1 minute granularity
+    # of Python's datetime library
+    instant = timedelta(seconds=1)
+
+    # before transition
+    before = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+    # after transition
+    after = {
+        'tzname': 'EDT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+
+    def _test_tzname(self, utc_dt, wanted):
+        tzname = wanted['tzname']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.assertEqual(dt.tzname(), tzname,
+            'Expected %s as tzname for %s. Got %s' % (
+                tzname, str(utc_dt), dt.tzname()
+                )
+            )
+
+    def _test_utcoffset(self, utc_dt, wanted):
+        utcoffset = wanted['utcoffset']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.assertEqual(
+                dt.utcoffset(), wanted['utcoffset'],
+                'Expected %s as utcoffset for %s. Got %s' % (
+                    utcoffset, utc_dt, dt.utcoffset()
+                    )
+                )
+
+    def _test_dst(self, utc_dt, wanted):
+        dst = wanted['dst']
+        dt = utc_dt.astimezone(self.tzinfo)
+        self.assertEqual(dt.dst(),dst,
+            'Expected %s as dst for %s. Got %s' % (
+                dst, utc_dt, dt.dst()
+                )
+            )
+
+    def test_arithmetic(self):
+        utc_dt = self.transition_time
+
+        for days in range(-420, 720, 20):
+            delta = timedelta(days=days)
+
+            # Make sure we can get back where we started
+            dt = utc_dt.astimezone(self.tzinfo)
+            dt2 = dt + delta
+            dt2 = dt2 - delta
+            self.assertEqual(dt, dt2)
+
+            # Make sure arithmetic crossing DST boundaries ends
+            # up in the correct timezone after normalization
+            utc_plus_delta = (utc_dt + delta).astimezone(self.tzinfo)
+            local_plus_delta = self.tzinfo.normalize(dt + delta)
+            self.assertEqual(
+                    prettydt(utc_plus_delta),
+                    prettydt(local_plus_delta),
+                    'Incorrect result for delta==%d days.  Wanted %r. Got %r'%(
+                        days,
+                        prettydt(utc_plus_delta),
+                        prettydt(local_plus_delta),
+                        )
+                    )
+
+    def _test_all(self, utc_dt, wanted):
+        self._test_utcoffset(utc_dt, wanted)
+        self._test_tzname(utc_dt, wanted)
+        self._test_dst(utc_dt, wanted)
+
+    def testDayBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(days=1), self.before
+                )
+
+    def testTwoHoursBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(hours=2), self.before
+                )
+
+    def testHourBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(hours=1), self.before
+                )
+
+    def testInstantBefore(self):
+        self._test_all(
+                self.transition_time - self.instant, self.before
+                )
+
+    def testTransition(self):
+        self._test_all(
+                self.transition_time, self.after
+                )
+
+    def testInstantAfter(self):
+        self._test_all(
+                self.transition_time + self.instant, self.after
+                )
+
+    def testHourAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(hours=1), self.after
+                )
+
+    def testTwoHoursAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(hours=1), self.after
+                )
+
+    def testDayAfter(self):
+        self._test_all(
+                self.transition_time + timedelta(days=1), self.after
+                )
+
+
+class USEasternDSTEndTestCase(USEasternDSTStartTestCase):
+    tzinfo = pytz.timezone('US/Eastern')
+    transition_time = datetime(2002, 10, 27, 6, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EDT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+
+class USEasternEPTStartTestCase(USEasternDSTStartTestCase):
+    transition_time = datetime(1945, 8, 14, 23, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EWT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EPT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+
+
+class USEasternEPTEndTestCase(USEasternDSTStartTestCase):
+    transition_time = datetime(1945, 9, 30, 6, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'EPT',
+        'utcoffset': timedelta(hours = -4),
+        'dst': timedelta(hours = 1),
+        }
+    after = {
+        'tzname': 'EST',
+        'utcoffset': timedelta(hours = -5),
+        'dst': timedelta(hours = 0),
+        }
+
+
+class WarsawWMTEndTestCase(USEasternDSTStartTestCase):
+    # In 1915, Warsaw changed from Warsaw to Central European time.
+    # This involved the clocks being set backwards, causing a end-of-DST
+    # like situation without DST being involved.
+    tzinfo = pytz.timezone('Europe/Warsaw')
+    transition_time = datetime(1915, 8, 4, 22, 36, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'WMT',
+        'utcoffset': timedelta(hours=1, minutes=24),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'CET',
+        'utcoffset': timedelta(hours=1),
+        'dst': timedelta(0),
+        }
+
+
+class VilniusWMTEndTestCase(USEasternDSTStartTestCase):
+    # At the end of 1916, Vilnius changed timezones putting its clock
+    # forward by 11 minutes 35 seconds. Neither timezone was in DST mode.
+    tzinfo = pytz.timezone('Europe/Vilnius')
+    instant = timedelta(seconds=31)
+    transition_time = datetime(1916, 12, 31, 22, 36, 00, tzinfo=UTC)
+    before = {
+        'tzname': 'WMT',
+        'utcoffset': timedelta(hours=1, minutes=24),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'KMT',
+        'utcoffset': timedelta(hours=1, minutes=36), # Really 1:35:36
+        'dst': timedelta(0),
+        }
+
+
+class VilniusCESTStartTestCase(USEasternDSTStartTestCase):
+    # In 1941, Vilnius changed from MSG to CEST, switching to summer
+    # time while simultaneously reducing its UTC offset by two hours,
+    # causing the clocks to go backwards for this summer time
+    # switchover.
+    tzinfo = pytz.timezone('Europe/Vilnius')
+    transition_time = datetime(1941, 6, 23, 21, 00, 00, tzinfo=UTC)
+    before = {
+        'tzname': 'MSK',
+        'utcoffset': timedelta(hours=3),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'CEST',
+        'utcoffset': timedelta(hours=2),
+        'dst': timedelta(hours=1),
+        }
+
+
+class LondonHistoryStartTestCase(USEasternDSTStartTestCase):
+    # The first known timezone transition in London was in 1847 when
+    # clocks where synchronized to GMT. However, we currently only
+    # understand v1 format tzfile(5) files which does handle years
+    # this far in the past, so our earliest known transition is in
+    # 1916.
+    tzinfo = pytz.timezone('Europe/London')
+    # transition_time = datetime(1847, 12, 1, 1, 15, 00, tzinfo=UTC)
+    # before = {
+    #     'tzname': 'LMT',
+    #     'utcoffset': timedelta(minutes=-75),
+    #     'dst': timedelta(0),
+    #     }
+    # after = {
+    #     'tzname': 'GMT',
+    #     'utcoffset': timedelta(0),
+    #     'dst': timedelta(0),
+    #     }
+    transition_time = datetime(1916, 5, 21, 2, 00, 00, tzinfo=UTC)
+    before = {
+        'tzname': 'GMT',
+        'utcoffset': timedelta(0),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': 'BST',
+        'utcoffset': timedelta(hours=1),
+        'dst': timedelta(hours=1),
+        }
+
+
+class LondonHistoryEndTestCase(USEasternDSTStartTestCase):
+    # Timezone switchovers are projected into the future, even
+    # though no official statements exist or could be believed even
+    # if they did exist. We currently only check the last known
+    # transition in 2037, as we are still using v1 format tzfile(5)
+    # files.
+    tzinfo = pytz.timezone('Europe/London')
+    # transition_time = datetime(2499, 10, 25, 1, 0, 0, tzinfo=UTC)
+    transition_time = datetime(2037, 10, 25, 1, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': 'BST',
+        'utcoffset': timedelta(hours=1),
+        'dst': timedelta(hours=1),
+        }
+    after = {
+        'tzname': 'GMT',
+        'utcoffset': timedelta(0),
+        'dst': timedelta(0),
+        }
+
+
+class NoumeaHistoryStartTestCase(USEasternDSTStartTestCase):
+    # Noumea adopted a whole hour offset in 1912. Previously
+    # it was 11 hours, 5 minutes and 48 seconds off UTC. However,
+    # due to limitations of the Python datetime library, we need
+    # to round that to 11 hours 6 minutes.
+    tzinfo = pytz.timezone('Pacific/Noumea')
+    transition_time = datetime(1912, 1, 12, 12, 54, 12, tzinfo=UTC)
+    before = {
+        'tzname': 'LMT',
+        'utcoffset': timedelta(hours=11, minutes=6),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': '+11',  # pre-2017a, NCT
+        'utcoffset': timedelta(hours=11),
+        'dst': timedelta(0),
+        }
+
+
+class NoumeaDSTEndTestCase(USEasternDSTStartTestCase):
+    # Noumea dropped DST in 1997.
+    tzinfo = pytz.timezone('Pacific/Noumea')
+    transition_time = datetime(1997, 3, 1, 15, 00, 00, tzinfo=UTC)
+    before = {
+        'tzname': '+12',  # pre-2017a, NCST
+        'utcoffset': timedelta(hours=12),
+        'dst': timedelta(hours=1),
+        }
+    after = {
+        'tzname': '+11',  # pre-2017a, NCT
+        'utcoffset': timedelta(hours=11),
+        'dst': timedelta(0),
+        }
+
+
+class NoumeaNoMoreDSTTestCase(NoumeaDSTEndTestCase):
+    # Noumea dropped DST in 1997. Here we test that it stops occuring.
+    transition_time = (
+        NoumeaDSTEndTestCase.transition_time + timedelta(days=365*10))
+    before = NoumeaDSTEndTestCase.after
+    after = NoumeaDSTEndTestCase.after
+
+
+class TahitiTestCase(USEasternDSTStartTestCase):
+    # Tahiti has had a single transition in its history.
+    tzinfo = pytz.timezone('Pacific/Tahiti')
+    transition_time = datetime(1912, 10, 1, 9, 58, 16, tzinfo=UTC)
+    before = {
+        'tzname': 'LMT',
+        'utcoffset': timedelta(hours=-9, minutes=-58),
+        'dst': timedelta(0),
+        }
+    after = {
+        'tzname': '-10',  # pre-2017a, TAHT
+        'utcoffset': timedelta(hours=-10),
+        'dst': timedelta(0),
+        }
+
+
+class SamoaInternationalDateLineChange(USEasternDSTStartTestCase):
+    # At the end of 2011, Samoa will switch from being east of the
+    # international dateline to the west. There will be no Dec 30th
+    # 2011 and it will switch from UTC-10 to UTC+14.
+    tzinfo = pytz.timezone('Pacific/Apia')
+    transition_time = datetime(2011, 12, 30, 10, 0, 0, tzinfo=UTC)
+    before = {
+        'tzname': '-10',  # pre-2017a, SDT
+        'utcoffset': timedelta(hours=-10),
+        'dst': timedelta(hours=1),
+        }
+    after = {
+        'tzname': '+14',  # pre-2017a, WSDT
+        'utcoffset': timedelta(hours=14),
+        'dst': timedelta(hours=1),
+        }
+
+
+class ReferenceUSEasternDSTStartTestCase(USEasternDSTStartTestCase):
+    tzinfo = reference.Eastern
+    def test_arithmetic(self):
+        # Reference implementation cannot handle this
+        pass
+
+
+class ReferenceUSEasternDSTEndTestCase(USEasternDSTEndTestCase):
+    tzinfo = reference.Eastern
+
+    def testHourBefore(self):
+        # Python's datetime library has a bug, where the hour before
+        # a daylight saving transition is one hour out. For example,
+        # at the end of US/Eastern daylight saving time, 01:00 EST
+        # occurs twice (once at 05:00 UTC and once at 06:00 UTC),
+        # whereas the first should actually be 01:00 EDT.
+        # Note that this bug is by design - by accepting this ambiguity
+        # for one hour one hour per year, an is_dst flag on datetime.time
+        # became unnecessary.
+        self._test_all(
+                self.transition_time - timedelta(hours=1), self.after
+                )
+
+    def testInstantBefore(self):
+        self._test_all(
+                self.transition_time - timedelta(seconds=1), self.after
+                )
+
+    def test_arithmetic(self):
+        # Reference implementation cannot handle this
+        pass
+
+
+class LocalTestCase(unittest.TestCase):
+    def testLocalize(self):
+        loc_tz = pytz.timezone('Europe/Amsterdam')
+
+        loc_time = loc_tz.localize(datetime(1930, 5, 10, 0, 0, 0))
+        # Actually +00:19:32, but Python datetime rounds this
+        self.assertEqual(loc_time.strftime('%Z%z'), 'AMT+0020')
+
+        loc_time = loc_tz.localize(datetime(1930, 5, 20, 0, 0, 0))
+        # Actually +00:19:32, but Python datetime rounds this
+        self.assertEqual(loc_time.strftime('%Z%z'), 'NST+0120')
+
+        loc_time = loc_tz.localize(datetime(1940, 5, 10, 0, 0, 0))
+        # pre-2017a, abbreviation was NCT
+        self.assertEqual(loc_time.strftime('%Z%z'), '+0020+0020')
+
+        loc_time = loc_tz.localize(datetime(1940, 5, 20, 0, 0, 0))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'CEST+0200')
+
+        loc_time = loc_tz.localize(datetime(2004, 2, 1, 0, 0, 0))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'CET+0100')
+
+        loc_time = loc_tz.localize(datetime(2004, 4, 1, 0, 0, 0))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'CEST+0200')
+
+        tz = pytz.timezone('Europe/Amsterdam')
+        loc_time = loc_tz.localize(datetime(1943, 3, 29, 1, 59, 59))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'CET+0100')
+
+
+        # Switch to US
+        loc_tz = pytz.timezone('US/Eastern')
+
+        # End of DST ambiguity check
+        loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=1)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EDT-0400')
+
+        loc_time = loc_tz.localize(datetime(1918, 10, 27, 1, 59, 59), is_dst=0)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EST-0500')
+
+        self.assertRaises(pytz.AmbiguousTimeError,
+            loc_tz.localize, datetime(1918, 10, 27, 1, 59, 59), is_dst=None
+            )
+
+        # Start of DST non-existent times
+        loc_time = loc_tz.localize(datetime(1918, 3, 31, 2, 0, 0), is_dst=0)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EST-0500')
+
+        loc_time = loc_tz.localize(datetime(1918, 3, 31, 2, 0, 0), is_dst=1)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EDT-0400')
+
+        self.assertRaises(pytz.NonExistentTimeError,
+            loc_tz.localize, datetime(1918, 3, 31, 2, 0, 0), is_dst=None
+            )
+
+        # Weird changes - war time and peace time both is_dst==True
+
+        loc_time = loc_tz.localize(datetime(1942, 2, 9, 3, 0, 0))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EWT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 8, 14, 19, 0, 0))
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EPT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=1)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EPT-0400')
+
+        loc_time = loc_tz.localize(datetime(1945, 9, 30, 1, 0, 0), is_dst=0)
+        self.assertEqual(loc_time.strftime('%Z%z'), 'EST-0500')
+
+        # Weird changes - ambiguous time (end-of-DST like) but is_dst==False
+        for zonename, ambiguous_naive, expected in [
+                ('Europe/Warsaw', datetime(1915, 8, 4, 23, 59, 59),
+                 ['1915-08-04 23:59:59 WMT+0124',
+                  '1915-08-04 23:59:59 CET+0100']),
+                ('Europe/Moscow', datetime(2014, 10, 26, 1, 30),
+                 ['2014-10-26 01:30:00 MSK+0400',
+                  '2014-10-26 01:30:00 MSK+0300'])]:
+            loc_tz = pytz.timezone(zonename)
+            self.assertRaises(pytz.AmbiguousTimeError,
+                loc_tz.localize, ambiguous_naive, is_dst=None
+                )
+            # Also test non-boolean is_dst in the weird case
+            for dst in [True, timedelta(1), False, timedelta(0)]:
+                loc_time = loc_tz.localize(ambiguous_naive, is_dst=dst)
+                self.assertEqual(loc_time.strftime(fmt), expected[not dst])
+
+    def testNormalize(self):
+        tz = pytz.timezone('US/Eastern')
+        dt = datetime(2004, 4, 4, 7, 0, 0, tzinfo=UTC).astimezone(tz)
+        dt2 = dt - timedelta(minutes=10)
+        self.assertEqual(
+                dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '2004-04-04 02:50:00 EDT-0400'
+                )
+
+        dt2 = tz.normalize(dt2)
+        self.assertEqual(
+                dt2.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '2004-04-04 01:50:00 EST-0500'
+                )
+
+    def testPartialMinuteOffsets(self):
+        # utcoffset in Amsterdam was not a whole minute until 1937
+        # However, we fudge this by rounding them, as the Python
+        # datetime library
+        tz = pytz.timezone('Europe/Amsterdam')
+        utc_dt = datetime(1914, 1, 1, 13, 40, 28, tzinfo=UTC) # correct
+        utc_dt = utc_dt.replace(second=0) # But we need to fudge it
+        loc_dt = utc_dt.astimezone(tz)
+        self.assertEqual(
+                loc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '1914-01-01 14:00:00 AMT+0020'
+                )
+
+        # And get back...
+        utc_dt = loc_dt.astimezone(UTC)
+        self.assertEqual(
+                utc_dt.strftime('%Y-%m-%d %H:%M:%S %Z%z'),
+                '1914-01-01 13:40:00 UTC+0000'
+                )
+
+    def no_testCreateLocaltime(self):
+        # It would be nice if this worked, but it doesn't.
+        tz = pytz.timezone('Europe/Amsterdam')
+        dt = datetime(2004, 10, 31, 2, 0, 0, tzinfo=tz)
+        self.assertEqual(
+                dt.strftime(fmt),
+                '2004-10-31 02:00:00 CET+0100'
+                )
+
+
+class CommonTimezonesTestCase(unittest.TestCase):
+    def test_bratislava(self):
+        # Bratislava is the default timezone for Slovakia, but our
+        # heuristics where not adding it to common_timezones. Ideally,
+        # common_timezones should be populated from zone.tab at runtime,
+        # but I'm hesitant to pay the startup cost as loading the list
+        # on demand whilst remaining backwards compatible seems
+        # difficult.
+        self.assertTrue('Europe/Bratislava' in pytz.common_timezones)
+        self.assertTrue('Europe/Bratislava' in pytz.common_timezones_set)
+
+    def test_us_eastern(self):
+        self.assertTrue('US/Eastern' in pytz.common_timezones)
+        self.assertTrue('US/Eastern' in pytz.common_timezones_set)
+
+    def test_belfast(self):
+        # Belfast uses London time.
+        self.assertTrue('Europe/Belfast' in pytz.all_timezones_set)
+        self.assertFalse('Europe/Belfast' in pytz.common_timezones)
+        self.assertFalse('Europe/Belfast' in pytz.common_timezones_set)
+
+
+class BaseTzInfoTestCase:
+    '''Ensure UTC, StaticTzInfo and DstTzInfo work consistently.
+
+    These tests are run for each type of tzinfo.
+    '''
+    tz = None  # override
+    tz_class = None  # override
+
+    def test_expectedclass(self):
+        self.assertTrue(isinstance(self.tz, self.tz_class))
+
+    def test_fromutc(self):
+        # naive datetime.
+        dt1 = datetime(2011, 10, 31)
+
+        # localized datetime, same timezone.
+        dt2 = self.tz.localize(dt1)
+
+        # Both should give the same results. Note that the standard
+        # Python tzinfo.fromutc() only supports the second.
+        for dt in [dt1, dt2]:
+            loc_dt = self.tz.fromutc(dt)
+            loc_dt2 = pytz.utc.localize(dt1).astimezone(self.tz)
+            self.assertEqual(loc_dt, loc_dt2)
+
+        # localized datetime, different timezone.
+        new_tz = pytz.timezone('Europe/Paris')
+        self.assertTrue(self.tz is not new_tz)
+        dt3 = new_tz.localize(dt1)
+        self.assertRaises(ValueError, self.tz.fromutc, dt3)
+
+    def test_normalize(self):
+        other_tz = pytz.timezone('Europe/Paris')
+        self.assertTrue(self.tz is not other_tz)
+
+        dt = datetime(2012, 3, 26, 12, 0)
+        other_dt = other_tz.localize(dt)
+
+        local_dt = self.tz.normalize(other_dt)
+
+        self.assertTrue(local_dt.tzinfo is not other_dt.tzinfo)
+        self.assertNotEqual(
+            local_dt.replace(tzinfo=None), other_dt.replace(tzinfo=None))
+
+    def test_astimezone(self):
+        other_tz = pytz.timezone('Europe/Paris')
+        self.assertTrue(self.tz is not other_tz)
+
+        dt = datetime(2012, 3, 26, 12, 0)
+        other_dt = other_tz.localize(dt)
+
+        local_dt = other_dt.astimezone(self.tz)
+
+        self.assertTrue(local_dt.tzinfo is not other_dt.tzinfo)
+        self.assertNotEqual(
+            local_dt.replace(tzinfo=None), other_dt.replace(tzinfo=None))
+
+
+class OptimizedUTCTestCase(unittest.TestCase, BaseTzInfoTestCase):
+    tz = pytz.utc
+    tz_class = tz.__class__
+
+
+class LegacyUTCTestCase(unittest.TestCase, BaseTzInfoTestCase):
+    # Deprecated timezone, but useful for comparison tests.
+    tz = pytz.timezone('Etc/UTC')
+    tz_class = StaticTzInfo
+
+
+class StaticTzInfoTestCase(unittest.TestCase, BaseTzInfoTestCase):
+    tz = pytz.timezone('GMT')
+    tz_class = StaticTzInfo
+
+
+class DstTzInfoTestCase(unittest.TestCase, BaseTzInfoTestCase):
+    tz = pytz.timezone('Australia/Melbourne')
+    tz_class = DstTzInfo
+
+
+def test_suite():
+    suite = unittest.TestSuite()
+    suite.addTest(doctest.DocTestSuite('pytz'))
+    suite.addTest(doctest.DocTestSuite('pytz.tzinfo'))
+    import test_tzinfo
+    suite.addTest(unittest.defaultTestLoader.loadTestsFromModule(test_tzinfo))
+    return suite
+
+
+if __name__ == '__main__':
+    warnings.simplefilter("error") # Warnings should be fatal in tests.
+    unittest.main(defaultTest='test_suite')
diff --git a/libs/pytz/tzfile.py b/libs/pytz/tzfile.py
index 25117f325..14b6bfcb4 100644
--- a/libs/pytz/tzfile.py
+++ b/libs/pytz/tzfile.py
@@ -3,37 +3,38 @@
 $Id: tzfile.py,v 1.8 2004/06/03 00:15:24 zenzen Exp $
 '''
 
-from datetime import datetime
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from io import StringIO
+from datetime import datetime, timedelta
 from struct import unpack, calcsize
 
 from pytz.tzinfo import StaticTzInfo, DstTzInfo, memorized_ttinfo
 from pytz.tzinfo import memorized_datetime, memorized_timedelta
 
-
 def _byte_string(s):
     """Cast a string or byte string to an ASCII byte string."""
     return s.encode('ASCII')
 
 _NULL = _byte_string('\0')
 
-
 def _std_string(s):
     """Cast a string or byte string to an ASCII string."""
     return str(s.decode('ASCII'))
 
-
 def build_tzinfo(zone, fp):
     head_fmt = '>4s c 15x 6l'
     head_size = calcsize(head_fmt)
-    (magic, format, ttisgmtcnt, ttisstdcnt, leapcnt, timecnt,
-        typecnt, charcnt) = unpack(head_fmt, fp.read(head_size))
+    (magic, format, ttisgmtcnt, ttisstdcnt,leapcnt, timecnt,
+        typecnt, charcnt) =  unpack(head_fmt, fp.read(head_size))
 
     # Make sure it is a tzfile(5) file
     assert magic == _byte_string('TZif'), 'Got magic %s' % repr(magic)
 
     # Read out the transition times, localtime indices and ttinfo structures.
     data_fmt = '>%(timecnt)dl %(timecnt)dB %(ttinfo)s %(charcnt)ds' % dict(
-        timecnt=timecnt, ttinfo='lBB' * typecnt, charcnt=charcnt)
+        timecnt=timecnt, ttinfo='lBB'*typecnt, charcnt=charcnt)
     data_size = calcsize(data_fmt)
     data = unpack(data_fmt, fp.read(data_size))
 
@@ -52,7 +53,7 @@ def build_tzinfo(zone, fp):
     i = 0
     while i < len(ttinfo_raw):
         # have we looked up this timezone name yet?
-        tzname_offset = ttinfo_raw[i + 2]
+        tzname_offset = ttinfo_raw[i+2]
         if tzname_offset not in tznames:
             nul = tznames_raw.find(_NULL, tzname_offset)
             if nul < 0:
@@ -60,12 +61,12 @@ def build_tzinfo(zone, fp):
             tznames[tzname_offset] = _std_string(
                 tznames_raw[tzname_offset:nul])
         ttinfo.append((ttinfo_raw[i],
-                       bool(ttinfo_raw[i + 1]),
+                       bool(ttinfo_raw[i+1]),
                        tznames[tzname_offset]))
         i += 3
 
     # Now build the timezone object
-    if len(ttinfo) == 1 or len(transitions) == 0:
+    if len(ttinfo) ==1 or len(transitions) == 0:
         ttinfo[0][0], ttinfo[0][2]
         cls = type(zone, (StaticTzInfo,), dict(
             zone=zone,
@@ -90,21 +91,21 @@ def build_tzinfo(zone, fp):
             if not inf[1]:
                 dst = 0
             else:
-                for j in range(i - 1, -1, -1):
+                for j in range(i-1, -1, -1):
                     prev_inf = ttinfo[lindexes[j]]
                     if not prev_inf[1]:
                         break
-                dst = inf[0] - prev_inf[0]  # dst offset
+                dst = inf[0] - prev_inf[0] # dst offset
 
                 # Bad dst? Look further. DST > 24 hours happens when
                 # a timzone has moved across the international dateline.
-                if dst <= 0 or dst > 3600 * 3:
-                    for j in range(i + 1, len(transitions)):
+                if dst <= 0 or dst > 3600*3:
+                    for j in range(i+1, len(transitions)):
                         stdinf = ttinfo[lindexes[j]]
                         if not stdinf[1]:
                             dst = inf[0] - stdinf[0]
                             if dst > 0:
-                                break  # Found a useful std time.
+                                break # Found a useful std time.
 
             tzname = inf[2]
 
@@ -128,7 +129,9 @@ if __name__ == '__main__':
     from pprint import pprint
     base = os.path.join(os.path.dirname(__file__), 'zoneinfo')
     tz = build_tzinfo('Australia/Melbourne',
-                      open(os.path.join(base, 'Australia', 'Melbourne'), 'rb'))
+                      open(os.path.join(base,'Australia','Melbourne'), 'rb'))
     tz = build_tzinfo('US/Eastern',
-                      open(os.path.join(base, 'US', 'Eastern'), 'rb'))
+                      open(os.path.join(base,'US','Eastern'), 'rb'))
     pprint(tz._utc_transition_times)
+    #print tz.asPython(4)
+    #print tz.transitions_mapping
diff --git a/libs/pytz/tzinfo.py b/libs/pytz/tzinfo.py
index 725978d53..1318872df 100644
--- a/libs/pytz/tzinfo.py
+++ b/libs/pytz/tzinfo.py
@@ -13,8 +13,6 @@ from pytz.exceptions import AmbiguousTimeError, NonExistentTimeError
 __all__ = []
 
 _timedelta_cache = {}
-
-
 def memorized_timedelta(seconds):
     '''Create only one instance of each distinct timedelta'''
     try:
@@ -26,8 +24,6 @@ def memorized_timedelta(seconds):
 
 _epoch = datetime.utcfromtimestamp(0)
 _datetime_cache = {0: _epoch}
-
-
 def memorized_datetime(seconds):
     '''Create only one instance of each distinct datetime'''
     try:
@@ -40,24 +36,21 @@ def memorized_datetime(seconds):
         return dt
 
 _ttinfo_cache = {}
-
-
 def memorized_ttinfo(*args):
     '''Create only one instance of each distinct tuple'''
     try:
         return _ttinfo_cache[args]
     except KeyError:
         ttinfo = (
-            memorized_timedelta(args[0]),
-            memorized_timedelta(args[1]),
-            args[2]
-        )
+                memorized_timedelta(args[0]),
+                memorized_timedelta(args[1]),
+                args[2]
+                )
         _ttinfo_cache[args] = ttinfo
         return ttinfo
 
 _notime = memorized_timedelta(0)
 
-
 def _to_seconds(td):
     '''Convert a timedelta to seconds'''
     return td.seconds + td.days * 24 * 60 * 60
@@ -161,20 +154,14 @@ class DstTzInfo(BaseTzInfo):
     timezone definition.
     '''
     # Overridden in subclass
-
-    # Sorted list of DST transition times, UTC
-    _utc_transition_times = None
-
-    # [(utcoffset, dstoffset, tzname)] corresponding to
-    # _utc_transition_times entries
-    _transition_info = None
-
+    _utc_transition_times = None # Sorted list of DST transition times in UTC
+    _transition_info = None # [(utcoffset, dstoffset, tzname)] corresponding
+                            # to _utc_transition_times entries
     zone = None
 
     # Set in __init__
-
     _tzinfos = None
-    _dst = None  # DST offset
+    _dst = None # DST offset
 
     def __init__(self, _inf=None, _tzinfos=None):
         if _inf:
@@ -183,8 +170,7 @@ class DstTzInfo(BaseTzInfo):
         else:
             _tzinfos = {}
             self._tzinfos = _tzinfos
-            self._utcoffset, self._dst, self._tzname = (
-                self._transition_info[0])
+            self._utcoffset, self._dst, self._tzname = self._transition_info[0]
             _tzinfos[self._transition_info[0]] = self
             for inf in self._transition_info[1:]:
                 if inf not in _tzinfos:
@@ -192,8 +178,8 @@ class DstTzInfo(BaseTzInfo):
 
     def fromutc(self, dt):
         '''See datetime.tzinfo.fromutc'''
-        if (dt.tzinfo is not None and
-                getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos):
+        if (dt.tzinfo is not None
+            and getattr(dt.tzinfo, '_tzinfos', None) is not self._tzinfos):
             raise ValueError('fromutc: dt.tzinfo is not self')
         dt = dt.replace(tzinfo=None)
         idx = max(0, bisect_right(self._utc_transition_times, dt) - 1)
@@ -351,8 +337,8 @@ class DstTzInfo(BaseTzInfo):
             # obtain the correct timezone by winding the clock back.
             else:
                 return self.localize(
-                    dt - timedelta(hours=6),
-                    is_dst=False) + timedelta(hours=6)
+                    dt - timedelta(hours=6), is_dst=False) + timedelta(hours=6)
+
 
         # If we get this far, we have multiple possible timezones - this
         # is an ambiguous case occuring during the end-of-DST transition.
@@ -365,8 +351,9 @@ class DstTzInfo(BaseTzInfo):
         # Filter out the possiblilities that don't match the requested
         # is_dst
         filtered_possible_loc_dt = [
-            p for p in possible_loc_dt if bool(p.tzinfo._dst) == is_dst
-        ]
+            p for p in possible_loc_dt
+                if bool(p.tzinfo._dst) == is_dst
+            ]
 
         # Hopefully we only have one possibility left. Return it.
         if len(filtered_possible_loc_dt) == 1:
@@ -385,10 +372,9 @@ class DstTzInfo(BaseTzInfo):
         # Choose the earliest (by UTC) applicable timezone if is_dst=True
         # Choose the latest (by UTC) applicable timezone if is_dst=False
         # i.e., behave like end-of-DST transition
-        dates = {}  # utc -> local
+        dates = {} # utc -> local
         for local_dt in filtered_possible_loc_dt:
-            utc_time = (
-                local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset)
+            utc_time = local_dt.replace(tzinfo=None) - local_dt.tzinfo._utcoffset
             assert utc_time not in dates
             dates[utc_time] = local_dt
         return dates[[min, max][not is_dst](dates)]
@@ -403,11 +389,11 @@ class DstTzInfo(BaseTzInfo):
         >>> tz = timezone('America/St_Johns')
         >>> ambiguous = datetime(2009, 10, 31, 23, 30)
 
-        >>> str(tz.utcoffset(ambiguous, is_dst=False))
-        '-1 day, 20:30:00'
+        >>> tz.utcoffset(ambiguous, is_dst=False)
+        datetime.timedelta(-1, 73800)
 
-        >>> str(tz.utcoffset(ambiguous, is_dst=True))
-        '-1 day, 21:30:00'
+        >>> tz.utcoffset(ambiguous, is_dst=True)
+        datetime.timedelta(-1, 77400)
 
         >>> try:
         ...     tz.utcoffset(ambiguous)
@@ -435,19 +421,19 @@ class DstTzInfo(BaseTzInfo):
 
         >>> normal = datetime(2009, 9, 1)
 
-        >>> str(tz.dst(normal))
-        '1:00:00'
-        >>> str(tz.dst(normal, is_dst=False))
-        '1:00:00'
-        >>> str(tz.dst(normal, is_dst=True))
-        '1:00:00'
+        >>> tz.dst(normal)
+        datetime.timedelta(0, 3600)
+        >>> tz.dst(normal, is_dst=False)
+        datetime.timedelta(0, 3600)
+        >>> tz.dst(normal, is_dst=True)
+        datetime.timedelta(0, 3600)
 
         >>> ambiguous = datetime(2009, 10, 31, 23, 30)
 
-        >>> str(tz.dst(ambiguous, is_dst=False))
-        '0:00:00'
-        >>> str(tz.dst(ambiguous, is_dst=True))
-        '1:00:00'
+        >>> tz.dst(ambiguous, is_dst=False)
+        datetime.timedelta(0)
+        >>> tz.dst(ambiguous, is_dst=True)
+        datetime.timedelta(0, 3600)
         >>> try:
         ...     tz.dst(ambiguous)
         ... except AmbiguousTimeError:
@@ -508,22 +494,23 @@ class DstTzInfo(BaseTzInfo):
             dst = 'STD'
         if self._utcoffset > _notime:
             return '<DstTzInfo %r %s+%s %s>' % (
-                self.zone, self._tzname, self._utcoffset, dst
-            )
+                    self.zone, self._tzname, self._utcoffset, dst
+                )
         else:
             return '<DstTzInfo %r %s%s %s>' % (
-                self.zone, self._tzname, self._utcoffset, dst
-            )
+                    self.zone, self._tzname, self._utcoffset, dst
+                )
 
     def __reduce__(self):
         # Special pickle to zone remains a singleton and to cope with
         # database changes.
         return pytz._p, (
-            self.zone,
-            _to_seconds(self._utcoffset),
-            _to_seconds(self._dst),
-            self._tzname
-        )
+                self.zone,
+                _to_seconds(self._utcoffset),
+                _to_seconds(self._dst),
+                self._tzname
+                )
+
 
 
 def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None):
@@ -562,8 +549,8 @@ def unpickler(zone, utcoffset=None, dstoffset=None, tzname=None):
     # get changed from the initial guess by the database maintainers to
     # match reality when this information is discovered.
     for localized_tz in tz._tzinfos.values():
-        if (localized_tz._utcoffset == utcoffset and
-                localized_tz._dst == dstoffset):
+        if (localized_tz._utcoffset == utcoffset
+                and localized_tz._dst == dstoffset):
             return localized_tz
 
     # This (utcoffset, dstoffset) information has been removed from the
diff --git a/libs/pytz/zoneinfo/Africa/Bissau b/libs/pytz/zoneinfo/Africa/Bissau
index 8e32be3e6..4e6fbe103 100644
Binary files a/libs/pytz/zoneinfo/Africa/Bissau and b/libs/pytz/zoneinfo/Africa/Bissau differ
diff --git a/libs/pytz/zoneinfo/Africa/Juba b/libs/pytz/zoneinfo/Africa/Juba
index 9fa711904..362918821 100644
Binary files a/libs/pytz/zoneinfo/Africa/Juba and b/libs/pytz/zoneinfo/Africa/Juba differ
diff --git a/libs/pytz/zoneinfo/Africa/Khartoum b/libs/pytz/zoneinfo/Africa/Khartoum
index f2c9e3037..362918821 100644
Binary files a/libs/pytz/zoneinfo/Africa/Khartoum and b/libs/pytz/zoneinfo/Africa/Khartoum differ
diff --git a/libs/pytz/zoneinfo/Africa/Sao_Tome b/libs/pytz/zoneinfo/Africa/Sao_Tome
index a4ece7ff2..6fd1af32d 100644
Binary files a/libs/pytz/zoneinfo/Africa/Sao_Tome and b/libs/pytz/zoneinfo/Africa/Sao_Tome differ
diff --git a/libs/pytz/zoneinfo/Africa/Windhoek b/libs/pytz/zoneinfo/Africa/Windhoek
index f5d40bafc..358432e6d 100644
Binary files a/libs/pytz/zoneinfo/Africa/Windhoek and b/libs/pytz/zoneinfo/Africa/Windhoek differ
diff --git a/libs/pytz/zoneinfo/America/Adak b/libs/pytz/zoneinfo/America/Adak
index 5696e0f8b..4f1ec7137 100644
Binary files a/libs/pytz/zoneinfo/America/Adak and b/libs/pytz/zoneinfo/America/Adak differ
diff --git a/libs/pytz/zoneinfo/America/Anchorage b/libs/pytz/zoneinfo/America/Anchorage
index 6c8bdf226..f5ee0742e 100644
Binary files a/libs/pytz/zoneinfo/America/Anchorage and b/libs/pytz/zoneinfo/America/Anchorage differ
diff --git a/libs/pytz/zoneinfo/America/Atka b/libs/pytz/zoneinfo/America/Atka
index 5696e0f8b..4f1ec7137 100644
Binary files a/libs/pytz/zoneinfo/America/Atka and b/libs/pytz/zoneinfo/America/Atka differ
diff --git a/libs/pytz/zoneinfo/America/Campo_Grande b/libs/pytz/zoneinfo/America/Campo_Grande
index de52bb681..58c56a84b 100644
Binary files a/libs/pytz/zoneinfo/America/Campo_Grande and b/libs/pytz/zoneinfo/America/Campo_Grande differ
diff --git a/libs/pytz/zoneinfo/America/Cuiaba b/libs/pytz/zoneinfo/America/Cuiaba
index 145c89e0f..6d45d512d 100644
Binary files a/libs/pytz/zoneinfo/America/Cuiaba and b/libs/pytz/zoneinfo/America/Cuiaba differ
diff --git a/libs/pytz/zoneinfo/America/Detroit b/libs/pytz/zoneinfo/America/Detroit
index e3ea5c3ef..a123b331e 100644
Binary files a/libs/pytz/zoneinfo/America/Detroit and b/libs/pytz/zoneinfo/America/Detroit differ
diff --git a/libs/pytz/zoneinfo/America/Grand_Turk b/libs/pytz/zoneinfo/America/Grand_Turk
index 4c8ca6f7f..331aeac26 100644
Binary files a/libs/pytz/zoneinfo/America/Grand_Turk and b/libs/pytz/zoneinfo/America/Grand_Turk differ
diff --git a/libs/pytz/zoneinfo/America/Jamaica b/libs/pytz/zoneinfo/America/Jamaica
index 7aedd262a..006689bc8 100644
Binary files a/libs/pytz/zoneinfo/America/Jamaica and b/libs/pytz/zoneinfo/America/Jamaica differ
diff --git a/libs/pytz/zoneinfo/America/Juneau b/libs/pytz/zoneinfo/America/Juneau
index d00668ad1..ade50a8ee 100644
Binary files a/libs/pytz/zoneinfo/America/Juneau and b/libs/pytz/zoneinfo/America/Juneau differ
diff --git a/libs/pytz/zoneinfo/America/La_Paz b/libs/pytz/zoneinfo/America/La_Paz
index bc3df5235..e83068b11 100644
Binary files a/libs/pytz/zoneinfo/America/La_Paz and b/libs/pytz/zoneinfo/America/La_Paz differ
diff --git a/libs/pytz/zoneinfo/America/Metlakatla b/libs/pytz/zoneinfo/America/Metlakatla
index c03359704..af71f0d22 100644
Binary files a/libs/pytz/zoneinfo/America/Metlakatla and b/libs/pytz/zoneinfo/America/Metlakatla differ
diff --git a/libs/pytz/zoneinfo/America/Montevideo b/libs/pytz/zoneinfo/America/Montevideo
index f524fd219..9c6abeb93 100644
Binary files a/libs/pytz/zoneinfo/America/Montevideo and b/libs/pytz/zoneinfo/America/Montevideo differ
diff --git a/libs/pytz/zoneinfo/America/Nome b/libs/pytz/zoneinfo/America/Nome
index c886c9bc0..d370ab14b 100644
Binary files a/libs/pytz/zoneinfo/America/Nome and b/libs/pytz/zoneinfo/America/Nome differ
diff --git a/libs/pytz/zoneinfo/America/Sao_Paulo b/libs/pytz/zoneinfo/America/Sao_Paulo
index 308a545ce..62dcd7bc4 100644
Binary files a/libs/pytz/zoneinfo/America/Sao_Paulo and b/libs/pytz/zoneinfo/America/Sao_Paulo differ
diff --git a/libs/pytz/zoneinfo/America/Sitka b/libs/pytz/zoneinfo/America/Sitka
index 662b8b67e..48fc6affd 100644
Binary files a/libs/pytz/zoneinfo/America/Sitka and b/libs/pytz/zoneinfo/America/Sitka differ
diff --git a/libs/pytz/zoneinfo/America/Yakutat b/libs/pytz/zoneinfo/America/Yakutat
index 523b0a108..f3d739901 100644
Binary files a/libs/pytz/zoneinfo/America/Yakutat and b/libs/pytz/zoneinfo/America/Yakutat differ
diff --git a/libs/pytz/zoneinfo/Antarctica/Casey b/libs/pytz/zoneinfo/Antarctica/Casey
index d0bbacc8a..676f06da4 100644
Binary files a/libs/pytz/zoneinfo/Antarctica/Casey and b/libs/pytz/zoneinfo/Antarctica/Casey differ
diff --git a/libs/pytz/zoneinfo/Asia/Calcutta b/libs/pytz/zoneinfo/Asia/Calcutta
index b57972dd8..c874a4b4e 100644
Binary files a/libs/pytz/zoneinfo/Asia/Calcutta and b/libs/pytz/zoneinfo/Asia/Calcutta differ
diff --git a/libs/pytz/zoneinfo/Asia/Famagusta b/libs/pytz/zoneinfo/Asia/Famagusta
index 021f8a2dd..b24caad2e 100644
Binary files a/libs/pytz/zoneinfo/Asia/Famagusta and b/libs/pytz/zoneinfo/Asia/Famagusta differ
diff --git a/libs/pytz/zoneinfo/Asia/Gaza b/libs/pytz/zoneinfo/Asia/Gaza
index 60d0de00a..1818affb5 100644
Binary files a/libs/pytz/zoneinfo/Asia/Gaza and b/libs/pytz/zoneinfo/Asia/Gaza differ
diff --git a/libs/pytz/zoneinfo/Asia/Hebron b/libs/pytz/zoneinfo/Asia/Hebron
index a2e1b364f..286a93513 100644
Binary files a/libs/pytz/zoneinfo/Asia/Hebron and b/libs/pytz/zoneinfo/Asia/Hebron differ
diff --git a/libs/pytz/zoneinfo/Asia/Kolkata b/libs/pytz/zoneinfo/Asia/Kolkata
index b57972dd8..c874a4b4e 100644
Binary files a/libs/pytz/zoneinfo/Asia/Kolkata and b/libs/pytz/zoneinfo/Asia/Kolkata differ
diff --git a/libs/pytz/zoneinfo/Asia/Macao b/libs/pytz/zoneinfo/Asia/Macao
index 2c20a3265..46c1bad54 100644
Binary files a/libs/pytz/zoneinfo/Asia/Macao and b/libs/pytz/zoneinfo/Asia/Macao differ
diff --git a/libs/pytz/zoneinfo/Asia/Macau b/libs/pytz/zoneinfo/Asia/Macau
index 2c20a3265..46c1bad54 100644
Binary files a/libs/pytz/zoneinfo/Asia/Macau and b/libs/pytz/zoneinfo/Asia/Macau differ
diff --git a/libs/pytz/zoneinfo/Asia/Pyongyang b/libs/pytz/zoneinfo/Asia/Pyongyang
index dc24926e8..de5c2b156 100644
Binary files a/libs/pytz/zoneinfo/Asia/Pyongyang and b/libs/pytz/zoneinfo/Asia/Pyongyang differ
diff --git a/libs/pytz/zoneinfo/Asia/Rangoon b/libs/pytz/zoneinfo/Asia/Rangoon
index 3cc2aafac..d1d5579b5 100644
Binary files a/libs/pytz/zoneinfo/Asia/Rangoon and b/libs/pytz/zoneinfo/Asia/Rangoon differ
diff --git a/libs/pytz/zoneinfo/Asia/Tokyo b/libs/pytz/zoneinfo/Asia/Tokyo
index 8ad44ba98..931baf224 100644
Binary files a/libs/pytz/zoneinfo/Asia/Tokyo and b/libs/pytz/zoneinfo/Asia/Tokyo differ
diff --git a/libs/pytz/zoneinfo/Asia/Yangon b/libs/pytz/zoneinfo/Asia/Yangon
index 3cc2aafac..d1d5579b5 100644
Binary files a/libs/pytz/zoneinfo/Asia/Yangon and b/libs/pytz/zoneinfo/Asia/Yangon differ
diff --git a/libs/pytz/zoneinfo/Asia/Yerevan b/libs/pytz/zoneinfo/Asia/Yerevan
index 4c4e045bd..64db2f961 100644
Binary files a/libs/pytz/zoneinfo/Asia/Yerevan and b/libs/pytz/zoneinfo/Asia/Yerevan differ
diff --git a/libs/pytz/zoneinfo/Atlantic/Azores b/libs/pytz/zoneinfo/Atlantic/Azores
index 1895e1b1e..37218e127 100644
Binary files a/libs/pytz/zoneinfo/Atlantic/Azores and b/libs/pytz/zoneinfo/Atlantic/Azores differ
diff --git a/libs/pytz/zoneinfo/Atlantic/Cape_Verde b/libs/pytz/zoneinfo/Atlantic/Cape_Verde
index 6bda6db76..1c012da59 100644
Binary files a/libs/pytz/zoneinfo/Atlantic/Cape_Verde and b/libs/pytz/zoneinfo/Atlantic/Cape_Verde differ
diff --git a/libs/pytz/zoneinfo/Atlantic/Madeira b/libs/pytz/zoneinfo/Atlantic/Madeira
index e25f8a599..9c60071e4 100644
Binary files a/libs/pytz/zoneinfo/Atlantic/Madeira and b/libs/pytz/zoneinfo/Atlantic/Madeira differ
diff --git a/libs/pytz/zoneinfo/Brazil/East b/libs/pytz/zoneinfo/Brazil/East
index 308a545ce..62dcd7bc4 100644
Binary files a/libs/pytz/zoneinfo/Brazil/East and b/libs/pytz/zoneinfo/Brazil/East differ
diff --git a/libs/pytz/zoneinfo/Canada/East-Saskatchewan b/libs/pytz/zoneinfo/Canada/East-Saskatchewan
new file mode 100644
index 000000000..5fe8d6b61
Binary files /dev/null and b/libs/pytz/zoneinfo/Canada/East-Saskatchewan differ
diff --git a/libs/pytz/zoneinfo/Eire b/libs/pytz/zoneinfo/Eire
index 655daf378..a7cffbbb9 100644
Binary files a/libs/pytz/zoneinfo/Eire and b/libs/pytz/zoneinfo/Eire differ
diff --git a/libs/pytz/zoneinfo/Europe/Bratislava b/libs/pytz/zoneinfo/Europe/Bratislava
index ba82f311b..4eabe5c81 100644
Binary files a/libs/pytz/zoneinfo/Europe/Bratislava and b/libs/pytz/zoneinfo/Europe/Bratislava differ
diff --git a/libs/pytz/zoneinfo/Europe/Dublin b/libs/pytz/zoneinfo/Europe/Dublin
index 655daf378..a7cffbbb9 100644
Binary files a/libs/pytz/zoneinfo/Europe/Dublin and b/libs/pytz/zoneinfo/Europe/Dublin differ
diff --git a/libs/pytz/zoneinfo/Europe/Lisbon b/libs/pytz/zoneinfo/Europe/Lisbon
index a85653044..b9aff3a51 100644
Binary files a/libs/pytz/zoneinfo/Europe/Lisbon and b/libs/pytz/zoneinfo/Europe/Lisbon differ
diff --git a/libs/pytz/zoneinfo/Europe/Prague b/libs/pytz/zoneinfo/Europe/Prague
index ba82f311b..4eabe5c81 100644
Binary files a/libs/pytz/zoneinfo/Europe/Prague and b/libs/pytz/zoneinfo/Europe/Prague differ
diff --git a/libs/pytz/zoneinfo/Jamaica b/libs/pytz/zoneinfo/Jamaica
index 7aedd262a..006689bc8 100644
Binary files a/libs/pytz/zoneinfo/Jamaica and b/libs/pytz/zoneinfo/Jamaica differ
diff --git a/libs/pytz/zoneinfo/Japan b/libs/pytz/zoneinfo/Japan
index 8ad44ba98..931baf224 100644
Binary files a/libs/pytz/zoneinfo/Japan and b/libs/pytz/zoneinfo/Japan differ
diff --git a/libs/pytz/zoneinfo/Pacific/Apia b/libs/pytz/zoneinfo/Pacific/Apia
index 4091a85f3..42fbbb3b7 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Apia and b/libs/pytz/zoneinfo/Pacific/Apia differ
diff --git a/libs/pytz/zoneinfo/Pacific/Enderbury b/libs/pytz/zoneinfo/Pacific/Enderbury
index a3f30e5c7..b729b256a 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Enderbury and b/libs/pytz/zoneinfo/Pacific/Enderbury differ
diff --git a/libs/pytz/zoneinfo/Pacific/Fiji b/libs/pytz/zoneinfo/Pacific/Fiji
index 912db1894..b30f496ca 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Fiji and b/libs/pytz/zoneinfo/Pacific/Fiji differ
diff --git a/libs/pytz/zoneinfo/Pacific/Kiritimati b/libs/pytz/zoneinfo/Pacific/Kiritimati
index 762275d3c..94384558c 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Kiritimati and b/libs/pytz/zoneinfo/Pacific/Kiritimati differ
diff --git a/libs/pytz/zoneinfo/Pacific/Midway b/libs/pytz/zoneinfo/Pacific/Midway
index 3e38e97c9..85316b470 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Midway and b/libs/pytz/zoneinfo/Pacific/Midway differ
diff --git a/libs/pytz/zoneinfo/Pacific/Pago_Pago b/libs/pytz/zoneinfo/Pacific/Pago_Pago
index 3e38e97c9..85316b470 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Pago_Pago and b/libs/pytz/zoneinfo/Pacific/Pago_Pago differ
diff --git a/libs/pytz/zoneinfo/Pacific/Samoa b/libs/pytz/zoneinfo/Pacific/Samoa
index 3e38e97c9..85316b470 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Samoa and b/libs/pytz/zoneinfo/Pacific/Samoa differ
diff --git a/libs/pytz/zoneinfo/Pacific/Tongatapu b/libs/pytz/zoneinfo/Pacific/Tongatapu
index b3a5a89b6..3b141f6b6 100644
Binary files a/libs/pytz/zoneinfo/Pacific/Tongatapu and b/libs/pytz/zoneinfo/Pacific/Tongatapu differ
diff --git a/libs/pytz/zoneinfo/Portugal b/libs/pytz/zoneinfo/Portugal
index a85653044..b9aff3a51 100644
Binary files a/libs/pytz/zoneinfo/Portugal and b/libs/pytz/zoneinfo/Portugal differ
diff --git a/libs/pytz/zoneinfo/US/Alaska b/libs/pytz/zoneinfo/US/Alaska
index 6c8bdf226..f5ee0742e 100644
Binary files a/libs/pytz/zoneinfo/US/Alaska and b/libs/pytz/zoneinfo/US/Alaska differ
diff --git a/libs/pytz/zoneinfo/US/Aleutian b/libs/pytz/zoneinfo/US/Aleutian
index 5696e0f8b..4f1ec7137 100644
Binary files a/libs/pytz/zoneinfo/US/Aleutian and b/libs/pytz/zoneinfo/US/Aleutian differ
diff --git a/libs/pytz/zoneinfo/US/Michigan b/libs/pytz/zoneinfo/US/Michigan
index e3ea5c3ef..a123b331e 100644
Binary files a/libs/pytz/zoneinfo/US/Michigan and b/libs/pytz/zoneinfo/US/Michigan differ
diff --git a/libs/pytz/zoneinfo/US/Pacific-New b/libs/pytz/zoneinfo/US/Pacific-New
new file mode 100644
index 000000000..c0ce4402f
Binary files /dev/null and b/libs/pytz/zoneinfo/US/Pacific-New differ
diff --git a/libs/pytz/zoneinfo/US/Samoa b/libs/pytz/zoneinfo/US/Samoa
index 3e38e97c9..85316b470 100644
Binary files a/libs/pytz/zoneinfo/US/Samoa and b/libs/pytz/zoneinfo/US/Samoa differ
diff --git a/libs/pytz/zoneinfo/localtime b/libs/pytz/zoneinfo/localtime
new file mode 100644
index 000000000..c05e45fdd
Binary files /dev/null and b/libs/pytz/zoneinfo/localtime differ
diff --git a/libs/pytz/zoneinfo/zone.tab b/libs/pytz/zoneinfo/zone.tab
index f92c919b8..204048cc5 100644
--- a/libs/pytz/zoneinfo/zone.tab
+++ b/libs/pytz/zoneinfo/zone.tab
@@ -186,7 +186,7 @@ GB	+513030-0000731	Europe/London
 GD	+1203-06145	America/Grenada
 GE	+4143+04449	Asia/Tbilisi
 GF	+0456-05220	America/Cayenne
-GG	+492717-0023210	Europe/Guernsey
+GG	+4927-00232	Europe/Guernsey
 GH	+0533-00013	Africa/Accra
 GI	+3608-00521	Europe/Gibraltar
 GL	+6411-05144	America/Godthab	Greenland (most areas)
@@ -221,7 +221,7 @@ IQ	+3321+04425	Asia/Baghdad
 IR	+3540+05126	Asia/Tehran
 IS	+6409-02151	Atlantic/Reykjavik
 IT	+4154+01229	Europe/Rome
-JE	+491101-0020624	Europe/Jersey
+JE	+4912-00207	Europe/Jersey
 JM	+175805-0764736	America/Jamaica
 JO	+3157+03556	Asia/Amman
 JP	+353916+1394441	Asia/Tokyo
@@ -372,7 +372,7 @@ SM	+4355+01228	Europe/San_Marino
 SN	+1440-01726	Africa/Dakar
 SO	+0204+04522	Africa/Mogadishu
 SR	+0550-05510	America/Paramaribo
-SS	+0451+03137	Africa/Juba
+SS	+0451+03136	Africa/Juba
 ST	+0020+00644	Africa/Sao_Tome
 SV	+1342-08912	America/El_Salvador
 SX	+180305-0630250	America/Lower_Princes
@@ -429,7 +429,7 @@ US	+593249-1394338	America/Yakutat	Alaska - Yakutat
 US	+643004-1652423	America/Nome	Alaska (west)
 US	+515248-1763929	America/Adak	Aleutian Islands
 US	+211825-1575130	Pacific/Honolulu	Hawaii
-UY	-345433-0561245	America/Montevideo
+UY	-3453-05611	America/Montevideo
 UZ	+3940+06648	Asia/Samarkand	Uzbekistan (west)
 UZ	+4120+06918	Asia/Tashkent	Uzbekistan (east)
 VA	+415408+0122711	Europe/Vatican
diff --git a/libs/pytz/zoneinfo/zone1970.tab b/libs/pytz/zoneinfo/zone1970.tab
index 2d90ed72f..2bcdc64b8 100644
--- a/libs/pytz/zoneinfo/zone1970.tab
+++ b/libs/pytz/zoneinfo/zone1970.tab
@@ -2,7 +2,7 @@
 #
 # This file is in the public domain.
 #
-# From Paul Eggert (2017-10-01):
+# From Paul Eggert (2014-07-31):
 # This file contains a table where each row stands for a zone where
 # civil time stamps have agreed since 1970.  Columns are separated by
 # a single tab.  Lines beginning with '#' are comments.  All text uses
@@ -12,10 +12,10 @@
 #     of ISO 3166 2-character country codes.  See the file 'iso3166.tab'.
 # 2.  Latitude and longitude of the zone's principal location
 #     in ISO 6709 sign-degrees-minutes-seconds format,
-#     either ±DDMM±DDDMM or ±DDMMSS±DDDMMSS,
+#     either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS,
 #     first latitude (+ is north), then longitude (+ is east).
 # 3.  Zone name used in value of TZ environment variable.
-#     Please see the theory.html file for how zone names are chosen.
+#     Please see the 'Theory' file for how zone names are chosen.
 #     If multiple zones overlap a country, each has a row in the
 #     table, with each column 1 containing the country code.
 # 4.  Comments; present if and only if a country has multiple zones.
@@ -132,7 +132,7 @@ CA	+6043-13503	America/Whitehorse	Pacific - Yukon (south)
 CA	+6404-13925	America/Dawson	Pacific - Yukon (north)
 CC	-1210+09655	Indian/Cocos
 CH,DE,LI	+4723+00832	Europe/Zurich	Swiss time
-CI,BF,GM,GN,ML,MR,SH,SL,SN,TG	+0519-00402	Africa/Abidjan
+CI,BF,GM,GN,ML,MR,SH,SL,SN,ST,TG	+0519-00402	Africa/Abidjan
 CK	-2114-15946	Pacific/Rarotonga
 CL	-3327-07040	America/Santiago	Chile (most areas)
 CL	-5309-07055	America/Punta_Arenas	Region of Magallanes
@@ -316,12 +316,10 @@ RU	+6445+17729	Asia/Anadyr	MSK+09 - Bering Sea
 SA,KW,YE	+2438+04643	Asia/Riyadh
 SB	-0932+16012	Pacific/Guadalcanal
 SC	-0440+05528	Indian/Mahe
-SD	+1536+03232	Africa/Khartoum
+SD,SS	+1536+03232	Africa/Khartoum
 SE	+5920+01803	Europe/Stockholm
 SG	+0117+10351	Asia/Singapore
 SR	+0550-05510	America/Paramaribo
-SS	+0451+03137	Africa/Juba
-ST	+0020+00644	Africa/Sao_Tome
 SV	+1342-08912	America/El_Salvador
 SY	+3330+03618	Asia/Damascus
 TC	+2128-07108	America/Grand_Turk
@@ -371,7 +369,7 @@ US	+593249-1394338	America/Yakutat	Alaska - Yakutat
 US	+643004-1652423	America/Nome	Alaska (west)
 US	+515248-1763929	America/Adak	Aleutian Islands
 US,UM	+211825-1575130	Pacific/Honolulu	Hawaii
-UY	-345433-0561245	America/Montevideo
+UY	-3453-05611	America/Montevideo
 UZ	+3940+06648	Asia/Samarkand	Uzbekistan (west)
 UZ	+4120+06918	Asia/Tashkent	Uzbekistan (east)
 VE	+1030-06656	America/Caracas
diff --git a/libs/requests/__init__.py b/libs/requests/__init__.py
index a5b3c9c33..bc168ee53 100644
--- a/libs/requests/__init__.py
+++ b/libs/requests/__init__.py
@@ -22,7 +22,7 @@ usage:
 ... or POST:
 
    >>> payload = dict(key1='value1', key2='value2')
-   >>> r = requests.post('http://httpbin.org/post', data=payload)
+   >>> r = requests.post('https://httpbin.org/post', data=payload)
    >>> print(r.text)
    {
      ...
@@ -57,10 +57,10 @@ def check_compatibility(urllib3_version, chardet_version):
     # Check urllib3 for compatibility.
     major, minor, patch = urllib3_version  # noqa: F811
     major, minor, patch = int(major), int(minor), int(patch)
-    # urllib3 >= 1.21.1, <= 1.23
+    # urllib3 >= 1.21.1, <= 1.24
     assert major == 1
     assert minor >= 21
-    assert minor <= 23
+    assert minor <= 24
 
     # Check chardet for compatibility.
     major, minor, patch = chardet_version.split('.')[:3]
@@ -79,14 +79,14 @@ def _check_cryptography(cryptography_version):
         return
 
     if cryptography_version < [1, 3, 4]:
-        warning = 'Old version of cryptography ({0}) may cause slowdown.'.format(cryptography_version)
+        warning = 'Old version of cryptography ({}) may cause slowdown.'.format(cryptography_version)
         warnings.warn(warning, RequestsDependencyWarning)
 
 # Check imported dependencies for compatibility.
 try:
     check_compatibility(urllib3.__version__, chardet.__version__)
 except (AssertionError, ValueError):
-    warnings.warn("urllib3 ({0}) or chardet ({1}) doesn't match a supported "
+    warnings.warn("urllib3 ({}) or chardet ({}) doesn't match a supported "
                   "version!".format(urllib3.__version__, chardet.__version__),
                   RequestsDependencyWarning)
 
@@ -123,12 +123,7 @@ from .exceptions import (
 
 # Set default logging handler to avoid "No handler found" warnings.
 import logging
-try:  # Python 2.7+
-    from logging import NullHandler
-except ImportError:
-    class NullHandler(logging.Handler):
-        def emit(self, record):
-            pass
+from logging import NullHandler
 
 logging.getLogger(__name__).addHandler(NullHandler())
 
diff --git a/libs/requests/__version__.py b/libs/requests/__version__.py
index ef61ec0f5..be8a45fe0 100644
--- a/libs/requests/__version__.py
+++ b/libs/requests/__version__.py
@@ -5,8 +5,8 @@
 __title__ = 'requests'
 __description__ = 'Python HTTP for Humans.'
 __url__ = 'http://python-requests.org'
-__version__ = '2.19.1'
-__build__ = 0x021901
+__version__ = '2.20.0'
+__build__ = 0x022000
 __author__ = 'Kenneth Reitz'
 __author_email__ = 'me@kennethreitz.org'
 __license__ = 'Apache 2.0'
diff --git a/libs/requests/adapters.py b/libs/requests/adapters.py
index a4b028420..fa4d9b3cc 100644
--- a/libs/requests/adapters.py
+++ b/libs/requests/adapters.py
@@ -26,6 +26,7 @@ from urllib3.exceptions import ProtocolError
 from urllib3.exceptions import ReadTimeoutError
 from urllib3.exceptions import SSLError as _SSLError
 from urllib3.exceptions import ResponseError
+from urllib3.exceptions import LocationValueError
 
 from .models import Response
 from .compat import urlparse, basestring
@@ -35,7 +36,8 @@ from .utils import (DEFAULT_CA_BUNDLE_PATH, extract_zipped_paths,
 from .structures import CaseInsensitiveDict
 from .cookies import extract_cookies_to_jar
 from .exceptions import (ConnectionError, ConnectTimeout, ReadTimeout, SSLError,
-                         ProxyError, RetryError, InvalidSchema, InvalidProxyURL)
+                         ProxyError, RetryError, InvalidSchema, InvalidProxyURL,
+                         InvalidURL)
 from .auth import _basic_auth_str
 
 try:
@@ -127,8 +129,7 @@ class HTTPAdapter(BaseAdapter):
         self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block)
 
     def __getstate__(self):
-        return dict((attr, getattr(self, attr, None)) for attr in
-                    self.__attrs__)
+        return {attr: getattr(self, attr, None) for attr in self.__attrs__}
 
     def __setstate__(self, state):
         # Can't handle by adding 'proxy_manager' to self.__attrs__ because
@@ -224,7 +225,7 @@ class HTTPAdapter(BaseAdapter):
 
             if not cert_loc or not os.path.exists(cert_loc):
                 raise IOError("Could not find a suitable TLS CA certificate bundle, "
-                              "invalid path: {0}".format(cert_loc))
+                              "invalid path: {}".format(cert_loc))
 
             conn.cert_reqs = 'CERT_REQUIRED'
 
@@ -246,10 +247,10 @@ class HTTPAdapter(BaseAdapter):
                 conn.key_file = None
             if conn.cert_file and not os.path.exists(conn.cert_file):
                 raise IOError("Could not find the TLS certificate file, "
-                              "invalid path: {0}".format(conn.cert_file))
+                              "invalid path: {}".format(conn.cert_file))
             if conn.key_file and not os.path.exists(conn.key_file):
                 raise IOError("Could not find the TLS key file, "
-                              "invalid path: {0}".format(conn.key_file))
+                              "invalid path: {}".format(conn.key_file))
 
     def build_response(self, req, resp):
         """Builds a :class:`Response <requests.Response>` object from a urllib3
@@ -378,7 +379,7 @@ class HTTPAdapter(BaseAdapter):
         when subclassing the
         :class:`HTTPAdapter <requests.adapters.HTTPAdapter>`.
 
-        :param proxies: The url of the proxy being used for this request.
+        :param proxy: The url of the proxy being used for this request.
         :rtype: dict
         """
         headers = {}
@@ -407,7 +408,10 @@ class HTTPAdapter(BaseAdapter):
         :rtype: requests.Response
         """
 
-        conn = self.get_connection(request.url, proxies)
+        try:
+            conn = self.get_connection(request.url, proxies)
+        except LocationValueError as e:
+            raise InvalidURL(e, request=request)
 
         self.cert_verify(conn, request.url, verify, cert)
         url = self.request_url(request, proxies)
@@ -421,7 +425,7 @@ class HTTPAdapter(BaseAdapter):
                 timeout = TimeoutSauce(connect=connect, read=read)
             except ValueError as e:
                 # this may raise a string formatting error.
-                err = ("Invalid timeout {0}. Pass a (connect, read) "
+                err = ("Invalid timeout {}. Pass a (connect, read) "
                        "timeout tuple, or a single float to set "
                        "both timeouts to the same value".format(timeout))
                 raise ValueError(err)
@@ -471,11 +475,10 @@ class HTTPAdapter(BaseAdapter):
 
                     # Receive the response from the server
                     try:
-                        # For Python 2.7+ versions, use buffering of HTTP
-                        # responses
+                        # For Python 2.7, use buffering of HTTP responses
                         r = low_conn.getresponse(buffering=True)
                     except TypeError:
-                        # For compatibility with Python 2.6 versions and back
+                        # For compatibility with Python 3.3+
                         r = low_conn.getresponse()
 
                     resp = HTTPResponse.from_httplib(
diff --git a/libs/requests/api.py b/libs/requests/api.py
index a2cc84d76..abada96d4 100644
--- a/libs/requests/api.py
+++ b/libs/requests/api.py
@@ -18,8 +18,10 @@ def request(method, url, **kwargs):
 
     :param method: method for the new :class:`Request` object.
     :param url: URL for the new :class:`Request` object.
-    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
-    :param data: (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param params: (optional) Dictionary, list of tuples or bytes to send
+        in the body of the :class:`Request`.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
     :param json: (optional) A JSON serializable Python object to send in the body of the :class:`Request`.
     :param headers: (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
     :param cookies: (optional) Dict or CookieJar object to send with the :class:`Request`.
@@ -47,7 +49,7 @@ def request(method, url, **kwargs):
     Usage::
 
       >>> import requests
-      >>> req = requests.request('GET', 'http://httpbin.org/get')
+      >>> req = requests.request('GET', 'https://httpbin.org/get')
       <Response [200]>
     """
 
@@ -62,7 +64,8 @@ def get(url, params=None, **kwargs):
     r"""Sends a GET request.
 
     :param url: URL for the new :class:`Request` object.
-    :param params: (optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
+    :param params: (optional) Dictionary, list of tuples or bytes to send
+        in the body of the :class:`Request`.
     :param \*\*kwargs: Optional arguments that ``request`` takes.
     :return: :class:`Response <Response>` object
     :rtype: requests.Response
@@ -102,7 +105,8 @@ def post(url, data=None, json=None, **kwargs):
     r"""Sends a POST request.
 
     :param url: URL for the new :class:`Request` object.
-    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
     :param json: (optional) json data to send in the body of the :class:`Request`.
     :param \*\*kwargs: Optional arguments that ``request`` takes.
     :return: :class:`Response <Response>` object
@@ -116,7 +120,8 @@ def put(url, data=None, **kwargs):
     r"""Sends a PUT request.
 
     :param url: URL for the new :class:`Request` object.
-    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
     :param json: (optional) json data to send in the body of the :class:`Request`.
     :param \*\*kwargs: Optional arguments that ``request`` takes.
     :return: :class:`Response <Response>` object
@@ -130,7 +135,8 @@ def patch(url, data=None, **kwargs):
     r"""Sends a PATCH request.
 
     :param url: URL for the new :class:`Request` object.
-    :param data: (optional) Dictionary (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
+    :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+        object to send in the body of the :class:`Request`.
     :param json: (optional) json data to send in the body of the :class:`Request`.
     :param \*\*kwargs: Optional arguments that ``request`` takes.
     :return: :class:`Response <Response>` object
diff --git a/libs/requests/auth.py b/libs/requests/auth.py
index 4ae459474..bdde51c7f 100644
--- a/libs/requests/auth.py
+++ b/libs/requests/auth.py
@@ -38,7 +38,7 @@ def _basic_auth_str(username, password):
     if not isinstance(username, basestring):
         warnings.warn(
             "Non-string usernames will no longer be supported in Requests "
-            "3.0.0. Please convert the object you've passed in ({0!r}) to "
+            "3.0.0. Please convert the object you've passed in ({!r}) to "
             "a string or bytes object in the near future to avoid "
             "problems.".format(username),
             category=DeprecationWarning,
@@ -48,7 +48,7 @@ def _basic_auth_str(username, password):
     if not isinstance(password, basestring):
         warnings.warn(
             "Non-string passwords will no longer be supported in Requests "
-            "3.0.0. Please convert the object you've passed in ({0!r}) to "
+            "3.0.0. Please convert the object you've passed in ({!r}) to "
             "a string or bytes object in the near future to avoid "
             "problems.".format(password),
             category=DeprecationWarning,
diff --git a/libs/requests/compat.py b/libs/requests/compat.py
index 6b9c6facb..c44b35efb 100644
--- a/libs/requests/compat.py
+++ b/libs/requests/compat.py
@@ -43,9 +43,8 @@ if is_py2:
     import cookielib
     from Cookie import Morsel
     from StringIO import StringIO
-    from collections import Callable, Mapping, MutableMapping
+    from collections import Callable, Mapping, MutableMapping, OrderedDict
 
-    from urllib3.packages.ordered_dict import OrderedDict
 
     builtin_str = str
     bytes = str
diff --git a/libs/requests/cookies.py b/libs/requests/cookies.py
index 50883a84f..56fccd9c2 100644
--- a/libs/requests/cookies.py
+++ b/libs/requests/cookies.py
@@ -444,20 +444,21 @@ def create_cookie(name, value, **kwargs):
     By default, the pair of `name` and `value` will be set for the domain ''
     and sent on every request (this is sometimes called a "supercookie").
     """
-    result = dict(
-        version=0,
-        name=name,
-        value=value,
-        port=None,
-        domain='',
-        path='/',
-        secure=False,
-        expires=None,
-        discard=True,
-        comment=None,
-        comment_url=None,
-        rest={'HttpOnly': None},
-        rfc2109=False,)
+    result = {
+        'version': 0,
+        'name': name,
+        'value': value,
+        'port': None,
+        'domain': '',
+        'path': '/',
+        'secure': False,
+        'expires': None,
+        'discard': True,
+        'comment': None,
+        'comment_url': None,
+        'rest': {'HttpOnly': None},
+        'rfc2109': False,
+    }
 
     badargs = set(kwargs) - set(result)
     if badargs:
@@ -511,6 +512,7 @@ def cookiejar_from_dict(cookie_dict, cookiejar=None, overwrite=True):
     :param cookiejar: (optional) A cookiejar to add the cookies to.
     :param overwrite: (optional) If False, will not replace cookies
         already in the jar with new ones.
+    :rtype: CookieJar
     """
     if cookiejar is None:
         cookiejar = RequestsCookieJar()
@@ -529,6 +531,7 @@ def merge_cookies(cookiejar, cookies):
 
     :param cookiejar: CookieJar object to add the cookies to.
     :param cookies: Dictionary or CookieJar object to be added.
+    :rtype: CookieJar
     """
     if not isinstance(cookiejar, cookielib.CookieJar):
         raise ValueError('You can only merge into CookieJar')
diff --git a/libs/requests/help.py b/libs/requests/help.py
index 06e06b2a7..e53d35ef6 100644
--- a/libs/requests/help.py
+++ b/libs/requests/help.py
@@ -89,8 +89,7 @@ def info():
         'version': getattr(idna, '__version__', ''),
     }
 
-    # OPENSSL_VERSION_NUMBER doesn't exist in the Python 2.6 ssl module.
-    system_ssl = getattr(ssl, 'OPENSSL_VERSION_NUMBER', None)
+    system_ssl = ssl.OPENSSL_VERSION_NUMBER
     system_ssl_info = {
         'version': '%x' % system_ssl if system_ssl is not None else ''
     }
diff --git a/libs/requests/hooks.py b/libs/requests/hooks.py
index 32b32de75..7a51f212c 100644
--- a/libs/requests/hooks.py
+++ b/libs/requests/hooks.py
@@ -15,14 +15,14 @@ HOOKS = ['response']
 
 
 def default_hooks():
-    return dict((event, []) for event in HOOKS)
+    return {event: [] for event in HOOKS}
 
 # TODO: response is the only one
 
 
 def dispatch_hook(key, hooks, hook_data, **kwargs):
     """Dispatches a hook dictionary on a given piece of data."""
-    hooks = hooks or dict()
+    hooks = hooks or {}
     hooks = hooks.get(key)
     if hooks:
         if hasattr(hooks, '__call__'):
diff --git a/libs/requests/models.py b/libs/requests/models.py
index 3d0e1f42a..3dded57ef 100644
--- a/libs/requests/models.py
+++ b/libs/requests/models.py
@@ -204,9 +204,13 @@ class Request(RequestHooksMixin):
     :param url: URL to send.
     :param headers: dictionary of headers to send.
     :param files: dictionary of {filename: fileobject} files to multipart upload.
-    :param data: the body to attach to the request. If a dictionary is provided, form-encoding will take place.
+    :param data: the body to attach to the request. If a dictionary or
+        list of tuples ``[(key, value)]`` is provided, form-encoding will
+        take place.
     :param json: json for the body to attach to the request (if files or data is not specified).
-    :param params: dictionary of URL parameters to append to the URL.
+    :param params: URL parameters to append to the URL. If a dictionary or
+        list of tuples ``[(key, value)]`` is provided, form-encoding will
+        take place.
     :param auth: Auth handler or (user, pass) tuple.
     :param cookies: dictionary or CookieJar of cookies to attach to this request.
     :param hooks: dictionary of callback hooks, for internal usage.
@@ -214,7 +218,7 @@ class Request(RequestHooksMixin):
     Usage::
 
       >>> import requests
-      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> req = requests.Request('GET', 'https://httpbin.org/get')
       >>> req.prepare()
       <PreparedRequest [GET]>
     """
@@ -274,7 +278,7 @@ class PreparedRequest(RequestEncodingMixin, RequestHooksMixin):
     Usage::
 
       >>> import requests
-      >>> req = requests.Request('GET', 'http://httpbin.org/get')
+      >>> req = requests.Request('GET', 'https://httpbin.org/get')
       >>> r = req.prepare()
       <PreparedRequest [GET]>
 
@@ -648,10 +652,7 @@ class Response(object):
         if not self._content_consumed:
             self.content
 
-        return dict(
-            (attr, getattr(self, attr, None))
-            for attr in self.__attrs__
-        )
+        return {attr: getattr(self, attr, None) for attr in self.__attrs__}
 
     def __setstate__(self, state):
         for name, value in state.items():
diff --git a/libs/requests/sessions.py b/libs/requests/sessions.py
index ba135268a..a448bd83f 100644
--- a/libs/requests/sessions.py
+++ b/libs/requests/sessions.py
@@ -115,6 +115,22 @@ class SessionRedirectMixin(object):
             return to_native_string(location, 'utf8')
         return None
 
+    def should_strip_auth(self, old_url, new_url):
+        """Decide whether Authorization header should be removed when redirecting"""
+        old_parsed = urlparse(old_url)
+        new_parsed = urlparse(new_url)
+        if old_parsed.hostname != new_parsed.hostname:
+            return True
+        # Special case: allow http -> https redirect when using the standard
+        # ports. This isn't specified by RFC 7235, but is kept to avoid
+        # breaking backwards compatibility with older versions of requests
+        # that allowed any redirects on the same host.
+        if (old_parsed.scheme == 'http' and old_parsed.port in (80, None)
+                and new_parsed.scheme == 'https' and new_parsed.port in (443, None)):
+            return False
+        # Standard case: root URI must match
+        return old_parsed.port != new_parsed.port or old_parsed.scheme != new_parsed.scheme
+
     def resolve_redirects(self, resp, req, stream=False, timeout=None,
                           verify=True, cert=None, proxies=None, yield_requests=False, **adapter_kwargs):
         """Receives a Response. Returns a generator of Responses or Requests."""
@@ -236,14 +252,10 @@ class SessionRedirectMixin(object):
         headers = prepared_request.headers
         url = prepared_request.url
 
-        if 'Authorization' in headers:
+        if 'Authorization' in headers and self.should_strip_auth(response.request.url, url):
             # If we get redirected to a new host, we should strip out any
             # authentication headers.
-            original_parsed = urlparse(response.request.url)
-            redirect_parsed = urlparse(url)
-
-            if (original_parsed.hostname != redirect_parsed.hostname):
-                del headers['Authorization']
+            del headers['Authorization']
 
         # .netrc might have more auth for us on our new host.
         new_auth = get_netrc_auth(url) if self.trust_env else None
@@ -299,7 +311,7 @@ class SessionRedirectMixin(object):
         """
         method = prepared_request.method
 
-        # http://tools.ietf.org/html/rfc7231#section-6.4.4
+        # https://tools.ietf.org/html/rfc7231#section-6.4.4
         if response.status_code == codes.see_other and method != 'HEAD':
             method = 'GET'
 
@@ -325,13 +337,13 @@ class Session(SessionRedirectMixin):
 
       >>> import requests
       >>> s = requests.Session()
-      >>> s.get('http://httpbin.org/get')
+      >>> s.get('https://httpbin.org/get')
       <Response [200]>
 
     Or as a context manager::
 
       >>> with requests.Session() as s:
-      >>>     s.get('http://httpbin.org/get')
+      >>>     s.get('https://httpbin.org/get')
       <Response [200]>
     """
 
@@ -453,8 +465,8 @@ class Session(SessionRedirectMixin):
         :param url: URL for the new :class:`Request` object.
         :param params: (optional) Dictionary or bytes to be sent in the query
             string for the :class:`Request`.
-        :param data: (optional) Dictionary, bytes, or file-like object to send
-            in the body of the :class:`Request`.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
         :param json: (optional) json to send in the body of the
             :class:`Request`.
         :param headers: (optional) Dictionary of HTTP Headers to send with the
@@ -550,7 +562,8 @@ class Session(SessionRedirectMixin):
         r"""Sends a POST request. Returns :class:`Response` object.
 
         :param url: URL for the new :class:`Request` object.
-        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
         :param json: (optional) json to send in the body of the :class:`Request`.
         :param \*\*kwargs: Optional arguments that ``request`` takes.
         :rtype: requests.Response
@@ -562,7 +575,8 @@ class Session(SessionRedirectMixin):
         r"""Sends a PUT request. Returns :class:`Response` object.
 
         :param url: URL for the new :class:`Request` object.
-        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
         :param \*\*kwargs: Optional arguments that ``request`` takes.
         :rtype: requests.Response
         """
@@ -573,7 +587,8 @@ class Session(SessionRedirectMixin):
         r"""Sends a PATCH request. Returns :class:`Response` object.
 
         :param url: URL for the new :class:`Request` object.
-        :param data: (optional) Dictionary, bytes, or file-like object to send in the body of the :class:`Request`.
+        :param data: (optional) Dictionary, list of tuples, bytes, or file-like
+            object to send in the body of the :class:`Request`.
         :param \*\*kwargs: Optional arguments that ``request`` takes.
         :rtype: requests.Response
         """
@@ -723,7 +738,7 @@ class Session(SessionRedirectMixin):
             self.adapters[key] = self.adapters.pop(key)
 
     def __getstate__(self):
-        state = dict((attr, getattr(self, attr, None)) for attr in self.__attrs__)
+        state = {attr: getattr(self, attr, None) for attr in self.__attrs__}
         return state
 
     def __setstate__(self, state):
@@ -735,7 +750,12 @@ def session():
     """
     Returns a :class:`Session` for context-management.
 
+    .. deprecated:: 1.0.0
+
+        This method has been deprecated since version 1.0.0 and is only kept for
+        backwards compatibility. New code should use :class:`~requests.sessions.Session`
+        to create a session. This may be removed at a future date.
+
     :rtype: Session
     """
-
     return Session()
diff --git a/libs/requests/status_codes.py b/libs/requests/status_codes.py
index ff462c6c6..813e8c4e6 100644
--- a/libs/requests/status_codes.py
+++ b/libs/requests/status_codes.py
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 
-"""
+r"""
 The ``codes`` object defines a mapping from common names for HTTP statuses
 to their numerical codes, accessible either as attributes or as dictionary
 items.
diff --git a/libs/requests/utils.py b/libs/requests/utils.py
index 431f6be07..0ce7fe115 100644
--- a/libs/requests/utils.py
+++ b/libs/requests/utils.py
@@ -173,10 +173,10 @@ def get_netrc_auth(url, raise_errors=False):
 
         for f in NETRC_FILES:
             try:
-                loc = os.path.expanduser('~/{0}'.format(f))
+                loc = os.path.expanduser('~/{}'.format(f))
             except KeyError:
                 # os.path.expanduser can fail when $HOME is undefined and
-                # getpwuid fails. See http://bugs.python.org/issue20164 &
+                # getpwuid fails. See https://bugs.python.org/issue20164 &
                 # https://github.com/requests/requests/issues/1846
                 return
 
@@ -466,7 +466,7 @@ def _parse_content_type_header(header):
             if index_of_equals != -1:
                 key = param[:index_of_equals].strip(items_to_strip)
                 value = param[index_of_equals + 1:].strip(items_to_strip)
-            params_dict[key] = value
+            params_dict[key.lower()] = value
     return content_type, params_dict
 
 
@@ -706,6 +706,10 @@ def should_bypass_proxies(url, no_proxy):
         no_proxy = get_proxy('no_proxy')
     parsed = urlparse(url)
 
+    if parsed.hostname is None:
+        # URLs don't always have hostnames, e.g. file:/// urls.
+        return True
+
     if no_proxy:
         # We need to check whether we match here. We need to see if we match
         # the end of the hostname, both with and without the port.
@@ -725,7 +729,7 @@ def should_bypass_proxies(url, no_proxy):
         else:
             host_with_port = parsed.hostname
             if parsed.port:
-                host_with_port += ':{0}'.format(parsed.port)
+                host_with_port += ':{}'.format(parsed.port)
 
             for host in no_proxy:
                 if parsed.hostname.endswith(host) or host_with_port.endswith(host):
@@ -733,13 +737,8 @@ def should_bypass_proxies(url, no_proxy):
                     # to apply the proxies on this URL.
                     return True
 
-    # If the system proxy settings indicate that this URL should be bypassed,
-    # don't proxy.
-    # The proxy_bypass function is incredibly buggy on OS X in early versions
-    # of Python 2.6, so allow this call to fail. Only catch the specific
-    # exceptions we've seen, though: this call failing in other ways can reveal
-    # legitimate problems.
     with set_environ('no_proxy', no_proxy_arg):
+        # parsed.hostname can be `None` in cases such as a file URI.
         try:
             bypass = proxy_bypass(parsed.hostname)
         except (TypeError, socket.gaierror):
diff --git a/libs/retry/__init__.py b/libs/retry/__init__.py
new file mode 100644
index 000000000..45c44d9f6
--- /dev/null
+++ b/libs/retry/__init__.py
@@ -0,0 +1,18 @@
+__all__ = ['retry']
+
+import logging
+
+from .api import retry
+
+
+# Set default logging handler to avoid "No handler found" warnings.
+try:  # Python 2.7+
+    from logging import NullHandler
+except ImportError:
+    class NullHandler(logging.Handler):
+
+        def emit(self, record):
+            pass
+
+log = logging.getLogger(__name__)
+log.addHandler(NullHandler())
diff --git a/libs/retry/api.py b/libs/retry/api.py
new file mode 100644
index 000000000..245e4e4c0
--- /dev/null
+++ b/libs/retry/api.py
@@ -0,0 +1,101 @@
+import logging
+import random
+import time
+
+from functools import partial
+
+from retry.compat import decorator
+
+
+logging_logger = logging.getLogger(__name__)
+
+
+def __retry_internal(f, exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0,
+                     logger=logging_logger):
+    """
+    Executes a function and retries it if it failed.
+
+    :param f: the function to execute.
+    :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
+    :param tries: the maximum number of attempts. default: -1 (infinite).
+    :param delay: initial delay between attempts. default: 0.
+    :param max_delay: the maximum value of delay. default: None (no limit).
+    :param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).
+    :param jitter: extra seconds added to delay between attempts. default: 0.
+                   fixed if a number, random if a range tuple (min, max)
+    :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
+                   default: retry.logging_logger. if None, logging is disabled.
+    :returns: the result of the f function.
+    """
+    _tries, _delay = tries, delay
+    while _tries:
+        try:
+            return f()
+        except exceptions as e:
+            _tries -= 1
+            if not _tries:
+                raise
+
+            if logger is not None:
+                logger.warning('%s, retrying in %s seconds...', e, _delay)
+
+            time.sleep(_delay)
+            _delay *= backoff
+
+            if isinstance(jitter, tuple):
+                _delay += random.uniform(*jitter)
+            else:
+                _delay += jitter
+
+            if max_delay is not None:
+                _delay = min(_delay, max_delay)
+
+
+def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger):
+    """Returns a retry decorator.
+
+    :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
+    :param tries: the maximum number of attempts. default: -1 (infinite).
+    :param delay: initial delay between attempts. default: 0.
+    :param max_delay: the maximum value of delay. default: None (no limit).
+    :param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).
+    :param jitter: extra seconds added to delay between attempts. default: 0.
+                   fixed if a number, random if a range tuple (min, max)
+    :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
+                   default: retry.logging_logger. if None, logging is disabled.
+    :returns: a retry decorator.
+    """
+
+    @decorator
+    def retry_decorator(f, *fargs, **fkwargs):
+        args = fargs if fargs else list()
+        kwargs = fkwargs if fkwargs else dict()
+        return __retry_internal(partial(f, *args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter,
+                                logger)
+
+    return retry_decorator
+
+
+def retry_call(f, fargs=None, fkwargs=None, exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1,
+               jitter=0,
+               logger=logging_logger):
+    """
+    Calls a function and re-executes it if it failed.
+
+    :param f: the function to execute.
+    :param fargs: the positional arguments of the function to execute.
+    :param fkwargs: the named arguments of the function to execute.
+    :param exceptions: an exception or a tuple of exceptions to catch. default: Exception.
+    :param tries: the maximum number of attempts. default: -1 (infinite).
+    :param delay: initial delay between attempts. default: 0.
+    :param max_delay: the maximum value of delay. default: None (no limit).
+    :param backoff: multiplier applied to delay between attempts. default: 1 (no backoff).
+    :param jitter: extra seconds added to delay between attempts. default: 0.
+                   fixed if a number, random if a range tuple (min, max)
+    :param logger: logger.warning(fmt, error, delay) will be called on failed attempts.
+                   default: retry.logging_logger. if None, logging is disabled.
+    :returns: the result of the f function.
+    """
+    args = fargs if fargs else list()
+    kwargs = fkwargs if fkwargs else dict()
+    return __retry_internal(partial(f, *args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter, logger)
diff --git a/libs/retry/compat.py b/libs/retry/compat.py
new file mode 100644
index 000000000..f39510d17
--- /dev/null
+++ b/libs/retry/compat.py
@@ -0,0 +1,18 @@
+import functools
+
+
+try:
+    from decorator import decorator
+except ImportError:
+    def decorator(caller):
+        """ Turns caller into a decorator.
+        Unlike decorator module, function signature is not preserved.
+
+        :param caller: caller(f, *args, **kwargs)
+        """
+        def decor(f):
+            @functools.wraps(f)
+            def wrapper(*args, **kwargs):
+                return caller(f, *args, **kwargs)
+            return wrapper
+        return decor
diff --git a/libs/retry/tests/__init__.py b/libs/retry/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/retry/tests/test_retry.py b/libs/retry/tests/test_retry.py
new file mode 100644
index 000000000..64f45cd89
--- /dev/null
+++ b/libs/retry/tests/test_retry.py
@@ -0,0 +1,185 @@
+try:
+    from unittest.mock import create_autospec
+except ImportError:
+    from mock import create_autospec
+
+try:
+    from unittest.mock import MagicMock
+except ImportError:
+    from mock import MagicMock
+
+import time
+
+import pytest
+
+from retry.api import retry_call
+from retry.api import retry
+
+
+def test_retry(monkeypatch):
+    mock_sleep_time = [0]
+
+    def mock_sleep(seconds):
+        mock_sleep_time[0] += seconds
+
+    monkeypatch.setattr(time, 'sleep', mock_sleep)
+
+    hit = [0]
+
+    tries = 5
+    delay = 1
+    backoff = 2
+
+    @retry(tries=tries, delay=delay, backoff=backoff)
+    def f():
+        hit[0] += 1
+        1 / 0
+
+    with pytest.raises(ZeroDivisionError):
+        f()
+    assert hit[0] == tries
+    assert mock_sleep_time[0] == sum(
+        delay * backoff ** i for i in range(tries - 1))
+
+
+def test_tries_inf():
+    hit = [0]
+    target = 10
+
+    @retry(tries=float('inf'))
+    def f():
+        hit[0] += 1
+        if hit[0] == target:
+            return target
+        else:
+            raise ValueError
+    assert f() == target
+
+
+def test_tries_minus1():
+    hit = [0]
+    target = 10
+
+    @retry(tries=-1)
+    def f():
+        hit[0] += 1
+        if hit[0] == target:
+            return target
+        else:
+            raise ValueError
+    assert f() == target
+
+
+def test_max_delay(monkeypatch):
+    mock_sleep_time = [0]
+
+    def mock_sleep(seconds):
+        mock_sleep_time[0] += seconds
+
+    monkeypatch.setattr(time, 'sleep', mock_sleep)
+
+    hit = [0]
+
+    tries = 5
+    delay = 1
+    backoff = 2
+    max_delay = delay  # Never increase delay
+
+    @retry(tries=tries, delay=delay, max_delay=max_delay, backoff=backoff)
+    def f():
+        hit[0] += 1
+        1 / 0
+
+    with pytest.raises(ZeroDivisionError):
+        f()
+    assert hit[0] == tries
+    assert mock_sleep_time[0] == delay * (tries - 1)
+
+
+def test_fixed_jitter(monkeypatch):
+    mock_sleep_time = [0]
+
+    def mock_sleep(seconds):
+        mock_sleep_time[0] += seconds
+
+    monkeypatch.setattr(time, 'sleep', mock_sleep)
+
+    hit = [0]
+
+    tries = 10
+    jitter = 1
+
+    @retry(tries=tries, jitter=jitter)
+    def f():
+        hit[0] += 1
+        1 / 0
+
+    with pytest.raises(ZeroDivisionError):
+        f()
+    assert hit[0] == tries
+    assert mock_sleep_time[0] == sum(range(tries - 1))
+
+
+def test_retry_call():
+    f_mock = MagicMock(side_effect=RuntimeError)
+    tries = 2
+    try:
+        retry_call(f_mock, exceptions=RuntimeError, tries=tries)
+    except RuntimeError:
+        pass
+
+    assert f_mock.call_count == tries
+
+
+def test_retry_call_2():
+    side_effect = [RuntimeError, RuntimeError, 3]
+    f_mock = MagicMock(side_effect=side_effect)
+    tries = 5
+    result = None
+    try:
+        result = retry_call(f_mock, exceptions=RuntimeError, tries=tries)
+    except RuntimeError:
+        pass
+
+    assert result == 3
+    assert f_mock.call_count == len(side_effect)
+
+
+def test_retry_call_with_args():
+
+    def f(value=0):
+        if value < 0:
+            return value
+        else:
+            raise RuntimeError
+
+    return_value = -1
+    result = None
+    f_mock = MagicMock(spec=f, return_value=return_value)
+    try:
+        result = retry_call(f_mock, fargs=[return_value])
+    except RuntimeError:
+        pass
+
+    assert result == return_value
+    assert f_mock.call_count == 1
+
+
+def test_retry_call_with_kwargs():
+
+    def f(value=0):
+        if value < 0:
+            return value
+        else:
+            raise RuntimeError
+
+    kwargs = {'value': -1}
+    result = None
+    f_mock = MagicMock(spec=f, return_value=kwargs['value'])
+    try:
+        result = retry_call(f_mock, fkwargs=kwargs)
+    except RuntimeError:
+        pass
+
+    assert result == kwargs['value']
+    assert f_mock.call_count == 1
diff --git a/libs/scandir.py b/libs/scandir.py
new file mode 100644
index 000000000..403f52d7b
--- /dev/null
+++ b/libs/scandir.py
@@ -0,0 +1,680 @@
+"""scandir, a better directory iterator and faster os.walk(), now in the Python 3.5 stdlib
+
+scandir() is a generator version of os.listdir() that returns an
+iterator over files in a directory, and also exposes the extra
+information most OSes provide while iterating files in a directory
+(such as type and stat information).
+
+This module also includes a version of os.walk() that uses scandir()
+to speed it up significantly.
+
+See README.md or https://github.com/benhoyt/scandir for rationale and
+docs, or read PEP 471 (https://www.python.org/dev/peps/pep-0471/) for
+more details on its inclusion into Python 3.5
+
+scandir is released under the new BSD 3-clause license. See
+LICENSE.txt for the full license text.
+"""
+
+from __future__ import division
+
+from errno import ENOENT
+from os import listdir, lstat, stat, strerror
+from os.path import join, islink
+from stat import S_IFDIR, S_IFLNK, S_IFREG
+import collections
+import os
+import sys
+
+try:
+    import _scandir
+except ImportError:
+    _scandir = None
+
+try:
+    import ctypes
+except ImportError:
+    ctypes = None
+
+if _scandir is None and ctypes is None:
+    import warnings
+    warnings.warn("scandir can't find the compiled _scandir C module "
+                  "or ctypes, using slow generic fallback")
+
+__version__ = '1.6'
+__all__ = ['scandir', 'scandir_generic', 'walk']
+
+# Windows FILE_ATTRIBUTE constants for interpreting the
+# FIND_DATA.dwFileAttributes member
+FILE_ATTRIBUTE_ARCHIVE = 32
+FILE_ATTRIBUTE_COMPRESSED = 2048
+FILE_ATTRIBUTE_DEVICE = 64
+FILE_ATTRIBUTE_DIRECTORY = 16
+FILE_ATTRIBUTE_ENCRYPTED = 16384
+FILE_ATTRIBUTE_HIDDEN = 2
+FILE_ATTRIBUTE_INTEGRITY_STREAM = 32768
+FILE_ATTRIBUTE_NORMAL = 128
+FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 8192
+FILE_ATTRIBUTE_NO_SCRUB_DATA = 131072
+FILE_ATTRIBUTE_OFFLINE = 4096
+FILE_ATTRIBUTE_READONLY = 1
+FILE_ATTRIBUTE_REPARSE_POINT = 1024
+FILE_ATTRIBUTE_SPARSE_FILE = 512
+FILE_ATTRIBUTE_SYSTEM = 4
+FILE_ATTRIBUTE_TEMPORARY = 256
+FILE_ATTRIBUTE_VIRTUAL = 65536
+
+IS_PY3 = sys.version_info >= (3, 0)
+
+if IS_PY3:
+    unicode = str  # Because Python <= 3.2 doesn't have u'unicode' syntax
+
+
+class GenericDirEntry(object):
+    __slots__ = ('name', '_stat', '_lstat', '_scandir_path', '_path')
+
+    def __init__(self, scandir_path, name):
+        self._scandir_path = scandir_path
+        self.name = name
+        self._stat = None
+        self._lstat = None
+        self._path = None
+
+    @property
+    def path(self):
+        if self._path is None:
+            self._path = join(self._scandir_path, self.name)
+        return self._path
+
+    def stat(self, follow_symlinks=True):
+        if follow_symlinks:
+            if self._stat is None:
+                self._stat = stat(self.path)
+            return self._stat
+        else:
+            if self._lstat is None:
+                self._lstat = lstat(self.path)
+            return self._lstat
+
+    def is_dir(self, follow_symlinks=True):
+        try:
+            st = self.stat(follow_symlinks=follow_symlinks)
+        except OSError as e:
+            if e.errno != ENOENT:
+                raise
+            return False  # Path doesn't exist or is a broken symlink
+        return st.st_mode & 0o170000 == S_IFDIR
+
+    def is_file(self, follow_symlinks=True):
+        try:
+            st = self.stat(follow_symlinks=follow_symlinks)
+        except OSError as e:
+            if e.errno != ENOENT:
+                raise
+            return False  # Path doesn't exist or is a broken symlink
+        return st.st_mode & 0o170000 == S_IFREG
+
+    def is_symlink(self):
+        try:
+            st = self.stat(follow_symlinks=False)
+        except OSError as e:
+            if e.errno != ENOENT:
+                raise
+            return False  # Path doesn't exist or is a broken symlink
+        return st.st_mode & 0o170000 == S_IFLNK
+
+    def inode(self):
+        st = self.stat(follow_symlinks=False)
+        return st.st_ino
+
+    def __str__(self):
+        return '<{0}: {1!r}>'.format(self.__class__.__name__, self.name)
+
+    __repr__ = __str__
+
+
+def _scandir_generic(path=unicode('.')):
+    """Like os.listdir(), but yield DirEntry objects instead of returning
+    a list of names.
+    """
+    for name in listdir(path):
+        yield GenericDirEntry(path, name)
+
+
+if IS_PY3 and sys.platform == 'win32':
+    def scandir_generic(path=unicode('.')):
+        if isinstance(path, bytes):
+            raise TypeError("os.scandir() doesn't support bytes path on Windows, use Unicode instead")
+        return _scandir_generic(path)
+    scandir_generic.__doc__ = _scandir_generic.__doc__
+else:
+    scandir_generic = _scandir_generic
+
+
+scandir_c = None
+scandir_python = None
+
+
+if sys.platform == 'win32':
+    if ctypes is not None:
+        from ctypes import wintypes
+
+        # Various constants from windows.h
+        INVALID_HANDLE_VALUE = ctypes.c_void_p(-1).value
+        ERROR_FILE_NOT_FOUND = 2
+        ERROR_NO_MORE_FILES = 18
+        IO_REPARSE_TAG_SYMLINK = 0xA000000C
+
+        # Numer of seconds between 1601-01-01 and 1970-01-01
+        SECONDS_BETWEEN_EPOCHS = 11644473600
+
+        kernel32 = ctypes.windll.kernel32
+
+        # ctypes wrappers for (wide string versions of) FindFirstFile,
+        # FindNextFile, and FindClose
+        FindFirstFile = kernel32.FindFirstFileW
+        FindFirstFile.argtypes = [
+            wintypes.LPCWSTR,
+            ctypes.POINTER(wintypes.WIN32_FIND_DATAW),
+        ]
+        FindFirstFile.restype = wintypes.HANDLE
+
+        FindNextFile = kernel32.FindNextFileW
+        FindNextFile.argtypes = [
+            wintypes.HANDLE,
+            ctypes.POINTER(wintypes.WIN32_FIND_DATAW),
+        ]
+        FindNextFile.restype = wintypes.BOOL
+
+        FindClose = kernel32.FindClose
+        FindClose.argtypes = [wintypes.HANDLE]
+        FindClose.restype = wintypes.BOOL
+
+        Win32StatResult = collections.namedtuple('Win32StatResult', [
+            'st_mode',
+            'st_ino',
+            'st_dev',
+            'st_nlink',
+            'st_uid',
+            'st_gid',
+            'st_size',
+            'st_atime',
+            'st_mtime',
+            'st_ctime',
+            'st_atime_ns',
+            'st_mtime_ns',
+            'st_ctime_ns',
+            'st_file_attributes',
+        ])
+
+        def filetime_to_time(filetime):
+            """Convert Win32 FILETIME to time since Unix epoch in seconds."""
+            total = filetime.dwHighDateTime << 32 | filetime.dwLowDateTime
+            return total / 10000000 - SECONDS_BETWEEN_EPOCHS
+
+        def find_data_to_stat(data):
+            """Convert Win32 FIND_DATA struct to stat_result."""
+            # First convert Win32 dwFileAttributes to st_mode
+            attributes = data.dwFileAttributes
+            st_mode = 0
+            if attributes & FILE_ATTRIBUTE_DIRECTORY:
+                st_mode |= S_IFDIR | 0o111
+            else:
+                st_mode |= S_IFREG
+            if attributes & FILE_ATTRIBUTE_READONLY:
+                st_mode |= 0o444
+            else:
+                st_mode |= 0o666
+            if (attributes & FILE_ATTRIBUTE_REPARSE_POINT and
+                    data.dwReserved0 == IO_REPARSE_TAG_SYMLINK):
+                st_mode ^= st_mode & 0o170000
+                st_mode |= S_IFLNK
+
+            st_size = data.nFileSizeHigh << 32 | data.nFileSizeLow
+            st_atime = filetime_to_time(data.ftLastAccessTime)
+            st_mtime = filetime_to_time(data.ftLastWriteTime)
+            st_ctime = filetime_to_time(data.ftCreationTime)
+
+            # Some fields set to zero per CPython's posixmodule.c: st_ino, st_dev,
+            # st_nlink, st_uid, st_gid
+            return Win32StatResult(st_mode, 0, 0, 0, 0, 0, st_size,
+                                   st_atime, st_mtime, st_ctime,
+                                   int(st_atime * 1000000000),
+                                   int(st_mtime * 1000000000),
+                                   int(st_ctime * 1000000000),
+                                   attributes)
+
+        class Win32DirEntryPython(object):
+            __slots__ = ('name', '_stat', '_lstat', '_find_data', '_scandir_path', '_path', '_inode')
+
+            def __init__(self, scandir_path, name, find_data):
+                self._scandir_path = scandir_path
+                self.name = name
+                self._stat = None
+                self._lstat = None
+                self._find_data = find_data
+                self._path = None
+                self._inode = None
+
+            @property
+            def path(self):
+                if self._path is None:
+                    self._path = join(self._scandir_path, self.name)
+                return self._path
+
+            def stat(self, follow_symlinks=True):
+                if follow_symlinks:
+                    if self._stat is None:
+                        if self.is_symlink():
+                            # It's a symlink, call link-following stat()
+                            self._stat = stat(self.path)
+                        else:
+                            # Not a symlink, stat is same as lstat value
+                            if self._lstat is None:
+                                self._lstat = find_data_to_stat(self._find_data)
+                            self._stat = self._lstat
+                    return self._stat
+                else:
+                    if self._lstat is None:
+                        # Lazily convert to stat object, because it's slow
+                        # in Python, and often we only need is_dir() etc
+                        self._lstat = find_data_to_stat(self._find_data)
+                    return self._lstat
+
+            def is_dir(self, follow_symlinks=True):
+                is_symlink = self.is_symlink()
+                if follow_symlinks and is_symlink:
+                    try:
+                        return self.stat().st_mode & 0o170000 == S_IFDIR
+                    except OSError as e:
+                        if e.errno != ENOENT:
+                            raise
+                        return False
+                elif is_symlink:
+                    return False
+                else:
+                    return (self._find_data.dwFileAttributes &
+                            FILE_ATTRIBUTE_DIRECTORY != 0)
+
+            def is_file(self, follow_symlinks=True):
+                is_symlink = self.is_symlink()
+                if follow_symlinks and is_symlink:
+                    try:
+                        return self.stat().st_mode & 0o170000 == S_IFREG
+                    except OSError as e:
+                        if e.errno != ENOENT:
+                            raise
+                        return False
+                elif is_symlink:
+                    return False
+                else:
+                    return (self._find_data.dwFileAttributes &
+                            FILE_ATTRIBUTE_DIRECTORY == 0)
+
+            def is_symlink(self):
+                return (self._find_data.dwFileAttributes &
+                            FILE_ATTRIBUTE_REPARSE_POINT != 0 and
+                        self._find_data.dwReserved0 == IO_REPARSE_TAG_SYMLINK)
+
+            def inode(self):
+                if self._inode is None:
+                    self._inode = lstat(self.path).st_ino
+                return self._inode
+
+            def __str__(self):
+                return '<{0}: {1!r}>'.format(self.__class__.__name__, self.name)
+
+            __repr__ = __str__
+
+        def win_error(error, filename):
+            exc = WindowsError(error, ctypes.FormatError(error))
+            exc.filename = filename
+            return exc
+
+        def _scandir_python(path=unicode('.')):
+            """Like os.listdir(), but yield DirEntry objects instead of returning
+            a list of names.
+            """
+            # Call FindFirstFile and handle errors
+            if isinstance(path, bytes):
+                is_bytes = True
+                filename = join(path.decode('mbcs', 'strict'), '*.*')
+            else:
+                is_bytes = False
+                filename = join(path, '*.*')
+            data = wintypes.WIN32_FIND_DATAW()
+            data_p = ctypes.byref(data)
+            handle = FindFirstFile(filename, data_p)
+            if handle == INVALID_HANDLE_VALUE:
+                error = ctypes.GetLastError()
+                if error == ERROR_FILE_NOT_FOUND:
+                    # No files, don't yield anything
+                    return
+                raise win_error(error, path)
+
+            # Call FindNextFile in a loop, stopping when no more files
+            try:
+                while True:
+                    # Skip '.' and '..' (current and parent directory), but
+                    # otherwise yield (filename, stat_result) tuple
+                    name = data.cFileName
+                    if name not in ('.', '..'):
+                        if is_bytes:
+                            name = name.encode('mbcs', 'replace')
+                        yield Win32DirEntryPython(path, name, data)
+
+                    data = wintypes.WIN32_FIND_DATAW()
+                    data_p = ctypes.byref(data)
+                    success = FindNextFile(handle, data_p)
+                    if not success:
+                        error = ctypes.GetLastError()
+                        if error == ERROR_NO_MORE_FILES:
+                            break
+                        raise win_error(error, path)
+            finally:
+                if not FindClose(handle):
+                    raise win_error(ctypes.GetLastError(), path)
+
+        if IS_PY3:
+            def scandir_python(path=unicode('.')):
+                if isinstance(path, bytes):
+                    raise TypeError("os.scandir() doesn't support bytes path on Windows, use Unicode instead")
+                return _scandir_python(path)
+            scandir_python.__doc__ = _scandir_python.__doc__
+        else:
+            scandir_python = _scandir_python
+
+    if _scandir is not None:
+        scandir_c = _scandir.scandir
+
+    if _scandir is not None:
+        scandir = scandir_c
+    elif ctypes is not None:
+        scandir = scandir_python
+    else:
+        scandir = scandir_generic
+
+
+# Linux, OS X, and BSD implementation
+elif sys.platform.startswith(('linux', 'darwin', 'sunos5')) or 'bsd' in sys.platform:
+    have_dirent_d_type = (sys.platform != 'sunos5')
+
+    if ctypes is not None and have_dirent_d_type:
+        import ctypes.util
+
+        DIR_p = ctypes.c_void_p
+
+        # Rather annoying how the dirent struct is slightly different on each
+        # platform. The only fields we care about are d_name and d_type.
+        class Dirent(ctypes.Structure):
+            if sys.platform.startswith('linux'):
+                _fields_ = (
+                    ('d_ino', ctypes.c_ulong),
+                    ('d_off', ctypes.c_long),
+                    ('d_reclen', ctypes.c_ushort),
+                    ('d_type', ctypes.c_byte),
+                    ('d_name', ctypes.c_char * 256),
+                )
+            else:
+                _fields_ = (
+                    ('d_ino', ctypes.c_uint32),  # must be uint32, not ulong
+                    ('d_reclen', ctypes.c_ushort),
+                    ('d_type', ctypes.c_byte),
+                    ('d_namlen', ctypes.c_byte),
+                    ('d_name', ctypes.c_char * 256),
+                )
+
+        DT_UNKNOWN = 0
+        DT_DIR = 4
+        DT_REG = 8
+        DT_LNK = 10
+
+        Dirent_p = ctypes.POINTER(Dirent)
+        Dirent_pp = ctypes.POINTER(Dirent_p)
+
+        libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
+        opendir = libc.opendir
+        opendir.argtypes = [ctypes.c_char_p]
+        opendir.restype = DIR_p
+
+        readdir_r = libc.readdir_r
+        readdir_r.argtypes = [DIR_p, Dirent_p, Dirent_pp]
+        readdir_r.restype = ctypes.c_int
+
+        closedir = libc.closedir
+        closedir.argtypes = [DIR_p]
+        closedir.restype = ctypes.c_int
+
+        file_system_encoding = sys.getfilesystemencoding()
+
+        class PosixDirEntry(object):
+            __slots__ = ('name', '_d_type', '_stat', '_lstat', '_scandir_path', '_path', '_inode')
+
+            def __init__(self, scandir_path, name, d_type, inode):
+                self._scandir_path = scandir_path
+                self.name = name
+                self._d_type = d_type
+                self._inode = inode
+                self._stat = None
+                self._lstat = None
+                self._path = None
+
+            @property
+            def path(self):
+                if self._path is None:
+                    self._path = join(self._scandir_path, self.name)
+                return self._path
+
+            def stat(self, follow_symlinks=True):
+                if follow_symlinks:
+                    if self._stat is None:
+                        if self.is_symlink():
+                            self._stat = stat(self.path)
+                        else:
+                            if self._lstat is None:
+                                self._lstat = lstat(self.path)
+                            self._stat = self._lstat
+                    return self._stat
+                else:
+                    if self._lstat is None:
+                        self._lstat = lstat(self.path)
+                    return self._lstat
+
+            def is_dir(self, follow_symlinks=True):
+                if (self._d_type == DT_UNKNOWN or
+                        (follow_symlinks and self.is_symlink())):
+                    try:
+                        st = self.stat(follow_symlinks=follow_symlinks)
+                    except OSError as e:
+                        if e.errno != ENOENT:
+                            raise
+                        return False
+                    return st.st_mode & 0o170000 == S_IFDIR
+                else:
+                    return self._d_type == DT_DIR
+
+            def is_file(self, follow_symlinks=True):
+                if (self._d_type == DT_UNKNOWN or
+                        (follow_symlinks and self.is_symlink())):
+                    try:
+                        st = self.stat(follow_symlinks=follow_symlinks)
+                    except OSError as e:
+                        if e.errno != ENOENT:
+                            raise
+                        return False
+                    return st.st_mode & 0o170000 == S_IFREG
+                else:
+                    return self._d_type == DT_REG
+
+            def is_symlink(self):
+                if self._d_type == DT_UNKNOWN:
+                    try:
+                        st = self.stat(follow_symlinks=False)
+                    except OSError as e:
+                        if e.errno != ENOENT:
+                            raise
+                        return False
+                    return st.st_mode & 0o170000 == S_IFLNK
+                else:
+                    return self._d_type == DT_LNK
+
+            def inode(self):
+                return self._inode
+
+            def __str__(self):
+                return '<{0}: {1!r}>'.format(self.__class__.__name__, self.name)
+
+            __repr__ = __str__
+
+        def posix_error(filename):
+            errno = ctypes.get_errno()
+            exc = OSError(errno, strerror(errno))
+            exc.filename = filename
+            return exc
+
+        def scandir_python(path=unicode('.')):
+            """Like os.listdir(), but yield DirEntry objects instead of returning
+            a list of names.
+            """
+            if isinstance(path, bytes):
+                opendir_path = path
+                is_bytes = True
+            else:
+                opendir_path = path.encode(file_system_encoding)
+                is_bytes = False
+            dir_p = opendir(opendir_path)
+            if not dir_p:
+                raise posix_error(path)
+            try:
+                result = Dirent_p()
+                while True:
+                    entry = Dirent()
+                    if readdir_r(dir_p, entry, result):
+                        raise posix_error(path)
+                    if not result:
+                        break
+                    name = entry.d_name
+                    if name not in (b'.', b'..'):
+                        if not is_bytes:
+                            try:
+                                name = name.decode(file_system_encoding)
+                            except UnicodeDecodeError:
+                                try:
+                                    name = name.decode("utf-8")
+                                except UnicodeDecodeError:
+                                    pass
+                        yield PosixDirEntry(path, name, entry.d_type, entry.d_ino)
+            finally:
+                if closedir(dir_p):
+                    raise posix_error(path)
+
+    if _scandir is not None:
+        scandir_c = _scandir.scandir
+
+    if _scandir is not None:
+        scandir = scandir_c
+    elif ctypes is not None:
+        scandir = scandir_python
+    else:
+        scandir = scandir_generic
+
+
+# Some other system -- no d_type or stat information
+else:
+    scandir = scandir_generic
+
+
+def _walk(top, topdown=True, onerror=None, followlinks=False):
+    """Like Python 3.5's implementation of os.walk() -- faster than
+    the pre-Python 3.5 version as it uses scandir() internally.
+    """
+    dirs = []
+    nondirs = []
+
+    # We may not have read permission for top, in which case we can't
+    # get a list of the files the directory contains.  os.walk
+    # always suppressed the exception then, rather than blow up for a
+    # minor reason when (say) a thousand readable directories are still
+    # left to visit.  That logic is copied here.
+    try:
+        scandir_it = scandir(top)
+    except OSError as error:
+        if onerror is not None:
+            onerror(error)
+        return
+
+    while True:
+        try:
+            try:
+                entry = next(scandir_it)
+            except StopIteration:
+                break
+        except OSError as error:
+            if onerror is not None:
+                onerror(error)
+            return
+
+        try:
+            is_dir = entry.is_dir()
+        except OSError:
+            # If is_dir() raises an OSError, consider that the entry is not
+            # a directory, same behaviour than os.path.isdir().
+            is_dir = False
+
+        if is_dir:
+            dirs.append(entry.name)
+        else:
+            nondirs.append(entry.name)
+
+        if not topdown and is_dir:
+            # Bottom-up: recurse into sub-directory, but exclude symlinks to
+            # directories if followlinks is False
+            if followlinks:
+                walk_into = True
+            else:
+                try:
+                    is_symlink = entry.is_symlink()
+                except OSError:
+                    # If is_symlink() raises an OSError, consider that the
+                    # entry is not a symbolic link, same behaviour than
+                    # os.path.islink().
+                    is_symlink = False
+                walk_into = not is_symlink
+
+            if walk_into:
+                for entry in walk(entry.path, topdown, onerror, followlinks):
+                    yield entry
+
+    # Yield before recursion if going top down
+    if topdown:
+        yield top, dirs, nondirs
+
+        # Recurse into sub-directories
+        for name in dirs:
+            new_path = join(top, name)
+            # Issue #23605: os.path.islink() is used instead of caching
+            # entry.is_symlink() result during the loop on os.scandir() because
+            # the caller can replace the directory entry during the "yield"
+            # above.
+            if followlinks or not islink(new_path):
+                for entry in walk(new_path, topdown, onerror, followlinks):
+                    yield entry
+    else:
+        # Yield after recursion if going bottom up
+        yield top, dirs, nondirs
+
+
+if IS_PY3 or sys.platform != 'win32':
+    walk = _walk
+else:
+    # Fix for broken unicode handling on Windows on Python 2.x, see:
+    # https://github.com/benhoyt/scandir/issues/54
+    file_system_encoding = sys.getfilesystemencoding()
+
+    def walk(top, topdown=True, onerror=None, followlinks=False):
+        if isinstance(top, bytes):
+            try:
+                top = top.decode(file_system_encoding)
+            except UnicodeDecodeError:
+                top = top.decode("utf-8")
+        return _walk(top, topdown, onerror, followlinks)
diff --git a/libs/stevedore/driver.py b/libs/stevedore/driver.py
index 167dc6716..a4b33b2c9 100644
--- a/libs/stevedore/driver.py
+++ b/libs/stevedore/driver.py
@@ -40,14 +40,12 @@ class DriverManager(NamedExtensionManager):
     :param verify_requirements: Use setuptools to enforce the
         dependencies of the plugin(s) being loaded. Defaults to False.
     :type verify_requirements: bool
-    :type warn_on_missing_entrypoint: bool
     """
 
     def __init__(self, namespace, name,
                  invoke_on_load=False, invoke_args=(), invoke_kwds={},
                  on_load_failure_callback=None,
-                 verify_requirements=False,
-                 warn_on_missing_entrypoint=True):
+                 verify_requirements=False):
         on_load_failure_callback = on_load_failure_callback \
             or self._default_on_load_failure
         super(DriverManager, self).__init__(
@@ -58,7 +56,6 @@ class DriverManager(NamedExtensionManager):
             invoke_kwds=invoke_kwds,
             on_load_failure_callback=on_load_failure_callback,
             verify_requirements=verify_requirements,
-            warn_on_missing_entrypoint=warn_on_missing_entrypoint
         )
 
     @staticmethod
diff --git a/libs/stevedore/extension.py b/libs/stevedore/extension.py
index f5c22928c..4029b658e 100644
--- a/libs/stevedore/extension.py
+++ b/libs/stevedore/extension.py
@@ -13,7 +13,6 @@
 """ExtensionManager
 """
 
-import operator
 import pkg_resources
 
 import logging
@@ -153,39 +152,20 @@ class ExtensionManager(object):
 
     def _init_plugins(self, extensions):
         self.extensions = extensions
-        self._extensions_by_name_cache = None
-
-    @property
-    def _extensions_by_name(self):
-        if self._extensions_by_name_cache is None:
-            d = {}
-            for e in self.extensions:
-                d[e.name] = e
-            self._extensions_by_name_cache = d
-        return self._extensions_by_name_cache
+        self._extensions_by_name = None
 
     ENTRY_POINT_CACHE = {}
 
-    def list_entry_points(self):
-        """Return the list of entry points for this namespace.
-
-        The entry points are not actually loaded, their list is just read and
-        returned.
-
-        """
-        if self.namespace not in self.ENTRY_POINT_CACHE:
-            eps = list(pkg_resources.iter_entry_points(self.namespace))
-            self.ENTRY_POINT_CACHE[self.namespace] = eps
-        return self.ENTRY_POINT_CACHE[self.namespace]
-
-    def entry_points_names(self):
-        """Return the list of entry points names for this namespace."""
-        return list(map(operator.attrgetter("name"), self.list_entry_points()))
+    def _find_entry_points(self, namespace):
+        if namespace not in self.ENTRY_POINT_CACHE:
+            eps = list(pkg_resources.iter_entry_points(namespace))
+            self.ENTRY_POINT_CACHE[namespace] = eps
+        return self.ENTRY_POINT_CACHE[namespace]
 
     def _load_plugins(self, invoke_on_load, invoke_args, invoke_kwds,
                       verify_requirements):
         extensions = []
-        for ep in self.list_entry_points():
+        for ep in self._find_entry_points(self.namespace):
             LOG.debug('found extension %r', ep)
             try:
                 ext = self._load_one_plugin(ep,
@@ -300,14 +280,6 @@ class ExtensionManager(object):
                 LOG.error('error calling %r: %s', e.name, err)
                 LOG.exception(err)
 
-    def items(self):
-        """
-        Return an iterator of tuples of the form (name, extension).
-
-        This is analogous to the Mapping.items() method.
-        """
-        return self._extensions_by_name.items()
-
     def __iter__(self):
         """Produce iterator for the manager.
 
@@ -323,6 +295,11 @@ class ExtensionManager(object):
         produces the :class:`Extension` instance with the
         specified name.
         """
+        if self._extensions_by_name is None:
+            d = {}
+            for e in self.extensions:
+                d[e.name] = e
+            self._extensions_by_name = d
         return self._extensions_by_name[name]
 
     def __contains__(self, name):
diff --git a/libs/stevedore/tests/test_callback.py b/libs/stevedore/tests/test_callback.py
index c513aa220..877b31ee8 100644
--- a/libs/stevedore/tests/test_callback.py
+++ b/libs/stevedore/tests/test_callback.py
@@ -32,7 +32,7 @@ class TestCallback(utils.TestCase):
                                         on_load_failure_callback=
                                         failure_callback)
         extensions = list(em.extensions)
-        self.assertTrue(len(extensions), GreaterThan(0))
+        self.assertThat(len(extensions), GreaterThan(0))
         self.assertEqual(len(errors), 2)
         for manager, entrypoint, error in errors:
             self.assertIs(manager, em)
diff --git a/libs/stevedore/tests/test_extension.py b/libs/stevedore/tests/test_extension.py
index 17f270fc5..7d695ef7e 100644
--- a/libs/stevedore/tests/test_extension.py
+++ b/libs/stevedore/tests/test_extension.py
@@ -13,8 +13,6 @@
 """Tests for stevedore.extension
 """
 
-import operator
-
 import mock
 
 from stevedore import exception
@@ -51,19 +49,6 @@ class TestCallback(utils.TestCase):
         e = em['t1']
         self.assertEqual(e.name, 't1')
 
-    def test_list_entry_points(self):
-        em = extension.ExtensionManager('stevedore.test.extension')
-        n = em.list_entry_points()
-        self.assertEqual(set(['e1', 'e2', 't1', 't2']),
-                         set(map(operator.attrgetter("name"), n)))
-        self.assertEqual(4, len(n))
-
-    def test_list_entry_points_names(self):
-        em = extension.ExtensionManager('stevedore.test.extension')
-        names = em.entry_points_names()
-        self.assertEqual(set(['e1', 'e2', 't1', 't2']), set(names))
-        self.assertEqual(4, len(names))
-
     def test_contains_by_name(self):
         em = extension.ExtensionManager('stevedore.test.extension')
         self.assertEqual('t1' in em, True)
@@ -198,11 +183,6 @@ class TestCallback(utils.TestCase):
         result = em.map_method('get_args_and_data', 42)
         self.assertEqual(set(r[2] for r in result), set([42]))
 
-    def test_items(self):
-        em = extension.ExtensionManager('stevedore.test.extension')
-        expected_output = set([(name, em[name]) for name in ALL_NAMES])
-        self.assertEqual(expected_output, set(em.items()))
-
 
 class TestLoadRequirementsNewSetuptools(utils.TestCase):
     # setuptools 11.3 and later
diff --git a/libs/stevedore/tests/utils.py b/libs/stevedore/tests/utils.py
index f452959c9..0a6cc0aa3 100644
--- a/libs/stevedore/tests/utils.py
+++ b/libs/stevedore/tests/utils.py
@@ -10,8 +10,8 @@
 #  License for the specific language governing permissions and limitations
 #  under the License.
 
-import unittest
+from oslotest import base as test_base
 
 
-class TestCase(unittest.TestCase):
+class TestCase(test_base.BaseTestCase):
     pass
diff --git a/libs/subliminal/providers/subscenter.py b/libs/subliminal/providers/subscenter.py
new file mode 100644
index 000000000..f9bf3c8cb
--- /dev/null
+++ b/libs/subliminal/providers/subscenter.py
@@ -0,0 +1,243 @@
+# -*- coding: utf-8 -*-
+import bisect
+from collections import defaultdict
+import io
+import json
+import logging
+import zipfile
+
+from babelfish import Language
+from guessit import guessit
+from requests import Session
+
+from . import ParserBeautifulSoup, Provider
+from .. import __short_version__
+from ..cache import SHOW_EXPIRATION_TIME, region
+from ..exceptions import AuthenticationError, ConfigurationError, ProviderError
+from ..subtitle import Subtitle, fix_line_ending, guess_matches
+from ..utils import sanitize
+from ..video import Episode, Movie
+
+logger = logging.getLogger(__name__)
+
+
+class SubsCenterSubtitle(Subtitle):
+    """SubsCenter Subtitle."""
+    provider_name = 'subscenter'
+
+    def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, subtitle_id, subtitle_key,
+                 subtitle_version, downloaded, releases):
+        super(SubsCenterSubtitle, self).__init__(language, hearing_impaired, page_link)
+        self.series = series
+        self.season = season
+        self.episode = episode
+        self.title = title
+        self.subtitle_id = subtitle_id
+        self.subtitle_key = subtitle_key
+        self.subtitle_version = subtitle_version
+        self.downloaded = downloaded
+        self.releases = releases
+
+    @property
+    def id(self):
+        return str(self.subtitle_id)
+
+    def get_matches(self, video):
+        matches = set()
+
+        # episode
+        if isinstance(video, Episode):
+            # series
+            if video.series and sanitize(self.series) == sanitize(video.series):
+                matches.add('series')
+            # season
+            if video.season and self.season == video.season:
+                matches.add('season')
+            # episode
+            if video.episode and self.episode == video.episode:
+                matches.add('episode')
+            # guess
+            for release in self.releases:
+                matches |= guess_matches(video, guessit(release, {'type': 'episode'}))
+        # movie
+        elif isinstance(video, Movie):
+            # guess
+            for release in self.releases:
+                matches |= guess_matches(video, guessit(release, {'type': 'movie'}))
+
+        # title
+        if video.title and sanitize(self.title) == sanitize(video.title):
+            matches.add('title')
+
+        return matches
+
+
+class SubsCenterProvider(Provider):
+    """SubsCenter Provider."""
+    languages = {Language.fromalpha2(l) for l in ['he']}
+    server_url = 'http://www.subscenter.org/he/'
+    subtitle_class = SubsCenterSubtitle
+
+    def __init__(self, username=None, password=None):
+        if username is not None and password is None or username is None and password is not None:
+            raise ConfigurationError('Username and password must be specified')
+
+        self.session = None
+        self.username = username
+        self.password = password
+        self.logged_in = False
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers['User-Agent'] = 'Subliminal/{}'.format(__short_version__)
+
+        # login
+        if self.username is not None and self.password is not None:
+            logger.debug('Logging in')
+            url = self.server_url + 'subscenter/accounts/login/'
+
+            # retrieve CSRF token
+            self.session.get(url)
+            csrf_token = self.session.cookies['csrftoken']
+
+            # actual login
+            data = {'username': self.username, 'password': self.password, 'csrfmiddlewaretoken': csrf_token}
+            r = self.session.post(url, data, allow_redirects=False, timeout=10)
+
+            if r.status_code != 302:
+                raise AuthenticationError(self.username)
+
+            logger.info('Logged in')
+            self.logged_in = True
+
+    def terminate(self):
+        # logout
+        if self.logged_in:
+            logger.info('Logging out')
+            r = self.session.get(self.server_url + 'subscenter/accounts/logout/', timeout=10)
+            r.raise_for_status()
+            logger.info('Logged out')
+            self.logged_in = False
+
+        self.session.close()
+
+    @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
+    def _search_url_titles(self, title):
+        """Search the URL titles by kind for the given `title`.
+
+        :param str title: title to search for.
+        :return: the URL titles by kind.
+        :rtype: collections.defaultdict
+
+        """
+        # make the search
+        logger.info('Searching title name for %r', title)
+        r = self.session.get(self.server_url + 'subtitle/search/', params={'q': title}, timeout=10)
+        r.raise_for_status()
+
+        # check for redirections
+        if r.history and all([h.status_code == 302 for h in r.history]):
+            logger.debug('Redirected to the subtitles page')
+            links = [r.url]
+        else:
+            # get the suggestions (if needed)
+            soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+            links = [link.attrs['href'] for link in soup.select('#processes div.generalWindowTop a')]
+            logger.debug('Found %d suggestions', len(links))
+
+        url_titles = defaultdict(list)
+        for link in links:
+            parts = link.split('/')
+            url_titles[parts[-3]].append(parts[-2])
+
+        return url_titles
+
+    def query(self, title, season=None, episode=None):
+        # search for the url title
+        url_titles = self._search_url_titles(title)
+
+        # episode
+        if season and episode:
+            if 'series' not in url_titles:
+                logger.error('No URL title found for series %r', title)
+                return []
+            url_title = url_titles['series'][0]
+            logger.debug('Using series title %r', url_title)
+            url = self.server_url + 'cst/data/series/sb/{}/{}/{}/'.format(url_title, season, episode)
+            page_link = self.server_url + 'subtitle/series/{}/{}/{}/'.format(url_title, season, episode)
+        else:
+            if 'movie' not in url_titles:
+                logger.error('No URL title found for movie %r', title)
+                return []
+            url_title = url_titles['movie'][0]
+            logger.debug('Using movie title %r', url_title)
+            url = self.server_url + 'cst/data/movie/sb/{}/'.format(url_title)
+            page_link = self.server_url + 'subtitle/movie/{}/'.format(url_title)
+
+        # get the list of subtitles
+        logger.debug('Getting the list of subtitles')
+        r = self.session.get(url)
+        r.raise_for_status()
+        results = json.loads(r.text)
+
+        # loop over results
+        subtitles = {}
+        for language_code, language_data in results.items():
+            for quality_data in language_data.values():
+                for quality, subtitles_data in quality_data.items():
+                    for subtitle_item in subtitles_data.values():
+                        # read the item
+                        language = Language.fromalpha2(language_code)
+                        hearing_impaired = bool(subtitle_item['hearing_impaired'])
+                        subtitle_id = subtitle_item['id']
+                        subtitle_key = subtitle_item['key']
+                        subtitle_version = subtitle_item['h_version']
+                        downloaded = subtitle_item['downloaded']
+                        release = subtitle_item['subtitle_version']
+
+                        # add the release and increment downloaded count if we already have the subtitle
+                        if subtitle_id in subtitles:
+                            logger.debug('Found additional release %r for subtitle %d', release, subtitle_id)
+                            bisect.insort_left(subtitles[subtitle_id].releases, release)  # deterministic order
+                            subtitles[subtitle_id].downloaded += downloaded
+                            continue
+
+                        # otherwise create it
+                        subtitle = self.subtitle_class(language, hearing_impaired, page_link, title, season, episode,
+                                                      title, subtitle_id, subtitle_key, subtitle_version, downloaded,
+                                                      [release])
+                        logger.debug('Found subtitle %r', subtitle)
+                        subtitles[subtitle_id] = subtitle
+
+        return subtitles.values()
+
+    def list_subtitles(self, video, languages):
+        season = episode = None
+        title = video.title
+
+        if isinstance(video, Episode):
+            title = video.series
+            season = video.season
+            episode = video.episode
+
+        return [s for s in self.query(title, season, episode) if s.language in languages]
+
+    def download_subtitle(self, subtitle):
+        # download
+        url = self.server_url + 'subtitle/download/{}/{}/'.format(subtitle.language.alpha2, subtitle.subtitle_id)
+        params = {'v': subtitle.subtitle_version, 'key': subtitle.subtitle_key}
+        r = self.session.get(url, params=params, headers={'Referer': subtitle.page_link}, timeout=10)
+        r.raise_for_status()
+
+        # open the zip
+        try:
+            with zipfile.ZipFile(io.BytesIO(r.content)) as zf:
+                # remove some filenames from the namelist
+                namelist = [n for n in zf.namelist() if not n.endswith('.txt')]
+                if len(namelist) > 1:
+                    raise ProviderError('More than one file to unzip')
+
+                subtitle.content = fix_line_ending(zf.read(namelist[0]))
+        except zipfile.BadZipfile:
+            # if no zip file was retrieved, daily downloads limit has exceeded
+            raise ProviderError('Daily limit exceeded')
diff --git a/libs/subliminal/subtitle.py b/libs/subliminal/subtitle.py
index b78733fb5..726b28e37 100644
--- a/libs/subliminal/subtitle.py
+++ b/libs/subliminal/subtitle.py
@@ -6,8 +6,6 @@ import os
 import chardet
 import pysrt
 
-import types
-
 from .score import get_equivalent_release_groups
 from .video import Episode, Movie
 from .utils import sanitize, sanitize_release_group
@@ -240,19 +238,8 @@ def guess_matches(video, guess, partial=False):
     if video.resolution and 'screen_size' in guess and guess['screen_size'] == video.resolution:
         matches.add('resolution')
     # format
-    if 'format' in guess and video.format:
-        formats = guess["format"]
-        if not isinstance(formats, types.ListType):
-            formats = [formats]
-
-        video_formats = video.format
-        if not isinstance(video_formats, types.ListType):
-            video_formats = [video_formats]
-
-        lwr = lambda x: "tv" if x in ("HDTV", "SDTV", "TV") else x.lower()
-
-        if set(list(map(lwr, formats))) & set(list(map(lwr, video_formats))):
-            matches.add('format')
+    if video.format and 'format' in guess and guess['format'].lower() == video.format.lower():
+        matches.add('format')
     # video_codec
     if video.video_codec and 'video_codec' in guess and guess['video_codec'] == video.video_codec:
         matches.add('video_codec')
diff --git a/libs/subliminal/video.py b/libs/subliminal/video.py
index a6efb8016..0db6c65c4 100644
--- a/libs/subliminal/video.py
+++ b/libs/subliminal/video.py
@@ -220,9 +220,13 @@ class Movie(Video):
         if 'title' not in guess:
             raise ValueError('Insufficient data to process the guess')
 
+        alternative_titles = []
+        if 'alternative_title' in guess:
+            alternative_titles.append(u"%s %s" % (guess['title'], guess['alternative_title']))
+
         return cls(name, guess['title'], format=guess.get('format'), release_group=guess.get('release_group'),
                    resolution=guess.get('screen_size'), video_codec=guess.get('video_codec'),
-                   audio_codec=guess.get('audio_codec'), year=guess.get('year'))
+                   audio_codec=guess.get('audio_codec'), year=guess.get('year'), alternative_titles=alternative_titles)
 
     @classmethod
     def fromname(cls, name):
diff --git a/libs/subliminal_patch/__init__.py b/libs/subliminal_patch/__init__.py
new file mode 100644
index 000000000..e2d872246
--- /dev/null
+++ b/libs/subliminal_patch/__init__.py
@@ -0,0 +1,28 @@
+# coding=utf-8
+
+import subliminal
+
+# patch subliminal's subtitle and provider base
+from .subtitle import Subtitle, guess_matches
+from .providers import Provider
+subliminal.subtitle.Subtitle = Subtitle
+subliminal.subtitle.guess_matches = guess_matches
+
+from .core import scan_video, search_external_subtitles, list_all_subtitles, save_subtitles, refine, \
+    download_best_subtitles
+from .score import compute_score
+from .video import Video
+import extensions
+import http
+
+# patch subliminal's core functions
+subliminal.scan_video = subliminal.core.scan_video = scan_video
+subliminal.core.search_external_subtitles = search_external_subtitles
+subliminal.save_subtitles = subliminal.core.save_subtitles = save_subtitles
+subliminal.refine = subliminal.core.refine = refine
+subliminal.video.Video = subliminal.Video = Video
+subliminal.video.Episode.__bases__ = (Video,)
+subliminal.video.Movie.__bases__ = (Video,)
+
+# add our own list_all_subtitles
+subliminal.list_all_subtitles = subliminal.core.list_all_subtitles = list_all_subtitles
diff --git a/libs/subliminal_patch/converters/__init__.py b/libs/subliminal_patch/converters/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/subliminal_patch/converters/assrt.py b/libs/subliminal_patch/converters/assrt.py
new file mode 100644
index 000000000..ed4fd0362
--- /dev/null
+++ b/libs/subliminal_patch/converters/assrt.py
@@ -0,0 +1,25 @@
+# -*- coding: utf-8 -*-
+from babelfish import LanguageReverseConverter
+from subliminal.exceptions import ConfigurationError
+
+class AssrtConverter(LanguageReverseConverter):
+    def __init__(self):
+        self.from_assrt = { u'简体': ('zho', None, 'Hans'), u'çąä˝“': ('zho', None, 'Hant'),
+                            u'簡體': ('zho', None, 'Hans'), u'çąé«”': ('zho', None, 'Hant'),
+                            u'英文': ('eng',),
+                            u'chs': ('zho', None, 'Hans'), u'cht': ('zho', None, 'Hant'),
+                            u'chn': ('zho', None, 'Hans'), u'twn': ('zho', None, 'Hant')}
+        self.to_assrt = { ('zho', None, 'Hans'): u'chs', ('zho', None, 'Hant'): u'cht', ('eng',) : u'eng' }
+        self.codes = set(self.from_assrt.keys())
+
+    def convert(self, alpha3, country=None, script=None):
+        if (alpha3, country, script) in self.to_assrt:
+            return self.to_assrt[(alpha3, country, script)]
+
+        raise ConfigurationError('Unsupported language for assrt: %s, %s, %s' % (alpha3, country, script))
+
+    def reverse(self, assrt):
+        if assrt in self.from_assrt:
+            return self.from_assrt[assrt]
+
+        raise ConfigurationError('Unsupported language code for assrt: %s' % assrt)
diff --git a/libs/subliminal_patch/converters/hosszupuska.py b/libs/subliminal_patch/converters/hosszupuska.py
new file mode 100644
index 000000000..abbe394be
--- /dev/null
+++ b/libs/subliminal_patch/converters/hosszupuska.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+from babelfish import LanguageReverseConverter, language_converters
+
+
+class HosszupuskaConverter(LanguageReverseConverter):
+    def __init__(self):
+        self.alpha2_converter = language_converters['alpha2']
+        self.from_hosszupuska = {'hu': ('hun', ), 'en': ('eng',)}
+        self.to_hosszupuska = {v: k for k, v in self.from_hosszupuska.items()}
+        self.codes = self.alpha2_converter.codes | set(self.from_hosszupuska.keys())
+
+    def convert(self, alpha3, country=None, script=None):
+        if (alpha3, country) in self.to_hosszupuska:
+            return self.to_hosszupuska[(alpha3, country)]
+        if (alpha3,) in self.to_hosszupuska:
+            return self.to_hosszupuska[(alpha3,)]
+
+        return self.alpha2_converter.convert(alpha3, country, script)
+
+    def reverse(self, hosszupuska):
+        if hosszupuska in self.from_hosszupuska:
+            return self.from_hosszupuska[hosszupuska]
+
+        return self.alpha2_converter.reverse(hosszupuska)
diff --git a/libs/subliminal_patch/converters/subscene.py b/libs/subliminal_patch/converters/subscene.py
new file mode 100644
index 000000000..3a8c8ead6
--- /dev/null
+++ b/libs/subliminal_patch/converters/subscene.py
@@ -0,0 +1,76 @@
+# coding=utf-8
+
+from babelfish import LanguageReverseConverter
+from subliminal.exceptions import ConfigurationError
+from subzero.language import Language
+
+
+# alpha3 codes extracted from `https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes`
+# Subscene language list extracted from it's upload form
+from_subscene = {
+        'Farsi/Persian': 'fas', 'Greek': 'ell', 'Greenlandic': 'kal',
+        'Malay': 'msa', 'Pashto': 'pus', 'Punjabi': 'pan', 'Swahili': 'swa'
+}
+
+to_subscene = {v: k for k, v in from_subscene.items()}
+
+exact_languages_alpha3 = [
+        'ara', 'aze', 'bel', 'ben', 'bos', 'bul', 'cat', 'ces', 'dan', 'deu',
+        'eng', 'epo', 'est', 'eus', 'fin', 'fra', 'heb', 'hin', 'hrv', 'hun',
+        'hye', 'ind', 'isl', 'ita', 'jpn', 'kat', 'kor', 'kur', 'lav', 'lit',
+        'mal', 'mkd', 'mni', 'mon', 'mya', 'nld', 'nor', 'pol', 'por', 'ron',
+        'rus', 'sin', 'slk', 'slv', 'som', 'spa', 'sqi', 'srp', 'sun', 'swe',
+        'tam', 'tel', 'tgl', 'tha', 'tur', 'ukr', 'urd', 'vie', 'yor'
+]
+
+language_ids = {
+        'ara':  2, 'dan': 10, 'nld': 11, 'eng': 13, 'fas': 46, 'fin': 17,
+        'fra': 18, 'heb': 22, 'ind': 44, 'ita': 26, 'msa': 50, 'nor': 30,
+        'ron': 33, 'spa': 38, 'swe': 39, 'vie': 45, 'sqi':  1, 'hye': 73,
+        'aze': 55, 'eus': 74, 'bel': 68, 'ben': 54, 'bos': 60, 'bul':  5,
+        'mya': 61, 'cat': 49, 'hrv':  8, 'ces':  9, 'epo': 47, 'est': 16,
+        'kat': 62, 'deu': 19, 'ell': 21, 'kal': 57, 'hin': 51, 'hun': 23,
+        'isl': 25, 'jpn': 27, 'kor': 28, 'kur': 52, 'lav': 29, 'lit': 43,
+        'mkd': 48, 'mal': 64, 'mni': 65, 'mon': 72, 'pus': 67, 'pol': 31,
+        'por': 32, 'pan': 66, 'rus': 34, 'srp': 35, 'sin': 58, 'slk': 36,
+        'slv': 37, 'som': 70, 'tgl': 53, 'tam': 59, 'tel': 63, 'tha': 40,
+        'tur': 41, 'ukr': 56, 'urd': 42, 'yor': 71
+}
+
+# TODO: specify codes for unspecified_languages
+unspecified_languages = [
+        'Big 5 code', 'Brazillian Portuguese', 'Bulgarian/ English',
+        'Chinese BG code', 'Dutch/ English', 'English/ German',
+        'Hungarian/ English', 'Rohingya'
+]
+
+supported_languages = {Language(l) for l in exact_languages_alpha3}
+
+alpha3_of_code = {l.name: l.alpha3 for l in supported_languages}
+
+supported_languages.update({Language(l) for l in to_subscene})
+
+
+class SubsceneConverter(LanguageReverseConverter):
+    codes = {l.name for l in supported_languages}
+
+    def convert(self, alpha3, country=None, script=None):
+        if alpha3 in exact_languages_alpha3:
+            return Language(alpha3).name
+
+        if alpha3 in to_subscene:
+            return to_subscene[alpha3]
+
+        raise ConfigurationError('Unsupported language for subscene: %s, %s, %s' % (alpha3, country, script))
+
+    def reverse(self, code):
+        if code in from_subscene:
+            return (from_subscene[code],)
+
+        if code in alpha3_of_code:
+            return (alpha3_of_code[code],)
+
+        if code in unspecified_languages:
+            raise NotImplementedError("currently this language is unspecified: %s" % code)
+
+        raise ConfigurationError('Unsupported language code for subscene: %s' % code)
\ No newline at end of file
diff --git a/libs/subliminal_patch/converters/supersubtitles.py b/libs/subliminal_patch/converters/supersubtitles.py
new file mode 100644
index 000000000..cc5697b42
--- /dev/null
+++ b/libs/subliminal_patch/converters/supersubtitles.py
@@ -0,0 +1,24 @@
+# -*- coding: utf-8 -*-
+from babelfish import LanguageReverseConverter, language_converters
+
+
+class SuperSubtitlesConverter(LanguageReverseConverter):
+    def __init__(self):
+        self.alpha2_converter = language_converters['alpha2']
+        self.from_supersubtitles = {'hu': ('hun', ), 'en': ('eng',)}
+        self.to_supersubtitles = {v: k for k, v in self.from_supersubtitles.items()}
+        self.codes = self.alpha2_converter.codes | set(self.from_supersubtitles.keys())
+
+    def convert(self, alpha3, country=None, script=None):
+        if (alpha3, country) in self.to_supersubtitles:
+            return self.to_supersubtitles[(alpha3, country)]
+        if (alpha3,) in self.to_supersubtitles:
+            return self.to_supersubtitles[(alpha3,)]
+
+        return self.alpha2_converter.convert(alpha3, country, script)
+
+    def reverse(self, supersubtitles):
+        if supersubtitles in self.from_supersubtitles:
+            return self.from_supersubtitles[supersubtitles]
+
+        return self.alpha2_converter.reverse(supersubtitles)
diff --git a/libs/subliminal_patch/converters/titlovi.py b/libs/subliminal_patch/converters/titlovi.py
new file mode 100644
index 000000000..940507d4f
--- /dev/null
+++ b/libs/subliminal_patch/converters/titlovi.py
@@ -0,0 +1,57 @@
+# coding=utf-8
+import logging
+
+from babelfish import LanguageReverseConverter
+from subliminal.exceptions import ConfigurationError
+
+logger = logging.getLogger(__name__)
+
+
+class TitloviConverter(LanguageReverseConverter):
+    def __init__(self):
+        self.from_titlovi = {'Bosanski': ('bos',),
+                             'English': ('eng',),
+                             'Hrvatski': ('hrv',),
+                             'Makedonski': ('mkd',),
+                             'Srpski': ('srp',),
+                             'Cirilica': ('srp', None, 'Cyrl'),
+                             'Slovenski': ('slv',),
+                             }
+        self.to_titlovi = {('bos',): 'Bosanski',
+                           ('eng',): 'English',
+                           ('hrv',): 'Hrvatski',
+                           ('mkd',): 'Makedonski',
+                           ('srp',): 'Srpski',
+                           ('srp', None, 'Cyrl'): 'Cirilica',
+                           ('slv',): 'Slovenski'
+                           }
+        self.codes = set(self.from_titlovi.keys())
+
+        # temporary fix, should be removed as soon as API is used
+        self.lang_from_countrycode = {'ba': ('bos',),
+                                 'en': ('eng',),
+                                 'hr': ('hrv',),
+                                 'mk': ('mkd',),
+                                 'rs': ('srp',),
+                                 'rsc': ('srp', None, 'Cyrl'),
+                                 'si': ('slv',)
+                                 }
+
+    def convert(self, alpha3, country=None, script=None):
+        if (alpha3, country, script) in self.to_titlovi:
+            return self.to_titlovi[(alpha3, country, script)]
+        if (alpha3,) in self.to_titlovi:
+            return self.to_titlovi[(alpha3,)]
+
+        raise ConfigurationError('Unsupported language code for titlovi: %s, %s, %s' % (alpha3, country, script))
+
+    def reverse(self, titlovi):
+        if titlovi in self.from_titlovi:
+            return self.from_titlovi[titlovi]
+
+        # temporary fix, should be removed as soon as API is used
+        if titlovi in self.lang_from_countrycode:
+            return self.lang_from_countrycode[titlovi]
+
+        raise ConfigurationError('Unsupported language number for titlovi: %s' % titlovi)
+
diff --git a/libs/subliminal_patch/core.py b/libs/subliminal_patch/core.py
new file mode 100644
index 000000000..5f3158195
--- /dev/null
+++ b/libs/subliminal_patch/core.py
@@ -0,0 +1,875 @@
+# coding=utf-8
+import codecs
+import json
+import re
+import os
+import logging
+import socket
+import traceback
+import time
+import operator
+
+import itertools
+from httplib import ResponseNotReady
+
+import rarfile
+import requests
+
+from collections import defaultdict
+from bs4 import UnicodeDammit
+from babelfish import LanguageReverseError
+from guessit.jsonutils import GuessitEncoder
+from subliminal import ProviderError, refiner_manager
+
+from extensions import provider_registry
+from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded
+from subliminal.score import compute_score as default_compute_score
+from subliminal.utils import hash_napiprojekt, hash_opensubtitles, hash_shooter, hash_thesubdb
+from subliminal.video import VIDEO_EXTENSIONS, Video, Episode, Movie
+from subliminal.core import guessit, ProviderPool, io, is_windows_special_path, \
+    ThreadPoolExecutor, check_video
+from subliminal_patch.exceptions import TooManyRequests, APIThrottled
+
+from subzero.language import Language
+from scandir import scandir, scandir_generic as _scandir_generic
+
+logger = logging.getLogger(__name__)
+
+# may be absolute or relative paths; set to selected options
+CUSTOM_PATHS = []
+INCLUDE_EXOTIC_SUBS = True
+
+DOWNLOAD_TRIES = 0
+DOWNLOAD_RETRY_SLEEP = 6
+
+# fixme: this may be overkill
+REMOVE_CRAP_FROM_FILENAME = re.compile(r"(?i)(?:([\s_-]+(?:obfuscated|scrambled|nzbgeek|chamele0n|buymore|xpost|postbot"
+                                       r"|asrequested)(?:\[.+\])?)|([\s_-]\w{2,})(\[.+\]))(?=\.\w+$|$)")
+
+SUBTITLE_EXTENSIONS = ('.srt', '.sub', '.smi', '.txt', '.ssa', '.ass', '.mpl', '.vtt')
+
+
+def remove_crap_from_fn(fn):
+    # in case of the second regex part, the legit release group name will be in group(2), if it's followed by [string]
+    # otherwise replace fully, because the first part matched
+    def repl(m):
+        return m.group(2) if len(m.groups()) == 3 else ""
+
+    return REMOVE_CRAP_FROM_FILENAME.sub(repl, fn)
+
+
+class SZProviderPool(ProviderPool):
+    def __init__(self, providers=None, provider_configs=None, blacklist=None, throttle_callback=None,
+                 pre_download_hook=None, post_download_hook=None, language_hook=None):
+        #: Name of providers to use
+        self.providers = providers or provider_registry.names()
+
+        #: Provider configuration
+        self.provider_configs = provider_configs or {}
+
+        #: Initialized providers
+        self.initialized_providers = {}
+
+        #: Discarded providers
+        self.discarded_providers = set()
+
+        self.blacklist = blacklist or []
+
+        self.throttle_callback = throttle_callback
+
+        self.pre_download_hook = pre_download_hook
+        self.post_download_hook = post_download_hook
+        self.language_hook = language_hook
+
+        if not self.throttle_callback:
+            self.throttle_callback = lambda x, y: x
+
+    def __enter__(self):
+        return self
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        self.terminate()
+
+    def __getitem__(self, name):
+        if name not in self.providers:
+            raise KeyError
+        if name not in self.initialized_providers:
+            logger.info('Initializing provider %s', name)
+            provider = provider_registry[name](**self.provider_configs.get(name, {}))
+            provider.initialize()
+            self.initialized_providers[name] = provider
+
+        return self.initialized_providers[name]
+
+    def __delitem__(self, name):
+        if name not in self.initialized_providers:
+            raise KeyError(name)
+
+        try:
+            logger.info('Terminating provider %s', name)
+            self.initialized_providers[name].terminate()
+        except (requests.Timeout, socket.timeout):
+            logger.error('Provider %r timed out, improperly terminated', name)
+        except:
+            logger.exception('Provider %r terminated unexpectedly', name)
+
+        del self.initialized_providers[name]
+
+    def list_subtitles_provider(self, provider, video, languages):
+        """List subtitles with a single provider.
+
+        The video and languages are checked against the provider.
+        
+        patch: add traceback info
+
+        :param str provider: name of the provider.
+        :param video: video to list subtitles for.
+        :type video: :class:`~subliminal.video.Video`
+        :param languages: languages to search for.
+        :type languages: set of :class:`~babelfish.language.Language`
+        :return: found subtitles.
+        :rtype: list of :class:`~subliminal.subtitle.Subtitle` or None
+
+        """
+        if self.language_hook:
+            languages_search_base = self.language_hook(provider)
+        else:
+            languages_search_base = languages
+
+        # check video validity
+        if not provider_registry[provider].check(video):
+            logger.info('Skipping provider %r: not a valid video', provider)
+            return []
+
+        # check whether we want to search this provider for the languages
+        use_languages = languages_search_base & languages
+        if not use_languages:
+            logger.info('Skipping provider %r: no language to search for (advanced: %r, requested: %r)', provider,
+                        languages_search_base, languages)
+            return []
+
+        # check supported languages
+        provider_languages = provider_registry[provider].languages & use_languages
+        if not provider_languages:
+            logger.info('Skipping provider %r: no language to search for', provider)
+            return []
+
+        # list subtitles
+        logger.info('Listing subtitles with provider %r and languages %r', provider, provider_languages)
+        results = []
+        try:
+            try:
+                results = self[provider].list_subtitles(video, provider_languages)
+            except ResponseNotReady:
+                logger.error('Provider %r response error, reinitializing', provider)
+                try:
+                    self[provider].terminate()
+                    self[provider].initialize()
+                    results = self[provider].list_subtitles(video, provider_languages)
+                except:
+                    logger.error('Provider %r reinitialization error: %s', provider, traceback.format_exc())
+
+            seen = []
+            out = []
+            for s in results:
+                if (str(provider), str(s.id)) in self.blacklist:
+                    logger.info("Skipping blacklisted subtitle: %s", s)
+                    continue
+                if s.id in seen:
+                    continue
+                s.plex_media_fps = float(video.fps) if video.fps else None
+                out.append(s)
+                seen.append(s.id)
+
+            return out
+
+        except (requests.Timeout, socket.timeout):
+            logger.error('Provider %r timed out', provider)
+
+        except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e:
+            self.throttle_callback(provider, e)
+            return
+
+        except:
+            logger.exception('Unexpected error in provider %r: %s', provider, traceback.format_exc())
+
+    def list_subtitles(self, video, languages):
+        """List subtitles.
+        
+        patch: handle LanguageReverseError
+
+        :param video: video to list subtitles for.
+        :type video: :class:`~subliminal.video.Video`
+        :param languages: languages to search for.
+        :type languages: set of :class:`~babelfish.language.Language`
+        :return: found subtitles.
+        :rtype: list of :class:`~subliminal.subtitle.Subtitle`
+
+        """
+        subtitles = []
+
+        for name in self.providers:
+            # check discarded providers
+            if name in self.discarded_providers:
+                logger.debug('Skipping discarded provider %r', name)
+                continue
+
+            # list subtitles
+            try:
+                provider_subtitles = self.list_subtitles_provider(name, video, languages)
+            except LanguageReverseError:
+                logger.exception("Unexpected language reverse error in %s, skipping. Error: %s", name,
+                                 traceback.format_exc())
+                continue
+
+            if provider_subtitles is None:
+                logger.info('Discarding provider %s', name)
+                self.discarded_providers.add(name)
+                continue
+
+            # add the subtitles
+            subtitles.extend(provider_subtitles)
+
+        return subtitles
+
+    def download_subtitle(self, subtitle):
+        """Download `subtitle`'s :attr:`~subliminal.subtitle.Subtitle.content`.
+        
+        patch: add retry functionality
+        
+        :param subtitle: subtitle to download.
+        :type subtitle: :class:`~subliminal.subtitle.Subtitle`
+        :return: `True` if the subtitle has been successfully downloaded, `False` otherwise.
+        :rtype: bool
+        """
+        # check discarded providers
+        if subtitle.provider_name in self.discarded_providers:
+            logger.warning('Provider %r is discarded', subtitle.provider_name)
+            return False
+
+        logger.info('Downloading subtitle %r', subtitle)
+        tries = 0
+
+        # retry downloading on failure until settings' download retry limit hit
+        while True:
+            tries += 1
+            try:
+                if self.pre_download_hook:
+                    self.pre_download_hook(subtitle)
+
+                self[subtitle.provider_name].download_subtitle(subtitle)
+                if self.post_download_hook:
+                    self.post_download_hook(subtitle)
+
+                break
+            except (requests.ConnectionError,
+                    requests.exceptions.ProxyError,
+                    requests.exceptions.SSLError,
+                    requests.Timeout,
+                    socket.timeout):
+                logger.error('Provider %r connection error', subtitle.provider_name)
+
+            except ResponseNotReady:
+                logger.error('Provider %r response error, reinitializing', subtitle.provider_name)
+                try:
+                    self[subtitle.provider_name].terminate()
+                    self[subtitle.provider_name].initialize()
+                except:
+                    logger.error('Provider %r reinitialization error: %s', subtitle.provider_name,
+                                 traceback.format_exc())
+
+            except rarfile.BadRarFile:
+                logger.error('Malformed RAR file from provider %r, skipping subtitle.', subtitle.provider_name)
+                logger.debug("RAR Traceback: %s", traceback.format_exc())
+                return False
+
+            except (TooManyRequests, DownloadLimitExceeded, ServiceUnavailable, APIThrottled), e:
+                self.throttle_callback(subtitle.provider_name, e)
+                self.discarded_providers.add(subtitle.provider_name)
+                return False
+
+            except:
+                logger.exception('Unexpected error in provider %r, Traceback: %s', subtitle.provider_name,
+                                 traceback.format_exc())
+                self.discarded_providers.add(subtitle.provider_name)
+                return False
+
+            if tries == DOWNLOAD_TRIES:
+                self.discarded_providers.add(subtitle.provider_name)
+                logger.error('Maximum retries reached for provider %r, discarding it', subtitle.provider_name)
+                return False
+
+            # don't hammer the provider
+            logger.debug('Errors while downloading subtitle, retrying provider %r in %s seconds',
+                         subtitle.provider_name, DOWNLOAD_RETRY_SLEEP)
+            time.sleep(DOWNLOAD_RETRY_SLEEP)
+
+        # check subtitle validity
+        if not subtitle.is_valid():
+            logger.error('Invalid subtitle')
+            return False
+
+        subtitle.normalize()
+
+        return True
+
+    def download_best_subtitles(self, subtitles, video, languages, min_score=0, hearing_impaired=False, only_one=False,
+                                compute_score=None):
+        """Download the best matching subtitles.
+        
+        patch: 
+            - hearing_impaired is now string
+            - add .score to subtitle
+            - move all languages check further to the top (still necessary?)
+
+        :param subtitles: the subtitles to use.
+        :type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
+        :param video: video to download subtitles for.
+        :type video: :class:`~subliminal.video.Video`
+        :param languages: languages to download.
+        :type languages: set of :class:`~babelfish.language.Language`
+        :param int min_score: minimum score for a subtitle to be downloaded.
+        :param bool hearing_impaired: hearing impaired preference.
+        :param bool only_one: download only one subtitle, not one per language.
+        :param compute_score: function that takes `subtitle` and `video` as positional arguments,
+            `hearing_impaired` as keyword argument and returns the score.
+        :return: downloaded subtitles.
+        :rtype: list of :class:`~subliminal.subtitle.Subtitle`
+
+        """
+        compute_score = compute_score or default_compute_score
+        use_hearing_impaired = hearing_impaired in ("prefer", "force HI")
+
+        is_episode = isinstance(video, Episode)
+
+        # sort subtitles by score
+        unsorted_subtitles = []
+
+        for s in subtitles:
+            # get the matches
+            if s.language not in languages:
+                logger.debug("%r: Skipping, language not searched for", s)
+                continue
+
+            try:
+                matches = s.get_matches(video)
+            except AttributeError:
+                logger.error("%r: Match computation failed: %s", s, traceback.format_exc())
+                continue
+
+            orig_matches = matches.copy()
+
+            logger.debug('%r: Found matches %r', s, matches)
+            unsorted_subtitles.append(
+                (s, compute_score(matches, s, video, hearing_impaired=use_hearing_impaired), matches, orig_matches))
+
+        # sort subtitles by score
+        scored_subtitles = sorted(unsorted_subtitles, key=operator.itemgetter(1), reverse=True)
+
+        # download best subtitles, falling back on the next on error
+        downloaded_subtitles = []
+        for subtitle, score, matches, orig_matches in scored_subtitles:
+            # check score
+            if score < min_score:
+                logger.info('%r: Score %d is below min_score (%d)', subtitle, score, min_score)
+                break
+
+            # stop when all languages are downloaded
+            if set(s.language for s in downloaded_subtitles) == languages:
+                logger.debug('All languages downloaded')
+                break
+
+            # check downloaded languages
+            if subtitle.language in set(s.language for s in downloaded_subtitles):
+                logger.debug('%r: Skipping subtitle: already downloaded', subtitle.language)
+                continue
+
+            # bail out if hearing_impaired was wrong
+            if subtitle.hearing_impaired_verifiable and "hearing_impaired" not in matches and \
+                            hearing_impaired in ("force HI", "force non-HI"):
+                logger.debug('%r: Skipping subtitle with score %d because hearing-impaired set to %s', subtitle,
+                             score, hearing_impaired)
+                continue
+
+            if is_episode:
+                can_verify_series = True
+                if not subtitle.hash_verifiable and "hash" in matches:
+                    can_verify_series = False
+
+                if can_verify_series and not {"series", "season", "episode"}.issubset(orig_matches):
+                    logger.debug("%r: Skipping subtitle with score %d, because it doesn't match our series/episode",
+                                 subtitle, score)
+                    continue
+
+            # download
+            logger.debug("%r: Trying to download subtitle with matches %s, score: %s; release(s): %s", subtitle, matches,
+                         score, subtitle.release_info)
+            if self.download_subtitle(subtitle):
+                subtitle.score = score
+                downloaded_subtitles.append(subtitle)
+
+            # stop if only one subtitle is requested
+            if only_one:
+                logger.debug('Only one subtitle downloaded')
+                break
+
+        return downloaded_subtitles
+
+
+class SZAsyncProviderPool(SZProviderPool):
+    """Subclass of :class:`ProviderPool` with asynchronous support for :meth:`~ProviderPool.list_subtitles`.
+
+    :param int max_workers: maximum number of threads to use. If `None`, :attr:`max_workers` will be set
+        to the number of :attr:`~ProviderPool.providers`.
+
+    """
+    def __init__(self, max_workers=None, *args, **kwargs):
+        super(SZAsyncProviderPool, self).__init__(*args, **kwargs)
+
+        #: Maximum number of threads to use
+        self.max_workers = max_workers or len(self.providers)
+        logger.info("Using %d threads for %d providers (%s)", self.max_workers, len(self.providers), self.providers)
+
+    def list_subtitles_provider(self, provider, video, languages):
+        # list subtitles
+        provider_subtitles = None
+        try:
+            provider_subtitles = super(SZAsyncProviderPool, self).list_subtitles_provider(provider, video, languages)
+        except LanguageReverseError:
+            logger.exception("Unexpected language reverse error in %s, skipping. Error: %s", provider,
+                             traceback.format_exc())
+
+        return provider, provider_subtitles
+
+    def list_subtitles(self, video, languages, blacklist=None):
+        if is_windows_special_path:
+            return super(SZAsyncProviderPool, self).list_subtitles(video, languages)
+
+        subtitles = []
+
+        with ThreadPoolExecutor(self.max_workers) as executor:
+            for provider, provider_subtitles in executor.map(self.list_subtitles_provider, self.providers,
+                                                             itertools.repeat(video, len(self.providers)),
+                                                             itertools.repeat(languages, len(self.providers))):
+                # discard provider that failed
+                if provider_subtitles is None:
+                    logger.info('Discarding provider %s', provider)
+                    self.discarded_providers.add(provider)
+                    continue
+
+                # add subtitles
+                subtitles.extend(provider_subtitles)
+
+        return subtitles
+
+
+if is_windows_special_path:
+    SZAsyncProviderPool = SZProviderPool
+
+
+def scan_video(path, dont_use_actual_file=False, hints=None, providers=None, skip_hashing=False):
+    """Scan a video from a `path`.
+
+    patch:
+        - allow passing of hints/options to guessit
+        - allow dry-run with dont_use_actual_file
+        - add crap removal (obfuscated/scrambled)
+        - trust plex's movie name
+
+    :param str path: existing path to the video.
+    :return: the scanned video.
+    :rtype: :class:`~subliminal.video.Video`
+
+    """
+    hints = hints or {}
+    video_type = hints.get("type")
+
+    # check for non-existing path
+    if not dont_use_actual_file and not os.path.exists(path):
+        raise ValueError('Path does not exist')
+
+    # check video extension
+    if not path.lower().endswith(VIDEO_EXTENSIONS):
+        raise ValueError('%r is not a valid video extension' % os.path.splitext(path)[1])
+
+    dirpath, filename = os.path.split(path)
+    logger.info('Scanning video %r in %r', filename, dirpath)
+
+    # hint guessit the filename itself and its 2 parent directories if we're an episode (most likely
+    # Series name/Season/filename), else only one
+    split_path = os.path.normpath(path).split(os.path.sep)[-3 if video_type == "episode" else -2:]
+
+    # remove crap from folder names
+    if video_type == "episode":
+        if len(split_path) > 2:
+            split_path[-3] = remove_crap_from_fn(split_path[-3])
+    else:
+        if len(split_path) > 1:
+            split_path[-2] = remove_crap_from_fn(split_path[-2])
+
+    guess_from = os.path.join(*split_path)
+
+    # remove crap from file name
+    guess_from = remove_crap_from_fn(guess_from)
+
+    # guess
+    hints["single_value"] = True
+    if video_type == "movie":
+        hints["expected_title"] = [hints["title"]]
+
+    guessed_result = guessit(guess_from, options=hints)
+    logger.debug('GuessIt found: %s', json.dumps(guessed_result, cls=GuessitEncoder, indent=4, ensure_ascii=False))
+    video = Video.fromguess(path, guessed_result)
+    video.hints = hints
+
+    if dont_use_actual_file:
+        return video
+
+    # size and hashes
+    if not skip_hashing:
+        video.size = os.path.getsize(path)
+        if video.size > 10485760:
+            logger.debug('Size is %d', video.size)
+            if "opensubtitles" in providers:
+                video.hashes['opensubtitles'] = hash_opensubtitles(path)
+
+            if "shooter" in providers:
+                video.hashes['shooter'] = hash_shooter(path)
+
+            if "thesubdb" in providers:
+                video.hashes['thesubdb'] = hash_thesubdb(path)
+
+            if "napiprojekt" in providers:
+                try:
+                    video.hashes['napiprojekt'] = hash_napiprojekt(path)
+                except MemoryError:
+                    logger.warning(u"Couldn't compute napiprojekt hash for %s", path)
+
+            logger.debug('Computed hashes %r', video.hashes)
+        else:
+            logger.warning('Size is lower than 10MB: hashes not computed')
+
+    return video
+
+
+def _search_external_subtitles(path, languages=None, only_one=False, scandir_generic=False):
+    dirpath, filename = os.path.split(path)
+    dirpath = dirpath or '.'
+    fileroot, fileext = os.path.splitext(filename)
+    subtitles = {}
+    _scandir = _scandir_generic if scandir_generic else scandir
+    for entry in _scandir(dirpath):
+        if not entry.is_file(follow_symlinks=False):
+            continue
+
+        p = entry.name
+
+        # keep only valid subtitle filenames
+        if not p.startswith(fileroot) or not p.endswith(SUBTITLE_EXTENSIONS):
+            continue
+
+        p_root, p_ext = os.path.splitext(p)
+        if not INCLUDE_EXOTIC_SUBS and p_ext not in (".srt", ".ass", ".ssa", ".vtt"):
+            continue
+
+        # extract potential forced/normal/default tag
+        # fixme: duplicate from subtitlehelpers
+        split_tag = p_root.rsplit('.', 1)
+        adv_tag = None
+        if len(split_tag) > 1:
+            adv_tag = split_tag[1].lower()
+            if adv_tag in ['forced', 'normal', 'default', 'embedded', 'embedded-forced', 'custom']:
+                p_root = split_tag[0]
+
+        forced = False
+        if adv_tag:
+            forced = "forced" in adv_tag
+
+        # extract the potential language code
+        language_code = p_root[len(fileroot):].replace('_', '-')[1:]
+
+        # default language is undefined
+        language = Language('und')
+
+        # attempt to parse
+        if language_code:
+            try:
+                language = Language.fromietf(language_code)
+                language.forced = forced
+            except ValueError:
+                logger.error('Cannot parse language code %r', language_code)
+                language = None
+
+        if not language and only_one:
+            language = Language.rebuild(list(languages)[0], forced=forced)
+
+        subtitles[p] = language
+
+    logger.debug('Found subtitles %r', subtitles)
+
+    return subtitles
+
+
+def search_external_subtitles(path, languages=None, only_one=False):
+    """
+    wrap original search_external_subtitles function to search multiple paths for one given video
+    # todo: cleanup and merge with _search_external_subtitles
+    """
+    video_path, video_filename = os.path.split(path)
+    subtitles = {}
+    for folder_or_subfolder in [video_path] + CUSTOM_PATHS:
+        # folder_or_subfolder may be a relative path or an absolute one
+        try:
+            abspath = unicode(os.path.abspath(
+                os.path.join(*[video_path if not os.path.isabs(folder_or_subfolder) else "", folder_or_subfolder,
+                               video_filename])))
+        except Exception, e:
+            logger.error("skipping path %s because of %s", repr(folder_or_subfolder), e)
+            continue
+        logger.debug("external subs: scanning path %s", abspath)
+
+        if os.path.isdir(os.path.dirname(abspath)):
+            try:
+                subtitles.update(_search_external_subtitles(abspath, languages=languages,
+                                                            only_one=only_one))
+            except OSError:
+                subtitles.update(_search_external_subtitles(abspath, languages=languages,
+                                                            only_one=only_one, scandir_generic=True))
+    logger.debug("external subs: found %s", subtitles)
+    return subtitles
+
+
+def list_all_subtitles(videos, languages, **kwargs):
+    """List all available subtitles.
+    
+    patch: remove video check, it has been done before
+
+    The `videos` must pass the `languages` check of :func:`check_video`.
+
+    All other parameters are passed onwards to the :class:`ProviderPool` constructor.
+
+    :param videos: videos to list subtitles for.
+    :type videos: set of :class:`~subliminal.video.Video`
+    :param languages: languages to search for.
+    :type languages: set of :class:`~babelfish.language.Language`
+    :return: found subtitles per video.
+    :rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
+
+    """
+    listed_subtitles = defaultdict(list)
+
+    # return immediatly if no video passed the checks
+    if not videos:
+        return listed_subtitles
+
+    # list subtitles
+    with SZProviderPool(**kwargs) as pool:
+        for video in videos:
+            logger.info('Listing subtitles for %r', video)
+            subtitles = pool.list_subtitles(video, languages - video.subtitle_languages)
+            listed_subtitles[video].extend(subtitles)
+            logger.info('Found %d subtitle(s)', len(subtitles))
+
+    return listed_subtitles
+
+
+def download_subtitles(subtitles, pool_class=ProviderPool, **kwargs):
+    """Download :attr:`~subliminal.subtitle.Subtitle.content` of `subtitles`.
+
+    :param subtitles: subtitles to download.
+    :type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
+    :param pool_class: class to use as provider pool.
+    :type pool_class: :class:`ProviderPool`, :class:`AsyncProviderPool` or similar
+    :param \*\*kwargs: additional parameters for the provided `pool_class` constructor.
+
+    """
+    with pool_class(**kwargs) as pool:
+        for subtitle in subtitles:
+            logger.info('Downloading subtitle %r with score %s', subtitle, subtitle.score)
+            pool.download_subtitle(subtitle)
+
+
+def download_best_subtitles(videos, languages, min_score=0, hearing_impaired=False, only_one=False, compute_score=None,
+                            pool_class=ProviderPool, throttle_time=0, **kwargs):
+    """List and download the best matching subtitles.
+
+    The `videos` must pass the `languages` and `undefined` (`only_one`) checks of :func:`check_video`.
+
+    :param videos: videos to download subtitles for.
+    :type videos: set of :class:`~subliminal.video.Video`
+    :param languages: languages to download.
+    :type languages: set of :class:`~babelfish.language.Language`
+    :param int min_score: minimum score for a subtitle to be downloaded.
+    :param bool hearing_impaired: hearing impaired preference.
+    :param bool only_one: download only one subtitle, not one per language.
+    :param compute_score: function that takes `subtitle` and `video` as positional arguments,
+        `hearing_impaired` as keyword argument and returns the score.
+    :param pool_class: class to use as provider pool.
+    :type pool_class: :class:`ProviderPool`, :class:`AsyncProviderPool` or similar
+    :param \*\*kwargs: additional parameters for the provided `pool_class` constructor.
+    :return: downloaded subtitles per video.
+    :rtype: dict of :class:`~subliminal.video.Video` to list of :class:`~subliminal.subtitle.Subtitle`
+
+    """
+    downloaded_subtitles = defaultdict(list)
+
+    # check videos
+    checked_videos = []
+    for video in videos:
+        if not check_video(video, languages=languages, undefined=only_one):
+            logger.info('Skipping video %r', video)
+            continue
+        checked_videos.append(video)
+
+    # return immediately if no video passed the checks
+    if not checked_videos:
+        return downloaded_subtitles
+
+    got_multiple = len(checked_videos) > 1
+
+    # download best subtitles
+    with pool_class(**kwargs) as pool:
+        for video in checked_videos:
+            logger.info('Downloading best subtitles for %r', video)
+            subtitles = pool.download_best_subtitles(pool.list_subtitles(video, languages - video.subtitle_languages),
+                                                     video, languages, min_score=min_score,
+                                                     hearing_impaired=hearing_impaired, only_one=only_one,
+                                                     compute_score=compute_score)
+            logger.info('Downloaded %d subtitle(s)', len(subtitles))
+            downloaded_subtitles[video].extend(subtitles)
+
+            if got_multiple and throttle_time:
+                logger.debug("Waiting %ss before continuing ...", throttle_time)
+                time.sleep(throttle_time)
+
+    return downloaded_subtitles
+
+
+def get_subtitle_path(video_path, language=None, extension='.srt', forced_tag=False, tags=None):
+    """Get the subtitle path using the `video_path` and `language`.
+
+    :param str video_path: path to the video.
+    :param language: language of the subtitle to put in the path.
+    :type language: :class:`~babelfish.language.Language`
+    :param str extension: extension of the subtitle.
+    :return: path of the subtitle.
+    :rtype: str
+
+    """
+    subtitle_root = os.path.splitext(video_path)[0]
+    tags = tags or []
+    if forced_tag:
+        tags.append("forced")
+
+    if language:
+        subtitle_root += '.' + str(language.basename)
+
+    if tags:
+        subtitle_root += ".%s" % "-".join(tags)
+
+    return subtitle_root + extension
+
+
+def save_subtitles(file_path, subtitles, single=False, directory=None, chmod=None, formats=("srt",),
+                   tags=None, path_decoder=None, debug_mods=False):
+    """Save subtitles on filesystem.
+
+    Subtitles are saved in the order of the list. If a subtitle with a language has already been saved, other subtitles
+    with the same language are silently ignored.
+
+    The extension used is `.lang.srt` by default or `.srt` is `single` is `True`, with `lang` being the IETF code for
+    the :attr:`~subliminal.subtitle.Subtitle.language` of the subtitle.
+
+    :param file_path: video file path
+    :param formats: list of "srt" and "vtt"
+    :param subtitles: subtitles to save.
+    :type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
+    :param bool single: save a single subtitle, default is to save one subtitle per language.
+    :param str directory: path to directory where to save the subtitles, default is next to the video.
+    :return: the saved subtitles
+    :rtype: list of :class:`~subliminal.subtitle.Subtitle`
+
+    patch: unicode path problems
+    """
+
+    logger.debug("Subtitle formats requested: %r", formats)
+
+    saved_subtitles = []
+    for subtitle in subtitles:
+        # check content
+        if subtitle.content is None:
+            logger.error('Skipping subtitle %r: no content', subtitle)
+            continue
+
+        # check language
+        if subtitle.language in set(s.language for s in saved_subtitles):
+            logger.debug('Skipping subtitle %r: language already saved', subtitle)
+            continue
+
+        # create subtitle path
+        subtitle_path = get_subtitle_path(file_path, None if single else subtitle.language,
+                                          forced_tag=subtitle.language.forced, tags=tags)
+        if directory is not None:
+            subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1])
+
+        if path_decoder:
+            subtitle_path = path_decoder(subtitle_path)
+
+        # force unicode
+        subtitle_path = UnicodeDammit(subtitle_path).unicode_markup
+
+        subtitle.storage_path = subtitle_path
+
+        for format in formats:
+            if format != "srt":
+                subtitle_path = os.path.splitext(subtitle_path)[0] + (u".%s" % format)
+
+            logger.debug(u"Saving %r to %r", subtitle, subtitle_path)
+            content = subtitle.get_modified_content(format=format, debug=debug_mods)
+            if content:
+                with open(subtitle_path, 'w') as f:
+                    f.write(content)
+                subtitle.storage_path = subtitle_path
+            else:
+                logger.error(u"Something went wrong when getting modified subtitle for %s", subtitle)
+
+        # change chmod if requested
+        if chmod:
+            os.chmod(subtitle_path, chmod)
+
+        saved_subtitles.append(subtitle)
+
+        # check single
+        if single:
+            break
+
+    return saved_subtitles
+
+
+def refine(video, episode_refiners=None, movie_refiners=None, **kwargs):
+    """Refine a video using :ref:`refiners`.
+    
+    patch: add traceback logging
+
+    .. note::
+
+        Exceptions raised in refiners are silently passed and logged.
+
+    :param video: the video to refine.
+    :type video: :class:`~subliminal.video.Video`
+    :param tuple episode_refiners: refiners to use for episodes.
+    :param tuple movie_refiners: refiners to use for movies.
+    :param \*\*kwargs: additional parameters for the :func:`~subliminal.refiners.refine` functions.
+
+    """
+    refiners = ()
+    if isinstance(video, Episode):
+        refiners = episode_refiners or ('metadata', 'tvdb', 'omdb')
+    elif isinstance(video, Movie):
+        refiners = movie_refiners or ('metadata', 'omdb')
+    for refiner in refiners:
+        logger.info('Refining video with %s', refiner)
+        try:
+            refiner_manager[refiner].plugin(video, **kwargs)
+        except:
+            logger.error('Failed to refine video: %s', traceback.format_exc())
diff --git a/libs/subliminal_patch/exceptions.py b/libs/subliminal_patch/exceptions.py
new file mode 100644
index 000000000..e336a10af
--- /dev/null
+++ b/libs/subliminal_patch/exceptions.py
@@ -0,0 +1,11 @@
+# coding=utf-8
+from subliminal import ProviderError
+
+
+class TooManyRequests(ProviderError):
+    """Exception raised by providers when too many requests are made."""
+    pass
+
+
+class APIThrottled(ProviderError):
+    pass
diff --git a/libs/subliminal_patch/extensions.py b/libs/subliminal_patch/extensions.py
new file mode 100644
index 000000000..e155439a6
--- /dev/null
+++ b/libs/subliminal_patch/extensions.py
@@ -0,0 +1,66 @@
+# coding=utf-8
+from collections import OrderedDict
+
+import subliminal
+import babelfish
+
+
+class ProviderRegistry(object):
+    providers = None
+
+    def __init__(self):
+        self.providers = OrderedDict()
+
+    def __cmp__(self, d):
+        return cmp(self.providers, d)
+
+    def __contains__(self, item):
+        return item in self.providers
+
+    def __setitem__(self, key, item):
+        self.providers[key] = item
+
+    def __iter__(self):
+        return iter(self.providers)
+
+    def __getitem__(self, key):
+        if key in self.providers:
+            return self.providers[key]
+
+    def __repr__(self):
+        return repr(self.providers)
+
+    def __str__(self):
+        return str(self.providers)
+
+    def __len__(self):
+        return len(self.providers)
+
+    def __delitem__(self, key):
+        del self.providers[key]
+
+    def register(self, name, cls):
+        self.providers[name] = cls
+
+    def names(self):
+        return self.providers.keys()
+
+
+provider_registry = ProviderRegistry()
+
+# add language converters
+try:
+    babelfish.language_converters.unregister('addic7ed = subliminal.converters.addic7ed:Addic7edConverter')
+except ValueError:
+    pass
+
+babelfish.language_converters.register('addic7ed = subliminal_patch.language:PatchedAddic7edConverter')
+babelfish.language_converters.register('szopensubtitles = subliminal_patch.language:PatchedOpenSubtitlesConverter')
+subliminal.refiner_manager.register('sz_metadata = subliminal_patch.refiners.metadata:refine')
+subliminal.refiner_manager.register('sz_omdb = subliminal_patch.refiners.omdb:refine')
+subliminal.refiner_manager.register('sz_tvdb = subliminal_patch.refiners.tvdb:refine')
+subliminal.refiner_manager.register('drone = subliminal_patch.refiners.drone:refine')
+subliminal.refiner_manager.register('filebot = subliminal_patch.refiners.filebot:refine')
+subliminal.refiner_manager.register('file_info_file = subliminal_patch.refiners.file_info_file:refine')
+subliminal.refiner_manager.register('symlinks = subliminal_patch.refiners.symlinks:refine')
+
diff --git a/libs/subliminal_patch/http.py b/libs/subliminal_patch/http.py
new file mode 100644
index 000000000..5b6b308af
--- /dev/null
+++ b/libs/subliminal_patch/http.py
@@ -0,0 +1,169 @@
+# coding=utf-8
+import certifi
+import ssl
+import os
+import socket
+import logging
+import requests
+import xmlrpclib
+import dns.resolver
+
+from requests import Session, exceptions
+from urllib3.util import connection
+from retry.api import retry_call
+from exceptions import APIThrottled
+
+from subzero.lib.io import get_viable_encoding
+
+logger = logging.getLogger(__name__)
+pem_file = os.path.normpath(os.path.join(os.path.dirname(os.path.realpath(unicode(__file__, get_viable_encoding()))), "..", certifi.where()))
+try:
+    default_ssl_context = ssl.create_default_context(cafile=pem_file)
+except AttributeError:
+    # < Python 2.7.9
+    default_ssl_context = None
+
+
+custom_resolver = dns.resolver.Resolver(configure=False)
+
+# 8.8.8.8 is Google's public DNS server
+custom_resolver.nameservers = ['8.8.8.8', '1.1.1.1']
+
+
+class CertifiSession(Session):
+    def __init__(self):
+        super(CertifiSession, self).__init__()
+        self.verify = pem_file
+
+
+class RetryingSession(CertifiSession):
+    proxied_functions = ("get", "post")
+
+    def __init__(self):
+        super(CertifiSession, self).__init__()
+        self.verify = pem_file
+
+        proxy = os.environ.get('SZ_HTTP_PROXY')
+        if proxy:
+            self.proxies = {
+                "http": proxy,
+                "https": proxy
+            }
+
+    def retry_method(self, method, *args, **kwargs):
+        if self.proxies:
+            # fixme: may be a little loud
+            logger.debug("Using proxy %s for: %s", self.proxies["http"], args[0])
+
+        return retry_call(getattr(super(CertifiSession, self), method), fargs=args, fkwargs=kwargs, tries=3, delay=5,
+                          exceptions=(exceptions.ConnectionError,
+                                      exceptions.ProxyError,
+                                      exceptions.SSLError,
+                                      exceptions.Timeout,
+                                      exceptions.ConnectTimeout,
+                                      exceptions.ReadTimeout,
+                                      socket.timeout))
+
+    def get(self, *args, **kwargs):
+        if self.proxies and "timeout" in kwargs and kwargs["timeout"]:
+            kwargs["timeout"] = kwargs["timeout"] * 3
+        return self.retry_method("get", *args, **kwargs)
+
+    def post(self, *args, **kwargs):
+        if self.proxies and "timeout" in kwargs and kwargs["timeout"]:
+            kwargs["timeout"] = kwargs["timeout"] * 3
+        return self.retry_method("post", *args, **kwargs)
+
+
+class SubZeroRequestsTransport(xmlrpclib.SafeTransport):
+    """
+    Drop in Transport for xmlrpclib that uses Requests instead of httplib
+
+    Based on: https://gist.github.com/chrisguitarguy/2354951#gistcomment-2388906
+
+    """
+    # change our user agent to reflect Requests
+    user_agent = "Python XMLRPC with Requests (python-requests.org)"
+    proxies = None
+
+    def __init__(self, use_https=True, verify=None, user_agent=None, timeout=10, *args, **kwargs):
+        self.verify = pem_file if verify is None else verify
+        self.use_https = use_https
+        self.user_agent = user_agent if user_agent is not None else self.user_agent
+        self.timeout = timeout
+        proxy = os.environ.get('SZ_HTTP_PROXY')
+        if proxy:
+            self.proxies = {
+                "http": proxy,
+                "https": proxy
+            }
+
+        xmlrpclib.SafeTransport.__init__(self, *args, **kwargs)
+
+    def request(self, host, handler, request_body, verbose=0):
+        """
+        Make an xmlrpc request.
+        """
+        headers = {'User-Agent': self.user_agent}
+        url = self._build_url(host, handler)
+        try:
+            resp = requests.post(url, data=request_body, headers=headers,
+                                 stream=True, timeout=self.timeout, proxies=self.proxies,
+                                 verify=self.verify)
+        except ValueError:
+            raise
+        except Exception:
+            raise  # something went wrong
+        else:
+            resp.raise_for_status()
+
+            try:
+                if 'x-ratelimit-remaining' in resp.headers and int(resp.headers['x-ratelimit-remaining']) <= 2:
+                    raise APIThrottled()
+            except ValueError:
+                logger.info('Couldn\'t parse "x-ratelimit-remaining": %r' % resp.headers['x-ratelimit-remaining'])
+
+            self.verbose = verbose
+            try:
+                return self.parse_response(resp.raw)
+            except:
+                logger.debug("Bad response data: %r", resp.raw)
+
+    def _build_url(self, host, handler):
+        """
+        Build a url for our request based on the host, handler and use_http
+        property
+        """
+        scheme = 'https' if self.use_https else 'http'
+        handler = handler[1:] if handler and handler[0] == "/" else handler
+        return '%s://%s/%s' % (scheme, host, handler)
+
+
+_orig_create_connection = connection.create_connection
+
+
+dns_cache = {}
+
+
+def set_custom_resolver():
+    def patched_create_connection(address, *args, **kwargs):
+        """Wrap urllib3's create_connection to resolve the name elsewhere"""
+        # resolve hostname to an ip address; use your own
+        # resolver here, as otherwise the system resolver will be used.
+        host, port = address
+        if host in dns_cache:
+            ip = dns_cache[host]
+            logger.debug("Using %s=%s from cache", host, ip)
+        else:
+            try:
+                ip = custom_resolver.query(host)[0].address
+                dns_cache[host] = ip
+            except dns.exception.DNSException:
+                logger.warning("Couldn't resolve %s with DNS: %s", host, custom_resolver.nameservers)
+                return _orig_create_connection((host, port), *args, **kwargs)
+
+            logger.debug("Resolved %s to %s using %s", host, ip, custom_resolver.nameservers)
+
+        return _orig_create_connection((ip, port), *args, **kwargs)
+
+    connection.create_connection = patched_create_connection
diff --git a/libs/subliminal_patch/language.py b/libs/subliminal_patch/language.py
new file mode 100644
index 000000000..83f70e155
--- /dev/null
+++ b/libs/subliminal_patch/language.py
@@ -0,0 +1,35 @@
+# coding=utf-8
+from subliminal.converters.addic7ed import Addic7edConverter
+from babelfish.converters.opensubtitles import OpenSubtitlesConverter
+
+
+class PatchedAddic7edConverter(Addic7edConverter):
+    def __init__(self):
+        super(PatchedAddic7edConverter, self).__init__()
+        self.from_addic7ed.update({
+            "French (Canadian)": ("fra", "CA"),
+        })
+        self.to_addic7ed.update({
+            ("fra", "CA"): "French (Canadian)",
+        })
+
+
+class PatchedOpenSubtitlesConverter(OpenSubtitlesConverter):
+    def __init__(self):
+        super(PatchedOpenSubtitlesConverter, self).__init__()
+        self.to_opensubtitles.update({
+            ('srp', None, "Latn"): 'scc',
+            ('srp', None, "Cyrl"): 'scc',
+            ('chi', None, 'Hant'): 'zht'
+        })
+        self.from_opensubtitles.update({
+            'zht': ('zho', None, 'Hant')
+        })
+
+    def convert(self, alpha3, country=None, script=None):
+        alpha3b = self.alpha3b_converter.convert(alpha3, country, script)
+        if (alpha3b, country) in self.to_opensubtitles:
+            return self.to_opensubtitles[(alpha3b, country)]
+        elif (alpha3b, country, script) in self.to_opensubtitles:
+            return self.to_opensubtitles[(alpha3b, country, script)]
+        return alpha3b
diff --git a/libs/subliminal_patch/providers/__init__.py b/libs/subliminal_patch/providers/__init__.py
new file mode 100644
index 000000000..a3520fce5
--- /dev/null
+++ b/libs/subliminal_patch/providers/__init__.py
@@ -0,0 +1,78 @@
+# coding=utf-8
+
+import importlib
+import os
+import subliminal
+from subliminal.providers import Provider as _Provider
+from subliminal.subtitle import Subtitle as _Subtitle
+from subliminal_patch.extensions import provider_registry
+from subliminal_patch.http import RetryingSession
+from subliminal_patch.subtitle import Subtitle, guess_matches
+
+from subzero.lib.io import get_viable_encoding
+
+
+class Provider(_Provider):
+    hash_verifiable = False
+    hearing_impaired_verifiable = False
+    skip_wrong_fps = True
+
+
+# register providers
+# fixme: this is bad
+for name in os.listdir(os.path.dirname(unicode(__file__, get_viable_encoding()))):
+    if name in ("__init__.py", "mixins.py", "utils.py") or not name.endswith(".py"):
+        continue
+
+    module_name = os.path.splitext(name)[0]
+    mod = importlib.import_module("subliminal_patch.providers.%s" % module_name.lower())
+    for item in dir(mod):
+        cls = getattr(mod, item)
+        if item != "Provider" and item.endswith("Provider") and not item.startswith("_"):
+            is_sz_provider = issubclass(cls, Provider)
+            is_provider = issubclass(cls, _Provider)
+
+            if not is_provider:
+                continue
+
+            if not is_sz_provider:
+                # patch provider bases
+                new_bases = []
+
+                for base in cls.__bases__:
+                    if base == _Provider:
+                        base = Provider
+                    else:
+                        if _Provider in base.__bases__:
+                            base.__bases__ = (Provider,)
+                    new_bases.append(base)
+
+                cls.__bases__ = tuple(new_bases)
+
+                # patch subtitle bases
+                new_bases = []
+                for base in cls.subtitle_class.__bases__:
+                    if base == _Subtitle:
+                        base = Subtitle
+                    else:
+                        if _Subtitle in base.__bases__:
+                            base.__bases__ = (Subtitle,)
+                    new_bases.append(base)
+
+                cls.subtitle_class.__bases__ = tuple(new_bases)
+
+            # inject our requests.Session wrapper for automatic retry
+            mod.Session = RetryingSession
+            mod.guess_matches = guess_matches
+
+            provider_registry.register(module_name, cls)
+
+    # try patching the correspondent subliminal provider
+    try:
+        subliminal_mod = importlib.import_module("subliminal.providers.%s" % module_name.lower())
+    except ImportError:
+        pass
+    else:
+        subliminal_mod.Session = RetryingSession
+        subliminal_mod.guess_matches = guess_matches
+
diff --git a/libs/subliminal_patch/providers/addic7ed.py b/libs/subliminal_patch/providers/addic7ed.py
new file mode 100644
index 000000000..269dd6aa9
--- /dev/null
+++ b/libs/subliminal_patch/providers/addic7ed.py
@@ -0,0 +1,301 @@
+# coding=utf-8
+import logging
+import re
+import datetime
+import subliminal
+import time
+from random import randint
+from dogpile.cache.api import NO_VALUE
+from requests import Session
+
+from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded, AuthenticationError
+from subliminal.providers.addic7ed import Addic7edProvider as _Addic7edProvider, \
+    Addic7edSubtitle as _Addic7edSubtitle, ParserBeautifulSoup, show_cells_re
+from subliminal.cache import region
+from subliminal.subtitle import fix_line_ending
+from subliminal_patch.utils import sanitize
+from subliminal_patch.exceptions import TooManyRequests
+
+from subzero.language import Language
+
+logger = logging.getLogger(__name__)
+
+#: Series header parsing regex
+series_year_re = re.compile(r'^(?P<series>[ \w\'.:(),*&!?-]+?)(?: \((?P<year>\d{4})\))?$')
+
+SHOW_EXPIRATION_TIME = datetime.timedelta(weeks=1).total_seconds()
+
+
+class Addic7edSubtitle(_Addic7edSubtitle):
+    hearing_impaired_verifiable = True
+
+    def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, year, version,
+                 download_link):
+        super(Addic7edSubtitle, self).__init__(language, hearing_impaired, page_link, series, season, episode,
+                                               title, year, version, download_link)
+        self.release_info = version
+
+    def get_matches(self, video):
+        matches = super(Addic7edSubtitle, self).get_matches(video)
+        if not subliminal.score.episode_scores.get("addic7ed_boost"):
+            return matches
+
+        # if the release group matches, the format is most likely correct, as well
+        if "release_group" in matches:
+            matches.add("format")
+
+        if {"series", "season", "episode", "year"}.issubset(matches) and "format" in matches:
+            matches.add("addic7ed_boost")
+            logger.info("Boosting Addic7ed subtitle by %s" % subliminal.score.episode_scores.get("addic7ed_boost"))
+        return matches
+
+    def __repr__(self):
+        return '<%s %r [%s]>' % (
+            self.__class__.__name__, u"http://www.addic7ed.com/%s" % self.download_link, self.language)
+
+
+class Addic7edProvider(_Addic7edProvider):
+    languages = {Language('por', 'BR')} | {Language(l) for l in [
+        'ara', 'aze', 'ben', 'bos', 'bul', 'cat', 'ces', 'dan', 'deu', 'ell', 'eng', 'eus', 'fas', 'fin', 'fra', 'glg',
+        'heb', 'hrv', 'hun', 'hye', 'ind', 'ita', 'jpn', 'kor', 'mkd', 'msa', 'nld', 'nor', 'pol', 'por', 'ron', 'rus',
+        'slk', 'slv', 'spa', 'sqi', 'srp', 'swe', 'tha', 'tur', 'ukr', 'vie', 'zho'
+    ]} | {Language.fromietf(l) for l in ["sr-Latn", "sr-Cyrl"]}
+
+    USE_ADDICTED_RANDOM_AGENTS = False
+    hearing_impaired_verifiable = True
+    subtitle_class = Addic7edSubtitle
+
+    sanitize_characters = {'-', ':', '(', ')', '.', '/'}
+
+    def __init__(self, username=None, password=None, use_random_agents=False):
+        super(Addic7edProvider, self).__init__(username=username, password=password)
+        self.USE_ADDICTED_RANDOM_AGENTS = use_random_agents
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers['User-Agent'] = 'Subliminal/%s' % subliminal.__short_version__
+
+        if self.USE_ADDICTED_RANDOM_AGENTS:
+            from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST
+            logger.debug("Addic7ed: using random user agents")
+            self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)]
+            self.session.headers['Referer'] = self.server_url
+
+        # login
+        if self.username and self.password:
+            ccks = region.get("addic7ed_cookies", expiration_time=86400)
+            do_login = False
+            if ccks != NO_VALUE:
+                self.session.cookies.update(ccks)
+                r = self.session.get(self.server_url + 'panel.php', allow_redirects=False, timeout=10)
+                if r.status_code == 302:
+                    logger.info('Addic7ed: Login expired')
+                    do_login = True
+                else:
+                    logger.info('Addic7ed: Reusing old login')
+                    self.logged_in = True
+
+            if do_login:
+                logger.info('Addic7ed: Logging in')
+                data = {'username': self.username, 'password': self.password, 'Submit': 'Log in'}
+                r = self.session.post(self.server_url + 'dologin.php', data, allow_redirects=False, timeout=10)
+
+                if "relax, slow down" in r.content:
+                    raise TooManyRequests(self.username)
+
+                if r.status_code != 302:
+                    raise AuthenticationError(self.username)
+
+                region.set("addic7ed_cookies", r.cookies)
+
+                logger.debug('Addic7ed: Logged in')
+                self.logged_in = True
+
+
+    @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
+    def _get_show_ids(self):
+        """Get the ``dict`` of show ids per series by querying the `shows.php` page.
+        :return: show id per series, lower case and without quotes.
+        :rtype: dict
+
+        # patch: add punctuation cleaning
+        """
+        # get the show page
+        logger.info('Getting show ids')
+        r = self.session.get(self.server_url + 'shows.php', timeout=10)
+        r.raise_for_status()
+
+        # LXML parser seems to fail when parsing Addic7ed.com HTML markup.
+        # Last known version to work properly is 3.6.4 (next version, 3.7.0, fails)
+        # Assuming the site's markup is bad, and stripping it down to only contain what's needed.
+        show_cells = re.findall(show_cells_re, r.content)
+        if show_cells:
+            soup = ParserBeautifulSoup(b''.join(show_cells), ['lxml', 'html.parser'])
+        else:
+            # If RegEx fails, fall back to original r.content and use 'html.parser'
+            soup = ParserBeautifulSoup(r.content, ['html.parser'])
+
+        # populate the show ids
+        show_ids = {}
+        for show in soup.select('td.version > h3 > a[href^="/show/"]'):
+            show_clean = sanitize(show.text, default_characters=self.sanitize_characters)
+            try:
+                show_id = int(show['href'][6:])
+            except ValueError:
+                continue
+
+            show_ids[show_clean] = show_id
+            match = series_year_re.match(show_clean)
+            if match and match.group(2) and match.group(1) not in show_ids:
+                # year found, also add it without year
+                show_ids[match.group(1)] = show_id
+
+        soup.decompose()
+        soup = None
+
+        logger.debug('Found %d show ids', len(show_ids))
+
+        return show_ids
+
+    @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
+    def _search_show_id(self, series, year=None):
+        """Search the show id from the `series` and `year`.
+
+        :param str series: series of the episode.
+        :param year: year of the series, if any.
+        :type year: int
+        :return: the show id, if found.
+        :rtype: int
+
+        """
+        # addic7ed doesn't support search with quotes
+        series = series.replace('\'', ' ')
+
+        # build the params
+        series_year = '%s %d' % (series, year) if year is not None else series
+        params = {'search': series_year, 'Submit': 'Search'}
+
+        # make the search
+        logger.info('Searching show ids with %r', params)
+
+        # currently addic7ed searches via srch.php from the front page, then a re-search is needed which calls
+        # search.php
+        for endpoint in ("srch.php", "search.php",):
+            headers = None
+            if endpoint == "search.php":
+                headers = {
+                    "referer": self.server_url + "srch.php"
+                }
+            r = self.session.get(self.server_url + endpoint, params=params, timeout=10, headers=headers)
+            r.raise_for_status()
+
+            if r.content and "Sorry, your search" not in r.content:
+                break
+
+            time.sleep(4)
+
+        if r.status_code == 304:
+            raise TooManyRequests()
+
+        soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+
+        suggestion = None
+
+        # get the suggestion
+        try:
+            suggestion = soup.select('span.titulo > a[href^="/show/"]')
+            if not suggestion:
+                logger.warning('Show id not found: no suggestion')
+                return None
+            if not sanitize(suggestion[0].i.text.replace('\'', ' '),
+                            default_characters=self.sanitize_characters) == \
+                    sanitize(series_year, default_characters=self.sanitize_characters):
+                logger.warning('Show id not found: suggestion does not match')
+                return None
+            show_id = int(suggestion[0]['href'][6:])
+            logger.debug('Found show id %d', show_id)
+
+            return show_id
+        finally:
+            soup.decompose()
+            soup = None
+
+    def query(self, show_id, series, season, year=None, country=None):
+        # patch: fix logging
+
+        # get the page of the season of the show
+        logger.info('Getting the page of show id %d, season %d', show_id, season)
+        r = self.session.get(self.server_url + 'ajax_loadShow.php',
+                             params={'show': show_id, 'season': season},
+                             timeout=10,
+                             headers={
+                                 "referer": "%sshow/%s" % (self.server_url, show_id),
+                                 "X-Requested-With": "XMLHttpRequest"
+                             }
+                             )
+
+        r.raise_for_status()
+
+        if r.status_code == 304:
+            raise TooManyRequests()
+
+        if not r.content:
+            # Provider wrongful return a status of 304 Not Modified with an empty content
+            # raise_for_status won't raise exception for that status code
+            logger.error('No data returned from provider')
+            return []
+
+        soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+
+        # loop over subtitle rows
+        subtitles = []
+        for row in soup.select('tr.epeven'):
+            cells = row('td')
+
+            # ignore incomplete subtitles
+            status = cells[5].text
+            if status != 'Completed':
+                logger.debug('Ignoring subtitle with status %s', status)
+                continue
+
+            # read the item
+            language = Language.fromaddic7ed(cells[3].text)
+            hearing_impaired = bool(cells[6].text)
+            page_link = self.server_url + cells[2].a['href'][1:]
+            season = int(cells[0].text)
+            episode = int(cells[1].text)
+            title = cells[2].text
+            version = cells[4].text
+            download_link = cells[9].a['href'][1:]
+
+            subtitle = self.subtitle_class(language, hearing_impaired, page_link, series, season, episode, title,
+                                           year,
+                                           version, download_link)
+            logger.debug('Found subtitle %r', subtitle)
+            subtitles.append(subtitle)
+
+        soup.decompose()
+        soup = None
+
+        return subtitles
+
+    def download_subtitle(self, subtitle):
+        # download the subtitle
+        r = self.session.get(self.server_url + subtitle.download_link, headers={'Referer': subtitle.page_link},
+                             timeout=10)
+        r.raise_for_status()
+
+        if r.status_code == 304:
+            raise TooManyRequests()
+
+        if not r.content:
+            # Provider wrongful return a status of 304 Not Modified with an empty content
+            # raise_for_status won't raise exception for that status code
+            logger.error('Unable to download subtitle. No data returned from provider')
+            return
+
+        # detect download limit exceeded
+        if r.headers['Content-Type'] == 'text/html':
+            raise DownloadLimitExceeded
+
+        subtitle.content = fix_line_ending(r.content)
diff --git a/libs/subliminal_patch/providers/argenteam.py b/libs/subliminal_patch/providers/argenteam.py
new file mode 100644
index 000000000..6a2c7aec8
--- /dev/null
+++ b/libs/subliminal_patch/providers/argenteam.py
@@ -0,0 +1,279 @@
+# coding=utf-8
+import logging
+import os
+import io
+import time
+
+from zipfile import ZipFile
+from guessit import guessit
+from requests import Session
+from subliminal import Episode, Movie
+from subliminal.score import get_equivalent_release_groups
+from subliminal.utils import sanitize_release_group, sanitize
+from subliminal_patch.providers import Provider
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subzero.language import Language
+
+logger = logging.getLogger(__name__)
+
+
+class ArgenteamSubtitle(Subtitle):
+    provider_name = 'argenteam'
+    hearing_impaired_verifiable = False
+    _release_info = None
+
+    def __init__(self, language, download_link, movie_kind, title, season, episode, year, release, version, source,
+                 video_codec, tvdb_id, imdb_id, asked_for_episode=None, asked_for_release_group=None, *args, **kwargs):
+        super(ArgenteamSubtitle, self).__init__(language, download_link, *args, **kwargs)
+        self.download_link = download_link
+        self.movie_kind = movie_kind
+        self.title = title
+        self.year = year
+        self.season = season
+        self.episode = episode
+        self.release = release
+        self.version = version
+        self.asked_for_release_group = asked_for_release_group
+        self.asked_for_episode = asked_for_episode
+        self.matches = None
+        self.format = source
+        self.video_codec = video_codec
+        self.tvdb_id = tvdb_id
+        self.imdb_id = "tt" + imdb_id if imdb_id else None
+        self.releases = self.release_info
+
+    @property
+    def id(self):
+        return self.download_link
+
+    @property
+    def release_info(self):
+        if self._release_info:
+            return self._release_info
+
+        combine = []
+        for attr in ("format", "version", "video_codec"):
+            value = getattr(self, attr)
+            if value:
+                combine.append(value)
+
+        self._release_info = u".".join(combine) + (u"-"+self.release if self.release else "")
+        return self._release_info
+
+    def __repr__(self):
+        ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else ""
+        return '<%s %r [%s]>' % (
+            self.__class__.__name__, u"%s%s%s." % (self.title, " (%s)" % self.year if self.year else "", ep_addon) +
+            self.release_info, self.language)
+
+    def get_matches(self, video):
+        matches = set()
+        # series
+        if isinstance(video, Episode) and self.movie_kind == 'episode':
+            if video.series and (sanitize(self.title) in (
+                     sanitize(name) for name in [video.series] + video.alternative_series)):
+                matches.add('series')
+            # season
+            if video.season and self.season == video.season:
+                matches.add('season')
+            # episode
+            if video.episode and self.episode == video.episode:
+                matches.add('episode')
+
+            # tvdb_id
+            if video.tvdb_id and str(self.tvdb_id) == str(video.tvdb_id):
+                matches.add('tvdb_id')
+
+        elif isinstance(video, Movie) and self.movie_kind == 'movie':
+            # title
+            if video.title and (sanitize(self.title) in (
+                     sanitize(name) for name in [video.title] + video.alternative_titles)):
+                matches.add('title')
+
+            # imdb_id
+            if video.imdb_id and self.imdb_id and str(self.imdb_id) == str(video.imdb_id):
+                matches.add('imdb_id')
+
+            # year
+            if video.year and self.year == video.year:
+                matches.add('year')
+        else:
+            logger.info('%r is not a valid movie_kind', self.movie_kind)
+            return matches
+
+        # release_group
+        if video.release_group and self.release:
+            rg = sanitize_release_group(video.release_group)
+            if any(r in sanitize_release_group(self.release) for r in get_equivalent_release_groups(rg)):
+                matches.add('release_group')
+
+                # blatantly assume we've got a matching format if the release group matches
+                # fixme: smart?
+                #matches.add('format')
+
+        # resolution
+        if video.resolution and self.version and str(video.resolution) in self.version.lower():
+            matches.add('resolution')
+        # format
+        if video.format and self.format:
+            formats = [video.format]
+            if video.format == "WEB-DL":
+                formats.append("WEB")
+
+            for fmt in formats:
+                if fmt.lower() in self.format.lower():
+                    matches.add('format')
+                    break
+
+        matches |= guess_matches(video, guessit(self.release_info), partial=True)
+        self.matches = matches
+        return matches
+
+
+class ArgenteamProvider(Provider, ProviderSubtitleArchiveMixin):
+    provider_name = 'argenteam'
+    languages = {Language.fromalpha2(l) for l in ['es']}
+    video_types = (Episode, Movie)
+    API_URL = "http://argenteam.net/api/v1/"
+    subtitle_class = ArgenteamSubtitle
+    hearing_impaired_verifiable = False
+    language_list = list(languages)
+
+    multi_result_throttle = 2  # seconds
+
+    def __init__(self):
+        self.session = None
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")}
+
+    def terminate(self):
+        self.session.close()
+
+    def search_ids(self, title, year=None, imdb_id=None, season=None, episode=None, titles=None):
+        """Search movie or episode id from the `title`, `season` and `episode`.
+
+        :param imdb_id: imdb id of the given movie
+        :param titles: all titles of the given series or movie
+        :param year: release year of the given movie
+        :param str title: series of the episode or movie name
+        :param int season: season of the episode.
+        :param int episode: episode number.
+        :return: list of ids
+        :rtype: list
+
+        """
+        # make the search
+        query = title
+        titles = titles or []
+
+        is_episode = False
+        if season and episode:
+            is_episode = True
+            query = '%s S%#02dE%#02d' % (title, season, episode)
+
+        logger.info(u'Searching %s ID for %r', "episode" if is_episode else "movie", query)
+        r = self.session.get(self.API_URL + 'search', params={'q': query}, timeout=10)
+        r.raise_for_status()
+        results = r.json()
+        match_ids = []
+        if results['total'] >= 1:
+            for result in results["results"]:
+                if (result['type'] == "episode" and not is_episode) or (result['type'] == "movie" and is_episode):
+                    continue
+
+                # shortcut in case of matching imdb id
+                if not is_episode and imdb_id and "imdb" in result and "tt%s" % result["imdb"] == str(imdb_id):
+                    logger.debug("Movie matched by IMDB ID %s, taking shortcut", imdb_id)
+                    match_ids = [result['id']]
+                    break
+
+                # advanced title check in case of multiple movie results
+                if results['total'] > 1:
+                    if not is_episode and year:
+                        if result["title"] and not (sanitize(result["title"]) in (u"%s %s" % (sanitize(name), year)
+                                                                                  for name in titles)):
+                            continue
+
+                match_ids.append(result['id'])
+        else:
+            logger.error(u'No episode ID found for %r', query)
+
+        if match_ids:
+            logger.debug(u"Found matching IDs: %s", ", ".join(str(id) for id in match_ids))
+
+        return match_ids
+
+    def query(self, title, video, titles=None):
+        is_episode = isinstance(video, Episode)
+        season = episode = None
+        url = self.API_URL + 'movie'
+        if is_episode:
+            season = video.season
+            episode = video.episode
+            url = self.API_URL + 'episode'
+            argenteam_ids = self.search_ids(title, season=season, episode=episode, titles=titles)
+
+        else:
+            argenteam_ids = self.search_ids(title, year=video.year, imdb_id=video.imdb_id, titles=titles)
+
+        if not argenteam_ids:
+            return []
+
+        language = self.language_list[0]
+        subtitles = []
+        has_multiple_ids = len(argenteam_ids) > 1
+        for aid in argenteam_ids:
+            response = self.session.get(url, params={'id': aid}, timeout=10)
+
+            response.raise_for_status()
+            content = response.json()
+
+            imdb_id = year = None
+            returned_title = title
+            if not is_episode and "info" in content:
+                imdb_id = content["info"].get("imdb")
+                year = content["info"].get("year")
+                returned_title = content["info"].get("title", title)
+
+            for r in content['releases']:
+                for s in r['subtitles']:
+                    sub = ArgenteamSubtitle(language, s['uri'], "episode" if is_episode else "movie", returned_title,
+                                            season, episode, year, r.get('team'), r.get('tags'),
+                                            r.get('source'), r.get('codec'), content.get("tvdb"), imdb_id,
+                                            asked_for_release_group=video.release_group,
+                                            asked_for_episode=episode
+                                            )
+                    subtitles.append(sub)
+
+            if has_multiple_ids:
+                time.sleep(self.multi_result_throttle)
+
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        if isinstance(video, Episode):
+            titles = [video.series] + video.alternative_series
+        else:
+            titles = [video.title] + video.alternative_titles
+
+        for title in titles:
+            subs = self.query(title, video, titles=titles)
+            if subs:
+                return subs
+
+            time.sleep(self.multi_result_throttle)
+
+        return []
+
+    def download_subtitle(self, subtitle):
+        # download as a zip
+        logger.info('Downloading subtitle %r', subtitle)
+        r = self.session.get(subtitle.download_link, timeout=10)
+        r.raise_for_status()
+
+        # open the zip
+        with ZipFile(io.BytesIO(r.content)) as zf:
+            subtitle.content = self.get_subtitle_from_archive(subtitle, zf)
diff --git a/libs/subliminal_patch/providers/assrt.py b/libs/subliminal_patch/providers/assrt.py
new file mode 100644
index 000000000..67300dd0b
--- /dev/null
+++ b/libs/subliminal_patch/providers/assrt.py
@@ -0,0 +1,166 @@
+# -*- coding: utf-8 -*-
+import json
+import logging
+import os
+import re
+
+from babelfish import language_converters
+from guessit import guessit
+from requests import Session
+
+from subliminal import Movie, Episode, ProviderError, __short_version__
+from subliminal.exceptions import AuthenticationError, ConfigurationError, DownloadLimitExceeded, ProviderError
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal.subtitle import fix_line_ending
+from subliminal_patch.providers import Provider
+from subzero.language import Language
+
+logger = logging.getLogger(__name__)
+
+language_converters.register('assrt = subliminal_patch.converters.assrt:AssrtConverter')
+
+server_url = 'https://api.assrt.net/v1'
+supported_languages = language_converters['assrt'].to_assrt.keys()
+
+
+class AssrtSubtitle(Subtitle):
+    """Assrt Sbutitle."""
+    provider_name = 'assrt'
+    guessit_options = {
+        'allowed_languages': [ l[0] for l in supported_languages ],
+        'allowed_countries': [ l[1] for l in supported_languages if len(l) > 1 ],
+        'enforce_list': True
+    }
+
+    def __init__(self, language, subtitle_id, video_name, session, token):
+        super(AssrtSubtitle, self).__init__(language)
+        self.session = session
+        self.token = token
+        self.subtitle_id = subtitle_id
+        self.video_name = video_name
+        self.url = None
+        self._detail = None
+
+    def _get_detail(self):
+        if self._detail:
+            return self._detail
+        params = {'token': self.token, 'id': self.id}
+        r = self.session.get(server_url + '/sub/detail', params=params, timeout=10)
+        r.raise_for_status()
+
+        result = r.json()
+        sub = result['sub']['subs'][0]
+        files = sub['filelist']
+
+        # first pass: guessit
+        for f in files:
+            logger.info('File %r', f)
+            guess = guessit(f['f'], self.guessit_options)
+            logger.info('GuessIt %r', guess)
+            langs = set()
+            if 'language' in guess:
+                langs.update(guess['language'])
+            if 'subtitle_language' in guess:
+                langs.update(guess['subtitle_language'])
+            if self.language in langs:
+                self._defail = f
+                return f
+
+        # second pass: keyword matching
+        codes = language_converters['assrt'].codes
+        for f in files:
+            langs = set([ Language.fromassrt(k) for k in codes if k in f['f'] ])
+            logger.info('%s: %r', f['f'], langs)
+            if self.language in langs:
+                self._defail = f
+                return f
+
+        # fallback: pick up first file if nothing matches
+        return files[0]
+
+    @property
+    def id(self):
+        return self.subtitle_id
+
+    @property
+    def download_link(self):
+        detail = self._get_detail()
+        return detail['url']
+
+    def get_matches(self, video):
+        matches = guess_matches(video, guessit(self.video_name))
+        return matches
+
+
+class AssrtProvider(Provider):
+    """Assrt Provider."""
+    languages = {Language(*l) for l in supported_languages}
+
+    def __init__(self, token=None):
+        if not token:
+            raise ConfigurationError('Token must be specified')
+        self.token = token
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")}
+
+    def terminate(self):
+        self.session.close()
+
+    def query(self, languages, video):
+        # query the server
+        keywords = []
+        if isinstance(video, Movie):
+            if video.title:
+                keywords.append(video.title)
+            if video.year:
+                keywords.append(str(video.year))
+        elif isinstance(video, Episode):
+            if video.series:
+                keywords.append(video.series)
+            if video.season and video.episode:
+                keywords.append('S%02dE%02d' % (video.season, video.episode))
+            elif video.episode:
+                keywords.append('E%02d' % video.episode)
+        query = ' '.join(keywords)
+
+        params = {'token': self.token, 'q': query, 'is_file': 1}
+        logger.debug('Searching subtitles %r', params)
+        res = self.session.get(server_url + '/sub/search', params=params, timeout=10)
+        res.raise_for_status()
+        result = res.json()
+
+        if result['status'] != 0:
+            logger.error('status error: %r', r)
+            return []
+
+        if not result['sub']['subs']:
+            logger.debug('No subtitle found')
+
+        # parse the subtitles
+        pattern = re.compile(ur'lang(?P<code>\w+)')
+        subtitles = []
+        for sub in result['sub']['subs']:
+            if 'lang' not in sub:
+                continue
+            for key in sub['lang']['langlist'].keys():
+                match = pattern.match(key)
+                try:
+                    language = Language.fromassrt(match.group('code'))
+                    if language in languages:
+                        subtitles.append(AssrtSubtitle(language, sub['id'], sub['videoname'], self.session, self.token))
+                except:
+                    pass
+
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        return self.query(languages, video)
+
+    def download_subtitle(self, subtitle):
+        logger.info('Downloading subtitle %r', subtitle)
+        r = self.session.get(subtitle.download_link, timeout=10)
+        r.raise_for_status()
+
+        subtitle.content = fix_line_ending(r.content)
diff --git a/libs/subliminal_patch/providers/hosszupuska.py b/libs/subliminal_patch/providers/hosszupuska.py
new file mode 100644
index 000000000..2552f1b78
--- /dev/null
+++ b/libs/subliminal_patch/providers/hosszupuska.py
@@ -0,0 +1,246 @@
+# coding: utf-8
+
+import io
+import six
+import logging
+import re
+import os
+import time
+
+from babelfish import language_converters
+from subzero.language import Language
+from requests import Session
+
+from subliminal_patch.providers import Provider
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subliminal.providers import ParserBeautifulSoup
+from subliminal_patch.exceptions import ProviderError
+from subliminal.score import get_equivalent_release_groups
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal.utils import sanitize, sanitize_release_group
+from subliminal.video import Episode
+from zipfile import ZipFile, is_zipfile
+from rarfile import RarFile, is_rarfile
+from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming
+from guessit import guessit
+
+
+def fix_inconsistent_naming(title):
+    """Fix titles with inconsistent naming using dictionary and sanitize them.
+
+    :param str title: original title.
+    :return: new title.
+    :rtype: str
+
+    """
+    return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow",
+                                            "Marvel's Jessica Jones": "Jessica Jones"})
+
+
+logger = logging.getLogger(__name__)
+
+language_converters.register('hosszupuska = subliminal_patch.converters.hosszupuska:HosszupuskaConverter')
+
+
+class HosszupuskaSubtitle(Subtitle):
+    """Hosszupuska Subtitle."""
+    provider_name = 'hosszupuska'
+
+    def __str__(self):
+        subtit = "Subtitle id: " + str(self.subtitle_id) \
+               + " Series: " + self.series \
+               + " Season: " + str(self.season) \
+               + " Episode: " + str(self.episode) \
+               + " Releases: " + str(self.releases)
+        if self.year:
+            subtit = subtit + " Year: " + str(self.year)
+        if six.PY3:
+            return subtit
+        return subtit.encode('utf-8')
+
+    def __init__(self, language, page_link, subtitle_id, series, season, episode, version,
+                 releases, year, asked_for_release_group=None, asked_for_episode=None):
+        super(HosszupuskaSubtitle, self).__init__(language, page_link=page_link)
+        self.subtitle_id = subtitle_id
+        self.series = series
+        self.season = season
+        self.episode = episode
+        self.version = version
+        self.releases = releases
+        self.year = year
+        if year:
+            self.year = int(year)
+
+        self.release_info = u", ".join(releases)
+        self.page_link = page_link
+        self.asked_for_release_group = asked_for_release_group
+        self.asked_for_episode = asked_for_episode
+
+    def __repr__(self):
+        ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else ""
+        return '<%s %r [%s]>' % (
+            self.__class__.__name__, u"%s%s%s [%s]" % (self.series, " (%s)" % self.year if self.year else "", ep_addon,
+                                                       self.release_info), self.language)
+
+    @property
+    def id(self):
+        return str(self.subtitle_id)
+
+    def get_matches(self, video):
+        matches = set()
+        # series
+        if video.series and sanitize(self.series) == sanitize(video.series):
+            matches.add('series')
+        # season
+        if video.season and self.season == video.season:
+            matches.add('season')
+        # episode
+        if video.episode and self.episode == video.episode:
+            matches.add('episode')
+        # year
+        if ('series' in matches and video.original_series and self.year is None or
+           video.year and video.year == self.year):
+            matches.add('year')
+
+        # release_group
+        if (video.release_group and self.version and
+                any(r in sanitize_release_group(self.version)
+                    for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))):
+            matches.add('release_group')
+        # resolution
+        if video.resolution and self.version and video.resolution in self.version.lower():
+            matches.add('resolution')
+        # format
+        if video.format and self.version and video.format.lower() in self.version.lower():
+            matches.add('format')
+        # other properties
+        matches |= guess_matches(video, guessit(self.release_info.encode("utf-8")))
+
+        return matches
+
+
+class HosszupuskaProvider(Provider, ProviderSubtitleArchiveMixin):
+    """Hosszupuska Provider."""
+    languages = {Language('hun', 'HU')} | {Language(l) for l in [
+        'hun', 'eng'
+    ]}
+    video_types = (Episode,)
+    server_url = 'http://hosszupuskasub.com/'
+    subtitle_class = HosszupuskaSubtitle
+    hearing_impaired_verifiable = False
+    multi_result_throttle = 2  # seconds
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")}
+
+    def terminate(self):
+        self.session.close()
+
+    def get_language(self, text):
+        if text == '1.gif':
+            return Language.fromhosszupuska('hu')
+        if text == '2.gif':
+            return Language.fromhosszupuska('en')
+        return None
+
+    def query(self, series, season, episode, year=None, video=None):
+
+        # Search for s01e03 instead of s1e3
+        seasona = "%02d" % season
+        episodea = "%02d" % episode
+        series = fix_inconsistent_naming(series)
+        seriesa = series.replace(' ', '+').replace('\'', '')
+
+        # get the episode page
+        logger.info('Getting the page for episode %s', episode)
+        url = self.server_url + "sorozatok.php?cim=" + seriesa + "&evad="+str(seasona) + \
+            "&resz="+str(episodea)+"&nyelvtipus=%25&x=24&y=8"
+        logger.info('Url %s', url)
+
+        r = self.session.get(url, timeout=10).content
+
+        i = 0
+        soup = ParserBeautifulSoup(r, ['lxml'])
+
+        table = soup.find_all("table")[9]
+
+        subtitles = []
+        # loop over subtitles rows
+        for row in table.find_all("tr"):
+            i = i + 1
+            if "this.style.backgroundImage='url(css/over2.jpg)" in str(row) and i > 5:
+                datas = row.find_all("td")
+
+                # Currently subliminal not use these params, but maybe later will come in handy
+                # hunagrian_name = re.split('s(\d{1,2})', datas[1].find_all('b')[0].getText())[0]
+                # Translator of subtitle
+                # sub_translator = datas[3].getText()
+                # Posting date of subtitle
+                # sub_date = datas[4].getText()
+
+                sub_year = sub_english_name = sub_version = None
+                # Handle the case when '(' in subtitle
+                if datas[1].getText().count('(') == 1:
+                    sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText())[3]
+                if datas[1].getText().count('(') == 2:
+                    sub_year = re.findall(r"(?<=\()(\d{4})(?=\))", datas[1].getText().strip())[0]
+                    sub_english_name = re.split('s(\d{1,2})e(\d{1,2})', datas[1].getText().split('(')[0])[0]
+
+                if not sub_english_name:
+                    continue
+
+                sub_season = int((re.findall('s(\d{1,2})', datas[1].find_all('b')[0].getText(), re.VERBOSE)[0])
+                                 .lstrip('0'))
+                sub_episode = int((re.findall('e(\d{1,2})', datas[1].find_all('b')[0].getText(), re.VERBOSE)[0])
+                                  .lstrip('0'))
+
+                if sub_season == season and sub_episode == episode:
+                    sub_language = self.get_language(datas[2].find_all('img')[0]['src'].split('/')[1])
+                    sub_downloadlink = datas[6].find_all('a')[1]['href']
+                    sub_id = sub_downloadlink.split('=')[1].split('.')[0]
+
+                    if datas[1].getText().count('(') == 1:
+                        sub_version = datas[1].getText().split('(')[1].split(')')[0]
+                    if datas[1].getText().count('(') == 2:
+                        sub_version = datas[1].getText().split('(')[2].split(')')[0]
+
+                    # One subtitle can be used for several releases
+                    sub_releases = [s.strip() for s in sub_version.split(',')]
+                    subtitle = self.subtitle_class(sub_language, sub_downloadlink, sub_id, sub_english_name.strip(),
+                                                   sub_season, sub_episode, sub_version, sub_releases, sub_year,
+                                                   asked_for_release_group=video.release_group,
+                                                   asked_for_episode=episode)
+
+                    logger.debug('Found subtitle: %r', subtitle)
+                    subtitles.append(subtitle)
+
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        titles = [video.series] + video.alternative_series
+
+        for title in titles:
+            subs = self.query(title, video.season, video.episode, video.year, video=video)
+            if subs:
+                return subs
+
+            time.sleep(self.multi_result_throttle)
+            return []
+
+    def download_subtitle(self, subtitle):
+        r = self.session.get(subtitle.page_link, timeout=10)
+        r.raise_for_status()
+
+        # open the archive
+        archive_stream = io.BytesIO(r.content)
+        if is_rarfile(archive_stream):
+            logger.debug('Archive identified as rar')
+            archive = RarFile(archive_stream)
+        elif is_zipfile(archive_stream):
+            logger.debug('Archive identified as zip')
+            archive = ZipFile(archive_stream)
+        else:
+            raise ProviderError('Unidentified archive type')
+
+        subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
diff --git a/libs/subliminal_patch/providers/legendastv.py b/libs/subliminal_patch/providers/legendastv.py
new file mode 100644
index 000000000..cffde9064
--- /dev/null
+++ b/libs/subliminal_patch/providers/legendastv.py
@@ -0,0 +1,260 @@
+# coding=utf-8
+import logging
+import rarfile
+import os
+from subliminal.exceptions import ConfigurationError
+
+from subliminal.providers.legendastv import LegendasTVSubtitle as _LegendasTVSubtitle, \
+    LegendasTVProvider as _LegendasTVProvider, Episode, Movie, guess_matches, guessit, sanitize, region, type_map, \
+    raise_for_status, json, SHOW_EXPIRATION_TIME, title_re, season_re, datetime, pytz, NO_VALUE, releases_key, \
+    SUBTITLE_EXTENSIONS
+
+logger = logging.getLogger(__name__)
+
+
+class LegendasTVSubtitle(_LegendasTVSubtitle):
+    def __init__(self, language, type, title, year, imdb_id, season, archive, name):
+        super(LegendasTVSubtitle, self).__init__(language, type, title, year, imdb_id, season, archive, name)
+        self.archive.content = None
+        self.release_info = archive.name
+        self.page_link = archive.link
+
+    def make_picklable(self):
+        self.archive.content = None
+        return self
+
+    def get_matches(self, video, hearing_impaired=False):
+        matches = set()
+
+        # episode
+        if isinstance(video, Episode) and self.type == 'episode':
+            # series
+            if video.series and (sanitize(self.title) in (
+                    sanitize(name) for name in [video.series] + video.alternative_series)):
+                matches.add('series')
+
+            # year
+            if video.original_series and self.year is None or video.year and video.year == self.year:
+                matches.add('year')
+
+            # imdb_id
+            if video.series_imdb_id and self.imdb_id == video.series_imdb_id:
+                matches.add('series_imdb_id')
+
+        # movie
+        elif isinstance(video, Movie) and self.type == 'movie':
+            # title
+            if video.title and (sanitize(self.title) in (
+                    sanitize(name) for name in [video.title] + video.alternative_titles)):
+                matches.add('title')
+
+            # year
+            if video.year and self.year == video.year:
+                matches.add('year')
+
+            # imdb_id
+            if video.imdb_id and self.imdb_id == video.imdb_id:
+                matches.add('imdb_id')
+
+        # name
+        matches |= guess_matches(video, guessit(self.name, {'type': self.type, 'single_value': True}))
+
+        return matches
+
+
+class LegendasTVProvider(_LegendasTVProvider):
+    subtitle_class = LegendasTVSubtitle
+
+    def __init__(self, username=None, password=None):
+
+        # Provider needs UNRAR installed. If not available raise ConfigurationError
+        try:
+            rarfile.custom_check([rarfile.UNRAR_TOOL], True)
+        except rarfile.RarExecError:
+            raise ConfigurationError('UNRAR tool not available')
+
+        if any((username, password)) and not all((username, password)):
+            raise ConfigurationError('Username and password must be specified')
+
+        self.username = username
+        self.password = password
+        self.logged_in = False
+        self.session = None
+
+    @staticmethod
+    def is_valid_title(title, title_id, sanitized_title, season, year, imdb_id):
+        """Check if is a valid title."""
+        if title["imdb_id"] and title["imdb_id"] == imdb_id:
+            logger.debug(u'Matched title "%s" as IMDB ID %s', sanitized_title, title["imdb_id"])
+            return True
+
+        if title["title2"] and sanitize(title['title2']) == sanitized_title:
+            logger.debug(u'Matched title "%s" as "%s"', sanitized_title, title["title2"])
+            return True
+
+        return _LegendasTVProvider.is_valid_title(title, title_id, sanitized_title, season, year)
+
+    @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME, should_cache_fn=lambda value: value)
+    def search_titles(self, title, season, title_year, imdb_id):
+        """Search for titles matching the `title`.
+
+        For episodes, each season has it own title
+        :param str title: the title to search for.
+        :param int season: season of the title
+        :param int title_year: year of the title
+        :return: found titles.
+        :rtype: dict
+        """
+        titles = {}
+        sanitized_titles = [sanitize(title)]
+        ignore_characters = {'\'', '.'}
+        if any(c in title for c in ignore_characters):
+            sanitized_titles.append(sanitize(title, ignore_characters=ignore_characters))
+
+        for sanitized_title in sanitized_titles:
+            # make the query
+            if season:
+                logger.info('Searching episode title %r for season %r', sanitized_title, season)
+            else:
+                logger.info('Searching movie title %r', sanitized_title)
+
+            r = self.session.get(self.server_url + 'legenda/sugestao/{}'.format(sanitized_title), timeout=10)
+            raise_for_status(r)
+            results = json.loads(r.text)
+
+            # loop over results
+            for result in results:
+                source = result['_source']
+
+                # extract id
+                title_id = int(source['id_filme'])
+
+                # extract type
+                title = {'type': type_map[source['tipo']], 'title2': None, 'imdb_id': None}
+
+                # extract title, year and country
+                name, year, country = title_re.match(source['dsc_nome']).groups()
+                title['title'] = name
+
+                if "dsc_nome_br" in source:
+                    name2, ommit1, ommit2 = title_re.match(source['dsc_nome_br']).groups()
+                    title['title2'] = name2
+
+                # extract imdb_id
+                if source['id_imdb'] != '0':
+                    if not source['id_imdb'].startswith('tt'):
+                        title['imdb_id'] = 'tt' + source['id_imdb'].zfill(7)
+                    else:
+                        title['imdb_id'] = source['id_imdb']
+
+                # extract season
+                if title['type'] == 'episode':
+                    if source['temporada'] and source['temporada'].isdigit():
+                        title['season'] = int(source['temporada'])
+                    else:
+                        match = season_re.search(source['dsc_nome_br'])
+                        if match:
+                            title['season'] = int(match.group('season'))
+                        else:
+                            logger.debug('No season detected for title %d (%s)', title_id, name)
+
+                # extract year
+                if year:
+                    title['year'] = int(year)
+                elif source['dsc_data_lancamento'] and source['dsc_data_lancamento'].isdigit():
+                    # year is based on season air date hence the adjustment
+                    title['year'] = int(source['dsc_data_lancamento']) - title.get('season', 1) + 1
+
+                # add title only if is valid
+                # Check against title without ignored chars
+                if self.is_valid_title(title, title_id, sanitized_titles[0], season, title_year, imdb_id):
+                    logger.debug(u'Found title: %s', title)
+                    titles[title_id] = title
+
+            logger.debug('Found %d titles', len(titles))
+
+        return titles
+
+    def query(self, language, title, season=None, episode=None, year=None, imdb_id=None):
+        # search for titles
+        titles = self.search_titles(title, season, year, imdb_id)
+
+        subtitles = []
+        # iterate over titles
+        for title_id, t in titles.items():
+
+            logger.info('Getting archives for title %d and language %d', title_id, language.legendastv)
+            archives = self.get_archives(title_id, language.legendastv, t['type'], season, episode)
+            if not archives:
+                logger.info('No archives found for title %d and language %d', title_id, language.legendastv)
+
+            # iterate over title's archives
+            for a in archives:
+
+                # compute an expiration time based on the archive timestamp
+                expiration_time = (datetime.utcnow().replace(tzinfo=pytz.utc) - a.timestamp).total_seconds()
+
+                # attempt to get the releases from the cache
+                cache_key = releases_key.format(archive_id=a.id, archive_name=a.name)
+                releases = region.get(cache_key, expiration_time=expiration_time)
+
+                # the releases are not in cache or cache is expired
+                if releases == NO_VALUE:
+                    logger.info('Releases not found in cache')
+
+                    # download archive
+                    self.download_archive(a)
+
+                    # extract the releases
+                    releases = []
+                    for name in a.content.namelist():
+                        # discard the legendastv file
+                        if name.startswith('Legendas.tv'):
+                            continue
+
+                        # discard hidden files
+                        if os.path.split(name)[-1].startswith('.'):
+                            continue
+
+                        # discard non-subtitle files
+                        if not name.lower().endswith(SUBTITLE_EXTENSIONS):
+                            continue
+
+                        releases.append(name)
+
+                    # cache the releases
+                    region.set(cache_key, releases)
+
+                # iterate over releases
+                for r in releases:
+                    subtitle = self.subtitle_class(language, t['type'], t['title'], t.get('year'), t.get('imdb_id'),
+                                                   t.get('season'), a, r)
+                    logger.debug('Found subtitle %r', subtitle)
+                    subtitles.append(subtitle)
+
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        season = episode = None
+        if isinstance(video, Episode):
+            titles = [video.series] + video.alternative_series
+            season = video.season
+            episode = video.episode
+        else:
+            titles = [video.title] + video.alternative_titles
+
+        for title in titles:
+            subtitles = [s for l in languages for s in
+                         self.query(l, title, season=season, episode=episode, year=video.year, imdb_id=video.imdb_id)]
+            if subtitles:
+                return subtitles
+
+        return []
+
+    def download_subtitle(self, subtitle):
+        super(LegendasTVProvider, self).download_subtitle(subtitle)
+        subtitle.archive.content = None
+
+    def get_archives(self, title_id, language_code, title_type, season, episode):
+        return super(LegendasTVProvider, self).get_archives.original(self, title_id, language_code, title_type,
+                                                                     season, episode)
diff --git a/libs/subliminal_patch/providers/mixins.py b/libs/subliminal_patch/providers/mixins.py
new file mode 100644
index 000000000..8e1f06fd4
--- /dev/null
+++ b/libs/subliminal_patch/providers/mixins.py
@@ -0,0 +1,168 @@
+# coding=utf-8
+
+import re
+import time
+import logging
+import traceback
+import types
+import os
+from httplib import ResponseNotReady
+
+from guessit import guessit
+from subliminal import ProviderError
+from subliminal.exceptions import ServiceUnavailable, DownloadLimitExceeded
+from subliminal.providers.opensubtitles import Unauthorized
+from subliminal.subtitle import fix_line_ending
+from subliminal_patch.exceptions import TooManyRequests
+
+logger = logging.getLogger(__name__)
+
+
+clean_whitespace_re = re.compile(r'\s+')
+
+
+class PunctuationMixin(object):
+    """
+    provider mixin
+
+    fixes show ids for stuff like "Mr. Petterson", as our matcher already sees it as "Mr Petterson" but addic7ed doesn't
+    """
+
+    def clean_punctuation(self, s):
+        return s.replace(".", "").replace(":", "").replace("'", "").replace("&", "").replace("-", "")
+
+    def clean_whitespace(self, s):
+        return clean_whitespace_re.sub("", s)
+
+    def full_clean(self, s):
+        return self.clean_whitespace(self.clean_punctuation(s))
+
+
+class ProviderRetryMixin(object):
+    def retry(self, f, amount=2, exc=Exception, retry_timeout=10):
+        i = 0
+        while i <= amount:
+            try:
+                return f()
+            except (Unauthorized, ServiceUnavailable, TooManyRequests, DownloadLimitExceeded, ResponseNotReady):
+                raise
+            except exc:
+                formatted_exc = traceback.format_exc()
+                i += 1
+                if i == amount:
+                    raise
+
+            logger.debug(u"Retrying %s, try: %i/%i, exception: %s" % (self.__class__.__name__, i, amount, formatted_exc))
+            time.sleep(retry_timeout)
+
+
+class ProviderSubtitleArchiveMixin(object):
+    """
+    handles ZipFile and RarFile archives
+    needs subtitle.episode, subtitle.season, subtitle.matches, subtitle.releases and subtitle.asked_for_episode to work
+    """
+    def get_subtitle_from_archive(self, subtitle, archive):
+        # extract subtitle's content
+        subs_in_archive = []
+        for name in archive.namelist():
+            for ext in (".srt", ".sub", ".ssa", ".ass"):
+                if name.endswith(ext):
+                    subs_in_archive.append(name)
+
+        # select the correct subtitle file
+        matching_sub = None
+        subs_unsure = []
+        subs_fallback = []
+        if len(subs_in_archive) == 1:
+            matching_sub = subs_in_archive[0]
+        else:
+            for sub_name in subs_in_archive:
+                guess = guessit(sub_name)
+                sub_name_lower = sub_name.lower()
+
+                # consider subtitle valid if:
+                # - episode and season match
+                # - format matches (if it was matched before)
+                # - release group matches (and we asked for one and it was matched, or it was not matched)
+                # - not asked for forced and "forced" not in filename
+                is_episode = subtitle.asked_for_episode
+
+                if not subtitle.language.forced:
+                    base, ext = os.path.splitext(sub_name_lower)
+                    if base.endswith("forced") or "forced" in guess.get("release_group", ""):
+                        continue
+
+                episodes = guess.get("episode")
+                if is_episode and episodes and not isinstance(episodes, list):
+                    episodes = [episodes]
+
+                if not is_episode or (
+                        (
+                                subtitle.episode in episodes
+                                or (subtitle.is_pack and subtitle.asked_for_episode in episodes)
+                        ) and guess.get("season") == subtitle.season):
+
+                    format_matches = True
+                    wanted_format_but_not_found = False
+
+                    if "format" in subtitle.matches:
+                        format_matches = False
+                        if isinstance(subtitle.releases, types.ListType):
+                            releases = ",".join(subtitle.releases).lower()
+                        else:
+                            releases = subtitle.releases.lower()
+
+                        if "format" not in guess:
+                            wanted_format_but_not_found = True
+
+                        else:
+                            formats = guess["format"]
+                            if not isinstance(formats, types.ListType):
+                                formats = [formats]
+
+                            for f in formats:
+                                format_matches = f.lower() in releases
+                                if format_matches:
+                                    break
+
+                    release_group_matches = True
+                    if subtitle.is_pack or (subtitle.asked_for_release_group and
+                                            ("release_group" in subtitle.matches or
+                                             "hash" in subtitle.matches)):
+
+                        if subtitle.asked_for_release_group:
+                            asked_for_rlsgrp = subtitle.asked_for_release_group.lower()
+
+                            if asked_for_rlsgrp:
+                                release_group_matches = False
+                                if asked_for_rlsgrp in sub_name_lower:
+                                    release_group_matches = True
+
+                    if release_group_matches and format_matches:
+                        matching_sub = sub_name
+                        break
+
+                    elif release_group_matches and wanted_format_but_not_found:
+                        subs_unsure.append(sub_name)
+                    else:
+                        subs_fallback.append(sub_name)
+
+        if not matching_sub and not subs_unsure and not subs_fallback:
+            raise ProviderError("None of expected subtitle found in archive")
+
+        elif subs_unsure:
+            matching_sub = subs_unsure[0]
+
+        elif subs_fallback:
+            matching_sub = subs_fallback[0]
+
+        try:
+            matching_sub_unicode = matching_sub.decode("utf-8")
+        except UnicodeDecodeError:
+            try:
+                matching_sub_unicode = matching_sub.decode("cp437")
+            except UnicodeDecodeError:
+                matching_sub_unicode = matching_sub.decode("utf-8", errors='replace')
+
+        logger.info(u"Using %s from the archive", matching_sub_unicode)
+        return fix_line_ending(archive.read(matching_sub))
diff --git a/libs/subliminal_patch/providers/napiprojekt.py b/libs/subliminal_patch/providers/napiprojekt.py
new file mode 100644
index 000000000..e4fefae46
--- /dev/null
+++ b/libs/subliminal_patch/providers/napiprojekt.py
@@ -0,0 +1,50 @@
+# coding=utf-8
+import logging
+
+from subliminal.providers.napiprojekt import NapiProjektProvider as _NapiProjektProvider, \
+    NapiProjektSubtitle as _NapiProjektSubtitle, get_subhash
+
+logger = logging.getLogger(__name__)
+
+
+class NapiProjektSubtitle(_NapiProjektSubtitle):
+    def __init__(self, language, hash):
+        super(NapiProjektSubtitle, self).__init__(language, hash)
+        self.release_info = hash
+
+    def __repr__(self):
+        return '<%s %r [%s]>' % (
+            self.__class__.__name__, self.release_info, self.language)
+
+
+class NapiProjektProvider(_NapiProjektProvider):
+    subtitle_class = NapiProjektSubtitle
+
+    def query(self, language, hash):
+        params = {
+            'v': 'dreambox',
+            'kolejka': 'false',
+            'nick': '',
+            'pass': '',
+            'napios': 'Linux',
+            'l': language.alpha2.upper(),
+            'f': hash,
+            't': get_subhash(hash)}
+        logger.info('Searching subtitle %r', params)
+        r = self.session.get(self.server_url, params=params, timeout=10)
+        r.raise_for_status()
+
+        # handle subtitles not found and errors
+        if r.content[:4] == b'NPc0':
+            logger.debug('No subtitles found')
+            return None
+
+        subtitle = self.subtitle_class(language, hash)
+        subtitle.content = r.content
+        logger.debug('Found subtitle %r', subtitle)
+
+        return subtitle
+
+    def list_subtitles(self, video, languages):
+        return [s for s in [self.query(l, video.hashes['napiprojekt']) for l in languages] if s is not None]
+
diff --git a/libs/subliminal_patch/providers/opensubtitles.py b/libs/subliminal_patch/providers/opensubtitles.py
new file mode 100644
index 000000000..23e82c833
--- /dev/null
+++ b/libs/subliminal_patch/providers/opensubtitles.py
@@ -0,0 +1,374 @@
+# coding=utf-8
+import base64
+import logging
+import os
+import traceback
+import zlib
+import time
+import requests
+
+from babelfish import language_converters
+from dogpile.cache.api import NO_VALUE
+from subliminal.exceptions import ConfigurationError, ServiceUnavailable
+from subliminal.providers.opensubtitles import OpenSubtitlesProvider as _OpenSubtitlesProvider,\
+    OpenSubtitlesSubtitle as _OpenSubtitlesSubtitle, Episode, ServerProxy, Unauthorized, NoSession, \
+    DownloadLimitReached, InvalidImdbid, UnknownUserAgent, DisabledUserAgent, OpenSubtitlesError
+from mixins import ProviderRetryMixin
+from subliminal.subtitle import fix_line_ending
+from subliminal_patch.http import SubZeroRequestsTransport
+from subliminal.cache import region
+from subliminal_patch.score import framerate_equal
+from subzero.language import Language
+
+from ..exceptions import TooManyRequests, APIThrottled
+
+logger = logging.getLogger(__name__)
+
+
+class OpenSubtitlesSubtitle(_OpenSubtitlesSubtitle):
+    hash_verifiable = True
+    hearing_impaired_verifiable = True
+
+    def __init__(self, language, hearing_impaired, page_link, subtitle_id, matched_by, movie_kind, hash, movie_name,
+                 movie_release_name, movie_year, movie_imdb_id, series_season, series_episode, query_parameters,
+                 filename, encoding, fps, skip_wrong_fps=True):
+        super(OpenSubtitlesSubtitle, self).__init__(language, hearing_impaired, page_link, subtitle_id,
+                                                    matched_by, movie_kind, hash,
+                                                    movie_name, movie_release_name, movie_year, movie_imdb_id,
+                                                    series_season, series_episode, filename, encoding)
+        self.query_parameters = query_parameters or {}
+        self.fps = fps
+        self.release_info = movie_release_name
+        self.wrong_fps = False
+        self.skip_wrong_fps = skip_wrong_fps
+
+    def get_matches(self, video, hearing_impaired=False):
+        matches = super(OpenSubtitlesSubtitle, self).get_matches(video)
+
+        sub_fps = None
+        try:
+            sub_fps = float(self.fps)
+        except ValueError:
+            pass
+
+        # video has fps info, sub also, and sub's fps is greater than 0
+        if video.fps and sub_fps and not framerate_equal(video.fps, self.fps):
+            self.wrong_fps = True
+
+            if self.skip_wrong_fps:
+                logger.debug("Wrong FPS (expected: %s, got: %s, lowering score massively)", video.fps, self.fps)
+                # fixme: may be too harsh
+                return set()
+            else:
+                logger.debug("Wrong FPS (expected: %s, got: %s, continuing)", video.fps, self.fps)
+
+        # matched by tag?
+        if self.matched_by == "tag":
+            # treat a tag match equally to a hash match
+            logger.debug("Subtitle matched by tag, treating it as a hash-match. Tag: '%s'",
+                         self.query_parameters.get("tag", None))
+            matches.add("hash")
+
+        return matches
+
+
+class OpenSubtitlesProvider(ProviderRetryMixin, _OpenSubtitlesProvider):
+    only_foreign = False
+    also_foreign = False
+    subtitle_class = OpenSubtitlesSubtitle
+    hash_verifiable = True
+    hearing_impaired_verifiable = True
+    skip_wrong_fps = True
+    is_vip = False
+    use_ssl = True
+    timeout = 15
+
+    default_url = "//api.opensubtitles.org/xml-rpc"
+    vip_url = "//vip-api.opensubtitles.org/xml-rpc"
+
+    languages = {Language.fromopensubtitles(l) for l in language_converters['szopensubtitles'].codes}
+    languages.update(set(Language.rebuild(l, forced=True) for l in languages))
+
+    def __init__(self, username=None, password=None, use_tag_search=False, only_foreign=False, also_foreign=False,
+                 skip_wrong_fps=True, is_vip=False, use_ssl=True, timeout=15):
+        if any((username, password)) and not all((username, password)):
+            raise ConfigurationError('Username and password must be specified')
+
+        self.username = username or ''
+        self.password = password or ''
+        self.use_tag_search = use_tag_search
+        self.only_foreign = only_foreign
+        self.also_foreign = also_foreign
+        self.skip_wrong_fps = skip_wrong_fps
+        self.token = None
+        self.is_vip = is_vip
+        self.use_ssl = use_ssl
+        self.timeout = timeout
+
+        logger.debug("Using timeout: %d", timeout)
+
+        if use_ssl:
+            logger.debug("Using HTTPS connection")
+
+        self.default_url = ("https:" if use_ssl else "http:") + self.default_url
+        self.vip_url = ("https:" if use_ssl else "http:") + self.vip_url
+
+        if use_tag_search:
+            logger.info("Using tag/exact filename search")
+
+        if only_foreign:
+            logger.info("Only searching for foreign/forced subtitles")
+
+    def get_server_proxy(self, url, timeout=None):
+        return ServerProxy(url, SubZeroRequestsTransport(use_https=self.use_ssl, timeout=timeout or self.timeout,
+                                                         user_agent=os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")))
+
+    def log_in(self, server_url=None):
+        if server_url:
+            self.terminate()
+
+            self.server = self.get_server_proxy(server_url)
+
+        response = self.retry(
+            lambda: checked(
+                lambda: self.server.LogIn(self.username, self.password, 'eng',
+                                          os.environ.get("SZ_USER_AGENT", "Sub-Zero/2"))
+            )
+        )
+
+        self.token = response['token']
+        logger.debug('Logged in with token %r', self.token[:10]+"X"*(len(self.token)-10))
+
+        region.set("os_token", self.token)
+
+    def use_token_or_login(self, func):
+        if not self.token:
+            self.log_in()
+            return func()
+        try:
+            return func()
+        except Unauthorized:
+            self.log_in()
+            return func()
+
+    def initialize(self):
+        if self.is_vip:
+            self.server = self.get_server_proxy(self.vip_url)
+            logger.info("Using VIP server")
+        else:
+            self.server = self.get_server_proxy(self.default_url)
+
+        logger.info('Logging in')
+
+        token = region.get("os_token", expiration_time=3600)
+        if token is not NO_VALUE:
+            try:
+                logger.debug('Trying previous token')
+                checked(lambda: self.server.NoOperation(token))
+                self.token = token
+                logger.debug("Using previous login token: %s", self.token)
+                return
+            except:
+                pass
+
+        try:
+            self.log_in()
+
+        except Unauthorized:
+            if self.is_vip:
+                logger.info("VIP server login failed, falling back")
+                self.log_in(self.default_url)
+                if self.token:
+                    return
+
+            logger.error("Login failed, please check your credentials")
+                
+    def terminate(self):
+        if self.token:
+            try:
+                checked(lambda: self.server.LogOut(self.token))
+            except:
+                logger.error("Logout failed: %s", traceback.format_exc())
+
+        self.server = None
+        self.token = None
+
+    def list_subtitles(self, video, languages):
+        """
+        :param video:
+        :param languages:
+        :return:
+
+         patch: query movies even if hash is known; add tag parameter
+        """
+
+        season = episode = None
+        if isinstance(video, Episode):
+            query = video.series
+            season = video.season
+            episode = episode = min(video.episode) if isinstance(video.episode, list) else video.episode
+
+            if video.is_special:
+                season = None
+                episode = None
+                query = u"%s %s" % (video.series, video.title)
+                logger.info("%s: Searching for special: %r", self.__class__, query)
+        # elif ('opensubtitles' not in video.hashes or not video.size) and not video.imdb_id:
+        #    query = video.name.split(os.sep)[-1]
+        else:
+            query = video.title
+
+        return self.query(languages, hash=video.hashes.get('opensubtitles'), size=video.size, imdb_id=video.imdb_id,
+                          query=query, season=season, episode=episode, tag=video.original_name,
+                          use_tag_search=self.use_tag_search, only_foreign=self.only_foreign,
+                          also_foreign=self.also_foreign)
+
+    def query(self, languages, hash=None, size=None, imdb_id=None, query=None, season=None, episode=None, tag=None,
+              use_tag_search=False, only_foreign=False, also_foreign=False):
+        # fill the search criteria
+        criteria = []
+        if hash and size:
+            criteria.append({'moviehash': hash, 'moviebytesize': str(size)})
+        if use_tag_search and tag:
+            criteria.append({'tag': tag})
+        if imdb_id:
+            if season and episode:
+                criteria.append({'imdbid': imdb_id[2:], 'season': season, 'episode': episode})
+            else:
+                criteria.append({'imdbid': imdb_id[2:]})
+        if query and season and episode:
+            criteria.append({'query': query.replace('\'', ''), 'season': season, 'episode': episode})
+        elif query:
+            criteria.append({'query': query.replace('\'', '')})
+        if not criteria:
+            raise ValueError('Not enough information')
+
+        # add the language
+        for criterion in criteria:
+            criterion['sublanguageid'] = ','.join(sorted(l.opensubtitles for l in languages))
+
+        # query the server
+        logger.info('Searching subtitles %r', criteria)
+        response = self.use_token_or_login(
+            lambda: self.retry(lambda: checked(lambda: self.server.SearchSubtitles(self.token, criteria)))
+        )
+
+        subtitles = []
+
+        # exit if no data
+        if not response['data']:
+            logger.info('No subtitles found')
+            return subtitles
+
+        # loop over subtitle items
+        for subtitle_item in response['data']:
+            _subtitle_item = subtitle_item
+
+            # in case OS messes their API results up again, check whether we've got a dict or a string as subtitle_item
+            if hasattr(_subtitle_item, "startswith"):
+                _subtitle_item = response["data"][subtitle_item]
+
+            # read the item
+            language = Language.fromopensubtitles(_subtitle_item['SubLanguageID'])
+            hearing_impaired = bool(int(_subtitle_item['SubHearingImpaired']))
+            page_link = _subtitle_item['SubtitlesLink']
+            subtitle_id = int(_subtitle_item['IDSubtitleFile'])
+            matched_by = _subtitle_item['MatchedBy']
+            movie_kind = _subtitle_item['MovieKind']
+            hash = _subtitle_item['MovieHash']
+            movie_name = _subtitle_item['MovieName']
+            movie_release_name = _subtitle_item['MovieReleaseName']
+            movie_year = int(_subtitle_item['MovieYear']) if _subtitle_item['MovieYear'] else None
+            movie_imdb_id = 'tt' + _subtitle_item['IDMovieImdb']
+            movie_fps = _subtitle_item.get('MovieFPS')
+            series_season = int(_subtitle_item['SeriesSeason']) if _subtitle_item['SeriesSeason'] else None
+            series_episode = int(_subtitle_item['SeriesEpisode']) if _subtitle_item['SeriesEpisode'] else None
+            filename = _subtitle_item['SubFileName']
+            encoding = _subtitle_item.get('SubEncoding') or None
+            foreign_parts_only = bool(int(_subtitle_item.get('SubForeignPartsOnly', 0)))
+
+            # foreign/forced subtitles only wanted
+            if only_foreign and not foreign_parts_only:
+                continue
+
+            # foreign/forced not wanted
+            elif not only_foreign and not also_foreign and foreign_parts_only:
+                continue
+
+            # foreign/forced *also* wanted
+            elif also_foreign and foreign_parts_only:
+                language = Language.rebuild(language, forced=True)
+
+            query_parameters = _subtitle_item.get("QueryParameters")
+
+            subtitle = self.subtitle_class(language, hearing_impaired, page_link, subtitle_id, matched_by,
+                                           movie_kind,
+                                           hash, movie_name, movie_release_name, movie_year, movie_imdb_id,
+                                           series_season, series_episode, query_parameters, filename, encoding,
+                                           movie_fps, skip_wrong_fps=self.skip_wrong_fps)
+            logger.debug('Found subtitle %r by %s', subtitle, matched_by)
+            subtitles.append(subtitle)
+
+        return subtitles
+
+    def download_subtitle(self, subtitle):
+        logger.info('Downloading subtitle %r', subtitle)
+        response = self.use_token_or_login(
+            lambda: checked(
+                lambda: self.server.DownloadSubtitles(self.token, [str(subtitle.subtitle_id)])
+            )
+        )
+        subtitle.content = fix_line_ending(zlib.decompress(base64.b64decode(response['data'][0]['data']), 47))
+
+
+def checked(fn, raise_api_limit=False):
+    """Run :fn: and check the response status before returning it.
+
+    :param fn: the function to make an XMLRPC call to OpenSubtitles.
+    :return: the response.
+    :raise: :class:`OpenSubtitlesError`
+
+    """
+    response = None
+    try:
+        try:
+            response = fn()
+        except APIThrottled:
+            if not raise_api_limit:
+                logger.info("API request limit hit, waiting and trying again once.")
+                time.sleep(12)
+                return checked(fn, raise_api_limit=True)
+            raise
+
+        except requests.RequestException as e:
+            status_code = e.response.status_code
+        else:
+            status_code = int(response['status'][:3])
+    except:
+        status_code = None
+
+    if status_code == 401:
+        raise Unauthorized
+    if status_code == 406:
+        raise NoSession
+    if status_code == 407:
+        raise DownloadLimitReached
+    if status_code == 413:
+        raise InvalidImdbid
+    if status_code == 414:
+        raise UnknownUserAgent
+    if status_code == 415:
+        raise DisabledUserAgent
+    if status_code == 429:
+        if not raise_api_limit:
+            raise TooManyRequests
+        else:
+            raise APIThrottled
+    if status_code == 503:
+        raise ServiceUnavailable(str(status_code))
+    if status_code != 200:
+        if response and "status" in response:
+            raise OpenSubtitlesError(response['status'])
+        raise ServiceUnavailable("Unknown Error, empty response: %s: %r" % (status_code, response))
+
+    return response
diff --git a/libs/subliminal_patch/providers/podnapisi.py b/libs/subliminal_patch/providers/podnapisi.py
new file mode 100644
index 000000000..128973ea7
--- /dev/null
+++ b/libs/subliminal_patch/providers/podnapisi.py
@@ -0,0 +1,233 @@
+# coding=utf-8
+
+import logging
+import re
+import io
+
+from zipfile import ZipFile
+from lxml.etree import XMLSyntaxError
+
+from guessit import guessit
+from subliminal.subtitle import guess_matches
+from subliminal.utils import sanitize
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+
+try:
+    from lxml import etree
+except ImportError:
+    try:
+        import xml.etree.cElementTree as etree
+    except ImportError:
+        import xml.etree.ElementTree as etree
+from babelfish import language_converters
+from subliminal import Episode
+from subliminal import Movie
+from subliminal.providers.podnapisi import PodnapisiProvider as _PodnapisiProvider, \
+    PodnapisiSubtitle as _PodnapisiSubtitle
+from subzero.language import Language
+
+logger = logging.getLogger(__name__)
+
+
+class PodnapisiSubtitle(_PodnapisiSubtitle):
+    provider_name = 'podnapisi'
+    hearing_impaired_verifiable = True
+
+    def __init__(self, language, hearing_impaired, page_link, pid, releases, title, season=None, episode=None,
+                 year=None, asked_for_release_group=None, asked_for_episode=None):
+        super(PodnapisiSubtitle, self).__init__(language, hearing_impaired, page_link, pid, releases, title,
+                                                season=season, episode=episode, year=year)
+        self.release_info = u", ".join(releases)
+        self.asked_for_release_group = asked_for_release_group
+        self.asked_for_episode = asked_for_episode
+        self.matches = None
+
+    def get_matches(self, video):
+        """
+        patch: set guessit to single_value
+        :param video:
+        :return:
+        """
+        matches = set()
+
+        # episode
+        if isinstance(video, Episode):
+            # series
+            if video.series and (sanitize(self.title) in (
+                    sanitize(name) for name in [video.series] + video.alternative_series)):
+                matches.add('series')
+            # year
+            if video.original_series and self.year is None or video.year and video.year == self.year:
+                matches.add('year')
+            # season
+            if video.season and self.season == video.season:
+                matches.add('season')
+            # episode
+            if video.episode and self.episode == video.episode:
+                matches.add('episode')
+            # guess
+            for release in self.releases:
+                matches |= guess_matches(video, guessit(release, {'type': 'episode', "single_value": True}))
+        # movie
+        elif isinstance(video, Movie):
+            # title
+            if video.title and (sanitize(self.title) in (
+                    sanitize(name) for name in [video.title] + video.alternative_titles)):
+                matches.add('title')
+            # year
+            if video.year and self.year == video.year:
+                matches.add('year')
+            # guess
+            for release in self.releases:
+                matches |= guess_matches(video, guessit(release, {'type': 'movie', "single_value": True}))
+
+        self.matches = matches
+
+        return matches
+
+
+class PodnapisiProvider(_PodnapisiProvider, ProviderSubtitleArchiveMixin):
+    languages = ({Language('por', 'BR'), Language('srp', script='Latn'), Language('srp', script='Cyrl')} |
+                 {Language.fromalpha2(l) for l in language_converters['alpha2'].codes})
+    languages.update(set(Language.rebuild(l, forced=True) for l in languages))
+
+    server_url = 'https://podnapisi.net/subtitles/'
+    only_foreign = False
+    also_foreign = False
+    subtitle_class = PodnapisiSubtitle
+    hearing_impaired_verifiable = True
+
+    def __init__(self, only_foreign=False, also_foreign=False):
+        self.only_foreign = only_foreign
+        self.also_foreign = also_foreign
+
+        if only_foreign:
+            logger.info("Only searching for foreign/forced subtitles")
+
+        super(PodnapisiProvider, self).__init__()
+
+    def list_subtitles(self, video, languages):
+        if video.is_special:
+            logger.info("%s can't search for specials right now, skipping", self)
+            return []
+
+        season = episode = None
+        if isinstance(video, Episode):
+            titles = [video.series] + video.alternative_series
+            season = video.season
+            episode = video.episode
+        else:
+            titles = [video.title] + video.alternative_titles
+
+        for title in titles:
+            subtitles = [s for l in languages for s in
+                         self.query(l, title, video, season=season, episode=episode, year=video.year,
+                                    only_foreign=self.only_foreign, also_foreign=self.also_foreign)]
+            if subtitles:
+                return subtitles
+
+        return []
+
+    def query(self, language, keyword, video, season=None, episode=None, year=None, only_foreign=False,
+              also_foreign=False):
+        search_language = str(language).lower()
+
+        # sr-Cyrl specialcase
+        if search_language == "sr-cyrl":
+            search_language = "sr"
+
+        # set parameters, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164#p212652
+        params = {'sXML': 1, 'sL': search_language, 'sK': keyword}
+
+        is_episode = False
+        if season and episode:
+            is_episode = True
+            params['sTS'] = season
+            params['sTE'] = episode
+
+        if year:
+            params['sY'] = year
+
+        # loop over paginated results
+        logger.info('Searching subtitles %r', params)
+        subtitles = []
+        pids = set()
+        while True:
+            # query the server
+            content = None
+            try:
+                content = self.session.get(self.server_url + 'search/old', params=params, timeout=10).content
+                xml = etree.fromstring(content)
+            except XMLSyntaxError:
+                logger.error("Wrong data returned: %r", content)
+                break
+
+            # exit if no results
+            if not int(xml.find('pagination/results').text):
+                logger.debug('No subtitles found')
+                break
+
+            # loop over subtitles
+            for subtitle_xml in xml.findall('subtitle'):
+                # read xml elements
+                pid = subtitle_xml.find('pid').text
+                # ignore duplicates, see http://www.podnapisi.net/forum/viewtopic.php?f=62&t=26164&start=10#p213321
+                if pid in pids:
+                    continue
+
+                language = Language.fromietf(subtitle_xml.find('language').text)
+                hearing_impaired = 'n' in (subtitle_xml.find('flags').text or '')
+                foreign = 'f' in (subtitle_xml.find('flags').text or '')
+                if only_foreign and not foreign:
+                    continue
+
+                elif not only_foreign and not also_foreign and foreign:
+                    continue
+
+                elif also_foreign and foreign:
+                    language = Language.rebuild(language, forced=True)
+
+                page_link = subtitle_xml.find('url').text
+                releases = []
+                if subtitle_xml.find('release').text:
+                    for release in subtitle_xml.find('release').text.split():
+                        releases.append(re.sub(r'\.+$', '', release))  # remove trailing dots
+                title = subtitle_xml.find('title').text
+                r_season = int(subtitle_xml.find('tvSeason').text)
+                r_episode = int(subtitle_xml.find('tvEpisode').text)
+                r_year = int(subtitle_xml.find('year').text)
+
+                if is_episode:
+                    subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title,
+                                                   season=r_season, episode=r_episode, year=r_year,
+                                                   asked_for_release_group=video.release_group,
+                                                   asked_for_episode=episode)
+                else:
+                    subtitle = self.subtitle_class(language, hearing_impaired, page_link, pid, releases, title,
+                                                   year=r_year, asked_for_release_group=video.release_group)
+
+
+                logger.debug('Found subtitle %r', subtitle)
+                subtitles.append(subtitle)
+                pids.add(pid)
+
+            # stop on last page
+            if int(xml.find('pagination/current').text) >= int(xml.find('pagination/count').text):
+                break
+
+            # increment current page
+            params['page'] = int(xml.find('pagination/current').text) + 1
+            logger.debug('Getting page %d', params['page'])
+            xml = None
+
+        return subtitles
+
+    def download_subtitle(self, subtitle):
+        # download as a zip
+        logger.info('Downloading subtitle %r', subtitle)
+        r = self.session.get(self.server_url + subtitle.pid + '/download', params={'container': 'zip'}, timeout=10)
+        r.raise_for_status()
+
+        # open the zip
+        with ZipFile(io.BytesIO(r.content)) as zf:
+            subtitle.content = self.get_subtitle_from_archive(subtitle, zf)
diff --git a/libs/subliminal_patch/providers/shooter.py b/libs/subliminal_patch/providers/shooter.py
new file mode 100644
index 000000000..af3870d99
--- /dev/null
+++ b/libs/subliminal_patch/providers/shooter.py
@@ -0,0 +1,15 @@
+# coding=utf-8
+
+from subliminal.providers.shooter import ShooterProvider as _ShooterProvider, ShooterSubtitle as _ShooterSubtitle
+
+
+class ShooterSubtitle(_ShooterSubtitle):
+    def __init__(self, language, hash, download_link):
+        super(ShooterSubtitle, self).__init__(language, hash, download_link)
+        self.release_info = hash
+        self.page_link = download_link
+
+
+class ShooterProvider(_ShooterProvider):
+    subtitle_class = ShooterSubtitle
+
diff --git a/libs/subliminal_patch/providers/subscene.py b/libs/subliminal_patch/providers/subscene.py
new file mode 100644
index 000000000..9f00975d6
--- /dev/null
+++ b/libs/subliminal_patch/providers/subscene.py
@@ -0,0 +1,223 @@
+# coding=utf-8
+
+import io
+import logging
+import os
+import time
+
+from random import randint
+from zipfile import ZipFile
+
+from babelfish import language_converters
+from guessit import guessit
+from requests import Session
+from subliminal import Episode, ProviderError
+from subliminal.utils import sanitize_release_group
+from subliminal_patch.providers import Provider
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal_patch.converters.subscene import language_ids, supported_languages
+from subscene_api.subscene import search, Subtitle as APISubtitle
+from subzero.language import Language
+
+
+language_converters.register('subscene = subliminal_patch.converters.subscene:SubsceneConverter')
+logger = logging.getLogger(__name__)
+
+
+class SubsceneSubtitle(Subtitle):
+    provider_name = 'subscene'
+    hearing_impaired_verifiable = True
+    is_pack = False
+    page_link = None
+    season = None
+    episode = None
+    releases = None
+
+    def __init__(self, language, release_info, hearing_impaired=False, page_link=None, encoding=None, mods=None,
+                 asked_for_release_group=None, asked_for_episode=None):
+        super(SubsceneSubtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link,
+                                               encoding=encoding, mods=mods)
+        self.release_info = self.releases = release_info
+        self.asked_for_episode = asked_for_episode
+        self.asked_for_release_group = asked_for_release_group
+        self.season = None
+        self.episode = None
+
+    @classmethod
+    def from_api(cls, s):
+        return cls(Language.fromsubscene(s.language.strip()), s.title, hearing_impaired=s.hearing_impaired,
+                   page_link=s.url)
+
+    @property
+    def id(self):
+        return self.page_link
+
+    @property
+    def numeric_id(self):
+        return self.page_link.split("/")[-1]
+
+    def get_matches(self, video):
+        matches = set()
+
+        if self.release_info.strip() == get_video_filename(video):
+            logger.debug("Using hash match as the release name is the same")
+            matches |= {"hash"}
+
+        # episode
+        if isinstance(video, Episode):
+            guess = guessit(self.release_info, {'type': 'episode'})
+            self.season = guess.get("season")
+            self.episode = guess.get("episode")
+
+            matches |= guess_matches(video, guess)
+            if "season" in matches and "episode" not in guess:
+                # pack
+                matches.add("episode")
+                logger.debug("%r is a pack", self)
+                self.is_pack = True
+
+        # movie
+        else:
+            guess = guessit(self.release_info, {'type': 'movie'})
+            matches |= guess_matches(video, guess)
+
+        if video.release_group and "release_group" not in matches and "release_group" in guess:
+            if sanitize_release_group(video.release_group) in sanitize_release_group(guess["release_group"]):
+                matches.add("release_group")
+
+        self.matches = matches
+
+        return matches
+
+    def get_download_link(self, session):
+        return APISubtitle.get_zipped_url(self.page_link, session)
+
+
+def get_video_filename(video):
+    return os.path.splitext(os.path.basename(video.original_name))[0]
+
+
+class SubsceneProvider(Provider, ProviderSubtitleArchiveMixin):
+    """
+    This currently only searches for the filename on SubScene. It doesn't open every found subtitle page to avoid
+    massive hammering, thus it can't determine whether a subtitle is only-foreign or not.
+    """
+    subtitle_class = SubsceneSubtitle
+    languages = supported_languages
+    languages.update(set(Language.rebuild(l, forced=True) for l in languages))
+
+    session = None
+    skip_wrong_fps = False
+    hearing_impaired_verifiable = True
+    only_foreign = False
+
+    search_throttle = 2  # seconds
+
+    def __init__(self, only_foreign=False):
+        self.only_foreign = only_foreign
+
+    def initialize(self):
+        logger.info("Creating session")
+        self.session = Session()
+        from .utils import FIRST_THOUSAND_OR_SO_USER_AGENTS as AGENT_LIST
+        self.session.headers['User-Agent'] = AGENT_LIST[randint(0, len(AGENT_LIST) - 1)]
+
+    def terminate(self):
+        logger.info("Closing session")
+        self.session.close()
+
+    def _create_filters(self, languages):
+        self.filters = dict(HearingImpaired="2")
+        if self.only_foreign:
+            self.filters["ForeignOnly"] = "True"
+            logger.info("Only searching for foreign/forced subtitles")
+
+        self.filters["LanguageFilter"] = ",".join((str(language_ids[l.alpha3]) for l in languages
+                                                   if l.alpha3 in language_ids))
+
+        logger.debug("Filter created: '%s'" % self.filters)
+
+    def _enable_filters(self):
+        self.session.cookies.update(self.filters)
+        logger.debug("Filters applied")
+
+    def list_subtitles(self, video, languages):
+        if not video.original_name:
+            logger.info("Skipping search because we don't know the original release name")
+            return []
+
+        self._create_filters(languages)
+        self._enable_filters()
+        return [s for s in self.query(video) if s.language in languages]
+
+    def download_subtitle(self, subtitle):
+        if subtitle.pack_data:
+            logger.info("Using previously downloaded pack data")
+            archive = ZipFile(io.BytesIO(subtitle.pack_data))
+            subtitle.pack_data = None
+
+            try:
+                subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
+                return
+            except ProviderError:
+                pass
+
+        # open the archive
+        r = self.session.get(subtitle.get_download_link(self.session), timeout=10)
+        r.raise_for_status()
+        archive_stream = io.BytesIO(r.content)
+        archive = ZipFile(archive_stream)
+
+        subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
+
+        # store archive as pack_data for later caching
+        subtitle.pack_data = r.content
+
+    def parse_results(self, video, film):
+        subtitles = []
+        for s in film.subtitles:
+            subtitle = SubsceneSubtitle.from_api(s)
+            subtitle.asked_for_release_group = video.release_group
+            if isinstance(video, Episode):
+                subtitle.asked_for_episode = video.episode
+
+            if self.only_foreign:
+                subtitle.language = Language.rebuild(subtitle.language, forced=True)
+
+            subtitles.append(subtitle)
+            logger.debug('Found subtitle %r', subtitle)
+
+        return subtitles
+
+    def query(self, video):
+        vfn = get_video_filename(video)
+        logger.debug(u"Searching for: %s", vfn)
+        film = search(vfn, session=self.session)
+
+        subtitles = []
+        if film and film.subtitles:
+            subtitles = self.parse_results(video, film)
+
+        # re-search for episodes without explicit release name
+        if isinstance(video, Episode):
+            term = u"%s S%02iE%02i" % (video.series, video.season, video.episode)
+            time.sleep(self.search_throttle)
+            logger.debug('Searching for alternative results: %s', term)
+            film = search(term, session=self.session)
+            if film and film.subtitles:
+                subtitles += self.parse_results(video, film)
+
+            # packs
+            if video.season_fully_aired:
+                term = u"%s S%02i" % (video.series, video.season)
+                logger.debug('Searching for packs: %s', term)
+                time.sleep(self.search_throttle)
+                film = search(term, session=self.session)
+                if film and film.subtitles:
+                    subtitles += self.parse_results(video, film)
+            else:
+                logger.debug("Not searching for packs, because the season hasn't fully aired")
+
+        logger.info("%s subtitles found" % len(subtitles))
+        return subtitles
diff --git a/libs/subliminal_patch/providers/subscenter.py b/libs/subliminal_patch/providers/subscenter.py
new file mode 100644
index 000000000..a8b9844b4
--- /dev/null
+++ b/libs/subliminal_patch/providers/subscenter.py
@@ -0,0 +1,27 @@
+# coding=utf-8
+
+from subliminal.providers.subscenter import SubsCenterProvider as _SubsCenterProvider, \
+    SubsCenterSubtitle as _SubsCenterSubtitle
+
+
+class SubsCenterSubtitle(_SubsCenterSubtitle):
+    hearing_impaired_verifiable = True
+
+    def __init__(self, language, hearing_impaired, page_link, series, season, episode, title, subtitle_id, subtitle_key,
+                 subtitle_version, downloaded, releases):
+        super(SubsCenterSubtitle, self).__init__(language, hearing_impaired, page_link, series, season, episode, title,
+                                                 subtitle_id, subtitle_key,
+                                                 subtitle_version, downloaded, releases)
+        self.release_info = u", ".join(releases)
+        self.page_link = page_link
+
+    def __repr__(self):
+        return '<%s %r %s [%s]>' % (
+            self.__class__.__name__, self.page_link, self.id, self.language)
+
+
+class SubsCenterProvider(_SubsCenterProvider):
+    subtitle_class = SubsCenterSubtitle
+    hearing_impaired_verifiable = True
+    server_url = 'http://www.subscenter.info/he/'
+
diff --git a/libs/subliminal_patch/providers/supersubtitles.py b/libs/subliminal_patch/providers/supersubtitles.py
new file mode 100644
index 000000000..97c841103
--- /dev/null
+++ b/libs/subliminal_patch/providers/supersubtitles.py
@@ -0,0 +1,389 @@
+# coding=utf-8
+import io
+import six
+import os
+from pkg_resources import require
+import logging
+import re
+import os
+import time
+
+from babelfish import language_converters
+from subzero.language import Language
+from requests import Session
+
+from subliminal.subtitle import fix_line_ending
+from subliminal_patch.providers import Provider
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subliminal.providers import ParserBeautifulSoup
+from subliminal_patch.exceptions import ProviderError
+from subliminal.score import get_equivalent_release_groups
+from subliminal_patch.subtitle import Subtitle, guess_matches
+from subliminal.utils import sanitize, sanitize_release_group
+from subliminal.video import Episode, Movie
+from zipfile import ZipFile, is_zipfile
+from rarfile import RarFile, is_rarfile
+from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming
+from guessit import guessit
+
+
+logger = logging.getLogger(__name__)
+
+language_converters.register('supersubtitles = subliminal_patch.converters.supersubtitles:SuperSubtitlesConverter')
+
+
+class SuperSubtitlesSubtitle(Subtitle):
+    """SuperSubtitles Subtitle."""
+    provider_name = 'supersubtitles'
+
+    def __str__(self):
+        subtit = "Subtitle id: " + str(self.subtitle_id) \
+                 + " Series: " + self.series \
+                 + " Season: " + str(self.season) \
+                 + " Episode: " + str(self.episode) \
+                 + " Version: " + str(self.version) \
+                 + " Releases: " + str(self.releases) \
+                 + " DownloadLink: " + str(self.page_link) \
+                 + " Matches: " + str(self.matches)
+        if self.year:
+            subtit = subtit + " Year: " + str(self.year)
+        return subtit.encode('utf-8')
+
+    def __init__(self, language, page_link, subtitle_id, series, season, episode, version,
+                 releases, year, imdb_id, asked_for_episode=None, asked_for_release_group=None):
+        super(SuperSubtitlesSubtitle, self).__init__(language, page_link=page_link)
+        self.subtitle_id = subtitle_id
+        self.series = series
+        self.season = season
+        self.episode = episode
+        self.version = version
+        self.releases = releases
+        self.year = year
+        if year:
+            self.year = int(year)
+
+        self.release_info = u", ".join(releases)
+        self.page_link = page_link
+        self.asked_for_release_group = asked_for_release_group
+        self.asked_for_episode = asked_for_episode
+        self.imdb_id = imdb_id
+        self.is_pack = True
+
+    def numeric_id(self):
+        return self.subtitle_id
+
+    def __repr__(self):
+        ep_addon = (" S%02dE%02d" % (self.season, self.episode)) if self.episode else ""
+        return '<%s %r [%s]>' % (
+            self.__class__.__name__, u"%s%s%s [%s]" % (self.series, " (%s)" % self.year if self.year else "", ep_addon,
+                                                       self.release_info), self.language)
+
+    @property
+    def id(self):
+        return str(self.subtitle_id)
+
+    def get_matches(self, video):
+        matches = guess_matches(video, guessit(self.release_info.encode("utf-8")))
+
+        # episode
+        if isinstance(video, Episode):
+            # series
+            if video.series and sanitize(self.series) == sanitize(video.series):
+                matches.add('series')
+            # season
+            if video.season and self.season == video.season:
+                matches.add('season')
+            # episode
+            if video.episode and self.episode == video.episode:
+                matches.add('episode')
+            # imdb_id
+            if video.series_imdb_id and self.imdb_id and str(self.imdb_id) == str(video.series_imdb_id):
+                matches.add('series_imdb_id')
+                matches.add('series')
+                matches.add('year')
+            # year
+            if ('series' in matches and video.original_series and self.year is None or
+                    video.year and video.year == self.year):
+                matches.add('year')
+        # movie
+        elif isinstance(video, Movie):
+            # title
+            if video.title and (sanitize(self.series) in (
+                    sanitize(name) for name in [video.title] + video.alternative_titles)):
+                matches.add('title')
+            # imdb_id
+            if video.imdb_id and self.imdb_id == video.imdb_id:
+                matches.add('imdb_id')
+                matches.add('title')
+                matches.add('year')
+            # year
+            if video.year and self.year == video.year:
+                matches.add('year')
+
+        # release_group
+        if (video.release_group and self.version and
+                any(r in sanitize_release_group(self.version)
+                    for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))):
+            matches.add('release_group')
+        # resolution
+        if video.resolution and self.version and video.resolution in self.version.lower():
+            matches.add('resolution')
+        # format
+        if video.format and self.version and video.format.lower() in self.version.lower():
+            matches.add('format')
+
+        self.matches = matches
+        return matches
+
+
+class SuperSubtitlesProvider(Provider, ProviderSubtitleArchiveMixin):
+    """SuperSubtitles Provider."""
+    languages = {Language('hun', 'HU')} | {Language(l) for l in [
+        'hun', 'eng'
+    ]}
+    video_types = (Episode, Movie)
+    # https://www.feliratok.info/?search=&soriSorszam=&nyelv=&sorozatnev=The+Flash+%282014%29&sid=3212&complexsearch=true&knyelv=0&evad=4&epizod1=1&cimke=0&minoseg=0&rlsr=0&tab=all
+    server_url = 'https://www.feliratok.info/'
+    subtitle_class = SuperSubtitlesSubtitle
+    hearing_impaired_verifiable = False
+    multi_result_throttle = 2  # seconds
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers = {'User-Agent': os.environ.get("SZ_USER_AGENT", "Sub-Zero/2")}
+
+    def terminate(self):
+        self.session.close()
+
+    def get_language(self, text):
+        if text == 'Magyar':
+            return Language.fromsupersubtitles('hu')
+        if text == 'Angol':
+            return Language.fromsupersubtitles('en')
+        return None
+
+    def find_imdb_id(self, sub_id):
+        """
+
+        """
+
+        url = self.server_url + "index.php?tipus=adatlap&azon=a_" + sub_id
+        # url = https://www.feliratok.info/index.php?tipus=adatlap&azon=a_1518600916
+        logger.info('Get IMDB id from URL %s', url)
+        r = self.session.get(url, timeout=10).content
+
+        soup = ParserBeautifulSoup(r, ['lxml'])
+        links = soup.find_all("a")
+
+        for value in links:
+            if "imdb.com" in str(value):
+                # <a alt="iMDB" href="http://www.imdb.com/title/tt2357547/" target="_blank"><img alt="iMDB" src="img/adatlap/imdb.png"/></a>
+                imdb_id = re.findall(r'(?<=www\.imdb\.com/title/).*(?=/")', str(value))[0]
+                return imdb_id
+
+        return None
+
+    def find_id(self, series, year, original_title):
+        """
+        We need to find the id of the series at the following url:
+        https://www.feliratok.info/index.php?term=SERIESNAME&nyelv=0&action=autoname
+        Where SERIESNAME is a searchable string.
+        The result will be something like this:
+        [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"}
+        ,{"name":"No Tomorrow (2016)","ID":"4179"}]
+
+        """
+
+        # Search for exact name
+        url = self.server_url + "index.php?term=" + series + "&nyelv=0&action=autoname"
+        # url = self.server_url + "index.php?term=" + "fla"+ "&nyelv=0&action=autoname"
+        logger.info('Get series id from URL %s', url)
+        r = self.session.get(url, timeout=10)
+
+        # r is something like this:
+        # [{"name":"DC\u2019s Legends of Tomorrow (2016)","ID":"3725"},{"name":"Miles from Tomorrowland (2015)","ID":"3789"}
+        # ,{"name":"No Tomorrow (2016)","ID":"4179"}]
+
+        results = r.json()
+
+        # check all of the results:
+        for result in results:
+            try:
+                # "name":"Miles from Tomorrowland (2015)","ID":"3789"
+                result_year = re.findall(r"(?<=\()\d\d\d\d(?=\))", result['name'])[0]
+            except IndexError:
+                result_year = ""
+
+            try:
+                # "name":"Miles from Tomorrowland (2015)","ID":"3789"
+                result_title = re.findall(r".*(?=\(\d\d\d\d\))", result['name'])[0]
+                result_id = result['ID']
+            except IndexError:
+                continue
+
+            result_title = result_title.strip().replace("ďż˝", "").replace(" ", ".")
+
+            guessable = result_title.strip() + ".s01e01." + result_year
+            guess = guessit(guessable, {'type': "episode"})
+
+            if sanitize(original_title) == sanitize(guess['title']) and year and guess['year'] and year == guess['year']:
+                # Return the founded id
+                return result_id
+
+        return None
+
+    def query(self, series, video=None):
+        year = video.year
+        subtitle = None
+        if isinstance(video, Episode):
+            series = video.series
+            season = video.season
+            episode = video.episode
+            #seriesa = series.replace(' ', '+')
+
+            # Get ID of series with original name
+            series_id = self.find_id(series, year, series)
+            if not series_id:
+                # If not founded try without ' char
+                modified_series = series.replace(' ', '+').replace('\'', '')
+                series_id = self.find_id(modified_series, year, series)
+                if not series_id and modified_series:
+                    # If still not founded try with the longest word is series title
+                    modified_series = modified_series.split('+')
+                    modified_series = max(modified_series, key=len)
+                    series_id = self.find_id(modified_series, year, series)
+
+                    if not series_id:
+                        return None
+
+            # https://www.feliratok.info/index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=2075&complexsearch=true&knyelv=0&evad=6&epizod1=16&cimke=0&minoseg=0&rlsr=0&tab=all
+            url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \
+                  str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(season) + "&epizod1=" + str(
+                episode) + "&cimke=0&minoseg=0&rlsr=0&tab=all"
+            subtitle = self.process_subs(series, video, url)
+
+            if not subtitle:
+                # No Subtitle found. Maybe already archived to season pack
+                url = self.server_url + "index.php?search=&soriSorszam=&nyelv=&sorozatnev=&sid=" + \
+                      str(series_id) + "&complexsearch=true&knyelv=0&evad=" + str(
+                    season) + "&epizod1=&evadpakk=on&cimke=0&minoseg=0&rlsr=0&tab=all"
+                subtitle = self.process_subs(series, video, url)
+
+        if isinstance(video, Movie):
+            title = series.replace(" ", "+")
+
+            # https://www.feliratok.info/index.php?search=The+Hitman%27s+BodyGuard&soriSorszam=&nyelv=&tab=film
+            url = self.server_url + "index.php?search=" + title + "&soriSorszam=&nyelv=&tab=film"
+            subtitle = self.process_subs(series, video, url)
+
+        return subtitle
+
+    def process_subs(self, series, video, url):
+
+        subtitles = []
+
+        logger.info('URL for subtitles %s', url)
+        r = self.session.get(url, timeout=10).content
+
+        soup = ParserBeautifulSoup(r, ['lxml'])
+        tables = soup.find_all("table")
+        tables = tables[0].find_all("tr")
+        i = 0
+        series_imdb_id = None
+        for table in tables:
+            if "vilagit" in str(table) and i > 1:
+                try:
+                    sub_hun_name = table.findAll("div", {"class": "magyar"})[0]
+                    if isinstance(video, Episode):
+                        if "vad)" not in str(sub_hun_name):
+                            # <div class="magyar">A pletykaf�szek (3. �vad)</div>
+                            sub_hun_name = re.findall(r'(?<=<div class="magyar">).*(?= -)', str(sub_hun_name))[0]
+                        else:
+                            # <div class="magyar">A holnap legend�i - 3x11</div>
+                            sub_hun_name = re.findall(r'(?<=<div class="magyar">).*(?= \()', str(sub_hun_name))[0]
+                    if isinstance(video, Movie):
+                        sub_hun_name = re.findall(r'(?<=<div class="magyar">).*(?=</div)', str(sub_hun_name))[0]
+                except IndexError:
+                    sub_hun_name = ""
+
+                asked_for_episode = None
+                sub_season = None
+                sub_episode = None
+                sub_english = table.findAll("div", {"class": "eredeti"})
+                if isinstance(video, Episode):
+                    asked_for_episode = video.episode
+                    if "Season" not in str(sub_english):
+                        # [<div class="eredeti">Gossip Girl (Season 3) (DVDRip-REWARD)</div>]
+                        sub_english_name = re.findall(r'(?<=<div class="eredeti">).*?(?= -)', str(sub_english))[0]
+                        sub_season = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[0]).strip())
+                        sub_episode = int((re.findall(r"(?<=- ).*?(?= - )", str(sub_english))[0].split('x')[1]).strip())
+
+                    else:
+                        # [<div class="eredeti">DC's Legends of Tomorrow - 3x11 - Here I Go Again (HDTV-AFG, HDTV-RMX, 720p-SVA, 720p-PSA </div>]
+                        sub_english_name = \
+                            re.findall(r'(?<=<div class="eredeti">).*?(?=\(Season)', str(sub_english))[0]
+                        sub_season = int(re.findall(r"(?<=Season )\d+(?=\))", str(sub_english))[0])
+                        sub_episode = int(video.episode)
+                if isinstance(video, Movie):
+                    sub_english_name = re.findall(r'(?<=<div class="eredeti">).*?(?=\()', str(sub_english))[0]
+
+                sub_version = (str(sub_english).split('(')[len(str(sub_english).split('(')) - 1]).split(')')[0]
+                # <small>Angol</small>
+                lang = table.findAll("small")[0]
+                sub_language = self.get_language(re.findall(r"(?<=<small>).*(?=</small>)", str(lang))[0])
+
+                # <a href="/index.php?action=letolt&amp;fnev=DCs Legends of Tomorrow - 03x11 - Here I Go Again.SVA.English.C.orig.Addic7ed.com.srt&amp;felirat=1519162191">
+                link = str(table.findAll("a")[len(table.findAll("a")) - 1]).replace("amp;", "")
+                sub_downloadlink = self.server_url + re.findall(r'(?<=href="/).*(?=">)', link)[0]
+
+                sub_id = re.findall(r"(?<=felirat\=).*(?=\"\>)", link)[0]
+                sub_year = video.year
+                sub_releases = [s.strip() for s in sub_version.split(',')]
+
+                # For episodes we open the series page so all subtitles imdb_id must be the same. no need to check all
+                if isinstance(video, Episode) and series_imdb_id is not None:
+                    sub_imdb_id = series_imdb_id
+                else:
+                    sub_imdb_id = self.find_imdb_id(sub_id)
+                    series_imdb_id = sub_imdb_id
+
+                subtitle = SuperSubtitlesSubtitle(sub_language, sub_downloadlink, sub_id, sub_english_name.strip(), sub_season,
+                                                  sub_episode, sub_version, sub_releases, sub_year, sub_imdb_id,
+                                                  asked_for_episode, asked_for_release_group=video.release_group )
+                subtitles.append(subtitle)
+            i = i + 1
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        if isinstance(video, Episode):
+            titles = [video.series] + video.alternative_series
+        elif isinstance(video, Movie):
+            titles = [video.title] + video.alternative_titles
+
+        for title in titles:
+            subs = self.query(title, video=video)
+            if subs:
+                return subs
+
+            time.sleep(self.multi_result_throttle)
+            return []
+
+    def download_subtitle(self, subtitle):
+
+        # download as a zip
+        logger.info('Downloading subtitle %r', subtitle.subtitle_id)
+        r = self.session.get(subtitle.page_link, timeout=10)
+        r.raise_for_status()
+
+        if ".rar" in subtitle.page_link:
+            logger.debug('Archive identified as rar')
+            archive_stream = io.BytesIO(r.content)
+            archive = RarFile(archive_stream)
+            subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
+        elif ".zip" in subtitle.page_link:
+            logger.debug('Archive identified as zip')
+            archive_stream = io.BytesIO(r.content)
+            archive = ZipFile(archive_stream)
+            subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
+        else:
+            subtitle.content = fix_line_ending(r.content)
diff --git a/libs/subliminal_patch/providers/titlovi.py b/libs/subliminal_patch/providers/titlovi.py
new file mode 100644
index 000000000..4cf6d124a
--- /dev/null
+++ b/libs/subliminal_patch/providers/titlovi.py
@@ -0,0 +1,348 @@
+# coding=utf-8
+
+import io
+import logging
+import math
+import re
+
+import rarfile
+
+from bs4 import BeautifulSoup
+from zipfile import ZipFile, is_zipfile
+from rarfile import RarFile, is_rarfile
+from babelfish import language_converters, Script
+from requests import Session
+from guessit import guessit
+from subliminal_patch.providers import Provider
+from subliminal_patch.providers.mixins import ProviderSubtitleArchiveMixin
+from subliminal_patch.subtitle import Subtitle
+from subliminal_patch.utils import sanitize, fix_inconsistent_naming as _fix_inconsistent_naming
+from subliminal.exceptions import ProviderError
+from subliminal.score import get_equivalent_release_groups
+from subliminal.utils import sanitize_release_group
+from subliminal.subtitle import guess_matches
+from subliminal.video import Episode, Movie
+from subliminal.subtitle import fix_line_ending
+from subzero.language import Language
+
+# parsing regex definitions
+title_re = re.compile(r'(?P<title>(?:.+(?= [Aa][Kk][Aa] ))|.+)(?:(?:.+)(?P<altitle>(?<= [Aa][Kk][Aa] ).+))?')
+lang_re = re.compile(r'(?<=flags/)(?P<lang>.{2})(?:.)(?P<script>c?)(?:.+)')
+season_re = re.compile(r'Sezona (?P<season>\d+)')
+episode_re = re.compile(r'Epizoda (?P<episode>\d+)')
+year_re = re.compile(r'(?P<year>\d+)')
+fps_re = re.compile(r'fps: (?P<fps>.+)')
+
+
+def fix_inconsistent_naming(title):
+    """Fix titles with inconsistent naming using dictionary and sanitize them.
+
+    :param str title: original title.
+    :return: new title.
+    :rtype: str
+
+    """
+    return _fix_inconsistent_naming(title, {"DC's Legends of Tomorrow": "Legends of Tomorrow",
+                                            "Marvel's Jessica Jones": "Jessica Jones"})
+
+logger = logging.getLogger(__name__)
+
+# Configure :mod:`rarfile` to use the same path separator as :mod:`zipfile`
+rarfile.PATH_SEP = '/'
+
+language_converters.register('titlovi = subliminal_patch.converters.titlovi:TitloviConverter')
+
+
+class TitloviSubtitle(Subtitle):
+    provider_name = 'titlovi'
+
+    def __init__(self, language, page_link, download_link, sid, releases, title, alt_title=None, season=None,
+                 episode=None, year=None, fps=None, asked_for_release_group=None, asked_for_episode=None):
+        super(TitloviSubtitle, self).__init__(language, page_link=page_link)
+        self.sid = sid
+        self.releases = self.release_info = releases
+        self.title = title
+        self.alt_title = alt_title
+        self.season = season
+        self.episode = episode
+        self.year = year
+        self.download_link = download_link
+        self.fps = fps
+        self.matches = None
+        self.asked_for_release_group = asked_for_release_group
+        self.asked_for_episode = asked_for_episode
+
+    @property
+    def id(self):
+        return self.sid
+
+    def get_matches(self, video):
+        matches = set()
+
+        # handle movies and series separately
+        if isinstance(video, Episode):
+            # series
+            if video.series and sanitize(self.title) == fix_inconsistent_naming(video.series) or sanitize(
+                    self.alt_title) == fix_inconsistent_naming(video.series):
+                matches.add('series')
+            # year
+            if video.original_series and self.year is None or video.year and video.year == self.year:
+                matches.add('year')
+            # season
+            if video.season and self.season == video.season:
+                matches.add('season')
+            # episode
+            if video.episode and self.episode == video.episode:
+                matches.add('episode')
+        # movie
+        elif isinstance(video, Movie):
+            # title
+            if video.title and sanitize(self.title) == fix_inconsistent_naming(video.title) or sanitize(
+                    self.alt_title) == fix_inconsistent_naming(video.title):
+                matches.add('title')
+            # year
+            if video.year and self.year == video.year:
+                matches.add('year')
+
+        # rest is same for both groups
+
+        # release_group
+        if (video.release_group and self.releases and
+                any(r in sanitize_release_group(self.releases)
+                    for r in get_equivalent_release_groups(sanitize_release_group(video.release_group)))):
+            matches.add('release_group')
+        # resolution
+        if video.resolution and self.releases and video.resolution in self.releases.lower():
+            matches.add('resolution')
+        # format
+        if video.format and self.releases and video.format.lower() in self.releases.lower():
+            matches.add('format')
+        # other properties
+        matches |= guess_matches(video, guessit(self.releases))
+
+        self.matches = matches
+
+        return matches
+
+
+class TitloviProvider(Provider, ProviderSubtitleArchiveMixin):
+    subtitle_class = TitloviSubtitle
+    languages = {Language.fromtitlovi(l) for l in language_converters['titlovi'].codes} | {Language.fromietf('sr-Latn')}
+    server_url = 'https://titlovi.com'
+    search_url = server_url + '/titlovi/?'
+    download_url = server_url + '/download/?type=1&mediaid='
+
+    def initialize(self):
+        self.session = Session()
+        self.session.headers['User-Agent'] = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' \
+                                             '(KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36'
+        logger.debug('User-Agent set to %s', self.session.headers['User-Agent'])
+        self.session.headers['Referer'] = self.server_url
+        logger.debug('Referer set to %s', self.session.headers['Referer'])
+
+    def terminate(self):
+        self.session.close()
+
+    def query(self, languages, title, season=None, episode=None, year=None, video=None):
+        items_per_page = 10
+        current_page = 1
+
+        used_languages = languages
+        lang_strings = [str(lang) for lang in used_languages]
+
+        # handle possible duplicate use of Serbian Latin
+        if "sr" in lang_strings and "sr-Latn" in lang_strings:
+            logger.info('Duplicate entries <Language [sr]> and <Language [sr-Latn]> found, filtering languages')
+            used_languages = filter(lambda l: l != Language.fromietf('sr-Latn'), used_languages)
+            logger.info('Filtered language list %r', used_languages)
+
+        # convert list of languages into search string
+        langs = '|'.join(map(str, [l.titlovi for l in used_languages]))
+
+        # set query params
+        params = {'prijevod': title, 'jezik': langs}
+        is_episode = False
+        if season and episode:
+            is_episode = True
+            params['s'] = season
+            params['e'] = episode
+        if year:
+            params['g'] = year
+
+        # loop through paginated results
+        logger.info('Searching subtitles %r', params)
+        subtitles = []
+
+        while True:
+            # query the server
+            try:
+                r = self.session.get(self.search_url, params=params, timeout=10)
+                r.raise_for_status()
+
+                soup = BeautifulSoup(r.content, 'lxml')
+
+                # number of results
+                result_count = int(soup.select_one('.results_count b').string)
+            except:
+                result_count = None
+
+            # exit if no results
+            if not result_count:
+                if not subtitles:
+                    logger.debug('No subtitles found')
+                else:
+                    logger.debug("No more subtitles found")
+                break
+
+            # number of pages with results
+            pages = int(math.ceil(result_count / float(items_per_page)))
+
+            # get current page
+            if 'pg' in params:
+                current_page = int(params['pg'])
+
+            try:
+                sublist = soup.select('section.titlovi > ul.titlovi > li')
+                for sub in sublist:
+                    # subtitle id
+                    sid = sub.find(attrs={'data-id': True}).attrs['data-id']
+                    # get download link
+                    download_link = self.download_url + sid
+                    # title and alternate title
+                    match = title_re.search(sub.a.string)
+                    if match:
+                        _title = match.group('title')
+                        alt_title = match.group('altitle')
+                    else:
+                        continue
+
+                    # page link
+                    page_link = self.server_url + sub.a.attrs['href']
+                    # subtitle language
+                    match = lang_re.search(sub.select_one('.lang').attrs['src'])
+                    if match:
+                        try:
+                            # decode language
+                            lang = Language.fromtitlovi(match.group('lang')+match.group('script'))
+                        except ValueError:
+                            continue
+
+                    # relase year or series start year
+                    match = year_re.search(sub.find(attrs={'data-id': True}).parent.i.string)
+                    if match:
+                        r_year = int(match.group('year'))
+                    # fps
+                    match = fps_re.search(sub.select_one('.fps').string)
+                    if match:
+                        fps = match.group('fps')
+                    # releases
+                    releases = str(sub.select_one('.fps').parent.contents[0].string)
+
+                    # handle movies and series separately
+                    if is_episode:
+                        # season and episode info
+                        sxe = sub.select_one('.s0xe0y').string
+                        r_season = None
+                        r_episode = None
+                        if sxe:
+                            match = season_re.search(sxe)
+                            if match:
+                                r_season = int(match.group('season'))
+                            match = episode_re.search(sxe)
+                            if match:
+                                r_episode = int(match.group('episode'))
+
+                        subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title,
+                                                       alt_title=alt_title, season=r_season, episode=r_episode,
+                                                       year=r_year, fps=fps,
+                                                       asked_for_release_group=video.release_group,
+                                                       asked_for_episode=episode)
+                    else:
+                        subtitle = self.subtitle_class(lang, page_link, download_link, sid, releases, _title,
+                                                       alt_title=alt_title, year=r_year, fps=fps,
+                                                       asked_for_release_group=video.release_group)
+                    logger.debug('Found subtitle %r', subtitle)
+
+                    # prime our matches so we can use the values later
+                    subtitle.get_matches(video)
+
+                    # add found subtitles
+                    subtitles.append(subtitle)
+
+            finally:
+                soup.decompose()
+
+            # stop on last page
+            if current_page >= pages:
+                break
+
+            # increment current page
+            params['pg'] = current_page + 1
+            logger.debug('Getting page %d', params['pg'])
+
+        return subtitles
+
+    def list_subtitles(self, video, languages):
+        season = episode = None
+        if isinstance(video, Episode):
+            title = video.series
+            season = video.season
+            episode = video.episode
+        else:
+            title = video.title
+
+        return [s for s in
+                self.query(languages, fix_inconsistent_naming(title), season=season, episode=episode, year=video.year,
+                           video=video)]
+
+    def download_subtitle(self, subtitle):
+        r = self.session.get(subtitle.download_link, timeout=10)
+        r.raise_for_status()
+
+        # open the archive
+        archive_stream = io.BytesIO(r.content)
+        if is_rarfile(archive_stream):
+            logger.debug('Archive identified as rar')
+            archive = RarFile(archive_stream)
+        elif is_zipfile(archive_stream):
+            logger.debug('Archive identified as zip')
+            archive = ZipFile(archive_stream)
+        else:
+            subtitle.content = r.content
+            if subtitle.is_valid():
+                return
+            subtitle.content = None
+
+            raise ProviderError('Unidentified archive type')
+
+        subs_in_archive = archive.namelist()
+
+        # if Serbian lat and cyr versions are packed together, try to find right version
+        if len(subs_in_archive) > 1 and (subtitle.language == 'sr' or subtitle.language == 'sr-Cyrl'):
+            self.get_subtitle_from_bundled_archive(subtitle, subs_in_archive, archive)
+        else:
+            # use default method for everything else
+            subtitle.content = self.get_subtitle_from_archive(subtitle, archive)
+
+    def get_subtitle_from_bundled_archive(self, subtitle, subs_in_archive, archive):
+        sr_lat_subs = []
+        sr_cyr_subs = []
+        sub_to_extract = None
+
+        for sub_name in subs_in_archive:
+            if not ('.cyr' in sub_name or '.cir' in sub_name):
+                sr_lat_subs.append(sub_name)
+
+            if ('.cyr' in sub_name or '.cir' in sub_name) and not '.lat' in sub_name:
+                sr_cyr_subs.append(sub_name)
+
+        if subtitle.language == 'sr':
+            if len(sr_lat_subs) > 0:
+                sub_to_extract = sr_lat_subs[0]
+
+        if subtitle.language == 'sr-Cyrl':
+            if len(sr_cyr_subs) > 0:
+                sub_to_extract = sr_cyr_subs[0]
+
+        logger.info(u'Using %s from the archive', sub_to_extract)
+        subtitle.content = fix_line_ending(archive.read(sub_to_extract))
diff --git a/libs/subliminal_patch/providers/tvsubtitles.py b/libs/subliminal_patch/providers/tvsubtitles.py
new file mode 100644
index 000000000..d09a6adc5
--- /dev/null
+++ b/libs/subliminal_patch/providers/tvsubtitles.py
@@ -0,0 +1,133 @@
+# coding=utf-8
+
+import logging
+
+
+from subzero.language import Language
+from subliminal.providers import ParserBeautifulSoup
+from subliminal.cache import SHOW_EXPIRATION_TIME, region, EPISODE_EXPIRATION_TIME
+from subliminal.providers.tvsubtitles import TVsubtitlesProvider as _TVsubtitlesProvider, \
+    TVsubtitlesSubtitle as _TVsubtitlesSubtitle, link_re, episode_id_re
+from subliminal.utils import sanitize
+
+logger = logging.getLogger(__name__)
+
+
+class TVsubtitlesSubtitle(_TVsubtitlesSubtitle):
+    def __init__(self, language, page_link, subtitle_id, series, season, episode, year, rip, release):
+        super(TVsubtitlesSubtitle, self).__init__(language, page_link, subtitle_id, series, season, episode,
+                                                  year, rip, release)
+        self.release_info = u"%s, %s" % (rip, release)
+
+
+class TVsubtitlesProvider(_TVsubtitlesProvider):
+    subtitle_class = TVsubtitlesSubtitle
+
+    @region.cache_on_arguments(expiration_time=SHOW_EXPIRATION_TIME)
+    def search_show_id(self, series, year=None):
+        """Search the show id from the `series` and `year`.
+        :param string series: series of the episode.
+        :param year: year of the series, if any.
+        :type year: int or None
+        :return: the show id, if any.
+        :rtype: int or None
+        """
+        # make the search
+        logger.info('Searching show id for %r', series)
+        r = self.session.post(self.server_url + 'search.php', data={'q': series}, timeout=10)
+        r.raise_for_status()
+
+        # get the series out of the suggestions
+        soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+        show_id = None
+        for suggestion in soup.select('div.left li div a[href^="/tvshow-"]'):
+            match = link_re.match(suggestion.text)
+            if not match:
+                logger.error('Failed to match %s', suggestion.text)
+                continue
+
+            if sanitize(match.group('series')).lower() == series.lower():
+                if year is not None and int(match.group('first_year')) != year:
+                    logger.debug('Year does not match')
+                    continue
+                show_id = int(suggestion['href'][8:-5])
+                logger.debug('Found show id %d', show_id)
+                break
+
+        soup.decompose()
+        soup = None
+
+        return show_id
+
+    @region.cache_on_arguments(expiration_time=EPISODE_EXPIRATION_TIME)
+    def get_episode_ids(self, show_id, season):
+        """Get episode ids from the show id and the season.
+
+        :param int show_id: show id.
+        :param int season: season of the episode.
+        :return: episode ids per episode number.
+        :rtype: dict
+
+        """
+        # get the page of the season of the show
+        logger.info('Getting the page of show id %d, season %d', show_id, season)
+        r = self.session.get(self.server_url + 'tvshow-%d-%d.html' % (show_id, season), timeout=10)
+        soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+
+        # loop over episode rows
+        episode_ids = {}
+        for row in soup.select('table#table5 tr'):
+            # skip rows that do not have a link to the episode page
+            if not row('a', href=episode_id_re):
+                continue
+
+            # extract data from the cells
+            cells = row('td')
+            episode = int(cells[0].text.split('x')[1])
+            episode_id = int(cells[1].a['href'][8:-5])
+            episode_ids[episode] = episode_id
+
+        if episode_ids:
+            logger.debug('Found episode ids %r', episode_ids)
+        else:
+            logger.warning('No episode ids found')
+
+        soup.decompose()
+        soup = None
+
+        return episode_ids
+
+    def query(self, show_id, series, season, episode, year=None):
+        # get the episode ids
+        episode_ids = self.get_episode_ids(show_id, season)
+        # Provider doesn't store multi episode information
+        episode = min(episode) if episode and isinstance(episode, list) else episode
+
+        if episode not in episode_ids:
+            logger.error('Episode %d not found', episode)
+            return []
+
+        # get the episode page
+        logger.info('Getting the page for episode %d', episode_ids[episode])
+        r = self.session.get(self.server_url + 'episode-%d.html' % episode_ids[episode], timeout=10)
+        soup = ParserBeautifulSoup(r.content, ['lxml', 'html.parser'])
+
+        # loop over subtitles rows
+        subtitles = []
+        for row in soup.select('.subtitlen'):
+            # read the item
+            language = Language.fromtvsubtitles(row.h5.img['src'][13:-4])
+            subtitle_id = int(row.parent['href'][10:-5])
+            page_link = self.server_url + 'subtitle-%d.html' % subtitle_id
+            rip = row.find('p', title='rip').text.strip() or None
+            release = row.find('h5').text.strip() or None
+
+            subtitle = self.subtitle_class(language, page_link, subtitle_id, series, season, episode, year, rip,
+                                           release)
+            logger.info('Found subtitle %s', subtitle)
+            subtitles.append(subtitle)
+
+        soup.decompose()
+        soup = None
+
+        return subtitles
diff --git a/libs/subliminal_patch/providers/utils.py b/libs/subliminal_patch/providers/utils.py
new file mode 100644
index 000000000..7797a24bd
--- /dev/null
+++ b/libs/subliminal_patch/providers/utils.py
@@ -0,0 +1,783 @@
+FIRST_THOUSAND_OR_SO_USER_AGENTS = [
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5",
+    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Windows NT 6.1; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Safari/604.1.38",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.1.2 Safari/603.3.8",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 OPR/48.0.2685.52",
+    "Mozilla/5.0 (iPad; CPU OS 11_0_3 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A432 Safari/604.1",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
+    "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/61.0.3163.100 Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:57.0) Gecko/20100101 Firefox/57.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36 OPR/48.0.2685.39",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/600.5.17 (KHTML, like Gecko) Version/8.0.5 Safari/600.5.17",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/604.3.5 (KHTML, like Gecko) Version/11.0.1 Safari/604.3.5",
+    "Mozilla/5.0 (Windows NT 6.1; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0;  Trident/5.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;  Trident/5.0)",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.62 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:56.0) Gecko/20100101 Firefox/56.0",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.6 (Change: )",
+    "Avant Browser/1.2.789rel1 (http://www.avantbrowser.com)",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.0 Safari/532.5",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.310.0 Safari/532.9",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/9.0.601.0 Safari/534.14",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.14 (KHTML, like Gecko) Chrome/10.0.601.0 Safari/534.14",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.27 (KHTML, like Gecko) Chrome/12.0.712.0 Safari/534.27",
+    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.120 Safari/535.2",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
+    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/18.6.872.0 Safari/535.2 UNTRUSTED/1.0 3gpp-gba UNTRUSTED/1.0",
+    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1061.1 Safari/536.3",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
+    "Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0 x64; en-US; rv:1.9pre) Gecko/2008072421 Minefield/3.0.2pre",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-GB; rv:1.9.0.11) Gecko/2009060215 Firefox/3.0.11 (.NET CLR 3.5.30729)",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB5",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; tr; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8 ( .NET CLR 3.5.30729; .NET4.0E)",
+    "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0a2) Gecko/20110622 Firefox/6.0a2",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+    "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507 Firefox/12.0",
+    "Mozilla/5.0 (Windows NT 6.0; rv:14.0) Gecko/20100101 Firefox/14.0.1",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:15.0) Gecko/20120427 Firefox/15.0a1",
+    "Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:16.0) Gecko/16.0 Firefox/16.0",
+    "Mozilla/5.0 (Windows NT 6.2; rv:19.0) Gecko/20121129 Firefox/19.0",
+    "Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20121202 Firefox/20.0",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Maxthon 2.0)",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0b4pre) Gecko/20100815 Minefield/4.0b4pre",
+    "Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0 )",
+    "Opera/9.80 (Windows NT 5.2; U; en) Presto/2.2.15 Version/10.10",
+    "Opera/9.80 (Windows NT 5.1; U; zh-tw) Presto/2.8.131 Version/11.10",
+    "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.7.62 Version/11.01",
+    "Opera/9.80 (Windows NT 6.1; U; es-ES) Presto/2.9.181 Version/12.00",
+    "Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14",
+    "Mozilla/5.0 (Windows; U; WinNT4.0; en-US; rv:1.2b) Gecko/20021001 Phoenix/0.2",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.23) Gecko/20090825 SeaMonkey/1.1.18",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.1.17) Gecko/20110123 (like Firefox/3.x) SeaMonkey/2.0.12",
+    "Mozilla/5.0 (Windows NT 5.2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+    "Mozilla/5.0 (Windows; U; ; en-NZ) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.8.0",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser; Avant Browser; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.8 (KHTML, like Gecko) Beamrise/17.2.0.9 Chrome/17.0.939.0 Safari/535.8",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.93 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2869.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 AOL/11.0 AOLBUILD/11.0.1305 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3191.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0",
+    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240",
+    "Mozilla/5.0 (MSIE 9.0; Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14931",
+    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063",
+    "Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20130401 Firefox/21.0",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/25.0",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:25.0) Gecko/20100101 Firefox/29.0",
+    "Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0",
+    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:35.0) Gecko/20100101 Firefox/35.0",
+    "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
+    "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:39.0) Gecko/20100101 Firefox/39.0",
+    "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:47.0) Gecko/20100101 Firefox/47.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0",
+    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0",
+    "Mozilla/5.0 (compatible; Konqueror/4.5; Windows) KHTML/4.5.4 (like Gecko)",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US) AppleWebKit/533.1 (KHTML, like Gecko) Maxthon/3.0.8.2 Safari/533.1",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML like Gecko) Maxthon/4.0.0.2000 Chrome/22.0.1229.79 Safari/537.1",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/4.4.6.1000 Chrome/30.0.1599.101 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Maxthon/5.0.4.3000 Chrome/47.0.2526.73 Safari/537.36",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
+    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)",
+    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)",
+    "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; Trident/5.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; WOW64; Trident/5.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0)",
+    "Mozilla/5.0 (compatible; MSIE 10.6; Windows NT 6.1; Trident/5.0; InfoPath.2; SLCC1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET CLR 2.0.50727) 3gpp-gba UNTRUSTED/1.0",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)",
+    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) MxBrowser/4.5.10.7000 Chrome/30.0.1551.0 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; MATBJS; rv:11.0) like Gecko",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; MALNJS; rv:11.0) like Gecko",
+    "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.16",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.12 Safari/537.36 OPR/14.0.1116.4",
+    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.29 Safari/537.36 OPR/15.0.1147.24 (Edition Next)",
+    "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36 OPR/18.0.1284.49",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.76 Safari/537.36 OPR/19.0.1326.56",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36 OPR/20.0.1387.91",
+    "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.76 Safari/537.36 OPR/28.0.1750.40",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 OPR/31.0.1889.174",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 OPR/36.0.2130.46",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36 OPR/47.0.2631.55",
+    "Mozilla/5.0 (Windows NT 10.0; rv:45.9) Gecko/20100101 Goanna/3.2 Firefox/45.9 PaleMoon/27.4.0",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US) AppleWebKit/533.17.8 (KHTML, like Gecko) Version/5.0.1 Safari/533.17.8",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.19.4 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5",
+    "Mozilla/5.0 (Windows; U; Windows NT 6.2; es-US ) AppleWebKit/540.0 (KHTML like Gecko) Version/6.0 Safari/8900.00",
+    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.71 (KHTML like Gecko) WebVideo/1.0.1.10 Version/7.0 Safari/537.71",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20120422 Firefox/12.0 SeaMonkey/2.9",
+    "Mozilla/5.0 (Windows NT 6.0; rv:36.0) Gecko/20100101 Firefox/36.0 SeaMonkey/2.33.1",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 UBrowser/5.6.13705.206 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.89 Vivaldi/1.0.94.2 Safari/537.36",
+    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.90 Safari/537.36 Vivaldi/1.4.589.11",
+    "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.91 Safari/537.36 Vivaldi/1.92.917.39",
+    "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 YaBrowser/17.3.0.1785 Yowser/2.5 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Camino/2.2.1",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre Camino/2.2a1pre",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.302.2 Safari/532.8",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_4; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.464.0 Safari/534.3",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.15 Safari/534.13",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.186 Safari/535.1",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.54 Safari/535.2",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.36 Safari/535.7",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/536.3 (KHTML, like Gecko) Chrome/19.0.1063.0 Safari/536.3",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.79 Safari/537.4",
+    "Mozilla/5.0 (Macintosh; U; Mac OS X Mach-O; en-US; rv:2.0a) Gecko/20040614 Firefox/3.0.0",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.0.3) Gecko/2008092414 Firefox/3.0.3",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.6; en-US; rv:1.9.2.14) Gecko/20110218 AlexaToolbar/alxf-2.0 Firefox/3.6.14",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X 10.5; en-US; rv:1.9.2.15) Gecko/20110303 Firefox/3.6.15",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:5.0) Gecko/20100101 Firefox/5.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:9.0) Gecko/20100101 Firefox/9.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20120813 Firefox/16.0",
+    "Mozilla/4.0 (compatible; MSIE 5.15; Mac_PowerPC)",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en-US) AppleWebKit/125.4 (KHTML, like Gecko, Safari) OmniWeb/v563.15",
+    "Opera/9.0 (Macintosh; PPC Mac OS X; U; en)",
+    "Opera/9.20 (Macintosh; Intel Mac OS X; U; en)",
+    "Opera/9.64 (Macintosh; PPC Mac OS X; U; en) Presto/2.1.1",
+    "Opera/9.80 (Macintosh; Intel Mac OS X; U; en) Presto/2.6.30 Version/10.61",
+    "Opera/9.80 (Macintosh; Intel Mac OS X 10.4.11; U; en) Presto/2.7.62 Version/11.00",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/85.8",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/125.2 (KHTML, like Gecko) Safari/125.8",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; fr-fr) AppleWebKit/312.5 (KHTML, like Gecko) Safari/312.3",
+    "Mozilla/5.0 (Macintosh; U; PPC Mac OS X; en) AppleWebKit/418.8 (KHTML, like Gecko) Safari/419.3",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) AppleWebKit/537.31 (KHTML like Gecko) Chrome/26.0.1410.63 Safari/537.31",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 1083) AppleWebKit/537.36 (KHTML like Gecko) Chrome/28.0.1469.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1664.3 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1944.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2859.0 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.49 Safari/537.36",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:20.0) Gecko/20100101 Firefox/20.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:21.0) Gecko/20100101 Firefox/21.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:35.0) Gecko/20100101 Firefox/35.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:40.0) Gecko/20100101 Firefox/40.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:47.0) Gecko/20100101 Firefox/47.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:49.0) Gecko/20100101 Firefox/49.0",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.13; rv:55.0) Gecko/20100101 Firefox/55.0",
+    "iTunes/4.2 (Macintosh; U; PPC Mac OS X 10.2)",
+    "iTunes/9.0.3 (Macintosh; U; Intel Mac OS X 10_6_2; en-ca)",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Maxthon/4.5.2",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0.112941",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_6; en-US) AppleWebKit/528.16 (KHTML, like Gecko, Safari/528.16) OmniWeb/v622.8.0",
+    "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.118 Safari/537.36 OPR/28.0.1750.51",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.82 Safari/537.36 OPR/29.0.1795.41",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_2; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/531.21.10",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_5; de-de) AppleWebKit/534.15 (KHTML, like Gecko) Version/5.0.3 Safari/533.19.4",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-us) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_7; en-us) AppleWebKit/534.20.8 (KHTML, like Gecko) Version/5.1 Safari/534.20.8",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/534.55.3 (KHTML, like Gecko) Version/5.1.3 Safari/534.53.10",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+ (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/536.26.17 (KHTML like Gecko) Version/6.0.2 Safari/536.26.17",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_5) AppleWebKit/537.78.1 (KHTML like Gecko) Version/7.0.6 Safari/537.78.1",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWebKit/537.75.14 (KHTML, like Gecko) Version/7.0.3 Safari/7046A194A",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/600.8.9 (KHTML, like Gecko) Version/8.0.8 Safari/600.8.9",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11) AppleWebKit/601.1.56 (KHTML, like Gecko) Version/9.0 Safari/601.1.56",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/601.7.8 (KHTML, like Gecko) Version/10.1 Safari/603.1.30",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Safari/602.1.50",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.5; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_3; en-us; Silk/1.0.13.81_10003810) AppleWebKit/533.16 (KHTML, like Gecko) Version/5.0 Safari/533.16 Silk-Accelerated=true",
+    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.105 Safari/537.36 Vivaldi/1.0.162.9",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.4 (KHTML, like Gecko) Chrome/4.0.237.0 Safari/532.4 Debian",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/532.8 (KHTML, like Gecko) Chrome/4.0.277.0 Safari/532.8",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/532.9 (KHTML, like Gecko) Chrome/5.0.309.0 Safari/532.9",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.514.0 Safari/534.7",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/540.0 (KHTML, like Gecko) Ubuntu/10.10 Chrome/9.1.0.0 Safari/540.0",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Chrome/10.0.613.0 Safari/534.15",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.15 (KHTML, like Gecko) Ubuntu/10.10 Chromium/10.0.613.0 Chrome/10.0.613.0 Safari/534.15",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/534.24 (KHTML, like Gecko) Ubuntu/10.10 Chromium/12.0.703.0 Chrome/12.0.703.0 Safari/534.24",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.20 Safari/535.1",
+    "Mozilla/5.0 Slackware/13.37 (X11; U; Linux x86_64; en-US) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.41",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Ubuntu/11.04 Chromium/14.0.825.0 Chrome/14.0.825.0 Safari/535.1",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.2 (KHTML, like Gecko) Ubuntu/11.10 Chromium/15.0.874.120 Chrome/15.0.874.120 Safari/535.2",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.9 Safari/536.5",
+    "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Epiphany/1.2.5",
+    "Mozilla/5.0 (X11; U; Linux i586; en-US; rv:1.7.3) Gecko/20040924 Epiphany/1.4.4 (Ubuntu)",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040614 Firefox/0.8",
+    "Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.11) Gecko/2009060309 Ubuntu/9.10 (karmic) Firefox/3.0.11",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.2) Gecko/20090803 Ubuntu/9.04 (jaunty) Shiretoko/3.5.2",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.5) Gecko/20091107 Firefox/3.5.5",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Linux Mint/8 (Helena) Firefox/3.5.3",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.9) Gecko/20100915 Gentoo Firefox/3.6.9",
+    "Mozilla/5.0 (X11; U; Linux i686; pl-PL; rv:1.9.0.2) Gecko/20121223 Ubuntu/9.25 (jaunty) Firefox/3.8",
+    "Mozilla/5.0 (X11; Linux i686; rv:2.0b6pre) Gecko/20100907 Firefox/4.0b6pre",
+    "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:2.2a1pre) Gecko/20100101 Firefox/4.2a1pre",
+    "Mozilla/5.0 (X11; Linux i686; rv:5.0) Gecko/20100101 Firefox/5.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:7.0a1) Gecko/20110623 Firefox/7.0a1",
+    "Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:10.0.1) Gecko/20100101 Firefox/10.0.1",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.16) Gecko/20120421 Gecko Firefox/11.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20100101 Firefox/12.0",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:14.0) Gecko/20100101 Firefox/14.0.1",
+    "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Galeon/1.3.14",
+    "Mozilla/5.0 (X11; U; Linux ppc; en-US; rv:1.8.1.13) Gecko/20080313 Iceape/1.1.9 (Debian-1.1.9-5)",
+    "Mozilla/5.0 (X11; U; Linux i686; pt-PT; rv:1.9.2.3) Gecko/20100402 Iceweasel/3.6.3 (like Firefox/3.6.3) GTB7.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:5.0) Gecko/20100101 Firefox/5.0 Iceweasel/5.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:6.0a2) Gecko/20110615 Firefox/6.0a2 Iceweasel/6.0a2",
+    "Mozilla/5.0 (X11; Linux i686; rv:14.0) Gecko/20100101 Firefox/14.0.1 Iceweasel/14.0.1",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:15.0) Gecko/20120724 Debian Iceweasel/15.02",
+    "Konqueror/3.0-rc4; (Konqueror/3.0-rc4; i686 Linux;;datecode)",
+    "Mozilla/5.0 (compatible; Konqueror/3.3; Linux 2.6.8-gentoo-r3; X11;",
+    "Mozilla/5.0 (compatible; Konqueror/3.5; Linux 2.6.30-7.dmz.1-liquorix-686; X11) KHTML/3.5.10 (like Gecko) (Debian package 4:3.5.10.dfsg.1-1 b1)",
+    "Mozilla/5.0 (compatible; Konqueror/3.5; Linux; en_US) KHTML/3.5.6 (like Gecko) (Kubuntu)",
+    "Mozilla/5.0 (X11; Linux x86_64; en-US; rv:2.0b2pre) Gecko/20100712 Minefield/4.0b2pre",
+    "Mozilla/5.0 (X11; U; Linux; i686; en-US; rv:1.6) Gecko Debian/1.6-7",
+    "MSIE (MSIE 6.0; X11; Linux; i686) Opera 7.23",
+    "Opera/9.64 (X11; Linux i686; U; Linux Mint; nb) Presto/2.1.1",
+    "Opera/9.80 (X11; Linux i686; U; en) Presto/2.2.15 Version/10.10",
+    "Opera/9.80 (X11; Linux x86_64; U; pl) Presto/2.7.62 Version/11.00",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) QupZilla/1.2.0 Safari/534.34",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.17) Gecko/20110123 SeaMonkey/2.0.12",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1) Gecko/20061024 Firefox/2.0 (Swiftfox)",
+    "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.10.1",
+    "Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.56 Safari/537.4",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1478.0 Safari/537.36",
+    "Mozilla/5.0 (X11; CrOS x86_64 5841.83.0) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.138 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.125 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2166.2 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.93 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.130 Safari/537.36",
+    "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2876.0 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686 (x86_64)) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3187.0 Safari/537.366",
+    "Mozilla/5.0 (X11; Fedora; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3178.0 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.22 (KHTML like Gecko) Ubuntu Chromium/25.0.1364.160 Chrome/25.0.1364.160 Safari/537.22",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/33.0.1750.152 Chrome/33.0.1750.152 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/51.0.2704.79 Chrome/51.0.2704.79 Safari/537.36",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/60.0.3112.78 Chrome/60.0.3112.78 Safari/537.36",
+    "Mozilla/4.0 (compatible; Dillo 3.0)",
+    "Mozilla/5.0 (X11; U; Linux i686; en-us) AppleWebKit/528.5 (KHTML, like Gecko, Safari/528.5 ) lt-GtkLauncher",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.32 (KHTML, like Gecko) Chromium/25.0.1349.2 Chrome/25.0.1349.2 Safari/537.32 Epiphany/3.8.2",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/604.1 (KHTML, like Gecko) Version/11.0 Safari/604.1 Ubuntu/17.04 (3.24.1-0ubuntu1) Epiphany/3.24.1",
+    "Mozilla/5.0 (X11; Linux i686; rv:16.0) Gecko/20100101 Firefox/16.0",
+    "Mozilla/5.0 (X11; U; Linux i686; rv:19.0) Gecko/20100101 Slackware/13 Firefox/19.0",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:20.0) Gecko/20100101 Firefox/20.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:25.0) Gecko/20100101 Firefox/25.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:28.0) Gecko/20100101 Firefox/28.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:32.0) Gecko/20100101 Firefox/32.0",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0",
+    "Mozilla/5.0 (X11; CentOS; Linux x86_64; rv:36.0) Gecko/20100101 Firefox/36.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:40.0) Gecko/20100101 Firefox/40.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:43.0) Gecko/20100101 Firefox/43.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:46.0) Gecko/20100101 Firefox/46.0",
+    "Mozilla/5.0 (X11; Linux i686; rv:49.0) Gecko/20100101 Firefox/49.0",
+    "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0",
+    "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:55.0) Gecko/20100101 Firefox/55.0",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Galeon/2.0.6 (Ubuntu 2.0.6-2)",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.16) Gecko/20080716 (Gentoo) Galeon/2.0.6",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.13) Gecko/20100916 Iceape/2.0.8",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:19.0) Gecko/20100101 Firefox/19.0 Iceweasel/19.0.2",
+    "Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0 Iceweasel/38.2.1",
+    "Mozilla/5.0 (compatible; Konqueror/4.2; Linux) KHTML/4.2.4 (like Gecko) Slackware/13.0",
+    "Mozilla/5.0 (compatible; Konqueror/4.3; Linux) KHTML/4.3.1 (like Gecko) Fedora/4.3.1-3.fc11",
+    "Mozilla/5.0 (compatible; Konqueror/4.4; Linux) KHTML/4.4.1 (like Gecko) Fedora/4.4.1-1.fc12",
+    "Mozilla/5.0 (compatible; Konqueror/4.4; Linux 2.6.32-22-generic; X11; en_US) KHTML/4.4.3 (like Gecko) Kubuntu",
+    "Mozilla/5.0 (compatible; Konqueror/4.4; Linux 2.6.32-22-generic; X11; en_US) KHTML/4.4.3 (like Gecko) Kubuntu",
+    "Mozilla/5.0 (X11; Linux 3.8-6.dmz.1-liquorix-686) KHTML/4.8.4 (like Gecko) Konqueror/4.8",
+    "Mozilla/5.0 (X11; Linux) KHTML/4.9.1 (like Gecko) Konqueror/4.9",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.21 (KHTML, like Gecko) konqueror/4.14.10 Safari/537.21",
+    "Midori/0.1.10 (X11; Linux i686; U; en-us) WebKit/(531).(2)",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.0.3) Gecko/2008092814 (Debian-3.0.1-1)",
+    "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9a3pre) Gecko/20070330",
+    "Opera/9.80 (X11; Linux i686) Presto/2.12.388 Version/12.16",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36 OPR/20.0.1396.73172",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.166 Safari/537.36 OPR/20.0.1396.73172",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36 OPR/32.0.1948.25",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36 OPR/40.0.2308.62",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.8.0.2965AT",
+    "Mozilla/5.0 (X11; Linux i686) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.8.6 Safari/538.1",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.9.0 Safari/538.1",
+    "Mozilla/5.0 (X11; Linux i686; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 SeaMonkey/2.7.1",
+    "Mozilla/5.0 (X11; Linux i686; rv:12.0) Gecko/20120502 Firefox/12.0 SeaMonkey/2.9.1",
+    "Mozilla/5.0 (Windows NT 5.1; rv:38.0) Gecko/20100101 Firefox/38.0 SeaMonkey/2.35",
+    "Mozilla/5.0 (X11; Linux i686; rv:49.0) Gecko/20100101 Firefox/49.0 SeaMonkey/2.46",
+    "Mozilla/5.0 (X11; U; Linux x86_64; us; rv:1.9.1.19) Gecko/20110430 shadowfox/7.0 (like Firefox/7.0",
+    "Mozilla/5.0 (X11; U; Linux i686; it; rv:1.9.2.3) Gecko/20100406 Firefox/3.6.3 (Swiftfox)",
+    "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 Vivaldi/1.0.344.37",
+    "Mozilla/5.0 (X11; U; FreeBSD i386; en-US) AppleWebKit/532.0 (KHTML, like Gecko) Chrome/4.0.207.0 Safari/532.0",
+    "Mozilla/5.0 (X11; U; OpenBSD i386; en-US) AppleWebKit/533.3 (KHTML, like Gecko) Chrome/5.0.359.0 Safari/533.3",
+    "Mozilla/5.0 (X11; U; FreeBSD x86_64; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16",
+    "Mozilla/5.0 (X11; U; SunOS sun4m; en-US; rv:1.4b) Gecko/20030517 Mozilla Firebird/0.6",
+    "Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.9.1b3) Gecko/20090429 Firefox/3.1b3",
+    "Mozilla/5.0 (X11; U; OpenBSD i386; en-US; rv:1.9.1) Gecko/20090702 Firefox/3.5",
+    "Mozilla/5.0 (X11; U; FreeBSD i386; de-CH; rv:1.9.2.8) Gecko/20100729 Firefox/3.6.8",
+    "Mozilla/5.0 (X11; FreeBSD amd64; rv:5.0) Gecko/20100101 Firefox/5.0",
+    "Mozilla/5.0 (X11; U; FreeBSD i386; en-US; rv:1.6) Gecko/20040406 Galeon/1.3.15",
+    "Mozilla/5.0 (compatible; Konqueror/3.5; NetBSD 4.0_RC3; X11) KHTML/3.5.7 (like Gecko)",
+    "Mozilla/5.0 (compatible; Konqueror/3.5; SunOS) KHTML/3.5.1 (like Gecko)",
+    "Mozilla/5.0 (X11; U; FreeBSD; i386; en-US; rv:1.7) Gecko",
+    "Mozilla/4.77 [en] (X11; I; IRIX;64 6.5 IP30)",
+    "Mozilla/4.8 [en] (X11; U; SunOS; 5.7 sun4u)",
+    "Mozilla/5.0 (Unknown; U; UNIX BSD/SYSV system; C -) AppleWebKit/527 (KHTML, like Gecko, Safari/419.3) Arora/0.10.2",
+    "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/536.5 (KHTML like Gecko) Chrome/19.0.1084.56 Safari/536.5",
+    "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.4 (KHTML like Gecko) Chrome/22.0.1229.79 Safari/537.4",
+    "Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36",
+    "Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36",
+    "Mozilla/5.0 (X11; NetBSD x86; en-us) AppleWebKit/666.6+ (KHTML, like Gecko) Chromium/20.0.0000.00 Chrome/20.0.0000.00 Safari/666.6+",
+    "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/535.22+ (KHTML, like Gecko) Chromium/17.0.963.56 Chrome/17.0.963.56 Safari/535.22+ Epiphany/2.30.6",
+    "Mozilla/5.0 (X11; U; OpenBSD arm; en-us) AppleWebKit/531.2 (KHTML, like Gecko) Safari/531.2 Epiphany/2.30.0",
+    "Mozilla/5.0 (X11; NetBSD amd64; rv:16.0) Gecko/20121102 Firefox/16.0",
+    "Mozilla/5.0 (X11; OpenBSD amd64; rv:28.0) Gecko/20100101 Firefox/28.0",
+    "Mozilla/5.0 (X11; NetBSD amd64; rv:30.0) Gecko/20100101 Firefox/30.0",
+    "Mozilla/5.0 (X11; OpenBSD amd64; rv:30.0) Gecko/20100101 Firefox/30.0",
+    "Mozilla/5.0 (X11; FreeBSD amd64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36",
+    "Mozilla/5.0 (X11; FreeBSD amd64; rv:54.0) Gecko/20100101 Firefox/54.0",
+    "Mozilla/5.0 (compatible; Konqueror/4.1; DragonFly) KHTML/4.1.4 (like Gecko)",
+    "Mozilla/5.0 (compatible; Konqueror/4.1; OpenBSD) KHTML/4.1.4 (like Gecko)",
+    "Mozilla/5.0 (compatible; Konqueror/4.5; NetBSD 5.0.2; X11; amd64; en_US) KHTML/4.5.4 (like Gecko)",
+    "Mozilla/5.0 (compatible; Konqueror/4.5; FreeBSD) KHTML/4.5.4 (like Gecko)",
+    "Mozilla/5.0 (X11; U; NetBSD amd64; en-US; rv:1.9.2.15) Gecko/20110308 Namoroka/3.6.15",
+    "NetSurf/1.2 (NetBSD; amd64)",
+    "Opera/9.80 (X11; FreeBSD 8.1-RELEASE i386; Edition Next) Presto/2.12.388 Version/12.10",
+    "Mozilla/5.0 (Unknown; UNIX BSD/SYSV system) AppleWebKit/538.1 (KHTML, like Gecko) QupZilla/1.7.0 Safari/538.1",
+    "Mozilla/5.0 (X11; U; SunOS i86pc; en-US; rv:1.8.1.12) Gecko/20080303 SeaMonkey/1.1.8",
+    "Mozilla/5.0 (X11; FreeBSD i386; rv:28.0) Gecko/20100101 Firefox/28.0 SeaMonkey/2.25",
+    "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; BOLT/2.800) AppleWebKit/534.6 (KHTML, like Gecko) Version/5.0 Safari/534.6.3",
+    "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0",
+    "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch)",
+    "Mozilla/1.22 (compatible; MSIE 5.01; PalmOS 3.0) EudoraWeb 2.1",
+    "Mozilla/5.0 (WindowsCE 6.0; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
+    "Mozilla/5.0 (X11; U; Linux armv61; en-US; rv:1.9.1b2pre) Gecko/20081015 Fennec/1.0a1",
+    "Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+    "Mozilla/5.0 (Maemo; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1",
+    "Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0",
+    "Mozilla/5.0 (Windows; U; Windows CE 5.1; rv:1.8.1a3) Gecko/20060610 Minimo/0.016",
+    "Mozilla/5.0 (X11; U; Linux armv6l; rv 1.8.1.5pre) Gecko/20070619 Minimo/0.020",
+    "Mozilla/5.0 (X11; U; Linux arm7tdmi; rv:1.8.1.11) Gecko/20071130 Minimo/0.025",
+    "Mozilla/4.0 (PDA; PalmOS/sony/model prmr/Revision:1.1.54 (en)) NetFront/3.0",
+    "Opera/9.51 Beta (Microsoft Windows; PPC; Opera Mobi/1718; U; en)",
+    "Opera/9.60 (J2ME/MIDP; Opera Mini/4.1.11320/608; U; en) Presto/2.2.0",
+    "Opera/9.60 (J2ME/MIDP; Opera Mini/4.2.14320/554; U; cs) Presto/2.2.0",
+    "Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00",
+    "Opera/10.61 (J2ME/MIDP; Opera Mini/5.1.21219/19.999; en-US; rv:1.9.3a5) WebKit/534.5 Presto/2.6.30",
+    "Opera/9.80 (Android; Opera Mini/7.5.33361/31.1543; U; en) Presto/2.8.119 Version/11.1010",
+    "Opera/9.80 (J2ME/MIDP; Opera Mini/8.0.35626/37.8918; U; en) Presto/2.12.423 Version/12.16",
+    "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+    "Opera/9.80 (Android; Opera Mini/9.0.1829/66.318; U; en) Presto/2.12.423 Version/12.16",
+    "Opera/9.80 (Linux i686; Opera Mobi/1040; U; en) Presto/2.5.24 Version/10.00",
+    "POLARIS/6.01 (BREW 3.1.5; U; en-us; LG; LX265; POLARIS/6.01/WAP) MMP/2.0 profile/MIDP-2.1 Configuration/CLDC-1.1",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AP",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AT",
+    "Mozilla/5.0 (iPod; U; CPU iPhone OS 6_1 like Mac OS X; en-HK) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IP Mobile",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-AU) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IT",
+    "Mozilla/5.0 (X11; U; Linux i686; en-gb) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.0.5603M",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+    "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7) UCBrowser/2.9.0.263",
+    "Mozilla/5.0 (Linux; U; Android 2.3.3; en-us ; LS670 Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1/UCBrowser/8.6.1.262/145/355",
+    "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+    "Mozilla/5.0 (Linux; U; Android 4.1; en-us; sdk Build/MR1) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.1 Safari/534.30",
+    "Mozilla/5.0 (Linux; U; Android 4.2; en-us; sdk Build/MR1) AppleWebKit/535.19 (KHTML, like Gecko) Version/4.2 Safari/535.19",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-us) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/2.9174AT",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-AU) AppleWebKit/534.35 (KHTML, like Gecko) Chrome/11.0.696.65 Safari/534.35 Puffin/3.9174IT",
+    "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko ) Version/5.1 Mobile/9B176 Safari/7534.48.3",
+    "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+    "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML like Gecko) Mobile/12A405 Version/7.0 Safari/9537.53",
+    "Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
+    "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1",
+    "Mozilla/5.0 (iPad; CPU OS 10_0 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/49.0.2623.109 Mobile/14A5335b Safari/601.1.46",
+    "Mozilla/5.0 (iPad; CPU OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7;en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17",
+    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true",
+    "Mozilla/5.0 (Linux; Android 4.4.2; LG-V410 Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+    "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
+    "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
+    "Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; GT-P5210 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
+    "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+    "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T530NU Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+    "Mozilla/4.0 (compatible; Linux 2.6.22) NetFront/3.4 Kindle/2.0 (screen 600x800)",
+    "Mozilla/5.0 (Linux U; en-US) AppleWebKit/528.5 (KHTML, like Gecko, Safari/528.5 ) Version/4.0 Kindle/3.0 (screen 600x800; rotate)",
+    "Mozilla/5.0 (X11; U; Linux armv7l like Android; en-us) AppleWebKit/531.2+ (KHTML, like Gecko) Version/5.0 Safari/533.2+ Kindle/3.0+",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K) AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19 Silk-Accelerated=true",
+    "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_3 like Mac OS X; en-us) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8F190 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; U; CPU iPad OS 5_0_1 like Mac OS X; en-us) AppleWebKit/535.1+ (KHTML like Gecko) Version/7.2.0.0 Safari/6533.18.5",
+    "Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5355d Safari/8536.25",
+    "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25 (3B92C18B-D9DE-4CB7-A02A-22FD2AF17C8F)",
+    "Mozilla/5.0 (iPad; CPU OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
+    "Mozilla/5.0 (iPad; CPU OS 8_0_2 like Mac OS X) AppleWebKit/600.1.4 (KHTML like Gecko) Mobile/12A405 Version/7.0 Safari/9537.53",
+    "Mozilla/5.0 (iPad; CPU OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12H321 Safari/600.1.4",
+    "Mozilla/5.0 (iPad; CPU OS 9_3_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13F69 Safari/601.1",
+    "Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.114 Safari/537.36 Puffin/4.5.0IT",
+    "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.200",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/531.22.7",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A403 Safari/8536.25",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 8_3 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12F70 Safari/600.1.4",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 8_4_1 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/8.0.57838 Mobile/12H321 Safari/600.1.4",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) Version/10.0 Mobile/14A346 Safari/602.1",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) GSA/18.0.130791545 Mobile/14A5345a Safari/600.1.4",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+    "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11a Safari/525.20",
+    "Mozilla/5.0 (iPod; U; CPU iPhone OS 3_1_1 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Mobile/7C145",
+    "Mozilla/5.0 (iPod touch; CPU iPhone OS 7_1 like Mac OS X) AppleWebKit/537.51.2 (KHTML like Gecko) Version/7.0 Mobile/11D167 Safari/123E71C",
+    "Mozilla/5.0 (iPod; CPU iPhone OS 8_4 like Mac OS X) AppleWebKit/600.1.4 (KHTML, like Gecko) CriOS/44.0.2403.67 Mobile/12H143 Safari/600.1.4",
+    "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7;en-us) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.3.4; en-us; BNTV250 Build/GINGERBREAD) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Safari/533.1",
+    "Mozilla/5.0 (Linux; Android 4.0.4; BNTV400 Build/IMM76L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Safari/537.36",
+    "BlackBerry7100i/4.1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/103",
+    "BlackBerry8300/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/107 UP.Link/6.2.3.15.0",
+    "BlackBerry8320/4.2.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/100",
+    "BlackBerry8330/4.3.0 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/105",
+    "BlackBerry9000/4.6.0.167 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/102",
+    "BlackBerry9530/4.7.0.167 Profile/MIDP-2.0 Configuration/CLDC-1.1 VendorID/102 UP.Link/6.3.1.20.0",
+    "BlackBerry9700/5.0.0.351 Profile/MIDP-2.1 Configuration/CLDC-1.1 VendorID/123",
+    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9800; en) AppleWebKit/534.1 (KHTML, Like Gecko) Version/6.0.0.141 Mobile Safari/534.1",
+    "Mozilla/5.0 (BlackBerry; U; BlackBerry 9930; en-US) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.267 Mobile Safari/534.11+",
+    "Mozilla/5.0 (Linux; Android 7.1.1; BBB100-1 Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+    "Mozilla/5.0 (PlayBook; U; RIM Tablet OS 2.1.0; en-US) AppleWebKit/536.2+ (KHTML like Gecko) Version/7.2.1.0 Safari/536.2+",
+    "Mozilla/5.0 (BB10; Touch) AppleWebKit/537.10+ (KHTML, like Gecko) Version/10.1.0.2342 Mobile Safari/537.10+",
+    "Mozilla/5.0 (Linux; Android 5.1.1; Coolpad 3622A Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.1.1; Coolpad 3632A Build/NMF26F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 1.5; en-us; sdk Build/CUPCAKE) AppleWebkit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 6.0; Nexus 5X Build/MDB08L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.1.2; Nexus 6P Build/N2G48C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.4; Nexus 7 Build/KTU84P) AppleWebKit/537.36 (KHTML like Gecko) Chrome/36.0.1985.135 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+    "Mozilla/5.0 (Linux; Android 7.0; Nexus 9 Build/NRD90R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.1.2; Pixel Build/NHG47N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.83 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (hp-tablet; Linux; hpwOS/3.0.2; U; de-DE) AppleWebKit/534.6 (KHTML, like Gecko) wOSBrowser/234.40.1 Safari/534.6 TouchPad/1.0",
+    "Mozilla/5.0 (Linux; webOS/2.2.4; U; en-US) AppleWebKit/534.6 (KHTML, like Gecko) webOSBrowser/221.56 Safari/534.6 Pre/3.0",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) Sprint:PPC6800",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) XV6800",
+    "Mozilla/5.0 (Linux; U; Android 1.5; en-us; htc_bahamas Build/CRB17) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.1-update1; de-de; HTC Desire 1.19.161.5 Build/ERE27) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "HTC_Dream Mozilla/5.0 (Linux; U; Android 1.5; en-ca; Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 1.5; de-ch; HTC Hero Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 2.1; en-us; HTC Legend Build/cupcake) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 1.5; de-de; HTC Magic Build/PLAT-RC33) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1 FirePHP/0.3",
+    "Mozilla/5.0 (Linux; Android 6.0; HTC One M9 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+    "HTC-ST7377/1.59.502.3 (67150) Opera/9.50 (Windows NT 5.1; U; en) UP.Link/6.3.1.17.0",
+    "Mozilla/5.0 (Linux; U; Android 1.6; en-us; HTC_TATTOO_A3288 Build/DRC79) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; Android 6.0; ALE-L21 Build/HuaweiALE-L21) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.89 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.1; C6740N Build/LMY47O) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.111 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 4.1.2; en-us; LG-P870/P87020d Build/JZO54K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+    "LG-LX550 AU-MIC-LX550/2.0 MMP/2.0 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Mozilla/5.0 (Linux; Android 6.0; LG-D850 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.97 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; LG-H918 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; LGL84VL Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; LGUS997 Build/NRD90U) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.2; LGMS323 Build/KOT49I.MS32310b) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Mobile Safari/537.36",
+    "POLARIS/6.01(BREW 3.1.5;U;en-us;LG;LX265;POLARIS/6.01/WAP;)MMP/2.0 profile/MIDP-201 Configuration /CLDC-1.1",
+    "LG-GC900/V10a Obigo/WAP2.0 Profile/MIDP-2.1 Configuration/CLDC-1.1",
+    "Mozilla/5.0 (Linux; Android 4.4.2; LG-V410 Build/KOT49I.V41010d) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.103 Safari/537.36",
+    "Mozilla/4.0 (compatible; MSIE 4.01; Windows CE; PPC; MDA Pro/1.0 Profile/MIDP-2.0 Configuration/CLDC-1.1)",
+    "Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+    "Mozilla/5.0 (Linux; U; Android 1.5; en-us; T-Mobile G1 Build/CRB43) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari 525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 1.5; en-gb; T-Mobile_G2_Touch Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Droid Build/FRG22D) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "MOT-L7v/08.B7.5DR MIB/2.2.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+    "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Milestone Build/ SHOLS_U2_01.03.1) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.0.1; de-de; Milestone Build/SHOLS_U2_01.14.0) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; Android 7.0; Moto G (5) Plus Build/NPNS25.137-35-5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.1.1; XT1710-02 Build/NDS26.74-36) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.125 Mobile Safari/537.36",
+    "MOT-V9mm/00.62 UP.Browser/6.2.3.4.c.1.123 (GUI) MMP/2.0",
+    "MOTORIZR-Z8/46.00.00 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 356) Opera 8.65 [it] UP.Link/6.3.0.0.0",
+    "MOT-V177/0.1.75 UP.Browser/6.2.3.9.c.12 (GUI) MMP/2.0 UP.Link/6.3.1.13.0",
+    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+    "Mozilla/5.0 (Linux; Android 4.4.4; XT1032 Build/KXB21.14-L1.61) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36",
+    "portalmmm/2.0 N410i(c20;TB)",
+    "Nokia3230/2.0 (5.0614.0) SymbianOS/7.0s Series60/2.1 Profile/MIDP-2.0 Configuration/CLDC-1.0",
+    "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia5700/3.27; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+    "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 Nokia6120c/3.70; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+    "Nokia6230/2.0 (04.44) Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Nokia6230i/2.0 (03.80) Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Mozilla/4.1 (compatible; MSIE 5.0; Symbian OS; Nokia 6600;452) Opera 6.20 [en-US]",
+    "Nokia6630/1.0 (2.39.15) SymbianOS/8.0 Series60/2.6 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Nokia7250/1.0 (3.14) Profile/MIDP-1.0 Configuration/CLDC-1.0",
+    "Mozilla/4.0 (compatible; MSIE 5.0; Series80/2.0 Nokia9500/4.51 Profile/MIDP-2.0 Configuration/CLDC-1.1)",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC6-01/011.010; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.2 3gpp-gba",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaC7-00/012.003; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.3 3gpp-gba",
+    "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es50",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaE6-00/021.002; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.16 Mobile Safari/533.4 3gpp-gba",
+    "UCWEB/8.8 (SymbianOS/9.2; U; en-US; NokiaE63) AppleWebKit/534.1 UCBrowser/8.8.0.245 Mobile",
+    "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es65",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaE7-00/010.016; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.7.3 3gpp-gba",
+    "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413 es70",
+    "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.2.3.18.0",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 630) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 635) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 920) like Geckoo",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko",
+    "NokiaN70-1/5.0609.2.0.1 Series60/2.8 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.1.13.0",
+    "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+    "NokiaN73-1/3.0649.0.0.1 Series60/3.0 Profile/MIDP2.0 Configuration/CLDC-1.1",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/014.002; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.4 3gpp-gba",
+    "Mozilla/5.0 (SymbianOS/9.1; U; en-us) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+    "Mozilla/5.0 (MeeGo; NokiaN9) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
+    "Mozilla/5.0 (SymbianOS/9.1; U; de) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
+    "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaN95/10.0.018; Profile/MIDP-2.0 Configuration/CLDC-1.1) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.3.0.0.0",
+    "Mozilla/5.0 (MeeGo; NokiaN950-00/00) AppleWebKit/534.13 (KHTML, like Gecko) NokiaBrowser/8.5.0 Mobile Safari/534.13",
+    "Mozilla/5.0 (SymbianOS/9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/021.004; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.21 Mobile Safari/533.4 3gpp-gba",
+    "Mozilla/5.0 (webOS/1.3; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Desktop/1.0",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
+    "SEC-SGHE900/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1 Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1378; nl; U; ssr)",
+    "Mozilla/5.0 (Linux; U; Android 1.5; de-de; Galaxy Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; SCH-I800 Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+    "Mozilla/5.0 (Linux; Android 4.3; SPH-L710 Build/JSS15J) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.99 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.0.1; SCH-R970 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-G900A Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.94 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 4.4.2; en-us; GT-P5210 Build/KOT49H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30",
+    "Mozilla/5.0 (Linux; U; Android 3.0.1; en-us; GT-P7100 Build/HRI83) AppleWebkit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+    "SAMSUNG-S8000/S8000XXIF3 SHP/VPP/R5 Jasmine/1.0 Nextreaming SMM-MMS/1.2.0 profile/MIDP-2.1 configuration/CLDC-1.1 FirePHP/0.3",
+    "Mozilla/5.0 (Linux; U; Android 1.5; en-us; SPH-M900 Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "SAMSUNG-SGH-A867/A867UCHJ3 SHP/VPP/R5 NetFront/35 SMM-MMS/1.2.0 profile/MIDP-2.0 configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+    "SEC-SGHX210/1.0 UP.Link/6.3.1.13.0",
+    "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900H Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; SAMSUNG SM-G925R6 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/5.4 Chrome/51.0.2704.106 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+    "Mozilla/5.0 (Linux; U; Android 1.5; fr-fr; GT-I5700 Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "SEC-SGHX820/1.0 NetFront/3.2 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonK310iv/R4DA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.1.13.0",
+    "SonyEricssonK550i/R1JD Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonK610i/R1CB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonK750i/R1CA Browser/SEMC-Browser/4.2 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Opera/9.80 (J2ME/MIDP; Opera Mini/5.0.16823/1428; U; en) Presto/2.2.0",
+    "SonyEricssonK800i/R1CB Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+    "SonyEricssonK810i/R1KG Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Opera/8.01 (J2ME/MIDP; Opera Mini/1.0.1479/HiFi; SonyEricsson P900; no; U; ssr)",
+    "SonyEricssonS500i/R6BC Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "Mozilla/5.0 (SymbianOS/9.4; U; Series60/5.0 SonyEricssonP100/01; Profile/MIDP-2.1 Configuration/CLDC-1.1) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 Safari/525",
+    "SonyEricssonT68/R201A",
+    "SonyEricssonT100/R101",
+    "SonyEricssonT610/R201 Profile/MIDP-1.0 Configuration/CLDC-1.0",
+    "SonyEricssonT650i/R7AA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonW580i/R6BC Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonW660i/R6AD Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonW810i/R4EA Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+    "SonyEricssonW850i/R1ED Browser/NetFront/3.3 Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonW950i/R100 Mozilla/4.0 (compatible; MSIE 6.0; Symbian OS; 323) Opera 8.60 [en-US]",
+    "SonyEricssonW995/R1EA Profile/MIDP-2.1 Configuration/CLDC-1.1 UNTRUSTED/1.0",
+    "Mozilla/5.0 (Linux; U; Android 1.6; es-es; SonyEricssonX10i Build/R1FA016) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 1.6; en-us; SonyEricssonX10i Build/R1AA056) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Opera/9.5 (Microsoft Windows; PPC; Opera Mobi; U) SonyEricssonX1i/R2AA Profile/MIDP-2.0 Configuration/CLDC-1.1",
+    "SonyEricssonZ800/R1Y Browser/SEMC-Browser/4.1 Profile/MIDP-2.0 Configuration/CLDC-1.1 UP.Link/6.3.0.0.0",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+    "Opera/9.80 (Android; Opera Mini/7.5.33361/31.1543; U; en) Presto/2.8.119 Version/11.1010",
+    "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0",
+    "Mozilla/5.0 (Android 6.0.1; Mobile; rv:48.0) Gecko/48.0 Firefox/48.0",
+    "Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522 (KHTML, like Gecko) Safari/419.3",
+    "Mozilla/5.0 (Linux; U; Android 1.1; en-gb; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+    "HTC_Dream Mozilla/5.0 (Linux; U; Android 1.5; en-ca; Build/CUPCAKE) AppleWebKit/528.5 (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1",
+    "Mozilla/5.0 (Linux; U; Android 2.0; en-us; Droid Build/ESD20) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.1; en-us; Nexus One Build/ERD62) AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Sprint APA9292KT Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-us; ADR6300 Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Linux; U; Android 2.2; en-ca; GT-P1000M Build/FROYO) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
+    "Mozilla/5.0 (Android; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+    "Mozilla/5.0 (Linux; U; Android 3.0.1; fr-fr; A500 Build/HRI66) AppleWebKit/534.13 (KHTML, like Gecko) Version/4.0 Safari/534.13",
+    "Mozilla/5.0 (Linux; U; Android 3.0; en-us; Xoom Build/HRI39) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+    "Mozilla/5.0 (Linux; U; Android 4.0.3; de-de; Galaxy S II Build/GRJ22) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30",
+    "Opera/9.80 (Android 4.0.4; Linux; Opera Mobi/ADR-1205181138; U; pl) Presto/2.10.254 Version/12.00",
+    "Mozilla/5.0 (Android; Linux armv7l; rv:10.0.1) Gecko/20100101 Firefox/10.0.1 Fennec/10.0.1",
+    "Mozilla/5.0 (Linux; Android 4.1.2; SHV-E250S Build/JZO54K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.82 Mobile Safari/537.36",
+    "Mozilla/5.0 (Android 4.2; rv:19.0) Gecko/20121129 Firefox/19.0",
+    "Mozilla/5.0 (Linux; U; Android 4.3; en-us; sdk Build/MR1) AppleWebKit/536.23 (KHTML, like Gecko) Version/4.3 Mobile Safari/536.23",
+    "Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.2; SAMSUNG-SM-T537A Build/KOT49H) AppleWebKit/537.36 (KHTML like Gecko) Chrome/35.0.1916.141 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 4.4.2; SM-T230NU Build/KOT49H) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.81 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.0.1; SCH-R970 Build/LRX22C) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.84 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.0.2; SAMSUNG SM-T530NU Build/LRX22G) AppleWebKit/537.36 (KHTML, like Gecko) SamsungBrowser/3.2 Chrome/38.0.2125.102 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 7 Build/LMY47V) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.78 Safari/537.36 OPR/30.0.1856.93524",
+    "Mozilla/5.0 (Linux; Android 6.0; HTC One M9 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 6.0; LG-D850 Build/MRA58K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.97 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 6.0; Nexus 5X Build/MDB08L) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 6.0.1; SM-G900H Build/MMB29K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.98 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; Nexus 9 Build/NRD90R) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.124 Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 7.0; LG-H918 Build/NRD90M) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (Linux; Android 8.0.0; Pixel XL Build/OPR6.170623.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.107 Mobile Safari/537.36",
+    "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420 (KHTML, like Gecko) Version/3.0 Mobile/1A543a Safari/419.3",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 2_0 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5A347 Safari/525.200",
+    "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_2_1 like Mac OS X; en-us) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5H11a Safari/525.20",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16",
+    "Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.10",
+    "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; ja-jp) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_2_1 like Mac OS X; da-dk) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3 like Mac OS X; de-de) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8F190",
+    "MobileSafari/600.1.4 CFNetwork/711.1.12 Darwin/14.0.0",
+    "Mozilla/5.0 (iPhone; U; CPU iPhone OS 5_1_1 like Mac OS X; da-dk) AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/19.0.1084.60 Mobile/9B206 Safari/7534.48.3",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 9_2 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13C75 Safari/601.1",
+    "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A5362a Safari/604.1",
+    "Mozilla/5.0 (X11; Linux i686 on x86_64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+    "Mozilla/5.0 (Maemo; Linux armv7l; rv:2.0.1) Gecko/20100101 Firefox/4.0.1 Fennec/2.0.1",
+    "Mozilla/5.0 (webOS/1.3; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Desktop/1.0",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; PalmSource/hspr-H102; Blazer/4.0) 16;320x320",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaN8-00/014.002; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) Version/3.0 BrowserNG/7.2.6.4 3gpp-gba",
+    "Mozilla/5.0 (Symbian/3; Series60/5.2 NokiaX7-00/021.004; Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/533.4 (KHTML, like Gecko) NokiaBrowser/7.3.1.21 Mobile Safari/533.4 3gpp-gba",
+    "Mozilla/5.0 (SymbianOS/9.2; U; Series60/3.1 NokiaE90-1/07.24.0.3; Profile/MIDP-2.0 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413 UP.Link/6.2.3.18.0",
+    "Mozilla/5.0 (SymbianOS 9.4; Series60/5.0 NokiaN97-1/10.0.012; Profile/MIDP-2.1 Configuration/CLDC-1.1; en-us) AppleWebKit/525 (KHTML, like Gecko) WicKed/7.1.12344",
+    "Opera/9.80 (S60; SymbOS; Opera Mobi/499; U; ru) Presto/2.4.18 Version/10.00",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 6.12; Microsoft ZuneHD 4.3)",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11)",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.11) Sprint:PPC6800",
+    "Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 8.12; MSIEMobile6.0)",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0) Asus;Galaxy6",
+    "Mozilla/4.0 (compatible; MSIE 7.0; Windows Phone OS 7.0; Trident/3.1; IEMobile/7.0)",
+    "Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0)",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch)",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 530) like Gecko",
+    "Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; IEMobile/10.0; ARM; Touch; NOKIA; Lumia 920)",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 630) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 635) like Gecko",
+    "Mozilla/5.0 (Windows NT 6.2; ARM; Trident/7.0; Touch; rv:11.0; WPDesktop; NOKIA; Lumia 920) like Geckoo",
+    "Mozilla/5.0 (Windows Phone 8.1; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 920) like Gecko",
+    "Mozilla/5.0 (Mobile; Windows Phone 8.1; Android 4.0; ARM; Trident/7.0; Touch; rv:11.0; IEMobile/11.0; NOKIA; Lumia 929) like iPhone OS 7_0_3 Mac OS X AppleWebKit/537 (KHTML, like Gecko) Mobile Safari/537",
+    "Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; DEVICE INFO) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Mobile Safari/537.36 Edge/12.0",
+    "Mozilla/5.0 (Windows NT 10.0; ARM; Lumia 950 Dual SIM) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393",
+
+]
diff --git a/libs/subliminal_patch/refiners/__init__.py b/libs/subliminal_patch/refiners/__init__.py
new file mode 100644
index 000000000..9bad5790a
--- /dev/null
+++ b/libs/subliminal_patch/refiners/__init__.py
@@ -0,0 +1 @@
+# coding=utf-8
diff --git a/libs/subliminal_patch/refiners/common.py b/libs/subliminal_patch/refiners/common.py
new file mode 100644
index 000000000..eda3c967c
--- /dev/null
+++ b/libs/subliminal_patch/refiners/common.py
@@ -0,0 +1,32 @@
+# coding=utf-8
+
+import logging
+import os
+
+from guessit import guessit
+from subliminal import Episode
+from subliminal_patch.core import remove_crap_from_fn
+
+logger = logging.getLogger(__name__)
+
+
+def update_video(video, fn):
+    guess_from = remove_crap_from_fn(fn)
+
+    logger.debug(u"Got original filename: %s", guess_from)
+
+    # guess
+    hints = {
+        "single_value": True,
+        "type": "episode" if isinstance(video, Episode) else "movie",
+    }
+
+    guess = guessit(guess_from, options=hints)
+
+    for attr in ("release_group", "format",):
+        if attr in guess:
+            value = guess.get(attr)
+            logger.debug(u"%s: Filling attribute %s: %s", video.name, attr, value)
+            setattr(video, attr, value)
+
+    video.original_name = os.path.basename(guess_from)
diff --git a/libs/subliminal_patch/refiners/drone.py b/libs/subliminal_patch/refiners/drone.py
new file mode 100644
index 000000000..d0a5cb628
--- /dev/null
+++ b/libs/subliminal_patch/refiners/drone.py
@@ -0,0 +1,318 @@
+# coding=utf-8
+
+import logging
+import types
+import os
+import datetime
+
+from guessit import guessit
+from requests.compat import urljoin, quote
+from subliminal import Episode, Movie, region
+from subliminal_patch.core import remove_crap_from_fn
+from subliminal_patch.http import CertifiSession
+
+logger = logging.getLogger(__name__)
+
+
+class DroneAPIClient(object):
+    api_url = None
+    _fill_attrs = None
+
+    def __init__(self, version=1, session=None, headers=None, timeout=10, base_url=None, api_key=None,
+                 ssl_no_verify=False):
+        headers = dict(headers or {}, **{"X-Api-Key": api_key})
+
+        #: Session for the requests
+        self.session = session or CertifiSession()
+        if ssl_no_verify:
+            self.session.verify = False
+
+        self.session.timeout = timeout
+        self.session.headers.update(headers or {})
+
+        if not base_url.endswith("/"):
+            base_url += "/"
+
+        if not base_url.startswith("http"):
+            base_url = "http://%s" % base_url
+
+        if not base_url.endswith("api/"):
+            self.api_url = urljoin(base_url, "api/")
+
+    def get_guess(self, video, scene_name):
+        raise NotImplemented
+
+    def get_additional_data(self, video):
+        raise NotImplemented
+
+    def build_params(self, params):
+        """
+        quotes values and converts keys of params to camelCase from underscore
+        :param params: dict
+        :return:
+        """
+        out = {}
+        for key, value in params.iteritems():
+            if not isinstance(value, types.StringTypes):
+                value = str(value)
+
+            elif isinstance(value, unicode):
+                value = value.encode("utf-8")
+
+            key = key.split('_')[0] + ''.join(x.capitalize() for x in key.split('_')[1:])
+            out[key] = quote(value)
+        return out
+
+    def get(self, endpoint, **params):
+        url = urljoin(self.api_url, endpoint)
+        params = self.build_params(params)
+
+        # perform the request
+        r = self.session.get(url, params=params)
+        r.raise_for_status()
+
+        # get the response as json
+        j = r.json()
+
+        # check response status
+        if j:
+            return j
+        return []
+
+    def status(self):
+        return self.get("system/status")
+
+    def update_video(self, video, scene_name):
+        """
+        update video attributes based on scene_name
+        :param video:
+        :param scene_name:
+        :return:
+        """
+        scene_fn, guess = self.get_guess(video, scene_name)
+        video_fn = os.path.basename(video.name)
+        for attr in self._fill_attrs:
+            if attr in guess:
+                value = guess.get(attr)
+                logger.debug(u"%s: Filling attribute %s: %s", video_fn, attr, value)
+                setattr(video, attr, value)
+
+        video.original_name = scene_fn
+
+
+def sonarr_series_cache_key(namespace, fn, **kw):
+    def generate_key(*arg):
+        return "sonarr_series"
+    return generate_key
+
+
+class SonarrClient(DroneAPIClient):
+    needs_attrs_to_work = ("series", "season", "episode",)
+    _fill_attrs = ("release_group", "format",)
+    cfg_name = "sonarr"
+
+    def __init__(self, base_url="http://127.0.0.1:8989/", **kwargs):
+        super(SonarrClient, self).__init__(base_url=base_url, **kwargs)
+
+    @region.cache_on_arguments(should_cache_fn=lambda x: bool(x),
+                               function_key_generator=sonarr_series_cache_key)
+    def get_all_series(self):
+        return self.get("series")
+
+    def get_show_id(self, video):
+        def is_correct_show(s):
+            return s["title"] == video.series or (video.series_tvdb_id and "tvdbId" in s and
+                                                  s["tvdbId"] == video.series_tvdb_id)
+
+        for show in self.get_all_series():
+            if is_correct_show(show):
+                return show["id"]
+
+        logger.debug(u"%s: Show not found, refreshing cache: %s", video.name, video.series)
+        for show in self.get_all_series.refresh(self):
+            if is_correct_show(show):
+                return show["id"]
+
+    def get_additional_data(self, video):
+        for attr in self.needs_attrs_to_work:
+            if getattr(video, attr, None) is None:
+                logger.debug(u"%s: Not enough data available for Sonarr", video.name)
+                return
+
+        found_show_id = self.get_show_id(video)
+
+        if not found_show_id:
+            logger.debug(u"%s: Show not found in Sonarr: %s", video.name, video.series)
+            return
+
+        episode_fn = os.path.basename(video.name)
+
+        for episode in self.get("episode", series_id=found_show_id):
+            episode_file = episode.get("episodeFile", {})
+            if os.path.basename(episode_file.get("relativePath", "")) == episode_fn:
+                scene_name = episode_file.get("sceneName")
+                original_filepath = episode_file.get("originalFilePath")
+
+                data = {}
+                if scene_name:
+                    logger.debug(u"%s: Got scene filename from Sonarr: %s", episode_fn, scene_name)
+                    data["scene_name"] = scene_name
+
+                if original_filepath:
+                    logger.debug(u"%s: Got original file path from Sonarr: %s", episode_fn, original_filepath)
+                    data["original_filepath"] = original_filepath
+
+                if data:
+                    return data
+
+                logger.debug(u"%s: Can't get original filename, sceneName-attribute not set", episode_fn)
+                return
+
+        logger.debug(u"%s: Episode not found in Sonarr: S%02dE%02d", episode_fn, video.season, video.episode)
+
+    def get_guess(self, video, scene_name):
+        """
+        run guessit on scene_name
+        :param video:
+        :param scene_name:
+        :return:
+        """
+        ext = os.path.splitext(video.name)[1]
+        guess_from = remove_crap_from_fn(scene_name + ext)
+
+        # guess
+        hints = {
+            "single_value": True,
+            "type": "episode",
+        }
+
+        return guess_from, guessit(guess_from, options=hints)
+
+
+def radarr_movies_cache_key(namespace, fn, **kw):
+    def generate_key(*arg):
+        return "radarr_movies"
+    return generate_key
+
+
+class RadarrClient(DroneAPIClient):
+    needs_attrs_to_work = ("title",)
+    _fill_attrs = ("release_group", "format",)
+    cfg_name = "radarr"
+
+    def __init__(self, base_url="http://127.0.0.1:7878/", **kwargs):
+        super(RadarrClient, self).__init__(base_url=base_url, **kwargs)
+
+    @region.cache_on_arguments(should_cache_fn=lambda x: bool(x["data"]), function_key_generator=radarr_movies_cache_key)
+    def get_all_movies(self):
+        return {"d": datetime.datetime.now(), "data": self.get("movie")}
+
+    def get_movie(self, movie_fn, movie_path):
+        def is_correct_movie(m):
+            movie_file = movie.get("movieFile", {})
+            if os.path.basename(movie_file.get("relativePath", "")) == movie_fn:
+                return m
+
+        res = self.get_all_movies()
+        try:
+            # get creation date of movie_path to see whether our cache is still valid
+            ctime = os.path.getctime(movie_path)
+            created = datetime.datetime.fromtimestamp(ctime)
+            if created < res["d"]:
+                for movie in res["data"]:
+                    if is_correct_movie(movie):
+                        return movie
+        except TypeError:
+            # legacy cache data
+            pass
+
+        logger.debug(u"%s: Movie not found, refreshing cache", movie_fn)
+        res = self.get_all_movies.refresh(self)
+        for movie in res["data"]:
+            if is_correct_movie(movie):
+                return movie
+
+    def get_additional_data(self, video):
+        for attr in self.needs_attrs_to_work:
+            if getattr(video, attr, None) is None:
+                logger.debug(u"%s: Not enough data available for Radarr")
+                return
+        movie_fn = os.path.basename(video.name)
+
+        movie = self.get_movie(movie_fn, video.name)
+        if not movie:
+            logger.debug(u"%s: Movie not found", movie_fn)
+
+        else:
+            movie_file = movie.get("movieFile", {})
+            scene_name = movie_file.get("sceneName")
+            release_group = movie_file.get("releaseGroup")
+
+            additional_data = {}
+            if scene_name:
+                logger.debug(u"%s: Got scene filename from Radarr: %s", movie_fn, scene_name)
+                additional_data["scene_name"] = scene_name
+
+            if release_group:
+                logger.debug(u"%s: Got release group from Radarr: %s", movie_fn, release_group)
+                additional_data["release_group"] = release_group
+
+            return additional_data
+
+    def get_guess(self, video, scene_name):
+        """
+        run guessit on scene_name
+        :param video:
+        :param scene_name:
+        :return:
+        """
+        ext = os.path.splitext(video.name)[1]
+        guess_from = remove_crap_from_fn(scene_name + ext)
+
+        # guess
+        hints = {
+            "single_value": True,
+            "type": "movie",
+        }
+
+        return guess_from, guessit(guess_from, options=hints)
+
+
+class DroneManager(object):
+    registry = {
+        Episode: SonarrClient,
+        Movie: RadarrClient,
+    }
+
+    @classmethod
+    def get_client(cls, video, cfg_kwa):
+        media_type = type(video)
+        client_cls = cls.registry.get(media_type)
+        if not client_cls:
+            raise NotImplementedError("Media type not supported: %s", media_type)
+
+        return client_cls(**cfg_kwa[client_cls.cfg_name])
+
+
+def refine(video, **kwargs):
+    """
+
+    :param video:
+    :param embedded_subtitles:
+    :param kwargs:
+    :return:
+    """
+
+    client = DroneManager.get_client(video, kwargs)
+
+    additional_data = client.get_additional_data(video)
+
+    if additional_data:
+        if "scene_name" in additional_data:
+            client.update_video(video, additional_data["scene_name"])
+
+        elif "original_filepath" in additional_data:
+            client.update_video(video, os.path.splitext(additional_data["original_filepath"])[0])
+
+        if "release_group" in additional_data and not video.release_group:
+            video.release_group = remove_crap_from_fn(additional_data["release_group"])
diff --git a/libs/subliminal_patch/refiners/file_info_file.py b/libs/subliminal_patch/refiners/file_info_file.py
new file mode 100644
index 000000000..2670cec54
--- /dev/null
+++ b/libs/subliminal_patch/refiners/file_info_file.py
@@ -0,0 +1,46 @@
+# coding=utf-8
+import sys
+import os
+import logging
+import codecs
+
+from common import update_video
+logger = logging.getLogger(__name__)
+
+
+def refine(video, **kwargs):
+    """
+
+    :param video:
+    :param kwargs:
+    :return:
+    """
+
+    check_fns = [".file_info", "file_info"]
+
+    # check for file_info on win32 first
+    if sys.platform == "win32":
+        check_fns.reverse()
+
+    delimiter = '="'
+    del_len = len(delimiter)
+    video_fn = os.path.basename(video.name)
+    orig_fn = None
+    for fn in check_fns:
+        path = os.path.join(os.path.dirname(video.name), fn)
+        if os.path.isfile(path):
+            logger.info(u"Found %s for %s", fn, video_fn)
+            with codecs.open(path, "rb", encoding="utf-8") as f:
+                for line in f:
+                    if video_fn in line and delimiter in line:
+                        orig_fn_start = line.index(delimiter) + del_len
+
+                        # find end of orig fn
+                        orig_fn_end = line.index('"', orig_fn_start)
+                        orig_fn = line[orig_fn_start:orig_fn_end].strip()
+
+                        # get optional json blob
+                        break
+        if orig_fn:
+            update_video(video, orig_fn)
+            break
diff --git a/libs/subliminal_patch/refiners/filebot.py b/libs/subliminal_patch/refiners/filebot.py
new file mode 100644
index 000000000..332026d9d
--- /dev/null
+++ b/libs/subliminal_patch/refiners/filebot.py
@@ -0,0 +1,25 @@
+# coding=utf-8
+
+import logging
+from libfilebot import get_filebot_attrs
+from common import update_video
+
+logger = logging.getLogger(__name__)
+
+
+def refine(video, **kwargs):
+    """
+
+    :param video:
+    :param kwargs:
+    :return:
+    """
+    try:
+        orig_fn = get_filebot_attrs(video.name)
+
+        if orig_fn:
+            update_video(video, orig_fn)
+        else:
+            logger.info(u"%s: Filebot didn't return an original filename", video.name)
+    except:
+        logger.exception(u"%s: Something went wrong when retrieving filebot attributes:", video.name)
diff --git a/libs/subliminal_patch/refiners/metadata.py b/libs/subliminal_patch/refiners/metadata.py
new file mode 100644
index 000000000..74c9f278c
--- /dev/null
+++ b/libs/subliminal_patch/refiners/metadata.py
@@ -0,0 +1,78 @@
+# coding=utf-8
+
+import logging
+import os
+
+from enzyme import MKV
+
+logger = logging.getLogger(__name__)
+
+
+def refine(video, embedded_subtitles=True, **kwargs):
+    """Refine a video by searching its metadata.
+    
+    patch: remove embedded subtitle detection
+
+    Several :class:`~subliminal.video.Video` attributes can be found:
+
+      * :attr:`~subliminal.video.Video.resolution`
+      * :attr:`~subliminal.video.Video.video_codec`
+      * :attr:`~subliminal.video.Video.audio_codec`
+      * :attr:`~subliminal.video.Video.subtitle_languages`
+
+    :param bool embedded_subtitles: search for embedded subtitles.
+
+    """
+    # skip non existing videos
+    if not video.exists:
+        return
+
+    # check extensions
+    extension = os.path.splitext(video.name)[1]
+    if extension == '.mkv':
+        with open(video.name, 'rb') as f:
+            mkv = MKV(f)
+
+        # main video track
+        if mkv.video_tracks:
+            video_track = mkv.video_tracks[0]
+
+            # resolution
+            if video_track.height in (480, 720, 1080):
+                if video_track.interlaced:
+                    video.resolution = '%di' % video_track.height
+                else:
+                    video.resolution = '%dp' % video_track.height
+                logger.debug('Found resolution %s', video.resolution)
+
+            # video codec
+            if video_track.codec_id == 'V_MPEG4/ISO/AVC':
+                video.video_codec = 'h264'
+                logger.debug('Found video_codec %s', video.video_codec)
+            elif video_track.codec_id == 'V_MPEG4/ISO/SP':
+                video.video_codec = 'DivX'
+                logger.debug('Found video_codec %s', video.video_codec)
+            elif video_track.codec_id == 'V_MPEG4/ISO/ASP':
+                video.video_codec = 'XviD'
+                logger.debug('Found video_codec %s', video.video_codec)
+        else:
+            logger.warning('MKV has no video track')
+
+        # main audio track
+        if mkv.audio_tracks:
+            audio_track = mkv.audio_tracks[0]
+            # audio codec
+            if audio_track.codec_id == 'A_AC3':
+                video.audio_codec = 'AC3'
+                logger.debug('Found audio_codec %s', video.audio_codec)
+            elif audio_track.codec_id == 'A_DTS':
+                video.audio_codec = 'DTS'
+                logger.debug('Found audio_codec %s', video.audio_codec)
+            elif audio_track.codec_id == 'A_AAC':
+                video.audio_codec = 'AAC'
+                logger.debug('Found audio_codec %s', video.audio_codec)
+        else:
+            logger.warning('MKV has no audio track')
+
+    else:
+        logger.debug('Unsupported video extension %s', extension)
diff --git a/libs/subliminal_patch/refiners/omdb.py b/libs/subliminal_patch/refiners/omdb.py
new file mode 100644
index 000000000..9ecb5155b
--- /dev/null
+++ b/libs/subliminal_patch/refiners/omdb.py
@@ -0,0 +1,67 @@
+# coding=utf-8
+import os
+import subliminal
+import base64
+import zlib
+from subliminal import __short_version__
+from subliminal.refiners.omdb import OMDBClient, refine
+
+
+class SZOMDBClient(OMDBClient):
+    def __init__(self, version=1, session=None, headers=None, timeout=10):
+        super(SZOMDBClient, self).__init__(version=version, session=session, headers=headers, timeout=timeout)
+
+    def get_params(self, params):
+        self.session.params['apikey'] = \
+            zlib.decompress(base64.b16decode(os.environ['U1pfT01EQl9LRVk']))\
+            .decode('cm90MTM=\n'.decode("base64")) \
+            .decode('YmFzZTY0\n'.decode("base64")).split("x")[0]
+        return dict(self.session.params, **params)
+
+    def get(self, id=None, title=None, type=None, year=None, plot='short', tomatoes=False):
+        # build the params
+        params = {}
+        if id:
+            params['i'] = id
+        if title:
+            params['t'] = title
+        if not params:
+            raise ValueError('At least id or title is required')
+        params['type'] = type
+        params['y'] = year
+        params['plot'] = plot
+        params['tomatoes'] = tomatoes
+
+        # perform the request
+        r = self.session.get(self.base_url, params=self.get_params(params))
+        r.raise_for_status()
+
+        # get the response as json
+        j = r.json()
+
+        # check response status
+        if j['Response'] == 'False':
+            return None
+
+        return j
+
+    def search(self, title, type=None, year=None, page=1):
+        # build the params
+        params = {'s': title, 'type': type, 'y': year, 'page': page}
+
+        # perform the request
+        r = self.session.get(self.base_url, params=self.get_params(params))
+        r.raise_for_status()
+
+        # get the response as json
+        j = r.json()
+
+        # check response status
+        if j['Response'] == 'False':
+            return None
+
+        return j
+
+
+omdb_client = SZOMDBClient(headers={'User-Agent': 'Subliminal/%s' % __short_version__})
+subliminal.refiners.omdb.omdb_client = omdb_client
diff --git a/libs/subliminal_patch/refiners/symlinks.py b/libs/subliminal_patch/refiners/symlinks.py
new file mode 100644
index 000000000..9fd246995
--- /dev/null
+++ b/libs/subliminal_patch/refiners/symlinks.py
@@ -0,0 +1,20 @@
+# coding=utf-8
+import os
+
+from common import update_video
+
+
+def refine(video, **kwargs):
+    """
+
+    :param video:
+    :param kwargs:
+    :return:
+    """
+    try:
+        orig_fn = os.path.basename(os.path.realpath(video.name))
+    except:
+        return
+
+    if orig_fn:
+        update_video(video, orig_fn)
diff --git a/libs/subliminal_patch/refiners/tvdb.py b/libs/subliminal_patch/refiners/tvdb.py
new file mode 100644
index 000000000..a70f9aba6
--- /dev/null
+++ b/libs/subliminal_patch/refiners/tvdb.py
@@ -0,0 +1,155 @@
+# coding=utf-8
+
+import datetime
+
+from subliminal.refiners.tvdb import Episode, logger, search_series, series_re, sanitize, get_series, \
+    get_series_episode, region, tvdb_client
+
+
+TVDB_SEASON_EXPIRATION_TIME = datetime.timedelta(days=1).total_seconds()
+
+
+@region.cache_on_arguments(expiration_time=TVDB_SEASON_EXPIRATION_TIME)
+def is_season_fully_aired(series_id, season):
+    """Get series.
+
+    :param int id: id of the series.
+    :return: the series data.
+    :rtype: dict
+
+    """
+    result = tvdb_client.query_series_episodes(series_id, aired_season=season)
+
+    # fixme: timezone unclear.
+    now = datetime.date.today()
+    if result:
+        for data in result['data']:
+            if data['firstAired']:
+                aired_at = datetime.datetime.strptime(data['firstAired'], '%Y-%m-%d').date()
+                if aired_at > now:
+                    return False
+    else:
+        return
+    return True
+
+
+def refine(video, **kwargs):
+    """Refine a video by searching `TheTVDB <http://thetvdb.com/>`_.
+
+    .. note::
+
+        This refiner only work for instances of :class:`~subliminal.video.Episode`.
+
+    Several attributes can be found:
+
+      * :attr:`~subliminal.video.Episode.series`
+      * :attr:`~subliminal.video.Episode.year`
+      * :attr:`~subliminal.video.Episode.series_imdb_id`
+      * :attr:`~subliminal.video.Episode.series_tvdb_id`
+      * :attr:`~subliminal.video.Episode.title`
+      * :attr:`~subliminal.video.Video.imdb_id`
+      * :attr:`~subliminal.video.Episode.tvdb_id`
+
+    """
+    # only deal with Episode videos
+    if not isinstance(video, Episode):
+        logger.error('Can only refine episodes')
+        return
+
+    # exit if the information is complete
+    if video.series_tvdb_id and video.tvdb_id:
+        logger.debug('No need to search')
+        return
+
+    # search the series
+    logger.info('Searching series %r', video.series)
+    results = search_series(video.series.lower())
+    if not results:
+        logger.warning('No results for series')
+        return
+    logger.debug('Found %d results', len(results))
+
+    # search for exact matches
+    matching_results = []
+    for result in results:
+        matching_result = {}
+
+        # use seriesName and aliases
+        series_names = [result['seriesName']]
+        series_names.extend(result['aliases'])
+
+        # parse the original series as series + year or country
+        original_match = series_re.match(result['seriesName']).groupdict()
+
+        # parse series year
+        series_year = None
+        if result['firstAired']:
+            series_year = datetime.datetime.strptime(result['firstAired'], '%Y-%m-%d').year
+
+        # discard mismatches on year
+        if video.year and series_year and video.year != series_year:
+            logger.debug('Discarding series %r mismatch on year %d', result['seriesName'], series_year)
+            continue
+
+        # iterate over series names
+        for series_name in series_names:
+            # parse as series and year
+            series, year, country = series_re.match(series_name).groups()
+            if year:
+                year = int(year)
+
+            # discard mismatches on year
+            if year and (video.original_series or video.year != year):
+                logger.debug('Discarding series name %r mismatch on year %d', series, year)
+                continue
+
+            # match on sanitized series name
+            if sanitize(series) == sanitize(video.series):
+                logger.debug('Found exact match on series %r', series_name)
+                matching_result['match'] = {'series': original_match['series'], 'year': series_year,
+                                            'original_series': original_match['year'] is None}
+                break
+
+        # add the result on match
+        if matching_result:
+            matching_result['data'] = result
+            matching_results.append(matching_result)
+
+    # exit if we don't have exactly 1 matching result
+    if not matching_results:
+        logger.warning('No matching series found')
+        return
+    if len(matching_results) > 1:
+        logger.error('Multiple matches found')
+        return
+
+    # get the series
+    matching_result = matching_results[0]
+    series = get_series(matching_result['data']['id'])
+
+    # add series information
+    logger.debug('Found series %r', series)
+    video.series = matching_result['match']['series']
+    video.alternative_series.extend(series['aliases'])
+    video.year = matching_result['match']['year']
+    video.original_series = matching_result['match']['original_series']
+    video.series_tvdb_id = series['id']
+    video.series_imdb_id = series['imdbId'] or None
+
+    # get the episode
+    logger.info('Getting series episode %dx%d', video.season, video.episode)
+    episode = get_series_episode(video.series_tvdb_id, video.season, video.episode)
+    if not episode:
+        logger.warning('No results for episode')
+        return
+
+    # add episode information
+    logger.debug('Found episode %r', episode)
+    video.tvdb_id = episode['id']
+    video.title = episode['episodeName'] or None
+    video.imdb_id = episode['imdbId'] or None
+
+    # get season fully aired information
+    season_fully_aired = is_season_fully_aired(video.series_tvdb_id, video.season)
+    if season_fully_aired is not None:
+        video.season_fully_aired = season_fully_aired
diff --git a/libs/subliminal_patch/score.py b/libs/subliminal_patch/score.py
new file mode 100644
index 000000000..918f8f668
--- /dev/null
+++ b/libs/subliminal_patch/score.py
@@ -0,0 +1,123 @@
+# coding=utf-8
+
+import logging
+
+from subliminal.video import Episode, Movie
+from subliminal.score import get_scores
+
+logger = logging.getLogger(__name__)
+
+
+FPS_EQUALITY = (
+    (23.976, 23.98, 24.0),
+)
+
+
+def framerate_equal(source, check):
+    if source == check:
+        return True
+
+    source = float(source)
+    check = float(check)
+    if source == check:
+        return True
+
+    for equal_fps_tuple in FPS_EQUALITY:
+        if check in equal_fps_tuple and source in equal_fps_tuple:
+            return True
+
+    return False
+
+
+def compute_score(matches, subtitle, video, hearing_impaired=None):
+    """Compute the score of the `subtitle` against the `video` with `hearing_impaired` preference.
+    
+    patch: 
+        - remove upper bounds of score
+        - re-add matches argument and remove get_matches from here
+
+    :func:`compute_score` uses the :meth:`Subtitle.get_matches <subliminal.subtitle.Subtitle.get_matches>` method and
+    applies the scores (either from :data:`episode_scores` or :data:`movie_scores`) after some processing.
+
+    :param subtitle: the subtitle to compute the score of.
+    :type subtitle: :class:`~subliminal.subtitle.Subtitle`
+    :param video: the video to compute the score against.
+    :type video: :class:`~subliminal.video.Video`
+    :param bool hearing_impaired: hearing impaired preference.
+    :return: score of the subtitle.
+    :rtype: int
+
+    """
+    logger.info('%r: Computing score for video %r with %r', subtitle, video, dict(hearing_impaired=hearing_impaired))
+
+    # get the scores dict
+    scores = get_scores(video)
+    # logger.debug('Using scores %r', scores)
+
+    is_episode = isinstance(video, Episode)
+    is_movie = isinstance(video, Movie)
+
+    episode_hash_valid_if = {"series", "season", "episode", "format"}
+    movie_hash_valid_if = {"video_codec", "format"}
+
+    # on hash match, discard everything else
+    if subtitle.hash_verifiable:
+        if 'hash' in matches:
+            # hash is error-prone, try to fix that
+            hash_valid_if = episode_hash_valid_if if is_episode else movie_hash_valid_if
+
+            # don't validate hashes of specials, as season and episode tend to be wrong
+            if is_movie or not video.is_special:
+                if hash_valid_if <= set(matches):
+                    # series, season and episode matched, hash is valid
+                    logger.debug('%r: Using valid hash, as %s are correct (%r) and (%r)', subtitle, hash_valid_if, matches,
+                                 video)
+                    matches &= {'hash'}
+                else:
+                    # no match, invalidate hash
+                    logger.debug('%r: Ignoring hash as other matches are wrong (missing: %r) and (%r)', subtitle,
+                                 hash_valid_if - matches, video)
+                    matches -= {"hash"}
+    elif 'hash' in matches:
+        logger.debug('%r: Hash not verifiable for this provider. Keeping it', subtitle)
+        matches &= {'hash'}
+
+    # handle equivalent matches
+    if is_episode:
+        if 'title' in matches:
+            logger.debug('Adding title match equivalent')
+            matches.add('episode')
+        if 'series_imdb_id' in matches:
+            logger.debug('Adding series_imdb_id match equivalent')
+            matches |= {'series', 'year'}
+        if 'imdb_id' in matches:
+            logger.debug('Adding imdb_id match equivalents')
+            matches |= {'series', 'year', 'season', 'episode'}
+        if 'tvdb_id' in matches:
+            logger.debug('Adding tvdb_id match equivalents')
+            matches |= {'series', 'year', 'season', 'episode', 'title'}
+        if 'series_tvdb_id' in matches:
+            logger.debug('Adding series_tvdb_id match equivalents')
+            matches |= {'series', 'year'}
+
+        # specials
+        if video.is_special and 'title' in matches and 'series' in matches \
+                and 'year' in matches:
+            logger.debug('Adding special title match equivalent')
+            matches |= {'season', 'episode'}
+
+    elif is_movie:
+        if 'imdb_id' in matches:
+            logger.debug('Adding imdb_id match equivalents')
+            matches |= {'title', 'year'}
+
+    # handle hearing impaired
+    if hearing_impaired is not None and subtitle.hearing_impaired == hearing_impaired:
+        logger.debug('Matched hearing_impaired')
+        matches.add('hearing_impaired')
+
+    # compute the score
+    score = sum((scores.get(match, 0) for match in matches))
+    logger.info('%r: Computed score %r with final matches %r', subtitle, score, matches)
+
+    return score
diff --git a/libs/subliminal_patch/subtitle.py b/libs/subliminal_patch/subtitle.py
new file mode 100644
index 000000000..d2b25674b
--- /dev/null
+++ b/libs/subliminal_patch/subtitle.py
@@ -0,0 +1,426 @@
+# coding=utf-8
+
+
+import logging
+import traceback
+
+import re
+import types
+
+import chardet
+import pysrt
+import pysubs2
+from bs4 import UnicodeDammit
+from pysubs2 import SSAStyle
+from pysubs2.subrip import parse_tags, MAX_REPRESENTABLE_TIME
+from pysubs2.time import ms_to_times
+from subzero.modification import SubtitleModifications
+from subliminal import Subtitle as Subtitle_
+from subliminal.subtitle import Episode, Movie, sanitize_release_group, sanitize, get_equivalent_release_groups
+from ftfy import fix_text
+
+logger = logging.getLogger(__name__)
+
+
+ftfy_defaults = {
+    "uncurl_quotes": False,
+    "fix_character_width": False,
+}
+
+
+class Subtitle(Subtitle_):
+    storage_path = None
+    release_info = None
+    matches = None
+    hash_verifiable = False
+    hearing_impaired_verifiable = False
+    mods = None
+    plex_media_fps = None
+    skip_wrong_fps = False
+    wrong_fps = False
+    is_pack = False
+    asked_for_release_group = None
+    asked_for_episode = None
+
+    pack_data = None
+    _guessed_encoding = None
+
+    def __init__(self, language, hearing_impaired=False, page_link=None, encoding=None, mods=None):
+        super(Subtitle, self).__init__(language, hearing_impaired=hearing_impaired, page_link=page_link,
+                                       encoding=encoding)
+        self.mods = mods
+
+    def __repr__(self):
+        return '<%s %r [%s:%s]>' % (
+            self.__class__.__name__, self.page_link, self.language, self._guessed_encoding)
+
+    @property
+    def text(self):
+        """Content as string
+
+        If :attr:`encoding` is None, the encoding is guessed with :meth:`guess_encoding`
+
+        """
+        if not self.content:
+            return
+
+        #if self.encoding:
+        #    return fix_text(self.content.decode(self.encoding, errors='replace'), **ftfy_defaults)
+
+        return self.content.decode(self.guess_encoding(), errors='replace')
+
+    @property
+    def numeric_id(self):
+        raise NotImplemented
+
+    def make_picklable(self):
+        """
+        some subtitle instances might have unpicklable objects stored; clean them up here 
+        :return: self
+        """
+        return self
+
+    def set_encoding(self, encoding):
+        ge = self.guess_encoding()
+        if encoding == ge:
+            return
+
+        unicontent = self.text
+        logger.debug("Changing encoding: to %s, from %s", encoding, ge)
+        self.content = unicontent.encode(encoding)
+        self._guessed_encoding = encoding
+
+    def normalize(self):
+        """
+        Set encoding to UTF-8 and normalize line endings
+        :return:
+        """
+        self.set_encoding("utf-8")
+
+        # normalize line endings
+        self.content = self.content.replace("\r\n", "\n").replace('\r', '\n')
+
+    def guess_encoding(self):
+        """Guess encoding using the language, falling back on chardet.
+
+        :return: the guessed encoding.
+        :rtype: str
+
+        """
+        if self._guessed_encoding:
+            return self._guessed_encoding
+
+        logger.info('Guessing encoding for language %s', self.language)
+
+        encodings = ['utf-8']
+
+        # add language-specific encodings
+        # http://scratchpad.wikia.com/wiki/Character_Encoding_Recommendation_for_Languages
+
+        if self.language.alpha3 == 'zho':
+            encodings.extend(['cp936', 'gb2312', 'cp950', 'gb18030', 'big5', 'big5hkscs'])
+        elif self.language.alpha3 == 'jpn':
+            encodings.extend(['shift-jis', 'cp932', 'euc_jp', 'iso2022_jp', 'iso2022_jp_1', 'iso2022_jp_2',
+                              'iso2022_jp_2004', 'iso2022_jp_3', 'iso2022_jp_ext', ])
+        elif self.language.alpha3 == 'tha':
+            encodings.extend(['tis-620', 'cp874'])
+
+        # arabian/farsi
+        elif self.language.alpha3 in ('ara', 'fas', 'per'):
+            encodings.append('windows-1256')
+        elif self.language.alpha3 == 'heb':
+            encodings.extend(['windows-1255', 'iso-8859-8'])
+        elif self.language.alpha3 == 'tur':
+            encodings.extend(['windows-1254', 'iso-8859-9', 'iso-8859-3'])
+
+        # Greek
+        elif self.language.alpha3 in ('grc', 'gre', 'ell'):
+            encodings.extend(['windows-1253', 'cp1253', 'cp737', 'iso8859-7', 'cp875', 'cp869', 'iso2022_jp_2',
+                              'mac_greek'])
+
+        # Polish, Czech, Slovak, Hungarian, Slovene, Bosnian, Croatian, Serbian (Latin script),
+        # Romanian and Albanian
+        elif self.language.alpha3 in ('pol', 'cze', 'ces', 'slk', 'slo', 'slv', 'hun', 'bos', 'hbs', 'hrv', 'rsb',
+                                      'ron', 'rum', 'sqi', 'alb'):
+
+            encodings.extend(['windows-1250', 'iso-8859-2'])
+
+            # Eastern European Group 1
+            if self.language.alpha3 == "slv":
+                encodings.append('iso-8859-4')
+
+            # Albanian
+            elif self.language.alpha3 in ("sqi", "alb"):
+                encodings.extend(['windows-1252', 'iso-8859-15', 'iso-8859-1', 'iso-8859-9'])
+
+        # Bulgarian, Serbian and Macedonian, Ukranian and Russian
+        elif self.language.alpha3 in ('bul', 'srp', 'mkd', 'mac', 'rus', 'ukr'):
+            # Eastern European Group 2
+            if self.language.alpha3 in ('bul', 'mkd', 'mac', 'rus', 'ukr'):
+                encodings.extend(['windows-1251', 'iso-8859-5'])
+
+            elif self.language.alpha3 == 'srp':
+                if self.language.script == "Latn":
+                    encodings.extend(['windows-1250', 'iso-8859-2'])
+                elif self.language.script == "Cyrl":
+                    encodings.extend(['windows-1251', 'iso-8859-5'])
+                else:
+                    encodings.extend(['windows-1250', 'windows-1251', 'iso-8859-2', 'iso-8859-5'])
+
+        else:
+            # Western European (windows-1252) / Northern European
+            encodings.extend(['latin-1', 'iso-8859-15', 'iso-8859-9', 'iso-8859-4', 'iso-8859-1'])
+
+        # try to decode
+        logger.debug('Trying encodings %r', encodings)
+        for encoding in encodings:
+            try:
+                self.content.decode(encoding)
+
+            except UnicodeDecodeError:
+                pass
+            else:
+                logger.info('Guessed encoding %s', encoding)
+                self._guessed_encoding = encoding
+                return encoding
+
+        logger.warning('Could not guess encoding from language')
+
+        # fallback on chardet
+        encoding = chardet.detect(self.content)['encoding']
+        logger.info('Chardet found encoding %s', encoding)
+
+        if not encoding:
+            # fallback on bs4
+            logger.info('Falling back to bs4 detection')
+            a = UnicodeDammit(self.content)
+
+            logger.info("bs4 detected encoding: %s", a.original_encoding)
+
+            if a.original_encoding:
+                self._guessed_encoding = a.original_encoding
+                return a.original_encoding
+            raise ValueError(u"Couldn't guess the proper encoding for %s", self)
+
+        self._guessed_encoding = encoding
+        return encoding
+
+    def is_valid(self):
+        """Check if a :attr:`text` is a valid SubRip format.
+
+        :return: whether or not the subtitle is valid.
+        :rtype: bool
+
+        """
+        text = self.text
+        if not text:
+            return False
+
+        # valid srt
+        try:
+            pysrt.from_string(text, error_handling=pysrt.ERROR_RAISE)
+        except Exception:
+            logger.error("PySRT-parsing failed, trying pysubs2")
+        else:
+            return True
+
+        # something else, try to return srt
+        try:
+            logger.debug("Trying parsing with PySubs2")
+            try:
+                # in case of microdvd, try parsing the fps from the subtitle
+                subs = pysubs2.SSAFile.from_string(text)
+                if subs.format == "microdvd":
+                    logger.info("Got FPS from MicroDVD subtitle: %s", subs.fps)
+                else:
+                    logger.info("Got format: %s", subs.format)
+            except pysubs2.UnknownFPSError:
+                # if parsing failed, suggest our media file's fps
+                logger.info("No FPS info in subtitle. Using our own media FPS for the MicroDVD subtitle: %s",
+                            self.plex_media_fps)
+                subs = pysubs2.SSAFile.from_string(text, fps=self.plex_media_fps)
+
+            unicontent = self.pysubs2_to_unicode(subs)
+            self.content = unicontent.encode("utf-8")
+            self._guessed_encoding = "utf-8"
+        except:
+            logger.exception("Couldn't convert subtitle %s to .srt format: %s", self, traceback.format_exc())
+            return False
+
+        return True
+
+    @classmethod
+    def pysubs2_to_unicode(cls, sub, format="srt"):
+        def ms_to_timestamp(ms, mssep=","):
+            """Convert ms to 'HH:MM:SS,mmm'"""
+            # XXX throw on overflow/underflow?
+            if ms < 0: ms = 0
+            if ms > MAX_REPRESENTABLE_TIME: ms = MAX_REPRESENTABLE_TIME
+            h, m, s, ms = ms_to_times(ms)
+            return "%02d:%02d:%02d%s%03d" % (h, m, s, mssep, ms)
+
+        def prepare_text(text, style):
+            body = []
+            for fragment, sty in parse_tags(text, style, sub.styles):
+                fragment = fragment.replace(ur"\h", u" ")
+                fragment = fragment.replace(ur"\n", u"\n")
+                fragment = fragment.replace(ur"\N", u"\n")
+                if format == "srt":
+                    if sty.italic:
+                        fragment = u"<i>%s</i>" % fragment
+                    if sty.underline:
+                        fragment = u"<u>%s</u>" % fragment
+                    if sty.strikeout:
+                        fragment = u"<s>%s</s>" % fragment
+                elif format == "vtt":
+                    if sty.bold:
+                        fragment = u"<b>%s</b>" % fragment
+                    if sty.italic:
+                        fragment = u"<i>%s</i>" % fragment
+                    if sty.underline:
+                        fragment = u"<u>%s</u>" % fragment
+
+                body.append(fragment)
+
+            return re.sub(u"\n+", u"\n", u"".join(body).strip())
+
+        visible_lines = (line for line in sub if not line.is_comment)
+
+        out = []
+        mssep = ","
+
+        if format == "vtt":
+            out.append("WEBVTT\n\n")
+            mssep = "."
+
+        for i, line in enumerate(visible_lines, 1):
+            start = ms_to_timestamp(line.start, mssep=mssep)
+            end = ms_to_timestamp(line.end, mssep=mssep)
+            text = prepare_text(line.text, sub.styles.get(line.style, SSAStyle.DEFAULT_STYLE))
+
+            out.append(u"%d\n" % i)
+            out.append(u"%s --> %s\n" % (start, end))
+            out.append(u"%s%s" % (text, "\n\n"))
+
+        return u"".join(out)
+
+    def get_modified_content(self, format="srt", debug=False):
+        """
+        :return: string 
+        """
+        if not self.mods:
+            return fix_text(self.content.decode("utf-8"), **ftfy_defaults).encode(encoding="utf-8")
+
+        submods = SubtitleModifications(debug=debug)
+        if submods.load(content=self.text, language=self.language):
+            logger.info("Applying mods: %s", self.mods)
+            submods.modify(*self.mods)
+            self.mods = submods.mods_used
+
+            content = fix_text(self.pysubs2_to_unicode(submods.f, format=format), **ftfy_defaults)\
+                .encode(encoding="utf-8")
+            submods.f = None
+            del submods
+            return content
+        return None
+
+
+class ModifiedSubtitle(Subtitle):
+    id = None
+
+
+def guess_matches(video, guess, partial=False):
+    """Get matches between a `video` and a `guess`.
+
+    If a guess is `partial`, the absence information won't be counted as a match.
+
+    Patch: add multiple release group and formats handling
+
+    :param video: the video.
+    :type video: :class:`~subliminal.video.Video`
+    :param guess: the guess.
+    :type guess: dict
+    :param bool partial: whether or not the guess is partial.
+    :return: matches between the `video` and the `guess`.
+    :rtype: set
+
+    """
+
+    matches = set()
+    if isinstance(video, Episode):
+        # series
+        if video.series and 'title' in guess and sanitize(guess['title']) == sanitize(video.series):
+            matches.add('series')
+        # title
+        if video.title and 'episode_title' in guess and sanitize(guess['episode_title']) == sanitize(video.title):
+            matches.add('title')
+        # season
+        if video.season and 'season' in guess and guess['season'] == video.season:
+            matches.add('season')
+        # episode
+        # Currently we only have single-ep support (guessit returns a multi-ep as a list with int values)
+        # Most providers only support single-ep, so make sure it contains only 1 episode
+        # In case of multi-ep, take the lowest episode (subtitles will normally be available on lowest episode number)
+        if video.episode and 'episode' in guess:
+            episode_guess = guess['episode']
+            episode = min(episode_guess) if episode_guess and isinstance(episode_guess, list) else episode_guess
+            if episode == video.episode:
+                matches.add('episode')
+        # year
+        if video.year and 'year' in guess and guess['year'] == video.year:
+            matches.add('year')
+        # count "no year" as an information
+        if not partial and video.original_series and 'year' not in guess:
+            matches.add('year')
+    elif isinstance(video, Movie):
+        # year
+        if video.year and 'year' in guess and guess['year'] == video.year:
+            matches.add('year')
+        # title
+        if video.title and 'title' in guess and sanitize(guess['title']) == sanitize(video.title):
+            matches.add('title')
+
+    # release_group
+    if 'release_group' in guess:
+        release_groups = guess["release_group"]
+        if not isinstance(release_groups, types.ListType):
+            release_groups = [release_groups]
+
+        if video.release_group:
+            for release_group in release_groups:
+                if (sanitize_release_group(release_group) in
+                        get_equivalent_release_groups(sanitize_release_group(video.release_group))):
+                    matches.add('release_group')
+                    break
+
+    # resolution
+    if video.resolution and 'screen_size' in guess and guess['screen_size'] == video.resolution:
+        matches.add('resolution')
+
+    # format
+    if 'format' in guess:
+        formats = guess["format"]
+        if not isinstance(formats, types.ListType):
+            formats = [formats]
+
+        if video.format:
+            video_format = video.format
+            if video_format in ("HDTV", "SDTV", "TV"):
+                video_format = "TV"
+                logger.debug("Treating HDTV/SDTV the same")
+
+            for frmt in formats:
+                if frmt in ("HDTV", "SDTV"):
+                    frmt = "TV"
+
+                if frmt.lower() == video_format.lower():
+                    matches.add('format')
+                    break
+    # video_codec
+    if video.video_codec and 'video_codec' in guess and guess['video_codec'] == video.video_codec:
+        matches.add('video_codec')
+    # audio_codec
+    if video.audio_codec and 'audio_codec' in guess and guess['audio_codec'] == video.audio_codec:
+        matches.add('audio_codec')
+
+    return matches
diff --git a/libs/subliminal_patch/utils.py b/libs/subliminal_patch/utils.py
new file mode 100644
index 000000000..d439272b0
--- /dev/null
+++ b/libs/subliminal_patch/utils.py
@@ -0,0 +1,58 @@
+# coding=utf-8
+
+import re
+
+
+def sanitize(string, ignore_characters=None, default_characters={'-', ':', '(', ')', '.'}):
+    """Sanitize a string to strip special characters.
+
+    :param str string: the string to sanitize.
+    :param set ignore_characters: characters to ignore.
+    :return: the sanitized string.
+    :rtype: str
+
+    """
+    # only deal with strings
+    if string is None:
+        return
+
+    ignore_characters = ignore_characters or set()
+
+    # replace some characters with one space
+    characters = default_characters - ignore_characters
+    if characters:
+        string = re.sub(r'[%s]' % re.escape(''.join(characters)), ' ', string)
+
+    # remove some characters
+    characters = {'\''} - ignore_characters
+    if characters:
+        string = re.sub(r'[%s]' % re.escape(''.join(characters)), '', string)
+
+    # replace multiple spaces with one
+    string = re.sub(r'\s+', ' ', string)
+
+    # strip and lower case
+    return string.strip().lower()
+
+
+def fix_inconsistent_naming(title, inconsistent_titles_dict=None):
+    """Fix titles with inconsistent naming using dictionary and sanitize them.
+
+    :param str title: original title.
+    :param dict inconsistent_titles_dict: dictionary of titles with inconsistent naming.
+    :return: new title.
+    :rtype: str
+
+    """
+    # only deal with strings
+    if title is None:
+        return
+
+    # fix titles with inconsistent naming using dictionary
+    inconsistent_titles_dict = inconsistent_titles_dict or {}
+    if inconsistent_titles_dict:
+        pattern = re.compile('|'.join(re.escape(key) for key in inconsistent_titles_dict.keys()))
+        title = pattern.sub(lambda x: inconsistent_titles_dict[x.group()], title)
+
+    # return fixed and sanitized title
+    return sanitize(title)
diff --git a/libs/subliminal_patch/video.py b/libs/subliminal_patch/video.py
new file mode 100644
index 000000000..df615c849
--- /dev/null
+++ b/libs/subliminal_patch/video.py
@@ -0,0 +1,24 @@
+# coding=utf-8
+
+import os
+
+from subliminal.video import Video as Video_
+
+
+class Video(Video_):
+    is_special = False
+    fps = None
+    plexapi_metadata = None
+    hints = None
+    season_fully_aired = None
+    audio_languages = None
+
+    def __init__(self, name, format=None, release_group=None, resolution=None, video_codec=None, audio_codec=None,
+                 imdb_id=None, hashes=None, size=None, subtitle_languages=None, audio_languages=None):
+        super(Video, self).__init__(name, format=format, release_group=release_group, resolution=resolution,
+                                    video_codec=video_codec, audio_codec=audio_codec, imdb_id=imdb_id, hashes=hashes,
+                                    size=size, subtitle_languages=subtitle_languages)
+        self.original_name = os.path.basename(name)
+        self.plexapi_metadata = {}
+        self.hints = {}
+        self.audio_languages = audio_languages or set()
diff --git a/libs/subscene_api/__init__.py b/libs/subscene_api/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/subscene_api/subscene.py b/libs/subscene_api/subscene.py
new file mode 100644
index 000000000..b59783a4b
--- /dev/null
+++ b/libs/subscene_api/subscene.py
@@ -0,0 +1,240 @@
+# -*- coding: utf-8 -*-
+# vim: fenc=utf-8 ts=4 et sw=4 sts=4
+
+# This file is part of Subscene-API.
+#
+# Subscene-API is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# Subscene-API is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+"""
+Python wrapper for Subscene subtitle database.
+
+since Subscene doesn't provide an official API, I wrote
+this script that does the job by parsing the website"s pages.
+"""
+
+# imports
+import re
+import enum
+import sys
+
+is_PY2 = sys.version_info[0] < 3
+if is_PY2:
+    from contextlib2 import suppress
+    from urllib2 import Request, urlopen
+else:
+    from contextlib import suppress
+    from urllib2.request import Request, urlopen
+
+from bs4 import BeautifulSoup
+
+# constants
+HEADERS = {
+}
+SITE_DOMAIN = "https://subscene.com"
+
+DEFAULT_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_3) AppleWeb"\
+                     "Kit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.47 Safari/537.36"
+
+
+# utils
+def soup_for(url, session=None, user_agent=DEFAULT_USER_AGENT):
+    url = re.sub("\s", "+", url)
+    if not session:
+        r = Request(url, data=None, headers=dict(HEADERS, **{"User-Agent": user_agent}))
+        html = urlopen(r).read().decode("utf-8")
+    else:
+        html = session.get(url).text
+    return BeautifulSoup(html, "html.parser")
+
+
+class AttrDict(object):
+    def __init__(self, *attrs):
+        self._attrs = attrs
+
+        for attr in attrs:
+            setattr(self, attr, "")
+
+    def to_dict(self):
+        return {k: getattr(self, k) for k in self._attrs}
+
+
+# models
+@enum.unique
+class SearchTypes(enum.Enum):
+    Exact = 1
+    TvSerie = 2
+    Popular = 3
+    Close = 4
+
+
+SectionsParts = {
+    SearchTypes.Exact: "Exact",
+    SearchTypes.TvSerie: "TV-Series",
+    SearchTypes.Popular: "Popular",
+    SearchTypes.Close: "Close"
+}
+
+
+class Subtitle(object):
+    def __init__(self, title, url, language, owner_username, owner_url,
+                 description, hearing_impaired):
+        self.title = title
+        self.url = url
+        self.language = language
+        self.owner_username = owner_username
+        self.owner_url = owner_url
+        self.description = description
+        self.hearing_impaired = hearing_impaired
+
+        self._zipped_url = None
+
+    def __str__(self):
+        return self.title
+
+    @classmethod
+    def from_rows(cls, rows):
+        subtitles = []
+
+        for row in rows:
+            if row.td.a is not None:
+                subtitles.append(cls.from_row(row))
+
+        return subtitles
+
+    @classmethod
+    def from_row(cls, row):
+        attrs = AttrDict("title", "url", "language", "owner_username",
+                         "owner_url", "description", "hearing_impaired")
+
+        with suppress(Exception):
+            attrs.title = row.find("td", "a1").a.find_all("span")[1].text \
+                .strip()
+
+        with suppress(Exception):
+            attrs.url = SITE_DOMAIN + row.find("td", "a1").a.get("href")
+
+        with suppress(Exception):
+            attrs.language = row.find("td", "a1").a.find_all("span")[0].text \
+                .strip()
+
+        with suppress(Exception):
+            attrs.owner_username = row.find("td", "a5").a.text.strip()
+
+        with suppress(Exception):
+            attrs.owner_page = SITE_DOMAIN + row.find("td", "a5").a \
+                .get("href").strip()
+
+        with suppress(Exception):
+            attrs.description = row.find("td", "a6").div.text.strip()
+
+        with suppress(Exception):
+            attrs.hearing_impaired = bool(row.find("td", "a41"))
+
+        return cls(**attrs.to_dict())
+
+    @classmethod
+    def get_zipped_url(cls, url, session=None):
+        soup = soup_for(url, session=session)
+        return SITE_DOMAIN + soup.find("div", "download").a.get("href")
+
+    @property
+    def zipped_url(self):
+        if self._zipped_url:
+            return self._zipped_url
+
+        self._zipped_url = Subtitle.get_zipped_url(self.url)
+        return self._zipped_url
+
+
+class Film(object):
+    def __init__(self, title, year=None, imdb=None, cover=None,
+                 subtitles=None):
+        self.title = title
+        self.year = year
+        self.imdb = imdb
+        self.cover = cover
+        self.subtitles = subtitles
+
+    def __str__(self):
+        return self.title
+
+    @classmethod
+    def from_url(cls, url, session=None):
+        soup = soup_for(url, session=session)
+
+        content = soup.find("div", "subtitles")
+        header = content.find("div", "box clearfix")
+
+        cover = header.find("div", "poster").img.get("src")
+
+        title = header.find("div", "header").h2.text[:-12].strip()
+
+        imdb = header.find("div", "header").h2.find("a", "imdb").get("href")
+
+        year = header.find("div", "header").ul.li.text
+        year = int(re.findall(r"[0-9]+", year)[0])
+
+        rows = content.find("table").tbody.find_all("tr")
+        subtitles = Subtitle.from_rows(rows)
+
+        return cls(title, year, imdb, cover, subtitles)
+
+
+# functions
+def section_exists(soup, section):
+    tag_part = SectionsParts[section]
+
+    try:
+        headers = soup.find("div", "search-result").find_all("h2")
+    except AttributeError:
+        return False
+
+    for header in headers:
+        if tag_part in header.text:
+            return True
+
+    return False
+
+
+def get_first_film(soup, section, session=None):
+    tag_part = SectionsParts[section]
+    tag = None
+
+    headers = soup.find("div", "search-result").find_all("h2")
+    for header in headers:
+        if tag_part in header.text:
+            tag = header
+            break
+
+    if not tag:
+        return
+
+    url = SITE_DOMAIN + tag.findNext("ul").find("li").div.a.get("href")
+    return Film.from_url(url, session=session)
+
+
+def search(term, session=None, limit_to=SearchTypes.Exact):
+    soup = soup_for("%s/subtitles/title?q=%s" % (SITE_DOMAIN, term), session=session)
+
+    if "Subtitle search by" in str(soup):
+        rows = soup.find("table").tbody.find_all("tr")
+        subtitles = Subtitle.from_rows(rows)
+        return Film(term, subtitles=subtitles)
+
+    for junk, search_type in SearchTypes.__members__.items():
+        if section_exists(soup, search_type):
+            return get_first_film(soup, search_type)
+
+        if limit_to == search_type:
+            return
diff --git a/libs/subzero/__init__.py b/libs/subzero/__init__.py
new file mode 100644
index 000000000..d21438cdf
--- /dev/null
+++ b/libs/subzero/__init__.py
@@ -0,0 +1,2 @@
+# coding=utf-8
+
diff --git a/libs/subzero/analytics.py b/libs/subzero/analytics.py
new file mode 100644
index 000000000..297bcf2c5
--- /dev/null
+++ b/libs/subzero/analytics.py
@@ -0,0 +1,33 @@
+# coding=utf-8
+
+import struct
+import binascii
+
+from pyga.requests import Event, Page, Tracker, Session, Visitor, Config
+
+
+def track_event(category=None, action=None, label=None, value=None, identifier=None, first_use=None, add=None,
+                noninteraction=True):
+    anonymousConfig = Config()
+    anonymousConfig.anonimize_ip_address = True
+
+    tracker = Tracker('UA-86466078-1', 'none', conf=anonymousConfig)
+    visitor = Visitor()
+
+    # convert the last 8 bytes of the machine identifier to an integer to get a "unique" user
+    visitor.unique_id = struct.unpack("!I", binascii.unhexlify(identifier[32:]))[0]/2
+
+    if add:
+        # add visitor's ip address (will be anonymized)
+        visitor.ip_address = add
+
+    if first_use:
+        visitor.first_visit_time = first_use
+
+    session = Session()
+    event = Event(category=category, action=action, label=label, value=value, noninteraction=noninteraction)
+    path = u"/" + u"/".join([category, action, label])
+    page = Page(path.lower())
+
+    tracker.track_event(event, session, visitor)
+    tracker.track_pageview(page, session, visitor)
diff --git a/libs/subzero/cache_backends/__init__.py b/libs/subzero/cache_backends/__init__.py
new file mode 100644
index 000000000..9bad5790a
--- /dev/null
+++ b/libs/subzero/cache_backends/__init__.py
@@ -0,0 +1 @@
+# coding=utf-8
diff --git a/libs/subzero/cache_backends/file.py b/libs/subzero/cache_backends/file.py
new file mode 100644
index 000000000..1ad404deb
--- /dev/null
+++ b/libs/subzero/cache_backends/file.py
@@ -0,0 +1,51 @@
+# coding=utf-8
+from dogpile.cache.api import CacheBackend, NO_VALUE
+from fcache.cache import FileCache
+
+
+class SZFileBackend(CacheBackend):
+    def __init__(self, arguments):
+        self._cache = FileCache(arguments.pop("appname", None), flag=arguments.pop("flag", "c"),
+                                serialize=arguments.pop("serialize", True),
+                                app_cache_dir=arguments.pop("app_cache_dir", None))
+
+    def get(self, key):
+        value = self._cache.get(key, NO_VALUE)
+
+        return value
+
+    def get_multi(self, keys):
+        ret = [
+            self._cache.get(key, NO_VALUE)
+            for key in keys]
+
+        return ret
+
+    def set(self, key, value):
+        self._cache[key] = value
+
+    def set_multi(self, mapping):
+        for key, value in mapping.items():
+            self._cache[key] = value
+
+    def delete(self, key):
+        self._cache.pop(key, None)
+
+    def delete_multi(self, keys):
+        for key in keys:
+            self._cache.pop(key, None)
+
+    @property
+    def all_filenames(self):
+        return self._cache._all_filenames()
+
+    def sync(self, force=False):
+        if (hasattr(self._cache, "_buffer") and self._cache._buffer) or force:
+            self._cache.sync()
+
+    def clear(self):
+        self._cache.clear()
+        if not hasattr(self._cache, "_buffer") or self._cache._sync:
+            self._cache._sync = False
+            self._cache._buffer = {}
+
diff --git a/libs/subzero/constants.py b/libs/subzero/constants.py
new file mode 100644
index 000000000..43297b2a2
--- /dev/null
+++ b/libs/subzero/constants.py
@@ -0,0 +1,47 @@
+# coding=utf-8
+
+OS_PLEX_USERAGENT = 'plexapp.com v9.0'
+
+DEPENDENCY_MODULE_NAMES = ['subliminal', 'subliminal_patch', 'enzyme', 'guessit', 'subzero', 'libfilebot']
+PERSONAL_MEDIA_IDENTIFIER = "com.plexapp.agents.none"
+PLUGIN_IDENTIFIER_SHORT = "subzero"
+PLUGIN_IDENTIFIER = "com.plexapp.agents.%s" % PLUGIN_IDENTIFIER_SHORT
+PLUGIN_NAME = "Sub-Zero"
+PREFIX = "/video/%s" % PLUGIN_IDENTIFIER_SHORT
+
+TITLE = "%s Subtitles" % PLUGIN_NAME
+ART      = 'art-default.jpg'
+ICON     = 'icon-default.jpg'
+ICON_SUB = 'icon-sub.jpg'
+
+DEFAULT_TIMEOUT = 15
+
+
+# media types as on https://github.com/Arcanemagus/plex-api/wiki/MediaTypes
+MOVIE = 1
+SHOW = 2
+SEASON = 3
+EPISODE = 4
+TRAILER = 5
+COMIC = 6
+PERSON = 7
+ARTIST = 8
+ALBUM = 9
+TRACK = 10
+PHOTO_ALBUM = 11
+PICTURE = 12
+PHOTO = 13
+CLIP = 14
+PLAYLIST_ITEM = 15
+
+MEDIA_TYPE_TO_STRING = {
+    MOVIE: "movie",
+    SHOW: "show"
+}
+
+
+mode_map = {
+    "a": "auto",
+    "m": "manual",
+    "b": "auto-better"
+}
\ No newline at end of file
diff --git a/libs/subzero/history_storage.py b/libs/subzero/history_storage.py
new file mode 100644
index 000000000..38d859d55
--- /dev/null
+++ b/libs/subzero/history_storage.py
@@ -0,0 +1,120 @@
+# coding=utf-8
+
+import datetime
+import logging
+import traceback
+import types
+
+from subzero.language import Language
+
+from constants import mode_map
+
+logger = logging.getLogger(__name__)
+
+
+class SubtitleHistoryItem(object):
+    item_title = None
+    section_title = None
+    rating_key = None
+    provider_name = None
+    lang_name = None
+    lang_data = None
+    score = None
+    thumb = None
+    time = None
+    mode = "a"
+
+    def __init__(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None):
+        self.item_title = item_title
+        self.section_title = section_title
+        self.rating_key = str(rating_key)
+        self.provider_name = subtitle.provider_name
+        self.lang_name = str(subtitle.language.name)
+        self.lang_data = str(subtitle.language.alpha3), \
+                         str(subtitle.language.country) if subtitle.language.country else None, \
+                         str(subtitle.language.script) if subtitle.language.script else None
+        self.score = subtitle.score
+        self.thumb = thumb
+        self.time = time or datetime.datetime.now()
+        self.mode = mode
+
+    @property
+    def title(self):
+        return u"%s: %s" % (self.section_title, self.item_title)
+
+    @property
+    def language(self):
+        if self.lang_data:
+            lang_data = [s if s != "None" else None for s in self.lang_data]
+            if lang_data[0]:
+                return Language(lang_data[0], country=lang_data[1], script=lang_data[2])
+
+    @property
+    def mode_verbose(self):
+        return mode_map.get(self.mode, "Unknown")
+
+    def __repr__(self):
+        return unicode(self)
+
+    def __unicode__(self):
+        return u"%s (Score: %s)" % (unicode(self.item_title), self.score)
+
+    def __str__(self):
+        return str(self.rating_key)
+
+    def __hash__(self):
+        return hash((self.rating_key, self.score))
+
+    def __eq__(self, other):
+        return (self.rating_key, self.score) == (other.rating_key, other.score)
+
+    def __ne__(self, other):
+        # Not strictly necessary, but to avoid having both x==y and x!=y
+        # True at the same time
+        return not (self == other)
+
+
+class SubtitleHistory(object):
+    size = 100
+    storage = None
+    threadkit = None
+
+    def __init__(self, storage, threadkit, size=100):
+        self.size = size
+        self.storage = storage
+        self.threadkit = threadkit
+
+    def add(self, item_title, rating_key, section_title=None, subtitle=None, thumb=None, mode="a", time=None):
+        with self.threadkit.Lock(key="sub_history_add"):
+            items = self.items
+
+            item = SubtitleHistoryItem(item_title, rating_key, section_title=section_title, subtitle=subtitle,
+                                       thumb=thumb, mode=mode, time=time)
+
+            # insert item
+            items.insert(0, item)
+
+            # clamp item amount
+            items = items[:self.size]
+
+            # store items
+            self.storage.SaveObject("subtitle_history", items)
+
+    @property
+    def items(self):
+        try:
+            items = self.storage.LoadObject("subtitle_history") or []
+        except:
+            items = []
+            logger.error("Failed to load history storage: %s" % traceback.format_exc())
+
+        if not isinstance(items, types.ListType):
+            items = []
+        else:
+            items = items[:]
+        return items
+
+    def destroy(self):
+        self.storage = None
+        self.threadkit = None
+
diff --git a/libs/subzero/intent.py b/libs/subzero/intent.py
new file mode 100644
index 000000000..174e68fee
--- /dev/null
+++ b/libs/subzero/intent.py
@@ -0,0 +1,101 @@
+# coding=utf-8
+
+import datetime
+import threading
+
+lock = threading.Lock()
+
+
+class TempIntent(object):
+    timeout = 1000  # milliseconds
+    store = None
+
+    def __init__(self, timeout=1000, store=None):
+        self.timeout = timeout
+        if store is None:
+            raise NotImplementedError
+
+        self.store = store
+
+    def get(self, kind, *keys):
+        with lock:
+            # iter all requested keys
+            for key in keys:
+                hit = False
+
+                # skip key if invalid
+                if not key:
+                    continue
+
+                # valid kind?
+                if kind in self.store:
+                    now = datetime.datetime.now()
+                    key = str(key)
+
+                    # iter all known kinds (previously created)
+                    for known_key in self.store[kind].keys():
+                        # may need locking, for now just play it safe
+                        data = self.store[kind].get(known_key, {})
+                        ends = data.get("timeout")
+                        if not ends:
+                            continue
+
+                        timed_out = False
+                        if now > ends:
+                            timed_out = True
+
+                        # key and kind in storage, and not timed out = hit
+                        if known_key == key and not timed_out:
+                            hit = True
+
+                        if timed_out:
+                            try:
+                                del self.store[kind][key]
+                            except:
+                                continue
+
+                    if hit:
+                        return True
+        return False
+
+    def resolve(self, kind, key):
+        with lock:
+            if kind in self.store and key in self.store[kind]:
+                del self.store[kind][key]
+                return True
+            return False
+
+    def set(self, kind, key, data=None, timeout=None):
+        with lock:
+            if kind not in self.store:
+                self.store[kind] = {}
+
+            key = str(key)
+            self.store[kind][key] = {
+                "data": data,
+                "timeout": datetime.datetime.now() + datetime.timedelta(milliseconds=timeout or self.timeout)
+            }
+
+    def has(self, kind, key):
+        with lock:
+            if kind not in self.store:
+                return False
+            return key in self.store[kind]
+
+    def cleanup(self):
+        now = datetime.datetime.now()
+        clear_all = False
+        for kind, info in self.store.items():
+            for key, intent_data in info.items():
+                # legacy intent data, clear everything
+                if not isinstance(intent_data, dict):
+                    clear_all = True
+                    continue
+
+                if now > intent_data["timeout"]:
+                    del self.store[kind][key]
+        if clear_all:
+            self.store.clear()
+
+        self.store.save()
+
diff --git a/libs/subzero/language.py b/libs/subzero/language.py
new file mode 100644
index 000000000..af486c4ed
--- /dev/null
+++ b/libs/subzero/language.py
@@ -0,0 +1,112 @@
+# coding=utf-8
+from babelfish.exceptions import LanguageError
+
+from babelfish import Language as Language_, basestr
+
+
+repl_map = {
+    "dk": "da",
+    "nld": "nl",
+    "english": "en",
+}
+
+
+def language_from_stream(l):
+    if not l:
+        raise LanguageError()
+    for method in ("fromietf", "fromalpha3t", "fromalpha3b"):
+        try:
+            return getattr(Language, method)(l)
+        except (LanguageError, ValueError):
+            pass
+    raise LanguageError()
+
+
+def wrap_forced(f):
+    def inner(*args, **kwargs):
+        """
+        classmethod wrapper
+        :param args: args[0] = cls
+        :param kwargs:
+        :return:
+        """
+        args = list(args)
+        cls = args[0]
+        args = args[1:]
+        s = args.pop(0)
+        base, forced = s.split(":") if ":" in s else (s, False)
+        instance = f(cls, base, *args, **kwargs)
+        if isinstance(instance, Language):
+            instance.forced = forced == "forced"
+        return instance
+
+    return inner
+
+
+class Language(Language_):
+    forced = False
+
+    def __init__(self, language, country=None, script=None, unknown=None, forced=False):
+        self.forced = forced
+        super(Language, self).__init__(language, country=country, script=script, unknown=unknown)
+
+    def __getstate__(self):
+        return self.alpha3, self.country, self.script, self.forced
+
+    def __setstate__(self, state):
+        self.alpha3, self.country, self.script, self.forced = state
+
+    def __eq__(self, other):
+        if isinstance(other, basestr):
+            return str(self) == other
+        if not isinstance(other, Language):
+            return False
+        return (self.alpha3 == other.alpha3 and
+                self.country == other.country and
+                self.script == other.script and
+                bool(self.forced) == bool(other.forced))
+
+    def __str__(self):
+        return super(Language, self).__str__() + (":forced" if self.forced else "")
+
+    @property
+    def basename(self):
+        return super(Language, self).__str__()
+
+    def __getattr__(self, name):
+        ret = super(Language, self).__getattr__(name)
+        if isinstance(ret, Language):
+            ret.forced = self.forced
+        return ret
+
+    @classmethod
+    def rebuild(cls, instance, **replkw):
+        state = instance.__getstate__()
+        attrs = ("country", "script", "forced")
+        language = state[0]
+        kwa = dict(zip(attrs, state[1:]))
+        kwa.update(replkw)
+        return cls(language, **kwa)
+
+    @classmethod
+    @wrap_forced
+    def fromcode(cls, code, converter):
+        return Language(*Language_.fromcode(code, converter).__getstate__())
+
+    @classmethod
+    @wrap_forced
+    def fromietf(cls, ietf):
+        ietf_lower = ietf.lower()
+        if ietf_lower in repl_map:
+            ietf = repl_map[ietf_lower]
+
+        return Language(*Language_.fromietf(ietf).__getstate__())
+
+    @classmethod
+    @wrap_forced
+    def fromalpha3b(cls, s):
+        if s in repl_map:
+            s = repl_map[s]
+            return Language(*Language_.fromietf(s).__getstate__())
+
+        return Language(*Language_.fromalpha3b(s).__getstate__())
diff --git a/libs/subzero/lib/__init__.py b/libs/subzero/lib/__init__.py
new file mode 100644
index 000000000..2c1fe6987
--- /dev/null
+++ b/libs/subzero/lib/__init__.py
@@ -0,0 +1,2 @@
+
+import dict, geezip, httpfake, io, json, rar, which
\ No newline at end of file
diff --git a/libs/subzero/lib/dict.py b/libs/subzero/lib/dict.py
new file mode 100644
index 000000000..3f327dcf4
--- /dev/null
+++ b/libs/subzero/lib/dict.py
@@ -0,0 +1,163 @@
+# coding=utf-8
+
+
+class DictProxy(object):
+    store = None
+
+    def __init__(self, d):
+        self.Dict = d
+        super(DictProxy, self).__init__()
+
+        if self.store not in self.Dict or not self.Dict[self.store]:
+            self.Dict[self.store] = self.setup_defaults()
+        self.save()
+        self.__initialized = True
+
+    def __getattr__(self, name):
+        if name in self.Dict[self.store]:
+            return self.Dict[self.store][name]
+        return getattr(super(DictProxy, self), name)
+
+    def __setattr__(self, name, value):
+        if not self.__dict__.has_key(
+                '_DictProxy__initialized'):  # this test allows attributes to be set in the __init__ method
+            return object.__setattr__(self, name, value)
+
+        elif self.__dict__.has_key(name):  # any normal attributes are handled normally
+            object.__setattr__(self, name, value)
+
+        else:
+            if name in self.Dict[self.store]:
+                self.Dict[self.store][name] = value
+                return
+        object.__setattr__(self, name, value)
+
+    def __cmp__(self, d):
+        return cmp(self.Dict[self.store], d)
+
+    def __contains__(self, item):
+        return item in self.Dict[self.store]
+
+    def __setitem__(self, key, item):
+        self.Dict[self.store][key] = item
+        self.Dict.Save()
+
+    def __iter__(self):
+        return iter(self.Dict[self.store])
+
+    def __getitem__(self, key):
+        if key in self.Dict[self.store]:
+            return self.Dict[self.store][key]
+
+    def __repr__(self):
+        return repr(self.Dict[self.store])
+
+    def __str__(self):
+        return str(self.Dict[self.store])
+
+    def __len__(self):
+        return len(self.Dict[self.store].keys())
+
+    def __delitem__(self, key):
+        del self.Dict[self.store][key]
+
+    def save(self):
+        self.Dict.Save()
+
+    def clear(self):
+        del self.Dict[self.store]
+        return None
+
+    def copy(self):
+        return self.Dict[self.store].copy()
+
+    def has_key(self, k):
+        return k in self.Dict[self.store]
+
+    def pop(self, k, d=None):
+        return self.Dict[self.store].pop(k, d)
+
+    def update(self, *args, **kwargs):
+        return self.Dict[self.store].update(*args, **kwargs)
+
+    def keys(self):
+        return self.Dict[self.store].keys()
+
+    def values(self):
+        return self.Dict[self.store].values()
+
+    def items(self):
+        return self.Dict[self.store].items()
+
+    def __unicode__(self):
+        return unicode(repr(self.Dict[self.store]))
+
+    def setup_defaults(self):
+        raise NotImplementedError
+
+
+class Dicked(object):
+    """
+    mirrors a dictionary; readonly
+    """
+    _entries = None
+
+    def __init__(self, **entries):
+        self._entries = entries or None
+        for key, value in entries.iteritems():
+            self.__dict__[key] = (Dicked(**value) if isinstance(value, dict) else value)
+
+    def __repr__(self):
+        return str(self)
+
+    def __unicode__(self):
+        return unicode(self.__digged__)
+
+    def __str__(self):
+        return str(self.__digged__)
+
+    def __lt__(self, d):
+        return self._entries < d
+
+    def __le__(self, d):
+        return self._entries <= d
+
+    def __eq__(self, d):
+        if d is None and not self._entries:
+            return True
+
+        return self._entries == d
+
+    def __ne__(self, d):
+        return self._entries != d
+
+    def __gt__(self, d):
+        return self._entries > d
+
+    def __ge__(self, d):
+        return self._entries >= d
+
+    def __getattr__(self, name):
+        # fixme: this might be wildly stupid; maybe implement stuff like .iteritems() directly
+        return getattr(self._entries, name, Dicked())
+
+    @property
+    def __digged__(self):
+        return {key: value for key, value in self.__dict__.iteritems() if key != "_entries"}
+
+    def __len__(self):
+        return len(self.__digged__)
+
+    def __nonzero__(self):
+        return bool(self.__digged__)
+
+    def __iter__(self):
+        return iter(self.__digged__)
+
+    def __hash__(self):
+        return hash(self.__digged__)
+
+    def __getitem__(self, name):
+        if name in self._entries:
+            return getattr(self, name)
+        raise KeyError(name)
diff --git a/libs/subzero/lib/geezip.py b/libs/subzero/lib/geezip.py
new file mode 100644
index 000000000..89657834f
--- /dev/null
+++ b/libs/subzero/lib/geezip.py
@@ -0,0 +1,37 @@
+# coding=utf-8
+
+import gzip
+from zlib import Z_FINISH
+
+
+__all__ = ["GeezipFile", "open", "Z_FINISH"]
+
+
+def open(filename, mode="rb", compresslevel=9):
+    """Shorthand for GzipFile(filename, mode, compresslevel).
+
+    The filename argument is required; mode defaults to 'rb'
+    and compresslevel defaults to 9.
+
+    """
+    return GeezipFile(filename, mode, compresslevel)
+
+
+class GeezipFile(gzip.GzipFile):
+    def close(self):
+        fileobj = self.fileobj
+        if fileobj is None:
+            return
+        self.fileobj = None
+        try:
+            if self.mode == gzip.WRITE:
+                fileobj.write(self.compress.flush(Z_FINISH))
+                gzip.write32u(fileobj, self.crc)
+                # self.size may exceed 2GB, or even 4GB
+                gzip.write32u(fileobj, self.size & 0xffffffffL)
+                fileobj.flush()
+        finally:
+            myfileobj = self.myfileobj
+            if myfileobj:
+                self.myfileobj = None
+                myfileobj.close()
diff --git a/libs/subzero/lib/httpfake.py b/libs/subzero/lib/httpfake.py
new file mode 100644
index 000000000..93b591a55
--- /dev/null
+++ b/libs/subzero/lib/httpfake.py
@@ -0,0 +1,45 @@
+# coding=utf-8
+
+
+class PlexPyNativeResponseProxy(object):
+    """
+    The equally stupid counterpart to Sub-Zero.support.lib.PlexPyNativeRequestProxy.
+    Incompletely mimics a requests response object for the plex.py library to use.
+    """
+    data = None
+    headers = None
+    response_code = None
+    request = None
+
+    def __init__(self, response, status_code, request):
+        if response:
+            self.data = response.content
+            self.headers = response.headers
+        self.response_code = status_code
+        self.request = request
+
+    def content(self):
+        return self.data
+
+    content = property(content)
+
+    def status_code(self):
+        return self.response_code
+
+    status_code = property(status_code)
+
+    def url(self):
+        return self.request.url
+
+    url = property(url)
+
+    def __str__(self):
+        return str(self.data)
+
+    def __unicode__(self):
+        return unicode(self.data)
+
+    def __repr__(self):
+        return repr(self.data)
+
+
diff --git a/libs/subzero/lib/io.py b/libs/subzero/lib/io.py
new file mode 100644
index 000000000..07c442972
--- /dev/null
+++ b/libs/subzero/lib/io.py
@@ -0,0 +1,99 @@
+# coding=utf-8
+
+import os
+import sys
+
+from scandir import scandir as _scandir
+
+# thanks @ plex trakt scrobbler: https://github.com/trakt/Plex-Trakt-Scrobbler/blob/master/Trakttv.bundle/Contents/Libraries/Shared/plugin/core/io.py
+
+
+class FileIO(object):
+    @staticmethod
+    def exists(path):
+        return os.path.exists(path)
+
+    @staticmethod
+    def delete(path):
+        os.remove(path)
+
+    @staticmethod
+    def read(path, mode='r'):
+        with open(path, mode) as fp:
+            data = fp.read()
+
+        return data
+
+    @staticmethod
+    def write(path, data, mode='w'):
+        with open(path, mode) as fp:
+            fp.write(data)
+
+
+VALID_ENCODINGS = ("latin1", "utf-8", "mbcs")
+
+
+def get_viable_encoding():
+    # fixme: bad
+    encoding = sys.getfilesystemencoding()
+    return "utf-8" if not encoding or encoding.lower() not in VALID_ENCODINGS else encoding
+
+
+class ScandirListdirEntryStub(object):
+    """
+    A class which mimics the entries returned by scandir, for fallback purposes when using listdir instead.
+    """
+    __slots__ = ('name', '_d_type', '_stat', '_lstat', '_scandir_path', '_path', '_inode')
+
+    def __init__(self, scandir_path, name, d_type, inode):
+        self._scandir_path = scandir_path
+        self.name = name
+        self._d_type = d_type
+        self._inode = inode
+        self._stat = None
+        self._lstat = None
+        self._path = None
+
+    @property
+    def path(self):
+        if self._path is None:
+            self._path = os.path.join(self._scandir_path, self.name)
+        return self._path
+
+    def stat(self, follow_symlinks=True):
+        path = self.path
+        if follow_symlinks and self.is_symlink():
+            path = os.path.realpath(path)
+
+        return os.stat(path)
+
+    def is_dir(self, follow_symlinks=True):
+        path = self.path
+        if follow_symlinks and self.is_symlink():
+            path = os.path.realpath(path)
+
+        return os.path.isdir(path)
+
+    def is_file(self, follow_symlinks=True):
+        path = self.path
+        if follow_symlinks and self.is_symlink():
+            path = os.path.realpath(path)
+
+        return os.path.isfile(path)
+
+    def is_symlink(self):
+        return os.path.islink(self.path)
+
+
+def scandir_listdir_fallback(path):
+    for fn in os.listdir(path):
+        yield ScandirListdirEntryStub(path, fn, None, None)
+
+
+def scandir(path):
+    try:
+        return _scandir(path)
+
+    # fallback for systems where sys.getfilesystemencoding() returns the "wrong" value
+    except UnicodeDecodeError:
+        return scandir_listdir_fallback(path)
diff --git a/libs/subzero/lib/json.py b/libs/subzero/lib/json.py
new file mode 100644
index 000000000..d3f3184a2
--- /dev/null
+++ b/libs/subzero/lib/json.py
@@ -0,0 +1,40 @@
+# coding=utf-8
+from gzip import GzipFile
+
+from json_tricks import TricksEncoder
+from json_tricks.nonp import DEFAULT_ENCODERS, ENCODING, is_py3, BytesIO
+
+
+def dumps(obj, sort_keys=None, cls=TricksEncoder, obj_encoders=DEFAULT_ENCODERS, extra_obj_encoders=(),
+          primitives=False, compression=None, allow_nan=False, conv_str_byte=False, **jsonkwargs):
+    """
+    Convert a nested data structure to a json string.
+
+    :param obj: The Python object to convert.
+    :param sort_keys: Keep this False if you want order to be preserved.
+    :param cls: The json encoder class to use, defaults to NoNumpyEncoder which gives a warning for numpy arrays.
+    :param obj_encoders: Iterable of encoders to use to convert arbitrary objects into json-able promitives.
+    :param extra_obj_encoders: Like `obj_encoders` but on top of them: use this to add encoders without replacing defaults. Since v3.5 these happen before default encoders.
+    :param allow_nan: Allow NaN and Infinity values, which is a (useful) violation of the JSON standard (default False).
+    :param conv_str_byte: Try to automatically convert between strings and bytes (assuming utf-8) (default False).
+    :return: The string containing the json-encoded version of obj.
+
+    Other arguments are passed on to `cls`. Note that `sort_keys` should be false if you want to preserve order.
+    """
+    if not hasattr(extra_obj_encoders, '__iter__'):
+        raise TypeError('`extra_obj_encoders` should be a tuple in `json_tricks.dump(s)`')
+    encoders = tuple(extra_obj_encoders) + tuple(obj_encoders)
+    txt = cls(sort_keys=sort_keys, obj_encoders=encoders, allow_nan=allow_nan,
+              primitives=primitives, **jsonkwargs).encode(obj)
+    #if not is_py3 and isinstance(txt, str):
+    #    txt = unicode(txt, ENCODING)
+    if not compression:
+        return txt
+    if compression is True:
+        compression = 5
+    txt = txt.encode(ENCODING)
+    sh = BytesIO()
+    with GzipFile(mode='wb', fileobj=sh, compresslevel=compression) as zh:
+        zh.write(txt)
+    gzstring = sh.getvalue()
+    return gzstring
diff --git a/libs/subzero/lib/rar.py b/libs/subzero/lib/rar.py
new file mode 100644
index 000000000..8e9cdafc8
--- /dev/null
+++ b/libs/subzero/lib/rar.py
@@ -0,0 +1,25 @@
+# coding=utf-8
+
+import logging
+import rarfile
+
+log = logging.getLogger(__name__)
+
+
+class RarFile(rarfile.RarFile):
+    def read(self, fname, psw=None):
+        """
+        read specific content of rarfile without parsing
+        :param fname:
+        :param psw:
+        :return:
+        """
+        cmd = [rarfile.UNRAR_TOOL] + list(rarfile.ORIG_OPEN_ARGS)
+
+        with rarfile.XTempFile(self._rarfile) as rf:
+            log.debug(u"RAR CMD: %s", cmd + [rf, fname])
+            p = rarfile.custom_popen(cmd + [rf, fname])
+            output = p.communicate()[0]
+            rarfile.check_returncode(p, output)
+
+            return output
diff --git a/libs/subzero/lib/which.py b/libs/subzero/lib/which.py
new file mode 100644
index 000000000..e65a7d900
--- /dev/null
+++ b/libs/subzero/lib/which.py
@@ -0,0 +1,42 @@
+# coding=utf-8
+
+# https://gist.github.com/4368898
+# Public domain code by anatoly techtonik <techtonik@gmail.com>
+# AKA Linux `which` and Windows `where`
+
+import os
+import sys
+
+
+def find_executable(executable, path=None):
+    """Find if 'executable' can be run. Looks for it in 'path'
+    (string that lists directories separated by 'os.pathsep';
+    defaults to os.environ['PATH']). Checks for all executable
+    extensions. Returns full path or None if no command is found.
+    """
+    if path is None:
+        path = os.environ['PATH']
+    paths = path.split(os.pathsep)
+    extlist = ['']
+    if os.name == 'os2':
+        (base, ext) = os.path.splitext(executable)
+        # executable files on OS/2 can have an arbitrary extension, but
+        # .exe is automatically appended if no dot is present in the name
+        if not ext:
+            executable = executable + ".exe"
+    elif sys.platform == 'win32':
+        pathext = os.environ['PATHEXT'].lower().split(os.pathsep)
+        (base, ext) = os.path.splitext(executable)
+        if ext.lower() not in pathext:
+            extlist = pathext
+    for ext in extlist:
+        execname = executable + ext
+        if os.path.isfile(execname):
+            return execname
+        else:
+            for p in paths:
+                f = os.path.join(p, execname)
+                if os.path.isfile(f):
+                    return f
+    else:
+        return None
diff --git a/libs/subzero/modification/__init__.py b/libs/subzero/modification/__init__.py
new file mode 100644
index 000000000..d6008b17b
--- /dev/null
+++ b/libs/subzero/modification/__init__.py
@@ -0,0 +1,5 @@
+# coding=utf-8
+
+from registry import registry
+from mods import hearing_impaired, ocr_fixes, fps, offset, common, color
+from main import SubtitleModifications, SubMod
diff --git a/libs/subzero/modification/dictionaries/__init__.py b/libs/subzero/modification/dictionaries/__init__.py
new file mode 100644
index 000000000..201b7409a
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/__init__.py
@@ -0,0 +1,3 @@
+# coding=utf-8
+
+from data import data
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/data.py b/libs/subzero/modification/dictionaries/data.py
new file mode 100644
index 000000000..2ec9253f7
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/data.py
@@ -0,0 +1,198 @@
+import re
+from collections import OrderedDict
+data = {'bos': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict([(u'da nadjem', u'na\u0107i'), (u'da nadjes', u'na\u0107i'), (u'da budes', u'biti'), (u'da ides', u'i\u0107i'), (u'da prodemo', u'pro\u0107i'), (u'da udem', u'u\u0107i'), (u'gdje ides', u'kamo ide\u0161'), (u'Gdje ides', u'Kamo ide\u0161'), (u'hocu da budem', u'\u017eelim biti'), (u'Hocu da budem', u'\u017delim biti'), (u'hocu da kazem', u'\u017eelim re\u0107i'), (u'hoces da kazes', u'\u017eeli\u0161 re\u0107i'), (u'hoce da kaze', u'\u017eeli re\u0107i'), (u'kao sto sam', u'kao \u0161to sam'), (u'me leda', u'me le\u0111a'), (u'medu nama', u'me\u0111u nama'), (u'moramo da idemo', u'moramo i\u0107i'), (u'moras da ides', u'mora\u0161 i\u0107i'), (u'na vecer', u'nave\u010der'), (u'Na vecer', u'Nave\u010der'), (u'ne cu', u'ne\u0107u'), (u'ne ces', u'ne\u0107e\u0161'), (u'ne\u0161to sto', u'ne\u0161to \u0161to'), (u'ono sto', u'ono \u0161to'), (u'Ono sto', u'Ono \u0161to'), (u'reci \u0107u', u're\u0107i \u0107u'), (u'sto ti se ne', u'\u0161to ti se ne'), (u'sto vise', u'\u0161to vi\u0161e'), (u'sve sto', u'sve \u0161to'), (u'Zao mi', u'\u017dao mi'), (u'zao mi', u'\u017eao mi'), (u'Zato sto', u'Zato \u0161to'), (u'zato sto', u'zato \u0161to'), (u'znas sto', u'zna\u0161 \u0161to'), (u'zna\u0161 sto', u'zna\u0161 \u0161to')]),
+                          'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:da\\ nadjem|da\\ nadjes|da\\ budes|da\\ ides|da\\ prodemo|da\\ udem|gdje\\ ides|Gdje\\ ides|hocu\\ da\\ budem|Hocu\\ da\\ budem|hocu\\ da\\ kazem|hoces\\ da\\ kazes|hoce\\ da\\ kaze|kao\\ sto\\ sam|me\\ leda|medu\\ nama|moramo\\ da\\ idemo|moras\\ da\\ ides|na\\ vecer|Na\\ vecer|ne\\ cu|ne\\ ces|ne\\\u0161to\\ sto|ono\\ sto|Ono\\ sto|reci\\ \\\u0107u|sto\\ ti\\ se\\ ne|sto\\ vise|sve\\ sto|Zao\\ mi|zao\\ mi|Zato\\ sto|zato\\ sto|znas\\ sto|zna\\\u0161\\ sto)(?:(?=\\s)|(?=$)|(?=\\b))'},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'andele', u'an\u0111ele'), (u'andeli', u'an\u0111eli'), (u'bacas', u'baca\u0161'), (u'bas', u'ba\u0161'), (u'Bas', u'Ba\u0161'), (u'basta', u'vrt'), (u'Basta', u'Vrt'), (u'baste', u'vrtovi'), (u'Baste', u'Vrtovi'), (u'basti', u'vrtu'), (u'Basti', u'Vrtu'), (u'bastom', u'vrtom'), (u'Bastom', u'Vrtom'), (u'bastu', u'vrt'), (u'Bastu', u'Vrt'), (u'Bice', u'Bi\u0107e'), (u'bice', u'bi\u0107e'), (u'Bice\u0161', u'Bit \u0107e\u0161'), (u'Bicu', u'Bit \u0107u'), (u'bicu', u'bi\u0107u'), (u'blagonaklonoscu', u'blagonaklono\u0161\u0107u'), (u'blizi', u'bli\u017ei'), (u'bljesti', u'blije\u0161ti'), (u'Bljesti', u'Blije\u0161ti'), (u'bojis', u'boji\u0161'), (u'braca', u'bra\u0107a'), (u'Braca', u'Bra\u0107a'), (u'broncane', u'bron\u010dane'), (u'broncanu', u'bron\u010danu'), (u'budes', u'bude\u0161'), (u'caj', u'\u010daj'), (u'caja', u'\u010daja'), (u'Cak', u'\u010cak'), (u'cak', u'\u010dak'), (u'cale', u'tata'), (u'Cao', u'\u0106ao'), (u'cao', u'\u0107ao'), (u'cas', u'sat'), (u'casno', u'\u010dasno'), (u'Casno', u'\u010casno'), (u'castis', u'\u010dasti\u0161'), (u'casu', u'ca\u0161u'), (u'ca\u0161u', u'\u010da\u0161u'), (u'cebe', u'deku'), (u'cega', u'\u010dega'), (u'Cek', u'\u010cek'), (u'cek', u'\u010dek'), (u'cekali', u'\u010dekali'), (u'cekas', u'\u010deka\u0161'), (u'Cemu', u'\u010cemu'), (u'cemu', u'\u010demu'), (u'cerka', u'k\u0107i'), (u'Cerka', u'K\u0107i'), (u'cerke', u'k\u0107eri'), (u'Cerke', u'K\u0107eri'), (u'cerku', u'k\u0107er'), (u'Cerku', u'K\u0107er'), (u'ces', u'\u0107e\u0161'), (u'cesce', u'\u010de\u0161\u0107e'), (u'Cesce', u'\u010ce\u0161\u0107e'), (u'Ceskoj', u'\u010ce\u0161koj'), (u'cestitki', u'\u010destitki'), (u'cesto', u'\u010desto'), (u'Cesto', u'\u010cesto'), (u'cetiri', u'\u010detiri'), (u'Cetiri', u'\u010cetiri'), (u'cetri', u'\u010detiri'), (u'cetu', u'\u010detu'), (u'ceznja', u'\u010de\u017enja'), (u'ceznje', u'\u010de\u017enje'), (u'ceznji', u'\u010de\u017enji'), (u'ceznjom', u'\u010de\u017enjom'), (u'ceznju', u'\u010de\u017enju'), (u'ceznu', u'\u010deznu'), (u'ce\u0161', u'\u0107e\u0161'), (u'Cija', u'\u010cija'), (u'cija', u'\u010dija'), (u'cije', u'\u010dije'), (u'Ciji', u'\u010ciji'), (u'ciji', u'\u010diji'), (u'cijih', u'\u010dijih'), (u'Cijih', u'\u010cijih'), (u'cijim', u'\u010dijim'), (u'Cijim', u'\u010cijim'), (u'Cim', u'\u010cim'), (u'cim', u'\u010dim'), (u'cime', u'\u010dime'), (u'cinila', u'\u010dinila'), (u'cinili', u'\u010dinili'), (u'cinio', u'\u010dinio'), (u'cinis', u'\u010dini\u0161'), (u'ciniti', u'\u010diniti'), (u'cipka', u'\u010dipka'), (u'cipku', u'\u010dipku'), (u'cita', u'\u010dita'), (u'citao', u'\u010ditao'), (u'citas', u'\u010dita\u0161'), (u'citavu', u'\u010ditavu'), (u'cizme', u'\u010dizme'), (u'clan', u'\u010dlan'), (u'Clan', u'\u010clan'), (u'clanke', u'\u010dlanke'), (u'clanove', u'\u010dlanove'), (u'clanovi', u'\u010dlanovi'), (u'clanovima', u'\u010dlanovima'), (u'cmo', u'\u0107emo'), (u'corsokak', u'slijepa ulica'), (u'corsokaku', u'slijepoj ulici'), (u'cosak', u'ugao'), (u'cosku', u'uglu'), (u'covece', u'\u010dovje\u010de'), (u'covek', u'\u010dovjek'), (u'covjece', u'\u010dovje\u010de'), (u'covjecnost', u'\u010dovje\u010dnost'), (u'covjek', u'\u010dovjek'), (u'covjeka', u'\u010dovjeka'), (u'covjeku', u'\u010dovjeku'), (u'crpeci', u'crpe\u0107i'), (u'cte', u'\u0107ete'), (u'Cu', u'\u0106u'), (u'Ce\u0161', u'\u0106e\u0161'), (u'Ce', u'\u0106e'), (u'Cemo', u'\u0106emo'), (u'Cete', u'\u0106ete'), (u'cu', u'\u0107u'), (u'ce', u'\u0107e'), (u'cemo', u'\u0107emo'), (u'cete', u'\u0107ete'), (u'cudi', u'\u010dudi'), (u'Cudo', u'\u010cudo'), (u'cudo', u'\u010dudo'), (u'Cujte', u'\u010cujte'), (u'cula', u'\u010dula'), (u'culi', u'\u010duli'), (u'Culi', u'\u010culi'), (u'culima', u'\u010dulima'), (u'cuo', u'\u010duo'), (u'Cuo', u'\u010cuo'), (u'cupam', u'\u010dupam'), (u'cutanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'cutao', u'\u0161utio'), (u'Cutao', u'\u0160utio'), (u'cuti', u'\u010duti'), (u'cutljiv', u'\u0161utljiv'), (u'cutnja', u'\u0161utnja'), (u'cuvali', u'\u010duvali'), (u'cuveni', u'\u010duveni'), (u'dace', u'dat \u0107e'), (u'dacemo', u'dat \u0107emo'), (u'davo', u'vrag'), (u'definise', u'definira'), (u'definisi', u'definiraj'), (u'Desava', u'Doga\u0111a'), (u'desava', u'doga\u0111a'), (u'disemo', u'di\u0161emo'), (u'disi', u'di\u0161i'), (u'dobijes', u'dobije\u0161'), (u'dobivas', u'dobiva\u0161'), (u'doci', u'do\u0107i'), (u'dode', u'do\u0111e'), (u'dodem', u'do\u0111em'), (u'dodes', u'do\u0111e\u0161'), (u'dodete', u'do\u0111ete'), (u'dode\u0161', u'do\u0111e\u0161'), (u'Dodi', u'Do\u0111i'), (u'dodi', u'do\u0111i'), (u'dodite', u'do\u0111ite'), (u'Dodji', u'Do\u0111i'), (u'dodji', u'do\u0111i'), (u'Dodjite', u'Do\u0111ite'), (u'dodjite', u'do\u0111ite'), (u'Dodju', u'Do\u0111u'), (u'dodju', u'do\u0111u'), (u'dodu', u'do\u0111u'), (u'dolazis', u'dolazi\u0161'), (u'dopustao', u'dopu\u0161tao'), (u'dorucak', u'doru\u010dak'), (u'dorucku', u'doru\u010dku'), (u'Dosao', u'Do\u0161ao'), (u'dosao', u'do\u0161ao'), (u'drhteci', u'drhte\u0107i'), (u'drhte\u0107i', u'drhte\u0107i'), (u'Drhte\u0107i', u'Drhte\u0107i'), (u'drugacija', u'druga\u010dija'), (u'Drugacije', u'Druga\u010dije'), (u'drugacije', u'druga\u010dije'), (u'drugaciji', u'druga\u010diji'), (u'Drugaciji', u'Druga\u010diji'), (u'drukciji', u'druga\u010diji'), (u'drveca', u'drve\u0107a'), (u'drvece', u'drve\u0107e'), (u'drvecem', u'drve\u0107em'), (u'drvecu', u'drve\u0107u'), (u'drzi', u'dr\u017ei'), (u'Drzim', u'Dr\u017eim'), (u'dugmici', u'gumbi\u0107i'), (u'duze', u'du\u017ee'), (u'duzinom', u'du\u017einom'), (u'dzanki', u'ovisnik'), (u'Dzejk', u'Jake'), (u'Dzime', u'Jime'), (u'Dzone', u'Johne'), (u'flasom', u'fla\u0161om'), (u'flasu', u'fla\u0161u'), (u'fucka', u'fu\u0107ka'), (u'funkcionisu', u'funkcioniraju'), (u'gacice', u'ga\u0107ice'), (u'gadao', u'ga\u0111ao'), (u'gadis', u'gadi\u0161'), (u'Gadis', u'Gadi\u0161'), (u'gdica', u'g\u0111ica'), (u'gdice', u'g\u0111ice'), (u'gdici', u'g\u0111ici'), (u'gdicu', u'g\u0111icu'), (u'gdu', u'g\u0111u'), (u'glupaco', u'glupa\u010do'), (u'govoris', u'govori\u0161'), (u'gradani', u'gra\u0111ani'), (u'gradic', u'gradi\u0107'), (u'gradica', u'gradi\u0107a'), (u'gradicu', u'gradi\u0107u'), (u'grancica', u'gran\u010dica'), (u'grancicu', u'gran\u010dicu'), (u'gresci', u'gre\u0161ci'), (u'grese', u'grije\u0161e'), (u'greski', u'gre\u0161ci'), (u'gresku', u'gre\u0161ku'), (u'gubis', u'gubi\u0161'), (u'Hoces', u'Ho\u0107e\u0161'), (u'hoces', u'ho\u0107e\u0161'), (u'hocu', u'ho\u0107u'), (u'Hocu', u'Ho\u0107u'), (u'hodas', u'hoda\u0161'), (u'htjeo', u'htio'), (u'iceg', u'i\u010deg'), (u'icega', u'i\u010dega'), (u'icemu', u'i\u010demu'), (u'Ici', u'I\u0107i'), (u'ici', u'i\u0107i'), (u'Ides', u'Ide\u0161'), (u'ides', u'ide\u0161'), (u'iduce', u'idu\u0107e'), (u'iduceg', u'idu\u0107eg'), (u'iducem', u'idu\u0107em'), (u'Iduci', u'Idu\u0107i'), (u'iduci', u'idu\u0107i'), (u'ignorisi', u'ignoriraju'), (u'igras', u'igra\u0161'), (u'Ijudi', u'ljudi'), (u'imas', u'ima\u0161'), (u'imidz', u'imid\u017e'), (u'inace', u'ina\u010de'), (u'Inace', u'Ina\u010de'), (u'isao', u'i\u0161ao'), (u'Isao', u'I\u0161ao'), (u'iscupao', u'i\u0161\u010dupao'), (u'ise\u0107emo', u'izrezati'), (u'isla', u'i\u0161la'), (u'istjece', u'istje\u010de'), (u'istrazio', u'istrazio'), (u'Istrazio', u'Istrazio'), (u'isuvise', u'previ\u0161e'), (u'izaci', u'iza\u0107i'), (u'Izaci', u'Iza\u0107i'), (u'izade', u'iza\u0111e'), (u'Izade', u'Iza\u0111e'), (u'izadem', u'iza\u0111em'), (u'izades', u'iza\u0111e\u0161'), (u'izadete', u'iza\u0111ete'), (u'Izadi', u'Iza\u0111i'), (u'izadi', u'iza\u0111i'), (u'izasao', u'iza\u0161ao'), (u'izasla', u'iza\u0161la'), (u'izici', u'izi\u0107i'), (u'izluduje', u'izlu\u0111uje'), (u'izluduju', u'izlu\u0111uju'), (u'izmedu', u'izme\u0111u'), (u'Izmedu', u'Izme\u0111u'), (u'izostri', u'izo\u0161tri'), (u'izostrim', u'izo\u0161trim'), (u'izvuci', u'izvu\u0107i'), (u'i\u0161cupao', u'i\u0161\u010dupao'), (u'jebes', u'jebe\u0161'), (u'Jebes', u'Jebe\u0161'), (u'jos', u'jo\u0161'), (u'Jos', u'Jo\u0161'), (u'juce', u'ju\u010der'), (u'Juce', u'Ju\u010der'), (u'jucer', u'ju\u010der'), (u'Jucer', u'Ju\u010der'), (u'kaslja', u'ka\u0161lja'), (u'kaze', u'ka\u017ee'), (u'Kaze', u'Ka\u017ee'), (u'kazemo', u'ka\u017eemo'), (u'kazite', u'ka\u017eite'), (u'Kazite', u'Ka\u017eite'), (u'kazu', u'ka\u017eu'), (u'Kcer', u'K\u0107er'), (u'kcer', u'k\u0107er'), (u'kcerka', u'k\u0107i'), (u'Kcerka', u'K\u0107i'), (u'kcerkama', u'k\u0107erima'), (u'kcerku', u'k\u0107er'), (u'Kcerku', u'K\u0107er'), (u'kecap', u'ke\u010dap'), (u'kecapa', u'ke\u010dapa'), (u'kise', u'ki\u0161e'), (u'kisi', u'ki\u0161i'), (u'kleknes', u'klekne\u0161'), (u'kociji', u'ko\u010diji'), (u'kolaca', u'kola\u010da'), (u'kolace', u'kola\u010de'), (u'komadic', u'komadi\u0107'), (u'komsijama', u'susjedima'), (u'komsije', u'susjedi'), (u'komsiji', u'susjedu'), (u'komsiluk', u'susjedstvo'), (u'komsiluku', u'susjedstvu'), (u'kom\u0161ija', u'susjed'), (u'Kom\u0161ija', u'Susjed'), (u'Konkurise', u'Konkurira'), (u'konkurise', u'konkurira'), (u'konkurisem', u'konkuriram'), (u'konkurisu', u'konkuriraju'), (u'kontrolisu', u'kontroliraju'), (u'kosulja', u'ko\u0161ulja'), (u'kosulje', u'ko\u0161ulje'), (u'kosulji', u'ko\u0161ulji'), (u'kosulju', u'ko\u0161ulju'), (u'kovceg', u'kov\u010deg'), (u'kovcegu', u'kov\u010degu'), (u'krada', u'kra\u0111a'), (u'Krada', u'Kra\u0111a'), (u'Krece', u'Kre\u0107e'), (u'krece', u'kre\u0107e'), (u'Kreci', u'Kre\u0107i'), (u'kreci', u'kre\u0107i'), (u'krecu', u'kre\u0107u'), (u'kre\u0107es', u'kre\u0107e\u0161'), (u'krosnje', u'kro\u0161nje'), (u'krvaris', u'krvari\u0161'), (u'kuca', u'ku\u0107a'), (u'kucama', u'ku\u0107ama'), (u'kuce', u'ku\u0107e'), (u'kuci', u'ku\u0107i'), (u'kusa', u'ku\u0161a'), (u'kusas', u'ku\u0161a\u0161'), (u'ku\u010da', u'ku\u0107a'), (u'ku\u010di', u'ku\u0107i'), (u'lakocom', u'lako\u0107om'), (u'laz', u'la\u017e'), (u'lazac', u'la\u017eljivac'), (u'laze', u'la\u017ee'), (u'lazi', u'la\u017ei'), (u'lazne', u'la\u017ene'), (u'lazni', u'la\u017eni'), (u'lazov', u'la\u017eljivac'), (u'ledja', u'le\u0111a'), (u'ledjima', u'le\u0111ima'), (u'leprsa', u'lepr\u0161a'), (u'lezala', u'le\u017eala'), (u'lezali', u'le\u017eali'), (u'lezati', u'le\u017eati'), (u'lezis', u'le\u017ei\u0161'), (u'Lezis', u'Le\u017ei\u0161'), (u'lici', u'li\u010di'), (u'licim', u'li\u010dim'), (u'licis', u'li\u010di\u0161'), (u'licnost', u'li\u010dnost'), (u'licnosti', u'li\u010dnosti'), (u'lijecniku', u'lije\u010dniku'), (u'ljubis', u'ljubi\u0161'), (u'los', u'lo\u0161'), (u'losa', u'lo\u0161a'), (u'losu', u'lo\u0161u'), (u'majcine', u'maj\u010dine'), (u'masini', u'ma\u0161ini'), (u'medu', u'me\u0111u'), (u'Medutim', u'Me\u0111utim'), (u'medutim', u'me\u0111utim'), (u'mici', u'mi\u010di'), (u'Mici', u'Mi\u010di'), (u'micu', u'mi\u010du'), (u'mislis', u'misli\u0161'), (u'Mislis', u'Misli\u0161'), (u'mjesecevom', u'mjese\u010devom'), (u'mjesecine', u'mjese\u010dine'), (u'mjesecini', u'mjese\u010dini'), (u'mjesecinu', u'mjese\u010dinu'), (u'mladic', u'mladi\u0107'), (u'moc', u'mo\u0107'), (u'moci', u'mo\u0107i'), (u'motivisu', u'motiviraju'), (u'mozda', u'mo\u017eda'), (u'Mozda', u'Mo\u017eda'), (u'moze', u'mo\u017ee'), (u'mozete', u'mo\u017eete'), (u'mreza', u'mre\u017ea'), (u'mrezu', u'mre\u017eu'), (u'mrzis', u'mrzi\u0161'), (u'muce', u'mu\u010de'), (u'mucenik', u'mu\u010denik'), (u'mucne', u'mu\u010dne'), (u'muska', u'mu\u0161ka'), (u'muz', u'mu\u017e'), (u'muza', u'mu\u017ea'), (u'naci', u'na\u0107i'), (u'Naci', u'Na\u0107i'), (u'nacin', u'na\u010din'), (u'nadem', u'na\u0111em'), (u'Nadem', u'Na\u0111em'), (u'nademo', u'na\u0111emo'), (u'nades', u'na\u0111e\u0161'), (u'Nades', u'Na\u0111e\u0161'), (u'nadete', u'na\u0111ete'), (u'nadici', u'nadi\u0107i'), (u'nadje', u'na\u0111e'), (u'Nadje', u'Na\u0111e'), (u'nadjen', u'na\u0111en'), (u'nadjes', u'na\u0111e\u0161'), (u'Nadjes', u'Na\u0111e\u0161'), (u'nadjete', u'na\u0111ete'), (u'nagovestaj', u'nagovje\u0161taj'), (u'najvise', u'najvise'), (u'Najvise', u'Najvi\u0161e'), (u'naklonoscu', u'nakolono\u0161\u0107u'), (u'naocale', u'nao\u010dale'), (u'Napisite', u'Napi\u0161ite'), (u'nasa', u'na\u0161a'), (u'Nase', u'Na\u0161e'), (u'nase', u'na\u0161e'), (u'naseg', u'na\u0161eg'), (u'nasi', u'na\u0161i'), (u'Nasi', u'Na\u0161i'), (u'nasao', u'na\u0161ao'), (u'Nasao', u'Na\u0161ao'), (u'nasla', u'na\u0161la'), (u'Nasla', u'Na\u0161la'), (u'nasli', u'na\u0161li'), (u'Nasli', u'Na\u0161li'), (u'nasoj', u'na\u0161oj'), (u'nasrecu', u'na sre\u0107u'), (u'nastavis', u'nastavi\u0161'), (u'nasu', u'na\u0161u'), (u'nauce', u'nau\u010de'), (u'neceg', u'ne\u010deg'), (u'necega', u'ne\u010dega'), (u'necemo', u'ne\u0107emo'), (u'necemu', u'ne\u010demu'), (u'necije', u'ne\u010dije'), (u'neciji', u'ne\u010diji'), (u'necim', u'ne\u010dim'), (u'necovjecnost', u'ne\u010dovje\u010dnost'), (u'necovjecnosti', u'ne\u010dovje\u010dnosti'), (u'necu', u'ne\u0107u'), (u'Necu', u'Ne\u0107u'), (u'nekaze', u'ne ka\u017ee'), (u'nekoc', u'neko\u0107'), (u'Nemas', u'Nema\u0161'), (u'nemas', u'nema\u0161'), (u'Nesreca', u'Nesre\u0107a'), (u'nesto', u'ne\u0161to'), (u'Nesto', u'Ne\u0161to'), (u'new yorski', u'njujor\u0161ki'), (u'Nezan', u'Nje\u017ean'), (u'nezan', u'nje\u017ean'), (u'nezna', u'nje\u017ena'), (u'Neznam', u'Ne znam'), (u'Neznas', u'Ne znas'), (u'Neznajuci', u'Ne znaju\u0107i'), (u'Neznavsi', u'Ne znav\u0161i'), (u'neznam', u'ne znam'), (u'neznas', u'ne znas'), (u'neznajuci', u'ne znaju\u0107i'), (u'neznavsi', u'ne znav\u0161i'), (u'nezni', u'nje\u017eni'), (u'neznih', u'nje\u017enih'), (u'neznim', u'nje\u017enim'), (u'nezno', u'nje\u017eno'), (u'neznu', u'nje\u017enu'), (u'niceg', u'ni\u010deg'), (u'nicega', u'ni\u010dega'), (u'nicemu', u'ni\u010demu'), (u'nicija', u'ni\u010dija'), (u'niciji', u'ni\u010diji'), (u'nicim', u'ni\u010dim'), (u'njezno', u'nje\u017eno'), (u'nju jorski', u'njujor\u0161ki'), (u'noci', u'no\u0107i'), (u'nocnu', u'no\u0107nu'), (u'nosac', u'nosa\u010d'), (u'nosices', u'nosit \u0107e\u0161'), (u'nosis', u'nosi\u0161'), (u'noz', u'no\u017e'), (u'nozem', u'no\u017eem'), (u'Obecao', u'Obe\u0107ao'), (u'Obezbedjuju', u'Osiguravaju'), (u'obezbedjuju', u'osiguravaju'), (u'obide', u'obi\u0111e'), (u'objasnis', u'objasni\u0161'), (u'obozavalac', u'obo\u017eavatelj'), (u'obracas', u'obra\u0107a\u0161'), (u'obra\u0107as', u'obra\u0107a\u0161'), (u'obuce', u'obu\u010de'), (u'obucem', u'obu\u010dem'), (u'oceve', u'o\u010deve'), (u'ocito', u'o\u010dito'), (u'ocnjaci', u'o\u010dnjaci'), (u'odes', u'ode\u0161'), (u'odlazis', u'odlazi\u0161'), (u'odlezati', u'odle\u017eati'), (u'odlucim', u'odlu\u010dim'), (u'odmice', u'odmi\u010de'), (u'odraduje', u'odra\u0111uje'), (u'odreden', u'odre\u0111en'), (u'odreduje', u'odre\u0111uje'), (u'odredujemo', u'odre\u0111ujemo'), (u'odvec', u'odve\u0107'), (u'ogrtac', u'ogrta\u010d'), (u'ohrabrujuce', u'ohrabruju\u0107e'), (u'ojacam', u'oja\u010dam'), (u'okrece', u'okre\u0107e'), (u'opasac', u'opasa\u010d'), (u'operise', u'operira'), (u'operisemo', u'operiramo'), (u'operisete', u'operirate'), (u'operise\u0161', u'operira\u0161'), (u'osecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecaces', u'osje\u0107at \u0107e\u0161'), (u'osjecam', u'osje\u0107am'), (u'osjecanja', u'osje\u0107anja'), (u'oslobada', u'osloba\u0111a'), (u'ostra', u'o\u0161tra'), (u'ostre', u'o\u0161tre'), (u'ostri', u'o\u0161tri'), (u'ostrom', u'o\u0161trom'), (u'ostru', u'o\u0161tru'), (u'osvrnes', u'osvrne\u0161'), (u'Osvrnes', u'Osvrne\u0161'), (u'otezala', u'ote\u017eala'), (u'otidi', u'oti\u0111i'), (u'otidji', u'oti\u0111i'), (u'otisao', u'oti\u0161ao'), (u'oziljak', u'o\u017eiljak'), (u'palaca', u'pala\u010da'), (u'palaci', u'pala\u010di'), (u'palacu', u'pala\u010du'), (u'papucama', u'papu\u010dama'), (u'parce', u'komadi\u0107'), (u'pateci', u'pate\u0107i'), (u'patis', u'pati\u0161'), (u'pcela', u'p\u010dela'), (u'pcele', u'p\u010dele'), (u'pecini', u'pe\u0107ini'), (u'pecinski', u'pe\u0107inski'), (u'peraca', u'pera\u010da'), (u'Peraci', u'Pera\u010di'), (u'pica', u'pi\u0107a'), (u'pice', u'pi\u0107e'), (u'picem', u'pi\u0107em'), (u'pijes', u'pije\u0161'), (u'pisacoj', u'pisa\u0107oj'), (u'pise', u'pi\u0161e'), (u'pisem', u'pi\u0161em'), (u'pisemo', u'pi\u0161emo'), (u'pises', u'pi\u0161e\u0161'), (u'pisite', u'pi\u0161ite'), (u'pisu', u'pi\u0161u'), (u'pitas', u'pita\u0161'), (u'placa', u'pla\u0107a'), (u'placam', u'pla\u0107am'), (u'placanje', u'pla\u0107anje'), (u'placanjem', u'pla\u0107anjem'), (u'place', u'pla\u010de'), (u'placem', u'pla\u010dem'), (u'placete', u'pla\u010dete'), (u'place\u0161', u'pla\u010de\u0161'), (u'placu', u'pla\u0107u'), (u'placuci', u'pla\u010du\u0107i'), (u'Plasi', u'Boji'), (u'plazi', u'pla\u017ei'), (u'plazu', u'pla\u017eu'), (u'plese', u'ple\u0161e'), (u'plesemo', u'ple\u0161emo'), (u'plesete', u'ple\u0161ete'), (u'plesu', u'ple\u0161u'), (u'ploca', u'plo\u010da'), (u'ploce', u'plo\u010de'), (u'pluca', u'plu\u0107a'), (u'plucima', u'plu\u0107ima'), (u'pobjeci', u'pobje\u0107i'), (u'pobjeduje', u'pobje\u0111uje'), (u'poceli', u'po\u010deli'), (u'poceo', u'po\u010deo'), (u'pocetak', u'po\u010detak'), (u'pocevsi', u'po\u010dev\u0161i'), (u'pocev\u0161i', u'po\u010dev\u0161i'), (u'poci', u'po\u0107i'), (u'pocinje', u'po\u010dinje'), (u'pociva', u'po\u010diva'), (u'pocivali', u'po\u010divali'), (u'pocivao', u'po\u010divao'), (u'pode', u'po\u0111e'), (u'podi', u'po\u0111i'), (u'podici', u'podi\u0107i'), (u'Podici', u'Podi\u0107i'), (u'podimo', u'po\u0111imo'), (u'Podimo', u'Po\u0111imo'), (u'podje', u'po\u0111e'), (u'Podje', u'Po\u0111e'), (u'Podji', u'Po\u0111i'), (u'podji', u'po\u0111i'), (u'podneses', u'podnese\u0161'), (u'podocnjacima', u'podo\u010dnjacima'), (u'podocnjake', u'podo\u010dnjake'), (u'podstice', u'poti\u010de'), (u'poduzeca', u'poduze\u0107a'), (u'poduzece', u'poduze\u0107e'), (u'poduzecu', u'poduze\u0107u'), (u'pojesce', u'pojest \u0107e'), (u'pojiliste', u'pojili\u0161te'), (u'pokazi', u'poka\u017ei'), (u'Pokazi', u'Poka\u017ei'), (u'pokrece', u'pokre\u0107e'), (u'pokusaj', u'poku\u0161aj'), (u'pokusam', u'poku\u0161am'), (u'pokusas', u'poku\u0161a\u0161'), (u'poletis', u'poleti\u0161'), (u'polozaja', u'polo\u017eaja'), (u'polozaju', u'polo\u017eaju'), (u'pomaci', u'pomaknuti'), (u'pomazes', u'poma\u017ee\u0161'), (u'pomislis', u'pomisli\u0161'), (u'pomognes', u'pomogne\u0161'), (u'poneses', u'ponese\u0161'), (u'ponovis', u'ponovi\u0161'), (u'poreci', u'pore\u0107i'), (u'porice', u'pori\u010de'), (u'posalji', u'po\u0161alji'), (u'Posalji', u'Po\u0161alji'), (u'posaljite', u'po\u0161aljite'), (u'posle', u'poslije'), (u'posluzili', u'poslu\u017eili'), (u'Posluzite', u'Poslu\u017eite'), (u'posluzite', u'poslu\u017eite'), (u'postaras', u'pobrine\u0161'), (u'posto', u'po\u0161to'), (u'Posto', u'Po\u0161to'), (u'potece', u'pote\u010de'), (u'potice', u'poti\u010de'), (u'potici', u'poti\u010di'), (u'potjece', u'potje\u010de'), (u'potjecem', u'potje\u010dem'), (u'potjeces', u'potje\u010de\u0161'), (u'potpises', u'potpi\u0161e\u0161'), (u'povedes', u'povede\u0161'), (u'pozuda', u'po\u017euda'), (u'pozude', u'po\u017eude'), (u'pozudi', u'po\u017eudi'), (u'pozudu', u'po\u017eudu'), (u'prakticno', u'prakti\u010dno'), (u'premasuje', u'prema\u0161uje'), (u'premasuju', u'prema\u0161uju'), (u'preporuca', u'preporu\u010duje'), (u'presao', u'pre\u0161ao'), (u'presjecen', u'presje\u010den'), (u'Previse', u'Previ\u0161e'), (u'previse', u'previ\u0161e'), (u'preziveo', u'pre\u017eivio'), (u'Priblizi', u'Pribli\u017ei'), (u'price', u'pri\u010de'), (u'prici', u'pri\u010di'), (u'pricu', u'pri\u010du'), (u'Pridji', u'Pri\u0111i'), (u'pridji', u'pri\u0111i'), (u'prijeci', u'prije\u0107i'), (u'prijedi', u'prije\u0111i'), (u'prilazis', u'prilazi\u0161'), (u'prisao', u'pri\u0161ao'), (u'priusti', u'priu\u0161ti'), (u'priustimo', u'priu\u0161timo'), (u'priustiti', u'priu\u0161titi'), (u'proci', u'pro\u0107i'), (u'prodavac', u'prodava\u010d'), (u'promasio', u'proma\u0161io'), (u'Promasio', u'Proma\u0161io'), (u'prosao', u'pro\u0161ao'), (u'prosla', u'pro\u0161la'), (u'Prosle', u'Pro\u0161le'), (u'prosle', u'pro\u0161le'), (u'prosli', u'pro\u0161li'), (u'Prosli', u'Pro\u0161li'), (u'proslim', u'pro\u0161lim'), (u'proslo', u'pro\u0161lo'), (u'Proslo', u'Pro\u0161lo'), (u'provedes', u'provede\u0161'), (u'provlaci', u'provla\u010di'), (u'provlacimo', u'provla\u010dimo'), (u'pticica', u'pti\u010dica'), (u'pticicu', u'pti\u010dicu'), (u'pucini', u'pu\u010dini'), (u'pupcanu', u'pup\u010danu'), (u'pusac', u'pu\u0161a\u010d'), (u'pusaci', u'pu\u0161a\u010di'), (u'pusi', u'pu\u0161i'), (u'pusimo', u'pu\u0161imo'), (u'pusite', u'pu\u0161ite'), (u'pustam', u'pu\u0161tam'), (u'racunare', u'ra\u010dunala'), (u'racunari', u'ra\u010dunala'), (u'radis', u'radi\u0161'), (u'Radis', u'Radi\u0161'), (u'raskosni', u'rasko\u0161ni'), (u'razumes', u'razumije\u0161'), (u'Razumes', u'Razumije\u0161'), (u'rec', u'rije\u010d'), (u'rece', u're\u010de'), (u'Receno', u'Re\u010deno'), (u'receno', u're\u010deno'), (u'recima', u'rije\u010dima'), (u'resimo', u'rije\u0161imo'), (u'rijec', u'rije\u010d'), (u'Rijeci', u'Rije\u010di'), (u'rijedji', u'rje\u0111i'), (u'rjedji', u'rje\u0111i'), (u'Rjesit', u'Rije\u0161it'), (u'rodena', u'ro\u0111ena'), (u'rodeni', u'ro\u0111eni'), (u'rodis', u'rodi\u0161'), (u'rodjen', u'ro\u0111en'), (u'rucno', u'ru\u010dno'), (u'ruza', u'ru\u017ea'), (u'ruzan', u'ru\u017ean'), (u'ruzu', u'ru\u017eu'), (u'sadrze', u'sadr\u017ee'), (u'sadrzi', u'sadr\u017ei'), (u'salje', u'\u0161alje'), (u'saljes', u'\u0161alje\u0161'), (u'salju', u'\u0161alju'), (u'sasila', u'sa\u0161ila'), (u'sasili', u'sa\u0161ili'), (u'sasio', u'sa\u0161io'), (u'sasiti', u'sa\u0161iti'), (u'savescu', u'savje\u0161\u0107u'), (u'savijescu', u'savje\u0161\u0107u'), (u'sedeces', u'sjedit \u0107e\u0161'), (u'sedis', u'sjedi\u0161'), (u'sedista', u'sjedala'), (u'sediste', u'sjedi\u0161te'), (u'sendvic', u'sendvi\u010d'), (u'sesir', u'\u0161e\u0161ir'), (u'sesirom', u'\u0161e\u0161irom'), (u'sest', u'\u0161est'), (u'setala', u'\u0161etala'), (u'setam', u'\u0161etam'), (u'setis', u'sjeti\u0161'), (u'seva', u'\u0161eva'), (u'sevu', u'\u0161evu'), (u'sezdeset', u'\u0161ezdeset'), (u'Sidji', u'Si\u0111i'), (u'sidji', u'si\u0111i'), (u'sijecanj', u'sije\u010danj'), (u'siroki', u'\u0161iroki'), (u'sjecaju', u'sje\u0107aju'), (u'sjecam', u'sje\u0107am'), (u'Sjecam', u'Sje\u0107am'), (u'sjecanja', u'sje\u0107anja'), (u'sjecanje', u'sje\u0107anje'), (u'skace', u'ska\u010de'), (u'skaci', u'ska\u010di'), (u'skacu', u'ska\u010du'), (u'sklanjas', u'sklanja\u0161'), (u'sklonoscu', u'sklono\u0161\u0107u'), (u'sklupcam', u'sklup\u010dam'), (u'skola', u'\u0161kola'), (u'Skola', u'\u0160kola'), (u'Skotska', u'\u0160kotska'), (u'Skotskoj', u'\u0160kotskoj'), (u'skrt', u'\u0161krt'), (u'skrte', u'\u0161krte'), (u'skrusena', u'skru\u0161ena'), (u'Skrusena', u'Skru\u0161ena'), (u'sledeca', u'sljede\u0107a'), (u'Sledece', u'Sljede\u0107e'), (u'sledeci', u'sljede\u0107i'), (u'Sledeci', u'Sljede\u0107i'), (u'slicno', u'sli\u010dno'), (u'sljedeci', u'sljede\u0107i'), (u'Sljedeci', u'Sljede\u0107i'), (u'slozila', u'slo\u017eila'), (u'slozili', u'slo\u017eili'), (u'slozio', u'slo\u017eio'), (u'sloziti', u'slo\u017eiti'), (u'slucaja', u'slu\u010daja'), (u'Smatras', u'Smatra\u0161'), (u'smatras', u'smatra\u0161'), (u'smece', u'sme\u0107e'), (u'smeda', u'sme\u0111a'), (u'smedem', u'sme\u0111em'), (u'smedi', u'sme\u0111i'), (u'smedoj', u'sme\u0111oj'), (u'smedu', u'sme\u0111u'), (u'smesak', u'smje\u0161ak'), (u'Smijes', u'Smije\u0161'), (u'smijes', u'smije\u0161'), (u'smionoscu', u'smiono\u0161\u0107u'), (u'smraci', u'smra\u010di'), (u'smracilo', u'smra\u010dilo'), (u'smrcu', u'smr\u0107u'), (u'snimacete', u'snimat \u0107ete'), (u'sokiras', u'\u0161okira\u0161'), (u'spases', u'spasi\u0161'), (u'Spases', u'Spasi\u0161'), (u'spavaca', u'spava\u0107a'), (u'spavacoj', u'spava\u0107oj'), (u'spominjes', u'spominje\u0161'), (u'spustamo', u'spu\u0161tamo'), (u'srdacan', u'srda\u010dan'), (u'srecom', u'sre\u0107om'), (u'sresce', u'srest \u0107e'), (u'sre\u0161ce', u'srest \u0107e'), (u'srljas', u'srlja\u0161'), (u'Sta', u'\u0160to'), (u'sta', u'\u0161to'), (u'stab', u'sto\u017eer'), (u'Stab', u'Sto\u017eer'), (u'stagod', u'\u0161to god'), (u'stampa', u'tisak'), (u'stampati', u'tiskati'), (u'stampi', u'tisku'), (u'stampom', u'tiskom'), (u'stampu', u'tisak'), (u'standa', u'\u0161tanda'), (u'standu', u'\u0161tandu'), (u'stavis', u'stavi\u0161'), (u'Stavise', u'\u0160tovi\u0161e'), (u'Stavi\u0107emo', u'Stavit \u0107emo'), (u'steceni', u'ste\u010deni'), (u'stezuci', u'ste\u017eu\u0107i'), (u'stici', u'sti\u0107i'), (u'stojis', u'stoji\u0161'), (u'Stojis', u'Stoji\u0161'), (u'stp', u'\u0161to'), (u'strasan', u'stra\u0161an'), (u'strasno', u'stra\u0161no'), (u'sudeci', u'sude\u0107i'), (u'sudenja', u'su\u0111enja'), (u'sudenje', u'su\u0111enje'), (u'sudenju', u'su\u0111enju'), (u'sugerisu', u'predla\u017eu'), (u'sumnjas', u'sumnja\u0161'), (u'sumska', u'\u0161umska'), (u'sumski', u'\u0161umski'), (u'sumskoj', u'\u0161umskoj'), (u'supak', u'\u0161upak'), (u'suraduj', u'sura\u0111uj'), (u'suraduje', u'sura\u0111uje'), (u'suradujemo', u'sura\u0111ujemo'), (u'suraduju', u'sura\u0111uju'), (u'Suraduj', u'Sura\u0111uj'), (u'Suraduje', u'Sura\u0111uje'), (u'Suradujemo', u'Sura\u0111ujemo'), (u'Suraduju', u'Sura\u0111uju'), (u'sustina', u'bit'), (u'sustine', u'biti'), (u'sustini', u'biti'), (u'Sustine', u'Biti'), (u'Sustini', u'Biti'), (u'Sustinom', u'Biti'), (u'sustinom', u'biti'), (u'sustinski', u'bitni'), (u'suti', u'\u0161uti'), (u'Suti', u'\u0160uti'), (u'svacije', u'sva\u010dije'), (u'svaciji', u'sva\u010diji'), (u'svaciju', u'sva\u010diju'), (u'svecan', u'sve\u010dan'), (u'svecani', u'sve\u010dani'), (u'svez', u'svje\u017e'), (u'sveza', u'svje\u017ea'), (u'svezu', u'svje\u017eu'), (u'svezi', u'svje\u017ei'), (u'sveze', u'svje\u017ee'), (u'svezim', u'svje\u017eim'), (u'svezom', u'svje\u017eom'), (u'svezoj', u'svje\u017eoj'), (u'svezinom', u'svje\u017einom'), (u'svezina', u'svje\u017eina'), (u'svezinu', u'svje\u017einu'), (u'svezini', u'svje\u017eini'), (u'svezine', u'svje\u017eine'), (u'Svida', u'Svi\u0111a'), (u'svidala', u'svi\u0111ala'), (u'svidalo', u'svi\u0111alo'), (u'svidam', u'svi\u0111am'), (u'svidao', u'svi\u0111ao'), (u'sviras', u'svira\u0161'), (u'taknes', u'takne\u0161'), (u'takode', u'tako\u0111er'), (u'takoder', u'tako\u0111er'), (u'takodje', u'tako\u0111er'), (u'Takodje', u'Tako\u0111er'), (u'tece', u'te\u010de'), (u'teska', u'te\u0161ka'), (u'Teska', u'Te\u0161ka'), (u'teske', u'te\u0161ke'), (u'teski', u'te\u0161ki'), (u'tesko', u'te\u0161ko'), (u'Tesko', u'Te\u0161ko'), (u'teskom', u'te\u0161kom'), (u'tezak', u'te\u017eak'), (u'Tezak', u'Te\u017eak'), (u'teze', u'te\u017ee'), (u'tezi', u'te\u017ei'), (u'Tezi', u'Te\u017ei'), (u'tezimo', u'te\u017eimo'), (u'Tezimo', u'Te\u017eimo'), (u'tezinu', u'te\u017einu'), (u'tezis', u'te\u017ei\u0161'), (u'Tezi\u0161', u'Te\u017ei\u0161'), (u'tisuce', u'tisu\u0107e'), (u'tisucu', u'tisu\u0107u'), (u'Tocak', u'Kota\u010d'), (u'tocak', u'kota\u010d'), (u'tocka', u'to\u010dka'), (u'tocku', u'to\u010dku'), (u'trajace', u'trajat \u0107e'), (u'Trajace', u'Trajat \u0107e'), (u'trazis', u'tra\u017ei\u0161'), (u'trcao', u'tr\u010dao'), (u'trce', u'tr\u010de'), (u'Trce', u'Tr\u010de'), (u'trci', u'tr\u010di'), (u'Trci', u'Tr\u010di'), (u'trcim', u'tr\u010dim'), (u'Trcim', u'Tr\u010dim'), (u'trcimo', u'tr\u010dimo'), (u'trebas', u'treba\u0161'), (u'Trebas', u'Treba\u0161'), (u'treci', u'tre\u0107i'), (u'tricarija', u'tri\u010darija'), (u'trudis', u'trudi\u0161'), (u'trunuce', u'trunut \u0107e'), (u'tuce', u'tu\u010de'), (u'tuces', u'tu\u010de\u0161'), (u'tucom', u'tu\u010dom'), (u'tucu', u'tu\u010dnjavu'), (u'tudje', u'tu\u0111e'), (u'tudjeg', u'tu\u0111eg'), (u'tudoj', u'tu\u0111oj'), (u'tudom', u'tu\u0111om'), (u'tudjem', u'tu\u0111em'), (u'tudem', u'tu\u0111em'), (u'tumaras', u'tumara\u0161'), (u'tvoris', u'tvori\u0161'), (u'ubedjuju', u'uvjeravaju'), (u'ubijes', u'ubije\u0161'), (u'Ubijes', u'Ubije\u0161'), (u'uceni', u'u\u010deni'), (u'uci', u'u\u0107i'), (u'ucine', u'u\u010dine'), (u'ucinimo', u'u\u010dinimo'), (u'ucinio', u'u\u010dinio'), (u'ucio', u'u\u010dio'), (u'Ucio', u'U\u010dio'), (u'udas', u'uda\u0161'), (u'udete', u'u\u0111ete'), (u'ude\u0161', u'ude\u0161'), (u'udi', u'u\u0111i'), (u'Udi', u'U\u0111i'), (u'Udje', u'U\u0111e'), (u'udje', u'u\u0111e'), (u'udjes', u'u\u0111e\u0161'), (u'ugriscu', u'ugrist \u0107u'), (u'ukljestena', u'uklije\u0161tena'), (u'ukljucujuci', u'uklju\u010duju\u0107i'), (u'umes', u'umije\u0161'), (u'umiruci', u'umiru\u0107i'), (u'umrecu', u'umrijet \u0107u'), (u'umres', u'umre\u0161'), (u'unistice', u'uni\u0161tit \u0107e'), (u'uopce', u'uop\u0107e'), (u'Uopce', u'Uop\u0107e'), (u'Uopste', u'Uop\u0107e'), (u'uopste', u'uop\u0107e'), (u'upoznas', u'upozna\u0161'), (u'uradis', u'u\u010dini\u0161'), (u'usao', u'u\u0161ao'), (u'Usao', u'U\u0161ao'), (u'usli', u'u\u0161li'), (u'Usmjerice', u'Usmjerit \u0107e'), (u'uspanicio', u'uspani\u010dio'), (u'utapas', u'utapa\u0161'), (u'utesi', u'utje\u0161i'), (u'utesim', u'utje\u0161im'), (u'uzinu', u'u\u017einu'), (u'uzivo', u'u\u017eivo'), (u'valda', u'valjda'), (u'vasa', u'va\u0161a'), (u'vaseg', u'va\u0161eg'), (u'Vaseg', u'Va\u0161eg'), (u'vasem', u'va\u0161em'), (u'vasi', u'va\u0161i'), (u'vasoj', u'va\u0161oj'), (u'vazi', u'vrijedi'), (u'Vec', u'Ve\u0107'), (u'vec', u've\u0107'), (u'vecan', u'vje\u010dan'), (u'vecera', u've\u010dera'), (u'Veceras', u'Ve\u010deras'), (u'veceras', u've\u010deras'), (u'vecere', u've\u010dere'), (u'veceri', u've\u010deri'), (u'veceru', u've\u010deru'), (u'vecih', u've\u0107ih'), (u'vecitim', u'vje\u010ditim'), (u'vecna', u'vje\u010dna'), (u'vecno', u'vje\u010dno'), (u'vecnost', u'vje\u010dnost'), (u'verovacu', u'vjerovat \u0107u'), (u'vice', u'vi\u010de'), (u'vicem', u'vi\u010dem'), (u'vicemo', u'vi\u010demo'), (u'vices', u'vi\u010de\u0161'), (u'vicete', u'vi\u010dete'), (u'viden', u'vi\u0111en'), (u'Viden', u'Vi\u0111en'), (u'vishe', u'vi\u0161e'), (u'vjencali', u'vjen\u010dali'), (u'vjencati', u'vjen\u010dati'), (u'vjerujes', u'vjeruje\u0161'), (u'Vjerujes', u'Vjeruje\u0161'), (u'vjetrenjace', u'vjetrenja\u010de'), (u'voce', u'vo\u0107e'), (u'vocka', u'vo\u0107ka'), (u'vocku', u'vo\u0107ku'), (u'vocnjak', u'vo\u0107njak'), (u'vocnjaku', u'vo\u0107njaku'), (u'vodic', u'vodi\u010d'), (u'vodju', u'vo\u0111u'), (u'vozac', u'voza\u010d'), (u'Vozac', u'Voza\u010d'), (u'vozaca', u'voza\u010da'), (u'vracam', u'vra\u0107am'), (u'vracen', u'vra\u010den'), (u'vrazja', u'vra\u017eja'), (u'vrazji', u'vra\u017eji'), (u'vreca', u'vre\u010da'), (u'vrece', u'vre\u0107e'), (u'vrecu', u'vre\u0107u'), (u'vredja', u'vrije\u0111a'), (u'vredjanje', u'vrije\u0111anje'), (u'vrtic', u'vrti\u0107'), (u'vrtica', u'vrti\u0107a'), (u'vrticu', u'vrti\u0107u'), (u'zacepe', u'za\u010depe'), (u'Zacepi', u'Za\u010depi'), (u'Zadrzi', u'Zadr\u017ei'), (u'zadrzi', u'zadr\u017ei'), (u'zaduzen', u'zadu\u017een'), (u'Zaduzen', u'Zadu\u017een'), (u'zagrlis', u'zagrli\u0161'), (u'zaljenja', u'\u017ealjenja'), (u'zaljenje', u'\u017ealjenje'), (u'zalosna', u'\u017ealosna'), (u'Zalosna', u'\u017dalosna'), (u'zaokruzi', u'zaokru\u017ei'), (u'zaokruzim', u'zaokru\u017eim'), (u'zaokruzimo', u'zaokru\u017eimo'), (u'zapoceli', u'zapo\u010deli'), (u'zarucen', u'zaru\u010den'), (u'zasto', u'za\u0161to'), (u'Zasto', u'Za\u0161to'), (u'zateci', u'zate\u0107i'), (u'zatvoris', u'zatvori\u0161'), (u'zdrebe', u'\u017edrijebe'), (u'Zele', u'\u017dele'), (u'zele', u'\u017eele'), (u'Zeleci', u'\u017dele\u0107i'), (u'zelila', u'\u017eeljela'), (u'Zelis', u'\u017deli\u0161'), (u'zelis', u'\u017eeli\u0161'), (u'zene', u'\u017eene'), (u'zenke', u'\u017eenke'), (u'zesce', u'\u017ee\u0161\u0107e'), (u'zezas', u'zeza\u0161'), (u'zita', u'\u017eita'), (u'zito', u'\u017eito'), (u'zitu', u'\u017eitu'), (u'ziv', u'\u017eiv'), (u'ziva', u'\u017eiva'), (u'zive', u'\u017eive'), (u'zivi', u'\u017eivi'), (u'zivis', u'\u017eivi\u0161'), (u'zivjeo', u'\u017eivio'), (u'Zivjeo', u'\u017divio'), (u'zmureo', u'\u017emirio'), (u'znacaj', u'zna\u010daj'), (u'znacaja', u'zna\u010daja'), (u'znace', u'zna\u010de'), (u'znace\u0161', u'znat \u0107e\u0161'), (u'znas', u'zna\u0161'), (u'Znas', u'Zna\u0161'), (u'zuris', u'zuri\u0161'), (u'zutoj', u'\u017eutoj'), (u'zvanican', u'slu\u017eben'), (u'\u0107es', u'\u0107e\u0161'), (u'\u0107te', u'\u0107ete'), (u'\u010cime', u'\u010cime'), (u'\u017eelis', u'\u017eeli\u0161'), (u'\u017diveo', u'\u017divio')]),
+                        'pattern': u'(?um)(\\b|^)(?:andele|andeli|bacas|bas|Bas|basta|Basta|baste|Baste|basti|Basti|bastom|Bastom|bastu|Bastu|Bice|bice|Bice\\\u0161|Bicu|bicu|blagonaklonoscu|blizi|bljesti|Bljesti|bojis|braca|Braca|broncane|broncanu|budes|caj|caja|Cak|cak|cale|Cao|cao|cas|casno|Casno|castis|casu|ca\\\u0161u|cebe|cega|Cek|cek|cekali|cekas|Cemu|cemu|cerka|Cerka|cerke|Cerke|cerku|Cerku|ces|cesce|Cesce|Ceskoj|cestitki|cesto|Cesto|cetiri|Cetiri|cetri|cetu|ceznja|ceznje|ceznji|ceznjom|ceznju|ceznu|ce\\\u0161|Cija|cija|cije|Ciji|ciji|cijih|Cijih|cijim|Cijim|Cim|cim|cime|cinila|cinili|cinio|cinis|ciniti|cipka|cipku|cita|citao|citas|citavu|cizme|clan|Clan|clanke|clanove|clanovi|clanovima|cmo|corsokak|corsokaku|cosak|cosku|covece|covek|covjece|covjecnost|covjek|covjeka|covjeku|crpeci|cte|Cu|Ce\\\u0161|Ce|Cemo|Cete|cu|ce|cemo|cete|cudi|Cudo|cudo|Cujte|cula|culi|Culi|culima|cuo|Cuo|cupam|cutanje|Cutanje|cutao|Cutao|cuti|cutljiv|cutnja|cuvali|cuveni|dace|dacemo|davo|definise|definisi|Desava|desava|disemo|disi|dobijes|dobivas|doci|dode|dodem|dodes|dodete|dode\\\u0161|Dodi|dodi|dodite|Dodji|dodji|Dodjite|dodjite|Dodju|dodju|dodu|dolazis|dopustao|dorucak|dorucku|Dosao|dosao|drhteci|drhte\\\u0107i|Drhte\\\u0107i|drugacija|Drugacije|drugacije|drugaciji|Drugaciji|drukciji|drveca|drvece|drvecem|drvecu|drzi|Drzim|dugmici|duze|duzinom|dzanki|Dzejk|Dzime|Dzone|flasom|flasu|fucka|funkcionisu|gacice|gadao|gadis|Gadis|gdica|gdice|gdici|gdicu|gdu|glupaco|govoris|gradani|gradic|gradica|gradicu|grancica|grancicu|gresci|grese|greski|gresku|gubis|Hoces|hoces|hocu|Hocu|hodas|htjeo|iceg|icega|icemu|Ici|ici|Ides|ides|iduce|iduceg|iducem|Iduci|iduci|ignorisi|igras|Ijudi|imas|imidz|inace|Inace|isao|Isao|iscupao|ise\\\u0107emo|isla|istjece|istrazio|Istrazio|isuvise|izaci|Izaci|izade|Izade|izadem|izades|izadete|Izadi|izadi|izasao|izasla|izici|izluduje|izluduju|izmedu|Izmedu|izostri|izostrim|izvuci|i\\\u0161cupao|jebes|Jebes|jos|Jos|juce|Juce|jucer|Jucer|kaslja|kaze|Kaze|kazemo|kazite|Kazite|kazu|Kcer|kcer|kcerka|Kcerka|kcerkama|kcerku|Kcerku|kecap|kecapa|kise|kisi|kleknes|kociji|kolaca|kolace|komadic|komsijama|komsije|komsiji|komsiluk|komsiluku|kom\\\u0161ija|Kom\\\u0161ija|Konkurise|konkurise|konkurisem|konkurisu|kontrolisu|kosulja|kosulje|kosulji|kosulju|kovceg|kovcegu|krada|Krada|Krece|krece|Kreci|kreci|krecu|kre\\\u0107es|krosnje|krvaris|kuca|kucama|kuce|kuci|kusa|kusas|ku\\\u010da|ku\\\u010di|lakocom|laz|lazac|laze|lazi|lazne|lazni|lazov|ledja|ledjima|leprsa|lezala|lezali|lezati|lezis|Lezis|lici|licim|licis|licnost|licnosti|lijecniku|ljubis|los|losa|losu|majcine|masini|medu|Medutim|medutim|mici|Mici|micu|mislis|Mislis|mjesecevom|mjesecine|mjesecini|mjesecinu|mladic|moc|moci|motivisu|mozda|Mozda|moze|mozete|mreza|mrezu|mrzis|muce|mucenik|mucne|muska|muz|muza|naci|Naci|nacin|nadem|Nadem|nademo|nades|Nades|nadete|nadici|nadje|Nadje|nadjen|nadjes|Nadjes|nadjete|nagovestaj|najvise|Najvise|naklonoscu|naocale|Napisite|nasa|Nase|nase|naseg|nasi|Nasi|nasao|Nasao|nasla|Nasla|nasli|Nasli|nasoj|nasrecu|nastavis|nasu|nauce|neceg|necega|necemo|necemu|necije|neciji|necim|necovjecnost|necovjecnosti|necu|Necu|nekaze|nekoc|Nemas|nemas|Nesreca|nesto|Nesto|new\\ yorski|Nezan|nezan|nezna|Neznam|Neznas|Neznajuci|Neznavsi|neznam|neznas|neznajuci|neznavsi|nezni|neznih|neznim|nezno|neznu|niceg|nicega|nicemu|nicija|niciji|nicim|njezno|nju\\ jorski|noci|nocnu|nosac|nosices|nosis|noz|nozem|Obecao|Obezbedjuju|obezbedjuju|obide|objasnis|obozavalac|obracas|obra\\\u0107as|obuce|obucem|oceve|ocito|ocnjaci|odes|odlazis|odlezati|odlucim|odmice|odraduje|odreden|odreduje|odredujemo|odvec|ogrtac|ohrabrujuce|ojacam|okrece|opasac|operise|operisemo|operisete|operise\\\u0161|osecaces|osjecaces|osjecam|osjecanja|oslobada|ostra|ostre|ostri|ostrom|ostru|osvrnes|Osvrnes|otezala|otidi|otidji|otisao|oziljak|palaca|palaci|palacu|papucama|parce|pateci|patis|pcela|pcele|pecini|pecinski|peraca|Peraci|pica|pice|picem|pijes|pisacoj|pise|pisem|pisemo|pises|pisite|pisu|pitas|placa|placam|placanje|placanjem|place|placem|placete|place\\\u0161|placu|placuci|Plasi|plazi|plazu|plese|plesemo|plesete|plesu|ploca|ploce|pluca|plucima|pobjeci|pobjeduje|poceli|poceo|pocetak|pocevsi|pocev\\\u0161i|poci|pocinje|pociva|pocivali|pocivao|pode|podi|podici|Podici|podimo|Podimo|podje|Podje|Podji|podji|podneses|podocnjacima|podocnjake|podstice|poduzeca|poduzece|poduzecu|pojesce|pojiliste|pokazi|Pokazi|pokrece|pokusaj|pokusam|pokusas|poletis|polozaja|polozaju|pomaci|pomazes|pomislis|pomognes|poneses|ponovis|poreci|porice|posalji|Posalji|posaljite|posle|posluzili|Posluzite|posluzite|postaras|posto|Posto|potece|potice|potici|potjece|potjecem|potjeces|potpises|povedes|pozuda|pozude|pozudi|pozudu|prakticno|premasuje|premasuju|preporuca|presao|presjecen|Previse|previse|preziveo|Priblizi|price|prici|pricu|Pridji|pridji|prijeci|prijedi|prilazis|prisao|priusti|priustimo|priustiti|proci|prodavac|promasio|Promasio|prosao|prosla|Prosle|prosle|prosli|Prosli|proslim|proslo|Proslo|provedes|provlaci|provlacimo|pticica|pticicu|pucini|pupcanu|pusac|pusaci|pusi|pusimo|pusite|pustam|racunare|racunari|radis|Radis|raskosni|razumes|Razumes|rec|rece|Receno|receno|recima|resimo|rijec|Rijeci|rijedji|rjedji|Rjesit|rodena|rodeni|rodis|rodjen|rucno|ruza|ruzan|ruzu|sadrze|sadrzi|salje|saljes|salju|sasila|sasili|sasio|sasiti|savescu|savijescu|sedeces|sedis|sedista|sediste|sendvic|sesir|sesirom|sest|setala|setam|setis|seva|sevu|sezdeset|Sidji|sidji|sijecanj|siroki|sjecaju|sjecam|Sjecam|sjecanja|sjecanje|skace|skaci|skacu|sklanjas|sklonoscu|sklupcam|skola|Skola|Skotska|Skotskoj|skrt|skrte|skrusena|Skrusena|sledeca|Sledece|sledeci|Sledeci|slicno|sljedeci|Sljedeci|slozila|slozili|slozio|sloziti|slucaja|Smatras|smatras|smece|smeda|smedem|smedi|smedoj|smedu|smesak|Smijes|smijes|smionoscu|smraci|smracilo|smrcu|snimacete|sokiras|spases|Spases|spavaca|spavacoj|spominjes|spustamo|srdacan|srecom|sresce|sre\\\u0161ce|srljas|Sta|sta|stab|Stab|stagod|stampa|stampati|stampi|stampom|stampu|standa|standu|stavis|Stavise|Stavi\\\u0107emo|steceni|stezuci|stici|stojis|Stojis|stp|strasan|strasno|sudeci|sudenja|sudenje|sudenju|sugerisu|sumnjas|sumska|sumski|sumskoj|supak|suraduj|suraduje|suradujemo|suraduju|Suraduj|Suraduje|Suradujemo|Suraduju|sustina|sustine|sustini|Sustine|Sustini|Sustinom|sustinom|sustinski|suti|Suti|svacije|svaciji|svaciju|svecan|svecani|svez|sveza|svezu|svezi|sveze|svezim|svezom|svezoj|svezinom|svezina|svezinu|svezini|svezine|Svida|svidala|svidalo|svidam|svidao|sviras|taknes|takode|takoder|takodje|Takodje|tece|teska|Teska|teske|teski|tesko|Tesko|teskom|tezak|Tezak|teze|tezi|Tezi|tezimo|Tezimo|tezinu|tezis|Tezi\\\u0161|tisuce|tisucu|Tocak|tocak|tocka|tocku|trajace|Trajace|trazis|trcao|trce|Trce|trci|Trci|trcim|Trcim|trcimo|trebas|Trebas|treci|tricarija|trudis|trunuce|tuce|tuces|tucom|tucu|tudje|tudjeg|tudoj|tudom|tudjem|tudem|tumaras|tvoris|ubedjuju|ubijes|Ubijes|uceni|uci|ucine|ucinimo|ucinio|ucio|Ucio|udas|udete|ude\\\u0161|udi|Udi|Udje|udje|udjes|ugriscu|ukljestena|ukljucujuci|umes|umiruci|umrecu|umres|unistice|uopce|Uopce|Uopste|uopste|upoznas|uradis|usao|Usao|usli|Usmjerice|uspanicio|utapas|utesi|utesim|uzinu|uzivo|valda|vasa|vaseg|Vaseg|vasem|vasi|vasoj|vazi|Vec|vec|vecan|vecera|Veceras|veceras|vecere|veceri|veceru|vecih|vecitim|vecna|vecno|vecnost|verovacu|vice|vicem|vicemo|vices|vicete|viden|Viden|vishe|vjencali|vjencati|vjerujes|Vjerujes|vjetrenjace|voce|vocka|vocku|vocnjak|vocnjaku|vodic|vodju|vozac|Vozac|vozaca|vracam|vracen|vrazja|vrazji|vreca|vrece|vrecu|vredja|vredjanje|vrtic|vrtica|vrticu|zacepe|Zacepi|Zadrzi|zadrzi|zaduzen|Zaduzen|zagrlis|zaljenja|zaljenje|zalosna|Zalosna|zaokruzi|zaokruzim|zaokruzimo|zapoceli|zarucen|zasto|Zasto|zateci|zatvoris|zdrebe|Zele|zele|Zeleci|zelila|Zelis|zelis|zene|zenke|zesce|zezas|zita|zito|zitu|ziv|ziva|zive|zivi|zivis|zivjeo|Zivjeo|zmureo|znacaj|znacaja|znace|znace\\\u0161|znas|Znas|zuris|zutoj|zvanican|\\\u0107es|\\\u0107te|\\\u010cime|\\\u017eelis|\\\u017diveo)(\\b|$)'}},
+ 'dan': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'IVI', u'M'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'Haner', u'Han er'), (u'JaveL', u'Javel'), (u'Pa//e', u'Palle'), (u'bffte', u'bitte'), (u'Utro//gt', u'Utroligt'), (u'Kommerdu', u'Kommer du'), (u'smi/er', u'smiler'), (u'/eg', u'leg'), (u'harvinger', u'har vinger'), (u'/et', u'let'), (u'erjeres', u'er jeres'), (u'hardet', u'har det'), (u't\xe6nktjer', u't\xe6nkt jer'), (u'erjo', u'er jo'), (u'sti/', u'stil'), (u'Iappe', u'lappe'), (u'Beklagel\xe7', u'Beklager,'), (u'vardet', u'var det'), (u'afden', u'af den'), (u'snupperjeg', u'snupper jeg'), (u'ikkejeg', u'ikke jeg'), (u'bliverjeg', u'bliver jeg'), (u'hartravit', u'har travlt'), (u'pandekagef/ag', u'pandekageflag'), (u'Stormvarsell', u'Stormvarsel!'), (u'stormvejn', u'stormvejr.'), (u'morgenkomp/et', u'morgenkomplet'), (u'/yv', u'lyv'), (u'varjo', u'var jo'), (u'/eger', u'leger'), (u'harjeg', u'har jeg'), (u'havdejeg', u'havde jeg'), (u'hvorjeg', u'hvor jeg'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'g\xe5rvi', u'g\xe5r vi'), (u'atjeg', u'at jeg'), (u'isine', u'i sine'), (u'f\xe5rjeg', u'f\xe5r jeg'), (u'k\xe6rtighed', u'k\xe6rlighed'), (u'skullejeg', u'skulle jeg'), (u'laest', u'l\xe6st'), (u'laese', u'l\xe6se'), (u'g\xf8rjeg', u'g\xf8r jeg'), (u'g\xf8rvi', u'g\xf8r vi'), (u'angrerjo', u'angrer jo'), (u'Hvergang', u'Hver gang'), (u'erder', u'er der'), (u'villetilgive', u'ville tilgive'), (u'\ufb01eme', u'fjeme'), (u'genopst\xe5ri', u'genopst\xe5r i'), (u'svigtejer', u'svigte jer'), (u'kommernu', u'kommer nu'), (u'n\xe5rman', u'n\xe5r man'), (u'erfire', u'er fire'), (u'Hvorfor\ufb01nderdu', u'Hvorfor \ufb01nder du'), (u'undertigt', u'underligt'), (u'itroen', u'i troen'), (u'erl\xf8gnt', u'er l\xf8gn!'), (u'g\xf8rden', u'g\xf8r den'), (u'forhelvede', u'for helvede'), (u'hjpe', u'hj\xe6lpe'), (u'togeti', u'toget i'), (u'M\xe5jeg', u'M\xe5 jeg'), (u'savnerjer', u'savner jer'), (u'erjeg', u'er jeg'), (u'vaere', u'v\xe6re'), (u'geme', u'gerne'), (u'trorp\xe5', u'tror p\xe5'), (u'forham', u'for ham'), (u'afham', u'af ham'), (u'harjo', u'har jo'), (u'ovema\ufb01et', u'overnattet'), (u'begae\ufb01ighed', u'beg\xe6rlighed'), (u'sy\u2019g', u'syg'), (u'Imensjeg', u'Imens jeg'), (u'bliverdu', u'bliver du'), (u'\ufb01ser', u'fiser'), (u'manipuierer', u'manipulerer'), (u'forjeg', u'for jeg'), (u'iivgivendefor', u'livgivende for'), (u'formig', u'for mig'), (u'Hardu', u'Har du'), (u'fornold', u'forhold'), (u'defrelste', u'de frelste'), (u'S\xe5jeg', u'S\xe5 jeg'), (u'varjeg', u'var jeg'), (u'g\xf8rved', u'g\xf8r ved'), (u'kalderjeg', u'kalder jeg'), (u'\ufb02ytte', u'flytte'), (u'handlerdet', u'handler det'), (u'trorjeg', u'tror jeg'), (u'\ufb02ytter', u'flytter'), (u'soverjeg', u'sover jeg'), (u'\ufb01nderud', u'\ufb01nder ud'), (u'naboerp\xe5', u'naboer p\xe5'), (u'ervildt', u'er vildt'), (u'v\xe6reher', u'v\xe6re her'), (u'hyggerjer', u'hygger jer'), (u'borjo', u'bor jo'), (u'kommerikke', u'kommer ikke'), (u'folkynde', u'forkynde'), (u'farglad', u'far glad'), (u'misterjeg', u'mister jeg'), (u'\ufb01nt', u'fint'), (u'Harl', u'Har I'), (u'bedejer', u'bede jer'), (u'synesjeg', u'synes jeg'), (u'vartil', u'var til'), (u'eren', u'er en'), (u'\\Al', u'Vil'), (u'\\A', u'Vi'), (u'fjeme', u'fjerne'), (u'Iigefyldt', u'lige fyldt'), (u'ertil', u'er til'), (u'fa\ufb01igt', u'farligt'), (u'\ufb01nder', u'finder'), (u'\ufb01ndes', u'findes'), (u'irettesae\ufb01else', u'irettes\xe6ttelse'), (u'ermed', u'er med'), (u'\xe8n', u'\xe9n'), (u'gikjoi', u'gik jo i'), (u'Hvisjeg', u'Hvis jeg'), (u'ovema\ufb01er', u'overnatter'), (u'hoident', u'holdent'), (u'\\Adne', u'Vidne'), (u'fori', u'for i'), (u'vei', u'vel'), (u'savnerjerjo', u'savner jer jo'), (u'elskerjer', u'elsker jer'), (u'harl\xf8jet', u'har l\xf8jet'), (u'eri', u'er i'), (u'\ufb01ende', u'fjende'), (u'derjo', u'der jo'), (u'sigerjo', u'siger jo'), (u'menerjeg', u'mener jeg'), (u'Harjeg', u'Har jeg'), (u'sigerjeg', u'siger jeg'), (u'splitterjeg', u'splitter jeg'), (u'erjournalist', u'er journalist'), (u'erjoumalist', u'er journalist'), (u'Forjeg', u'For jeg'), (u'g\xe2rjeg', u'g\xe5r jeg'), (u'N\xe2rjeg', u'N\xe5r jeg'), (u'a\ufb02lom', u'afkom'), (u'farerjo', u'farer jo'), (u'tagerjeg', u'tager jeg'), (u'Virkerjeg', u'Virker jeg'), (u'morerjer', u'morer jer'), (u'kommerjo', u'kommer jo'), (u'istand', u'i stand'), (u'b\xf8m', u'b\xf8rn'), (u'frygterjeg', u'frygter jeg'), (u'kommerjeg', u'kommer jeg'), (u'eriournalistelev', u'er journalistelev'), (u'harfat', u'har fat'), (u'f\xe5r\ufb01ngre', u'f\xe5r \ufb01ngre'), (u'sl\xe2rjeg', u'sl\xe5r jeg'), (u'bam', u'barn'), (u'erjournalistelev', u'er journalistelev'), (u'politietjo', u'politiet jo'), (u'elskerjo', u'elsker jo'), (u'vari', u'var i'), (u'fornemmerjeres', u'fornemmer jeres'), (u'udkl\xe6kketl', u'udkl\xe6kket!'), (u'\xed', u'i'), (u'nyi', u'ny i'), (u'Iumijelse', u'forn\xf8jelse'), (u'vures', u'vores'), (u'I/Vash\xedngtan', u'Washington'), (u'opleverjeg', u'oplever jeg'), (u'PANTEL\xc3NER', u'PANTEL\xc5NER'), (u'Gudmurgen', u'Godmorgen'), (u'SKYDEV\xc3BEN', u'SKYDEV\xc5BEN'), (u'P\xc3LIDELIG', u'P\xc5LIDELIG'), (u'avertalte', u'overtalte'), (u'Oms\xedder', u'Omsider'), (u'lurteb\xe5d', u'lorteb\xe5d'), (u'Telrslning', u'Tekstning'), (u'miU\xf8', u'milj\xf8'), (u'g\xe5ri', u'g\xe5r i'), (u'Fan/el', u'Farvel'), (u'abe\ufb01\xe6s', u'abefj\xe6s'), (u'hartalt', u'har talt'), (u'\\\xc5rkelig', u'Virkelig'), (u'beklagerjeg', u'beklager jeg'), (u'N\xe5rjeg', u'N\xe5r jeg'), (u'rnaend', u'm\xe6nd'), (u'vaskebjorn', u'vaskebj\xf8rn'), (u'Ivil', u'I vil'), (u'besog', u'bes\xf8g'), (u'Vaer', u'V\xe6r'), (u'Undersogte', u'Unders\xf8gte'), (u'modte', u'm\xf8dte'), (u'toj', u't\xf8j'), (u'fodt', u'f\xf8dt'), (u'gore', u'g\xf8re'), (u'provede', u'pr\xf8vede'), (u'forste', u'f\xf8rste'), (u'igang', u'i gang'), (u'ligenu', u'lige nu'), (u'clet', u'det'), (u'Strombell', u'Strombel!'), (u'tmvlt', u'travlt'), (u'studererjournalistik', u'studerer journalistik'), (u'inforrnererjeg', u'informerer jeg'), (u'omk\ufb01ng', u'omkring'), (u'tilAsg\xe5rd', u'til Asg\xe5rd'), (u'Kederjeg', u'Keder jeg'), (u'jaettetamp', u'j\xe6ttetamp'), (u'erjer', u'er jer'), (u'atjulehygge', u'at julehygge'), (u'Ueneste', u'tjeneste'), (u'foltsaetter', u'forts\xe6tter'), (u'A/ice', u'Alice'), (u'tvivlerjeg', u'tvivler jeg'), (u'henterjer', u'henter jer'), (u'forst\xe5rjeg', u'forst\xe5r jeg'), (u'hvisjeg', u'hvis jeg'), (u'/\xe6rt', u'l\xe6rt'), (u'vfgtrgt', u'vigtigt'), (u'hurtigtjeg', u'hurtigt jeg'), (u'kenderjo', u'kender jo'), (u'seiv', u'selv'), (u'/\xe6gehuset', u'l\xe6gehuset'), (u'herjo', u'her jo'), (u'stolerjeg', u'stoler jeg'), (u'digi', u'dig i'), (u'taberi', u'taber i'), (u'sl\xe5rjeres', u'sl\xe5r jeres'), (u'laere', u'l\xe6re'), (u'tr\xe6nerwushu', u'tr\xe6ner wushu'), (u'efterjeg', u'efter jeg'), (u'e\ufb01er', u'efter'), (u'dui', u'du i'), (u'a\ufb01en', u'aften'), (u'bliveri', u'bliver i'), (u'acceptererjer', u'accepterer jer'), (u'drikkerjo', u'drikker jo'), (u'\ufb01anjin', u'Tianjin'), (u'erl\xe6nge', u'er l\xe6nge'), (u'erikke', u'er ikke'), (u'medjer', u'med jer'), (u'Tmykke', u'Tillykke'), (u"'\ufb01anjins", u'Tianjins'), (u'Mesteri', u'Mester i'), (u'sagdetil', u'sagde til'), (u'indei', u'inde i'), (u'o\ufb01e', u'ofte'), (u"'\ufb01lgiv", u'Tilgiv'), (u'Lf\xe5r', u'I f\xe5r'), (u'viserjer', u'viser jer'), (u'Rejsjerblot', u'Rejs jer blot'), (u"'\ufb01llad", u'Tillad'), (u'iiiie\ufb01nger', u'lille\ufb01nger'), (u'VILOMFATTE', u'VIL OMFATTE'), (u'mo\ufb01o', u'motto'), (u'g\xf8rjer', u'g\xf8r jer'), (u'gifi', u'gift'), (u'hardu', u'har du'), (u'gi\ufb01', u'gift'), (u'Iaeggerjeg', u'l\xe6gger jeg'), (u'iet', u'i et'), (u'sv/yte', u'svigte'), (u'ti/', u'til'), (u'Wdal', u'Vidal'), (u'\ufb01\xe5et', u'f\xe5et'), (u'Hvo/for', u'Hvorfor'), (u'hellerikke', u'heller ikke'), (u'Wlle', u'Ville'), (u'dr/ver', u'driver'), (u'V\\\ufb02lliam', u'William'), (u'V\\\ufb02lliams', u'Williams'), (u'Vk\ufb01lliam', u'William'), (u'v\xe5dejakke', u'v\xe5de jakke'), (u'k\xe6\ufb02l', u'k\xe6ft!'), (u'sagdejeg', u'sagde jeg'), (u'oven/ejet', u'overvejet'), (u'karameisauce', u'karamelsauce'), (u'Lf\xf8lgej\xf8disk', u'If\xf8lge j\xf8disk'), (u'blevjo', u'blev jo'), (u'asiateri', u'asiater i'), (u'erV\\\ufb02lliam', u'er William'), (u'lidt\ufb02ov', u'lidt \ufb02ov'), (u'sagdejo', u'sagde jo'), (u'erlige', u'er lige'), (u'Vt\ufb01lliam', u'William'), (u'W\ufb01II', u'Will'), (u'a\ufb02darede', u'afklarede'), (u'hj\xe6iperjeg', u'hj\xe6lper jeg'), (u'laderjeg', u'lader jeg'), (u'H\xe2ndledsbeskyttere', u'H\xe5ndledsbeskyttere'), (u'Lsabels', u'Isabels'), (u'G\xf8rjeg', u'G\xf8r jeg'), (u'm\xe2jeg', u'm\xe5 jeg'), (u'ogjeg', u'og jeg'), (u'gjordejeg', u'gjorde jeg'), (u'villejeg', u'ville jeg'), (u'Vl\ufb02lliams', u'Williams'), (u'Dajeg', u'Da jeg'), (u'iorden', u'i orden'), (u'fandtjeg', u'fandt jeg'), (u'Tilykke', u'Tillykke'), (u'k\xf8rerjer', u'k\xf8rer jer'), (u'g\xf8fjeg', u'g\xf8r jeg'), (u'Selvflgelig', u'Selvf\xf8lgelig'), (u'fdder', u'fadder'), (u'bnfaldt', u'b\xf8nfaldt'), (u't\\/ehovedede', u'tvehovedede'), (u'EIler', u'Eller'), (u'ringerjeg', u'ringer jeg'), (u'blevv\xe6k', u'blev v\xe6k'), (u'st\xe1rjeg', u'st\xe5r jeg'), (u'varforbi', u'var forbi'), (u'harfortalt', u'har fortalt'), (u'iflere', u'i flere'), (u't\xf8rjeg', u't\xf8r jeg'), (u'kunnejeg', u'kunne jeg'), (u'm\xe1', u'm\xe5'), (u'hart\xe6nkt', u'har t\xe6nkt'), (u'F\xe1rjeg', u'F\xe5r jeg'), (u'afdelingervar', u'afdelinger var'), (u'0rd', u'ord'), (u'p\xe1st\xe1', u'p\xe5st\xe5'), (u'gr\xe1haret', u'gr\xe5haret'), (u'varforbl\xf8ffende', u'var forbl\xf8ffende'), (u'holdtjeg', u'holdt jeg'), (u'h\xe6ngerjo', u'h\xe6nger jo'), (u'fikjeg', u'fik jeg'), (u'f\xe1r', u'f\xe5r'), (u'Hvorforf\xf8lerjeg', u'Hvorfor f\xf8ler jeg'), (u'harfeber', u'har feber'), (u'\xe1ndssvagt', u'\xe5ndssvagt'), (u'0g', u'Og'), (u'vartre', u'var tre'), (u'abner', u'\xe5bner'), (u'garjeg', u'g\xe5r jeg'), (u'sertil', u'ser til'), (u'hvorfin', u'hvor fin'), (u'harfri', u'har fri'), (u'forstarjeg', u'forst\xe5r jeg'), (u'S\xe4', u'S\xe5'), (u'hvorfint', u'hvor fint'), (u'm\xe6rkerjeg', u'm\xe6rker jeg'), (u'ogsa', u'ogs\xe5'), (u'n\xe1rjeg', u'n\xe5r jeg'), (u'Jas\xe1', u'Jas\xe5'), (u'b\xe1ndoptager', u'b\xe5ndoptager'), (u'bed\xe1rende', u'bed\xe5rende'), (u's\xe1', u's\xe5'), (u'n\xe1r', u'n\xe5r'), (u'kunnejo', u'kunne jo'), (u'Brammertil', u'Brammer til'), (u'serjeg', u'ser jeg'), (u'gikjeg', u'gik jeg'), (u'udholderjeg', u'udholder jeg'), (u'm\xe1neder', u'm\xe5neder'), (u'vartr\xe6t', u'var tr\xe6t'), (u'd\xe1rligt', u'd\xe5rligt'), (u'klaretjer', u'klaret jer'), (u'pavirkelig', u'p\xe5virkelig'), (u'spekulererjeg', u'spekulerer jeg'), (u'fors\xf8gerjeg', u'fors\xf8ger jeg'), (u'huskerjeg', u'husker jeg'), (u'ifavnen', u'i favnen'), (u'skullejo', u'skulle jo'), (u'vartung', u'var tung'), (u'varfuldst\xe6ndig', u'var fuldst\xe6ndig'), (u'Paskedag', u'P\xe5skedag'), (u'turi', u'tur i'), (u'spillerschumanns', u'spiller Schumanns'), (u'forst\xe1rjeg', u'forst\xe5r jeg'), (u'istedet', u'i stedet'), (u'n\xe1rfrem', u'n\xe5r frem'), (u'habertrods', u'h\xe5ber trods'), (u'forf\xf8rste', u'for f\xf8rste'), (u'varto', u'var to'), (u'overtil', u'over til'), (u'forfem', u'for fem'), (u'holdtjo', u'holdt jo'), (u'passerjo', u'passer jo'), (u'ellerto', u'eller to'), (u'hartrods', u'har trods'), (u'harfuldst\xe6ndig', u'har fuldst\xe6ndig'), (u'g\xe5rjeg', u'g\xe5r jeg'), (u'giderjeg', u'gider jeg'), (u'forjer', u'for jer'), (u'erindrerjeg', u'erindrer jeg'), (u't\xe6nkerjeg', u't\xe6nker jeg'), (u'GAEt', u'G\xc5ET'), (u'h\xf8rerjo', u'h\xf8rer jo'), (u'forladerjeg', u'forlader jeg'), (u'kosterjo', u'koster jo'), (u'fort\xe6llerjeg', u'fort\xe6ller jeg'), (u'Forstyrrerjeg', u'Forstyrrer jeg'), (u'tjekkerjeg', u'tjekker jeg'), (u'erjurist', u'er jurist'), (u'tlLBUD', u'TILBUD'), (u'serjo', u'se rjo'), (u'bederjeg', u'beder jeg'), (u'bilderjeg', u'bilder jeg'), (u'ULVEtlME', u'ULVETlME'), (u'sk\xe6rerjo', u'sk\xe6rer jo'), (u'afjer', u'af jer'), (u'ordnerjeg', u'ordner jeg'), (u'giverjeg', u'giver jeg'), (u'rejservi', u'rejser vi'), (u'fangerjeg', u'fanger jeg'), (u'erjaloux', u'er jaloux'), (u'glemmerjeg', u'glemmer jeg'), (u'Beh\xf8verjeg', u'Beh\xf8ver jeg'), (u'harvi', u'har vi'), (u'ertyndere', u'er tyndere'), (u'f\xe5rtordenvejr', u'f\xe5r tordenvejr'), (u'varf\xe6rdig', u'var f\xe6rdig'), (u'h\xf8rerfor', u'h\xf8rer for'), (u'varvel', u'var vel'), (u'erforbi', u'er forbi'), (u'AIle', u'Alle'), (u'l\xe6serjo', u'l\xe6ser jo'), (u'Edgarer', u'Edgar er'), (u'hartaget', u'har taget'), (u'derer', u'der er'), (u'stikkerfrem', u'stikker frem'), (u'haraldrig', u'har aldrig'), (u'ellerfar', u'eller far'), (u'erat', u'er at'), (u'turtil', u'tur til'), (u'erf\xe6rdig', u'er f\xe6rdig'), (u'f\xf8lerjeg', u'f\xf8ler jeg'), (u'jerfra', u'jer fra'), (u'eralt', u'er alt'), (u'harfaktisk', u'har faktisk'), (u'harfundet', u'har fundet'), (u'harvendt', u'har vendt'), (u'Kunstneraf', u'Kunstner af'), (u'ervel', u'er vel'), (u'st\xe5ransigt', u'st\xe5r ansigt'), (u'Erjeg', u'Er jeg'), (u'venterjeg', u'venter jeg'), (u'Hvorvar', u'Hvor var'), (u'varfint', u'var fint'), (u'ervarmt', u'er varmt'), (u'g\xe5rfint', u'g\xe5r fint'), (u'flyverforbi', u'flyver forbi'), (u'Dervar', u'Der var'), (u'dervar', u'der var'), (u'mener\xe5ndeligt', u'mener \xe5ndeligt'), (u'forat', u'for at'), (u'herovertil', u'herover til'), (u'soverfor', u'sover for'), (u'begyndtejeg', u'begyndte jeg'), (u'vendertilbage', u'vender tilbage'), (u'erforf\xe6rdelig', u'er forf\xe6rdelig'), (u'g\xf8raltid', u'g\xf8r altid'), (u'ertilbage', u'er tilbage'), (u'harv\xe6ret', u'har v\xe6ret'), (u'bagoverellertil', u'bagover eller til'), (u'hertaler', u'her taler'), (u'v\xe5gnerjeg', u'v\xe5gner jeg'), (u'vartomt', u'var tomt'), (u'g\xe5rfrem', u'g\xe5r frem'), (u'talertil', u'taler til'), (u'ertryg', u'er tryg'), (u'ansigtervendes', u'ansigter vendes'), (u'hervirkeligt', u'her virkeligt'), (u'herer', u'her er'), (u'dr\xf8mmerjo', u'dr\xf8mmer jo'), (u'erfuldkommen', u'er fuldkommen'), (u'hveren', u'hver en'), (u'erfej', u'er fej'), (u'datterforg\xe6ves', u'datter forg\xe6ves'), (u'fors\xf8gerjo', u'fors\xf8ger jo'), (u'ertom', u'er tom'), (u'vareftermiddag', u'var eftermiddag'), (u'vartom', u'var tom'), (u'angerellerforventninger', u'anger eller forventninger'), (u'k\xf8rtejeg', u'k\xf8rte jeg'), (u'Hvorforfort\xe6ller', u'Hvorfor fort\xe6ller'), (u'g\xe5rtil', u'g\xe5r til'), (u'ringerefter', u'ringer efter'), (u's\xf8gertilflugt', u's\xf8ger tilflugt'), (u'ertvunget', u'er tvunget'), (u'megetjeg', u'meget jeg'), (u'varikke', u'var ikke'), (u'Derermange', u'Der e rmange'), (u'dervilhindre', u'der vil hindre'), (u'ers\xe5', u'er s\xe5'), (u'Detforst\xe5rLeggodt', u'Det forst\xe5r jeg godt'), (u'ergodt', u'er godt'), (u'vorventen', u'vor venten'), (u'tagerfejl', u'tager fejl'), (u'ellerer', u'eller er'), (u'laverjeg', u'laver jeg'), (u'0mgang', u'omgang'), (u'afst\xe1r', u'afst\xe5r'), (u'p\xe1', u'p\xe5'), (u'rejserjeg', u'rejser jeg'), (u'ellertage', u'eller tage'), (u'takkerjeg', u'takker jeg'), (u'ertilf\xe6ldigvis', u'er tilf\xe6ldigvis'), (u'fremstar', u'fremst\xe5r'), (u'ert\xe6t', u'er t\xe6t'), (u'ijeres', u'i jeres'), (u'Sagdejeg', u'Sagde jeg'), (u'overi', u'over i'), (u'plukkerjordb\xe6r', u'plukker jordb\xe6r'), (u'klarerjeg', u'klarer jeg'), (u'jerfire', u'jer fire'), (u't\xe1beligste', u't\xe5beligste'), (u'sigertvillingerne', u'siger tvillingerne'), (u'erfaktisk', u'er faktisk'), (u'g\xe1r', u'g\xe5r'), (u'harvasket', u'har vasket'), (u'harplukketjordb\xe6rtil', u'har plukket jordb\xe6r til'), (u'plukketjordb\xe6r', u'plukket jordb\xe6r'), (u'klaverfireh\xe6ndigt', u'klaver fireh\xe6ndigt'), (u'erj\xe6vnaldrende', u'er j\xe6vnaldrende'), (u'tierjeg', u'tier jeg'), (u'Hvorerden', u'Hvor er den'), (u'0veraltjeg', u'overalt jeg'), (u'g\xe5rp\xe5', u'g\xe5r p\xe5'), (u'finderjeg', u'finder jeg'), (u'serhans', u'ser hans'), (u'tiderbliver', u'tider bliver'), (u'ellertrist', u'eller trist'), (u'forst\xe5rjeres', u'forst\xe5r jeres'), (u'Hvorsj\xe6len', u'Hvor sj\xe6len'), (u'finderro', u'finder ro'), (u'sidderjeg', u'sidder jeg'), (u'tagerjo', u'tager jo'), (u'efterjeres', u'efter jeres'), (u'10O', u'100'), (u'besluttedejeg', u'besluttede jeg'), (u'varsket', u'var sket'), (u'uadskillige', u'uadskillelige'), (u'harjetlag', u'har jetlag'), (u'lkke', u'Ikke'), (u'lntet', u'Intet'), (u'afsl\xf8rerjeg', u'afsl\xf8rer jeg'), (u'm\xe5jeg', u'm\xe5 jeg'), (u'Vl', u'VI'), (u'atbygge', u'at bygge'), (u'detmakabre', u'det makabre'), (u'vilikke', u'vil ikke'), (u'talsmandbekr\xe6fter', u'talsmand bekr\xe6fter'), (u'vedatrenovere', u'ved at renovere'), (u'fors\xf8geratforst\xe5', u'fors\xf8ger at forst\xe5'), (u'ersket', u'er sket'), (u'morderp\xe5', u'morder p\xe5'), (u'frifodiRosewood', u'fri fod i Rosewood'), (u'holdtpressem\xf8de', u'holdt pressem\xf8de'), (u'lngen', u'Ingen'), (u'lND', u'IND'), (u'henterjeg', u'henter jeg'), (u'lsabel', u'Isabel'), (u'lsabels', u'Isabels'), (u'vinderjo', u'vinder jo'), (u'r\xf8dmerjo', u'r\xf8dmer jo'), (u'etjakkes\xe6t', u'et jakkes\xe6t'), (u'gl\xe6derjeg', u'gl\xe6der jeg'), (u'lgen', u'Igen'), (u'ls\xe6r', u'Is\xe6r'), (u'iparken', u'i parken'), (u'n\xe5rl', u'n\xe5r I'), (u'tilA1', u'til A1'), (u'FBl', u'FBI'), (u'viljo', u'vil jo'), (u'detp\xe5', u'det p\xe5'), (u'KIar', u'Klar'), (u'PIan', u'Plan'), (u'EIIer', u'Eller'), (u'FIot', u'Flot'), (u'AIIe', u'Alle'), (u'AIt', u'Alt'), (u'KIap', u'Klap'), (u'PIaza', u'Plaza'), (u'SIap', u'Slap'), (u'I\xe5', u'l\xe5'), (u'BIing', u'Bling'), (u'GIade', u'Glade'), (u'Iejrb\xe5lssange', u'lejrb\xe5lssange'), (u'bedtjer', u'bedt jer'), (u'h\xf8rerjeg', u'h\xf8rer jeg'), (u'F\xe5rjeg', u'F\xe5r jeg'), (u'fikJames', u'fik James'), (u'atsnakke', u'at snakke'), (u'varkun', u'var kun'), (u'retterjeg', u'retter jeg'), (u'ernormale', u'er normale'), (u'viljeg', u'vil jeg'), (u'S\xe6tjer', u'S\xe6t jer'), (u'udsatham', u'udsat ham'), (u'afen', u'af en'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'afdem', u'af dem'), (u'kmt', u'km/t')]),
+                        'pattern': u"(?um)(\\b|^)(?:Haner|JaveL|Pa\\/\\/e|bffte|Utro\\/\\/gt|Kommerdu|smi\\/er|\\/eg|harvinger|\\/et|erjeres|hardet|t\\\xe6nktjer|erjo|sti\\/|Iappe|Beklagel\\\xe7|vardet|afden|snupperjeg|ikkejeg|bliverjeg|hartravit|pandekagef\\/ag|Stormvarsell|stormvejn|morgenkomp\\/et|\\/yv|varjo|\\/eger|harjeg|havdejeg|hvorjeg|n\\\xe5rjeg|g\\\xe5rvi|atjeg|isine|f\\\xe5rjeg|k\\\xe6rtighed|skullejeg|laest|laese|g\\\xf8rjeg|g\\\xf8rvi|angrerjo|Hvergang|erder|villetilgive|\\\ufb01eme|genopst\\\xe5ri|svigtejer|kommernu|n\\\xe5rman|erfire|Hvorfor\\\ufb01nderdu|undertigt|itroen|erl\\\xf8gnt|g\\\xf8rden|forhelvede|hjpe|togeti|M\\\xe5jeg|savnerjer|erjeg|vaere|geme|trorp\\\xe5|forham|afham|harjo|ovema\\\ufb01et|begae\\\ufb01ighed|sy\\\u2019g|Imensjeg|bliverdu|\\\ufb01ser|manipuierer|forjeg|iivgivendefor|formig|Hardu|fornold|defrelste|S\\\xe5jeg|varjeg|g\\\xf8rved|kalderjeg|\\\ufb02ytte|handlerdet|trorjeg|\\\ufb02ytter|soverjeg|\\\ufb01nderud|naboerp\\\xe5|ervildt|v\\\xe6reher|hyggerjer|borjo|kommerikke|folkynde|farglad|misterjeg|\\\ufb01nt|Harl|bedejer|synesjeg|vartil|eren|\\\\Al|\\\\A|fjeme|Iigefyldt|ertil|fa\\\ufb01igt|\\\ufb01nder|\\\ufb01ndes|irettesae\\\ufb01else|ermed|\\\xe8n|gikjoi|Hvisjeg|ovema\\\ufb01er|hoident|\\\\Adne|fori|vei|savnerjerjo|elskerjer|harl\\\xf8jet|eri|\\\ufb01ende|derjo|sigerjo|menerjeg|Harjeg|sigerjeg|splitterjeg|erjournalist|erjoumalist|Forjeg|g\\\xe2rjeg|N\\\xe2rjeg|a\\\ufb02lom|farerjo|tagerjeg|Virkerjeg|morerjer|kommerjo|istand|b\\\xf8m|frygterjeg|kommerjeg|eriournalistelev|harfat|f\\\xe5r\\\ufb01ngre|sl\\\xe2rjeg|bam|erjournalistelev|politietjo|elskerjo|vari|fornemmerjeres|udkl\\\xe6kketl|\\\xed|nyi|Iumijelse|vures|I\\/Vash\\\xedngtan|opleverjeg|PANTEL\\\xc3NER|Gudmurgen|SKYDEV\\\xc3BEN|P\\\xc3LIDELIG|avertalte|Oms\\\xedder|lurteb\\\xe5d|Telrslning|miU\\\xf8|g\\\xe5ri|Fan\\/el|abe\\\ufb01\\\xe6s|hartalt|\\\\\\\xc5rkelig|beklagerjeg|N\\\xe5rjeg|rnaend|vaskebjorn|Ivil|besog|Vaer|Undersogte|modte|toj|fodt|gore|provede|forste|igang|ligenu|clet|Strombell|tmvlt|studererjournalistik|inforrnererjeg|omk\\\ufb01ng|tilAsg\\\xe5rd|Kederjeg|jaettetamp|erjer|atjulehygge|Ueneste|foltsaetter|A\\/ice|tvivlerjeg|henterjer|forst\\\xe5rjeg|hvisjeg|\\/\\\xe6rt|vfgtrgt|hurtigtjeg|kenderjo|seiv|\\/\\\xe6gehuset|herjo|stolerjeg|digi|taberi|sl\\\xe5rjeres|laere|tr\\\xe6nerwushu|efterjeg|e\\\ufb01er|dui|a\\\ufb01en|bliveri|acceptererjer|drikkerjo|\\\ufb01anjin|erl\\\xe6nge|erikke|medjer|Tmykke|\\'\\\ufb01anjins|Mesteri|sagdetil|indei|o\\\ufb01e|\\'\\\ufb01lgiv|Lf\\\xe5r|viserjer|Rejsjerblot|\\'\\\ufb01llad|iiiie\\\ufb01nger|VILOMFATTE|mo\\\ufb01o|g\\\xf8rjer|gifi|hardu|gi\\\ufb01|Iaeggerjeg|iet|sv\\/yte|ti\\/|Wdal|\\\ufb01\\\xe5et|Hvo\\/for|hellerikke|Wlle|dr\\/ver|V\\\\\\\ufb02lliam|V\\\\\\\ufb02lliams|Vk\\\ufb01lliam|v\\\xe5dejakke|k\\\xe6\\\ufb02l|sagdejeg|oven\\/ejet|karameisauce|Lf\\\xf8lgej\\\xf8disk|blevjo|asiateri|erV\\\\\\\ufb02lliam|lidt\\\ufb02ov|sagdejo|erlige|Vt\\\ufb01lliam|W\\\ufb01II|a\\\ufb02darede|hj\\\xe6iperjeg|laderjeg|H\\\xe2ndledsbeskyttere|Lsabels|G\\\xf8rjeg|m\\\xe2jeg|ogjeg|gjordejeg|villejeg|Vl\\\ufb02lliams|Dajeg|iorden|fandtjeg|Tilykke|k\\\xf8rerjer|g\\\xf8fjeg|Selvflgelig|fdder|bnfaldt|t\\\\\\/ehovedede|EIler|ringerjeg|blevv\\\xe6k|st\\\xe1rjeg|varforbi|harfortalt|iflere|t\\\xf8rjeg|kunnejeg|m\\\xe1|hart\\\xe6nkt|F\\\xe1rjeg|afdelingervar|0rd|p\\\xe1st\\\xe1|gr\\\xe1haret|varforbl\\\xf8ffende|holdtjeg|h\\\xe6ngerjo|fikjeg|f\\\xe1r|Hvorforf\\\xf8lerjeg|harfeber|\\\xe1ndssvagt|0g|vartre|abner|garjeg|sertil|hvorfin|harfri|forstarjeg|S\\\xe4|hvorfint|m\\\xe6rkerjeg|ogsa|n\\\xe1rjeg|Jas\\\xe1|b\\\xe1ndoptager|bed\\\xe1rende|s\\\xe1|n\\\xe1r|kunnejo|Brammertil|serjeg|gikjeg|udholderjeg|m\\\xe1neder|vartr\\\xe6t|d\\\xe1rligt|klaretjer|pavirkelig|spekulererjeg|fors\\\xf8gerjeg|huskerjeg|ifavnen|skullejo|vartung|varfuldst\\\xe6ndig|Paskedag|turi|spillerschumanns|forst\\\xe1rjeg|istedet|n\\\xe1rfrem|habertrods|forf\\\xf8rste|varto|overtil|forfem|holdtjo|passerjo|ellerto|hartrods|harfuldst\\\xe6ndig|g\\\xe5rjeg|giderjeg|forjer|erindrerjeg|t\\\xe6nkerjeg|GAEt|h\\\xf8rerjo|forladerjeg|kosterjo|fort\\\xe6llerjeg|Forstyrrerjeg|tjekkerjeg|erjurist|tlLBUD|serjo|bederjeg|bilderjeg|ULVEtlME|sk\\\xe6rerjo|afjer|ordnerjeg|giverjeg|rejservi|fangerjeg|erjaloux|glemmerjeg|Beh\\\xf8verjeg|harvi|ertyndere|f\\\xe5rtordenvejr|varf\\\xe6rdig|h\\\xf8rerfor|varvel|erforbi|AIle|l\\\xe6serjo|Edgarer|hartaget|derer|stikkerfrem|haraldrig|ellerfar|erat|turtil|erf\\\xe6rdig|f\\\xf8lerjeg|jerfra|eralt|harfaktisk|harfundet|harvendt|Kunstneraf|ervel|st\\\xe5ransigt|Erjeg|venterjeg|Hvorvar|varfint|ervarmt|g\\\xe5rfint|flyverforbi|Dervar|dervar|mener\\\xe5ndeligt|forat|herovertil|soverfor|begyndtejeg|vendertilbage|erforf\\\xe6rdelig|g\\\xf8raltid|ertilbage|harv\\\xe6ret|bagoverellertil|hertaler|v\\\xe5gnerjeg|vartomt|g\\\xe5rfrem|talertil|ertryg|ansigtervendes|hervirkeligt|herer|dr\\\xf8mmerjo|erfuldkommen|hveren|erfej|datterforg\\\xe6ves|fors\\\xf8gerjo|ertom|vareftermiddag|vartom|angerellerforventninger|k\\\xf8rtejeg|Hvorforfort\\\xe6ller|g\\\xe5rtil|ringerefter|s\\\xf8gertilflugt|ertvunget|megetjeg|varikke|Derermange|dervilhindre|ers\\\xe5|Detforst\\\xe5rLeggodt|ergodt|vorventen|tagerfejl|ellerer|laverjeg|0mgang|afst\\\xe1r|p\\\xe1|rejserjeg|ellertage|takkerjeg|ertilf\\\xe6ldigvis|fremstar|ert\\\xe6t|ijeres|Sagdejeg|overi|plukkerjordb\\\xe6r|klarerjeg|jerfire|t\\\xe1beligste|sigertvillingerne|erfaktisk|g\\\xe1r|harvasket|harplukketjordb\\\xe6rtil|plukketjordb\\\xe6r|klaverfireh\\\xe6ndigt|erj\\\xe6vnaldrende|tierjeg|Hvorerden|0veraltjeg|g\\\xe5rp\\\xe5|finderjeg|serhans|tiderbliver|ellertrist|forst\\\xe5rjeres|Hvorsj\\\xe6len|finderro|sidderjeg|tagerjo|efterjeres|10O|besluttedejeg|varsket|uadskillige|harjetlag|lkke|lntet|afsl\\\xf8rerjeg|m\\\xe5jeg|Vl|atbygge|detmakabre|vilikke|talsmandbekr\\\xe6fter|vedatrenovere|fors\\\xf8geratforst\\\xe5|ersket|morderp\\\xe5|frifodiRosewood|holdtpressem\\\xf8de|lngen|lND|henterjeg|lsabel|lsabels|vinderjo|r\\\xf8dmerjo|etjakkes\\\xe6t|gl\\\xe6derjeg|lgen|ls\\\xe6r|iparken|n\\\xe5rl|tilA1|FBl|viljo|detp\\\xe5|KIar|PIan|EIIer|FIot|AIIe|AIt|KIap|PIaza|SIap|I\\\xe5|BIing|GIade|Iejrb\\\xe5lssange|bedtjer|h\\\xf8rerjeg|F\\\xe5rjeg|fikJames|atsnakke|varkun|retterjeg|ernormale|viljeg|S\\\xe6tjer|udsatham|afen|p\\\xe5jorden|afdem|kmt)(\\b|$)"}},
+ 'deu': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'IVI', u'M'), (u'IVl', u'M'), (u'I\\/I', u'M'), (u'I\\/l', u'M'), (u'lVI', u'M'), (u'lVl', u'M'), (u'l\\/I', u'M'), (u'l\\/l', u'M'), (u'\xa4', u'o'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'/a', u'Ja'), (u'/ch', u'Ich'), (u'/d/of', u'Idiot'), (u'/ebte', u'lebte'), (u'/eid', u'leid'), (u'/hn', u'ihn'), (u'/hnen', u'Ihnen'), (u'/hr', u'Ihr'), (u'/hre', u'Ihre'), (u'/hren', u'Ihren'), (u'/m', u'im'), (u'/mmer', u'immer'), (u'/n', u'In'), (u'/ndividuen', u'Individuen'), (u'/nn', u'Inn'), (u'/oe', u'Joe'), (u'/sf', u'ist'), (u'/sf/0/1n', u'Ist John'), (u'/ungs', u'Jungs'), (u'/Vfinuten', u'Minuten'), (u'/\xe9nger', u'l\xe4nger'), (u'/\xe9uft', u'l\xe4uft'), (u'0/1', u'Oh'), (u'0/me', u'ohne'), (u'0/vne', u'ohne'), (u'00om', u'000 m'), (u'100m', u'100 m'), (u'120m', u'120 m'), (u'13Oj\xa7hrie', u'130-j\xe4hrige'), (u'145m', u'145 m'), (u'150m', u'150 m'), (u'160m', u'160 m'), (u'165m', u'165 m'), (u'19m', u'19 m'), (u'20m', u'20 m'), (u'27m', u'27 m'), (u'30m', u'30 m'), (u'37m', u'37 m'), (u'38m', u'38 m'), (u'3km', u'3 km'), (u'5/ch', u'sich'), (u'5/cher', u'sicher'), (u'5/cherer', u'sicherer'), (u'5/e', u'Sie'), (u'5/nd', u'Sind'), (u'500m', u'500 m'), (u'5ulSere', u'\xe4u\xdfere'), (u'60m', u'60 m'), (u'6de', u'\xf6de'), (u'6dere', u'\xf6dere'), (u'6ffne', u'\xf6ffne'), (u'6ffnen', u'\xf6ffnen'), (u'6ffnet', u'\xd6ffnet'), (u'6fter', u'\xf6fter'), (u'750m', u'750 m'), (u'85m', u'85 m'), (u'90m', u'90 m'), (u'a//em', u'allem'), (u'A//es', u'Alles'), (u'abbeif$en', u'abbei\xdfen'), (u'abdrficken', u'abdr\xfccken'), (u'aBen', u'a\xdfen'), (u'abergl\xe9iubischen', u'abergl\xe4ubischen'), (u'aberja', u'aber ja'), (u'aberjemand', u'aber jemand'), (u'Aberjetzt', u'Aber jetzt'), (u'abf\xe9hrt', u'abf\xe4hrt'), (u'abf\xe9illt', u'abf\xe4llt'), (u'abgef\xe9rbt', u'abgef\xe4rbt'), (u'abgeh\xe9ngt', u'abgeh\xe4ngt'), (u'abgeh\xe9rt', u'abgeh\xf6rt'), (u'abgelost', u'abgel\xf6st'), (u'abgesprengli', u'abgesprengt!'), (u'abgestfirztl', u'abgest\xfcrzt'), (u'abgestilrzt', u'abgest\xfcrzt'), (u'abgestofien', u'abgesto\xdfen'), (u'abgew\xe9hlt', u'abgew\xe4hlt'), (u'abgew\xe9hnen', u'abgew\xf6hnen'), (u'abgew\xe9hnt', u'abgew\xf6hnt'), (u'abge\xe9nderten', u'abge\xe4nderten'), (u'abh\xe9ingt', u'abh\xe4ngt'), (u'abh\xe9ngen', u'abh\xe4ngen'), (u'abh\xe9ngig', u'abh\xe4ngig'), (u'abh\xe9ngiges', u'abh\xe4ngiges'), (u'Abh\xe9rstationen', u'Abh\xf6rstationen'), (u'Abjetzt', u'Ab jetzt'), (u'abkfihlen', u'abk\xfchlen'), (u'Abkfirzung', u'Abk\xfcrzung'), (u'abkommlich', u'abk\xf6mmlich'), (u'Ablegenl', u'Ablegen!'), (u'ablfisen', u'abl\xf6sen'), (u'ablosen', u'abl\xf6sen'), (u'Ablosung', u'Abl\xf6sung'), (u'abreif$en', u'abrei\xdfen'), (u'Abrijcken', u'Abr\xfccken'), (u'abr\xe9umen', u'abr\xe4umen'), (u'Absch/ed', u'Abschied'), (u'abschiefien', u'abschie\xdfen'), (u'abschlief$en', u'abschlie\xdfen'), (u'abschliefien', u'abschlie\xdfen'), (u'abschwiiren', u'abschw\xf6ren'), (u'abstoflsend', u'absto\xdfend'), (u'Abtrijnnige', u'Abtr\xfcnnige'), (u'abwiirgt', u'abw\xfcrgt'), (u'abw\xe9gen', u'abw\xe4gen'), (u'abzuh\xe9ren', u'abzuh\xf6ren'), (u'abzuschwiiren', u'abzuschw\xf6ren'), (u'abzusfofien', u'abzusto\xdfen'), (u'ACh', u'Ach'), (u'Achtungl', u'Achtung!'), (u'Achzen', u'\xc4chzen'), (u'ACHZT', u'\xc4CHZT'), (u'Acic', u'Acid'), (u'ADDRESSDATEI', u'ADRESSDATEI'), (u'Adi\xf6s', u'Adi\xf3s'), (u'Admiralitat', u'Admiralit\xe4t'), (u'Admiralit\xe9it', u'Admiralit\xe4t'), (u'Admiralit\xe9t', u'Admiralit\xe4t'), (u'Aff\xe9re', u'Aff\xe4re'), (u'Aff\xe9ren', u'Aff\xe4ren'), (u'AFl', u'AFI'), (u'aggresivem', u'aggressivem'), (u'Agypten', u'\xc4gypten'), (u'aher', u'aber'), (u'AI/en/vichtigste', u'Allerwichtigste'), (u'Ain/vays', u'Airways'), (u'AIs', u'Als'), (u'Aktivit\xe9iten', u'Aktivit\xe4ten'), (u'Aktivit\xe9ten', u'Aktivit\xe4ten'), (u'AKTMERT', u'AKTIVIERT'), (u'Alarmsfufe', u'Alarmstufe'), (u'albem', u'albern'), (u'Albtriiume', u'Albtr\xe4ume'), (u'ale', u'als'), (u'alleinl', u'allein!'), (u'allejubeln', u'alle jubeln'), (u'allern\xe9chsten', u'allern\xe4chsten'), (u'Allmiichtigerl', u'Allm\xe4chtiger!'), (u'Allm\xe9chtige', u'Allm\xe4chtige'), (u'Allm\xe9chtiger', u'Allm\xe4chtiger'), (u'allm\xe9hlich', u'allm\xe4hlich'), (u'Allm\xe9ichtiger', u'Allm\xe4chtiger'), (u'Allsparkl', u'Allspark!'), (u'allt\xe9iglichen', u'allt\xe4glichen'), (u'ALTESTE', u'\xc4LTESTE'), (u'Altester', u'\xc4ltester'), (u'Alzte', u'\xc4rzte'), (u"Amerx'kaner", u'Amerikaner'), (u'amfisierst', u'am\xfcsierst'), (u'Amiilsierst', u'Am\xfcsierst'), (u'amiisieren', u'am\xfcsieren'), (u'amiisierenl', u'am\xfcsieren!'), (u'amiisierte', u'am\xfcsierte'), (u'Amijsant', u'Am\xfcsant'), (u'amlllsant', u'am\xfcsant'), (u'amlllsiert', u'am\xfcsiert'), (u'amtlsant', u'am\xfcsant'), (u'Amusanf', u'Am\xfcsant'), (u'amusant', u'am\xfcsant'), (u'Amusiert', u'Am\xfcsiert'), (u'Anderst', u'\xc4nderst'), (u'Anderung', u'\xc4nderung'), (u'Anderungen', u'\xc4nderungen'), (u"anfa'ngt", u'anf\xe4ngt'), (u'Anffihrer', u'Anf\xfchrer'), (u'Anffingerl', u'Anf\xe4nger!'), (u'Anfiihrer', u'Anf\xfchrer'), (u'anfijhlt', u'anf\xfchlt'), (u'Anfingerl', u'Anf\xe4nger!'), (u'Anfuhrer', u'Anf\xfchrer'), (u'Anfuhrern', u'Anf\xfchrern'), (u'Anf\xe9inger', u'Anf\xe4nger'), (u'Anf\xe9ingergliick', u'Anf\xe4ngergl\xfcck'), (u'Anf\xe9nge', u'Anf\xe4nge'), (u'anf\xe9ngst', u'anf\xe4ngst'), (u'anf\xe9ngt', u'anf\xe4ngt'), (u'angebrfillt', u'angebr\xfcllt'), (u'angebrullt', u'angebr\xfcllt'), (u'angefiihrt', u'angef\xfchrt'), (u'ANGEHCHDRIGE', u'ANGEH\xd6RIGE'), (u'angehfirt', u'angeh\xf6rt'), (u'Angehtirigen', u'Angeh\xf6rigen'), (u'angeh\xe9ren', u'angeh\xf6ren'), (u'angeh\xe9rt', u'angeh\xf6rt'), (u'angel\xe9chelt', u'angel\xe4chelt'), (u'angerilhrt', u'anger\xfchrt'), (u'anger\ufb02hrt', u'anger\xfchrt'), (u'angeschweifit', u'angeschwei\xdft'), (u'angespruht', u'angespr\xfcht'), (u'angetiltert', u'anget\xfctert'), (u'Angriffspl\xe9nen', u'Angriffspl\xe4nen'), (u'Angstschweili', u'Angstschwei\xdf'), (u'anhiiren', u'anh\xf6ren'), (u'Anh\xe9inger', u'Anh\xe4nger'), (u'anh\xe9lt', u'anh\xe4lt'), (u'anh\xe9ngen', u'anh\xe4ngen'), (u'anh\xe9ren', u'anh\xf6ren'), (u'ankijndigen', u'ank\xfcndigen'), (u'anliigen', u'anl\xfcgen'), (u'anlugen', u'anl\xfcgen'), (u'anmal3ende', u'anma\xdfende'), (u'ann\xe9hern', u'ann\xe4hern'), (u'anriihrst', u'anr\xfchrst'), (u'anrijuhren', u'anr\xfchren'), (u'anst\xe9indig', u'anst\xe4ndig'), (u'anst\xe9indiger', u'anst\xe4ndiger'), (u'anst\xe9indiges', u'anst\xe4ndiges'), (u'anst\xe9ndig', u'anst\xe4ndig'), (u'anst\xe9ndige', u'anst\xe4ndige'), (u'anst\xe9ndigen', u'anst\xe4ndigen'), (u'Anst\xe9ndiges', u'Anst\xe4ndiges'), (u'Antik\xe9rper', u'Antik\xf6rper'), (u'Antiquit\xe9t', u'Antiquit\xe4t'), (u'Antistrahlenger\xe9t', u'Antistrahlenger\xe4t'), (u'antwortenl', u'antworten!'), (u'Anwe/sung', u'Anweisung'), (u'Anwe/sungen', u'Anweisungen'), (u'Anw\xe9iltin', u'Anw\xe4ltin'), (u'Anw\xe9lte', u'Anw\xe4lte'), (u'Anw\xe9ltin', u'Anw\xe4ltin'), (u'Anzilge', u'Anz\xfcge'), (u'Anztinden', u'Anz\xfcnden'), (u'Anzuge', u'Anz\xfcge'), (u'Anzugen', u'Anz\xfcgen'), (u'anzuhiiren', u'anzuh\xf6ren'), (u'anzuhoren', u'anzuh\xf6ren'), (u'anzundenl', u'anz\xfcnden!'), (u'anzupiibeln', u'anzup\xf6beln'), (u'An\xe9sthesie', u'An\xe4sthesie'), (u'An\xe9sthesieprofessor', u'An\xe4sthesieprofessor'), (u'An\xe9sthesieteam', u'An\xe4sthesieteam'), (u'An\xe9sthesist', u'An\xe4sthesist'), (u'An\xe9sthesisten', u'An\xe4sthesisten'), (u'An\xe9sthetikum', u'An\xe4sthetikum'), (u'ARBEITERI', u'ARBEITER:'), (u'Arbeitsfl\ufb02gel', u'Arbeitsfl\xfcgel'), (u'Armeefunkger\xe9t', u'Armeefunkger\xe4t'), (u'Armel', u'\xc4rmel'), (u'Arschkichern', u'Arschl\xf6chern'), (u'Arschliicher', u'Arschl\xf6cher'), (u'Arschliichern', u'Arschl\xf6chern'), (u'Arschl\xe9cher', u'Arschl\xf6cher'), (u'Arschl\xe9chern', u'Arschl\xf6chern'), (u'Arzte', u'\xc4rzte'), (u'Arzten', u'\xc4rzten'), (u'Arztin', u'\xc4rztin'), (u'Atemger\xe9usche', u'Atemger\xe4usche'), (u'Atlantikkiiste', u'Atlantikk\xfcste'), (u'Atlantikkuste', u'Atlantikk\xfcste'), (u'ATMOSPHARE', u'ATMOSPH\xc4RE'), (u'Atmosph\xe9re', u'Atmosph\xe4re'), (u'Atmosph\xe9renbereich', u'Atmosph\xe4renbereich'), (u'Atmosph\xe9reneinflugsequenz', u'Atmosph\xe4reneinflugsequenz'), (u'Atmosph\xe9reneintritt', u'Atmosph\xe4reneintritt'), (u'Attenfaiter', u'Attent\xe4ter'), (u'Attent\xe9iter', u'Attent\xe4ter'), (u'Attent\xe9ter', u'Attent\xe4ter'), (u'Attent\xe9ters', u'Attent\xe4ters'), (u'Attraktivit\xe9t', u'Attraktivit\xe4t'), (u'auBen', u'au\xdfen'), (u'Aubenblick', u'Augenblick'), (u'AuBenbord', u'Au\xdfenbord'), (u'AuBenwelt', u'Au\xdfenwelt'), (u'auBer', u'au\xdfer'), (u'AuBerdem', u'Au\xdferdem'), (u'auBerhalb', u'au\xdferhalb'), (u'auc/1', u'auch'), (u'auchl', u'auch!'), (u'Auf$erdem', u'Au\xdferdem'), (u'auf3er', u'au\xdfer'), (u'aufAugenh6he', u'auf Augenh\xf6he'), (u'aufblilhende', u'aufbl\xfchende'), (u"auff'a'ngt", u'auff\xe4ngt'), (u'Auff\xe9lliges', u'Auff\xe4lliges'), (u'aufgebltiht', u'aufgebl\xfcht'), (u'aufgeftlhrt', u'aufgef\xfchrt'), (u'aufgeh\xe9ingt', u'aufgeh\xe4ngt'), (u'aufgeh\xe9rt', u'aufgeh\xf6rt'), (u'aufgekl\xe9rt', u'aufgekl\xe4rt'), (u'aufger\xe9umt', u'aufger\xe4umt'), (u'aufgespiefit', u'aufgespie\xdft'), (u'aufgewiihlter', u'aufgew\xfchlter'), (u'aufgez\xe9hlt', u'aufgez\xe4hlt'), (u'Aufh6ren', u'Aufh\xf6ren'), (u'aufhbren', u'aufh\xf6ren'), (u'aufhdrf', u'aufh\xf6rt'), (u'aufhfiren', u'aufh\xf6ren'), (u'aufhiiren', u'aufh\xf6ren'), (u'Aufhoren', u'Aufh\xf6ren'), (u'Aufh\xe9iren', u'Aufh\xf6ren'), (u'aufh\xe9ngen', u'aufh\xe4ngen'), (u'Aufh\xe9ren', u'Aufh\xf6ren'), (u'aufh\xe9renl', u'aufh\xf6ren'), (u'aufi', u'auf,'), (u'Aufienministerium', u'Au\xdfenministerium'), (u'aufier', u'au\xdfer'), (u'Aufierdem', u'Au\xdferdem'), (u'aufiergew\xe9hnliche', u'au\xdfergew\xf6hnliche'), (u'aufierhalb', u'au\xdferhalb'), (u'Aufierirdischer', u'Au\xdferirdischer'), (u'Aufierlich', u'\xc4u\xdferlich'), (u'aufierordentlich', u'au\xdferordentlich'), (u'Aufkenposten', u'Au\xdfenposten'), (u'aufkisen', u'aufl\xf6sen'), (u'aufkl\xe9ren', u'aufkl\xe4ren'), (u'Aufkl\xe9rung', u'Aufkl\xe4rung'), (u'aufl', u'auf!'), (u'Aufl6sung', u'Aufl\xf6sung'), (u'aufliisen', u'aufl\xf6sen'), (u'auflser', u'au\xdfer'), (u'aufl\xe9sen', u'aufl\xf6sen'), (u'aufmiibeln', u'aufm\xf6beln'), (u'aufraumte', u'aufr\xe4umte'), (u'aufr\xe9umen', u'aufr\xe4umen'), (u'aufschlief$en', u'aufschlie\xdfen'), (u'Aufschlull', u'Aufschluss'), (u'aufSer', u'au\xdfer'), (u'aufSIJBigkeiten', u'auf S\xfc\xdfigkeiten'), (u'aufspturen', u'aufsp\xfcren'), (u'aufstellenl', u'aufstellen!'), (u'Aufst\xe9ndige', u'Aufst\xe4ndische'), (u'aufTanis', u'auf Tanis'), (u'Auftr\xe9ge', u'Auftr\xe4ge'), (u'aufvv\xe9ndigen', u'aufw\xe4ndigen'), (u'aufw\xe9ichst', u'aufw\xe4chst'), (u'aufw\xe9rmen', u'aufw\xe4rmen'), (u'aufZ>er', u'au\xdfer'), (u'Aufztlge', u'Aufz\xfcge'), (u'aufzuhiivren', u'aufzuh\xf6ren'), (u'aufzukl\xe9ren', u'aufzukl\xe4ren'), (u'aufzuldsen', u'aufzul\xf6sen'), (u'aufzur\xe9umen', u'aufzur\xe4umen'), (u'aufz\xe9hlen', u'aufz\xe4hlen'), (u'auf\xe9er', u'au\xdfer'), (u'auf\ufb02iegen', u'auffliegen'), (u'Augenm\xe9igen', u'Augenm\xe4gen'), (u"aul'5er", u'au\xdfer'), (u'aul3er', u'au\xdfer'), (u'Aul3erdem', u'Au\xdferdem'), (u'aul5er', u'au\xdfer'), (u'aulier', u'au\xdfer'), (u'Aulierdem', u'Au\xdferdem'), (u'auliergewfihnlich', u'au\xdfergew\xf6hnlich'), (u'aulierhalb', u'au\xdferhalb'), (u'Aulierirdischen', u'Au\xdferirdischen'), (u'auller', u'au\xdfer'), (u'aullerhalb', u'au\xdferhalb'), (u'AulSer', u'Au\xdfer'), (u'AulSerdem', u'Au\xdferdem'), (u'ausdriicken', u'ausdr\xfccken'), (u'ausdriickt', u'ausdr\xfcckt'), (u'ausdrijcken', u'ausdr\xfccken'), (u'ausdrucklicher', u'ausdr\xfccklicher'), (u'Ausdr\ufb02cken', u'Ausdr\xfccken'), (u'Ausen/v\xe9hlte', u'Auserw\xe4hlte'), (u'Ausen/v\xe9hlter', u'Auserw\xe4hlter'), (u'auserw\xe9hlt', u'auserw\xe4hlt'), (u'Ausffillen', u'Ausf\xfcllen'), (u'ausfijhren', u'ausf\xfchren'), (u'ausfijhrt', u'ausf\xfchrt'), (u'ausfuhren', u'ausf\xfchren'), (u'ausfullt', u'ausf\xfcllt'), (u'ausgef\ufb02llt', u'ausgef\xfcllt'), (u'ausgeliischt', u'ausgel\xf6scht'), (u'ausgeliist', u'ausgel\xf6st'), (u'ausgel\xe9ist', u'ausgel\xf6st'), (u'ausgel\xe9scht', u'ausgel\xf6scht'), (u'ausgel\xe9st', u'ausgel\xf6st'), (u'ausgeriickt', u'ausger\xfcckt'), (u'ausgerijstet', u'ausger\xfcstet'), (u'AUSGEWAHLT', u'AUSGEW\xc4HLT'), (u'ausgew\xe9hlt', u'ausgew\xe4hlt'), (u'Ausg\xe9ngen', u'Ausg\xe4ngen'), (u'aush6hlen', u'aush\xf6hlen'), (u'aushiilt', u'aush\xe4lt'), (u'Aushilfspunkerl', u'Aushilfspunker!'), (u'aush\xe9lt', u'aush\xe4lt'), (u'ausilben', u'aus\xfcben'), (u'Auskunfte', u'Ausk\xfcnfte'), (u'ausl', u'aus!'), (u'Ausl\xe9nder', u'Ausl\xe4nder'), (u'Ausl\xe9nderl', u'Ausl\xe4nder'), (u'ausl\xe9schen', u'ausl\xf6schen'), (u'ausl\xe9sen', u'ausl\xf6sen'), (u'Ausl\xe9ser', u'Ausl\xf6ser'), (u'AusmaB', u'Ausma\xdf'), (u'ausprobie\ufb02', u'ausprobiert'), (u'Ausriistung', u'Ausr\xfcstung'), (u'ausrusten', u'ausr\xfcsten'), (u'Ausrustung', u'Ausr\xfcstung'), (u'Ausschullware', u'Ausschussware'), (u'ausschwinnenl', u'ausschw\xe4rmen!'), (u'auszudriicken', u'auszudr\xfccken'), (u'auszuschliefien', u'auszuschlie\xdfen'), (u'auszuw\xe9hlen', u'auszuw\xe4hlen'), (u'Autorit\xe9t', u'Autorit\xe4t'), (u'Autoschlilssel', u'Autoschl\xfcssel'), (u'Autoschl\ufb02ssel', u'Autoschl\xfcssel'), (u'au\ufb02/viihlt', u'aufw\xfchlt'), (u'Au\ufb02ergewiihnlich', u'Au\xdfergew\xf6hnlich'), (u'Azevedol', u'Azevedo!'), (u'A\ufb02es', u'Alles'), (u'B/ick', u'Blick'), (u'b/olog/sch', u'biologisch'), (u'b/sschen', u'bisschen'), (u'B6se', u'B\xf6se'), (u'B6sem', u'B\xf6sem'), (u'B6ser', u'B\xf6ser'), (u'Babym\xe9dchen', u'Babym\xe4dchen'), (u'Ballastst\xe9ffchen', u'Ballastst\xf6ffchen'), (u'Ballm\xe9dchen', u'Ballm\xe4dchen'), (u'Ballm\xe9idchen', u'Ballm\xe4dchen'), (u'Ballonverk\xe9ufer', u'Ballonverk\xe4ufer'), (u'Balzenl', u'Balzen!'), (u'Bankijberfall', u'Bank\xfcberfall'), (u'Barbarenilberfall', u'Barbaren\xfcberfall'), (u'Barenk\xe9nig', u'Barenk\xf6nig'), (u'basfeln', u'basteln'), (u'Bastianol', u'Bastiano!'), (u'Bastlano', u'Bastiano'), (u'Bauchfellentztmdung', u'Bauchfellentz\xfcndung'), (u'Bauchkr\xe9mpfe', u'Bauchkr\xe4mpfe'), (u'bauf\xe9llig', u'bauf\xe4llig'), (u'bauf\xe9llige', u'bauf\xe4llige'), (u'Baumst\xe9mme', u'Baumst\xe4mme'), (u'Baupl\xe9ne', u'Baupl\xe4ne'), (u'Bbses', u'B\xf6ses'), (u'be/de', u'beide'), (u'bedecktl', u'bedeckt!'), (u'Bedilrfnisse', u'Bed\xfcrfnisse'), (u'Bedilrfnissen', u'Bed\xfcrfnissen'), (u'Bedllirfnisse', u'Bed\xfcrfnisse'), (u'bedrijckt', u'bedr\xfcckt'), (u'bedr\xe9ngen', u'bedr\xe4ngen'), (u'bedr\xe9ngt', u'bedr\xe4ngt'), (u'bedr\xe9ngten', u'bedr\xe4ngten'), (u'Beeilungf', u'Beeilung!'), (u'Beeilungl', u'Beeilung!'), (u'Beerdingungsinsiiiui', u'Beerdigungsinstitut'), (u'Beerdingungsinstitut', u'Beerdigungsinstitut'), (u'Befehll', u'Befehl!'), (u'beffirdert', u'bef\xf6rdert'), (u'Beffirderung', u'Bef\xf6rderung'), (u'befiirchte', u'bef\xfcrchte'), (u'befiirchteten', u'bef\xfcrchteten'), (u'befiirdert', u'bef\xf6rdert'), (u'befiirderte', u'bef\xf6rderte'), (u'Befiirderung', u'Bef\xf6rderung'), (u'befilrchtete', u'bef\xfcrchtete'), (u'befllirchte', u'bef\xfcrchte'), (u'befurworte', u'bef\xfcrworte'), (u'befurwortet', u'bef\xfcrwortet'), (u'bef\xe9rdere', u'bef\xf6rdere'), (u'bef\xe9rdert', u'bef\xf6rdert'), (u'Bef\xe9rderung', u'Bef\xf6rderung'), (u'beg/ng', u'beging'), (u'begl\ufb02ckt', u'begl\xfcckt'), (u'begniigt', u'begn\xfcgt'), (u'begrfindetes', u'begr\xfcndetes'), (u'Begriiliungsruf', u'Begr\xfc\xdfungsruf'), (u'begrijfien', u'begr\xfc\xdfen'), (u'Begrilfiung', u'Begr\xfc\xdfung'), (u'Begrilfkung', u'Begr\xfc\xdfung'), (u"begrL'llZ>en", u'begr\xfc\xdfen'), (u'BegrUBungsruf', u'Begr\xfc\xdfungsruf'), (u'begrUf$t', u'begr\xfc\xdft'), (u'begrufie', u'begr\xfc\xdfe'), (u'begrufit', u'begr\xfc\xdft'), (u'Begrundung', u'Begr\xfcndung'), (u'Beh6rden', u'Beh\xf6rden'), (u'beh\xe9lt', u'beh\xe4lt'), (u'Beh\xe9lter', u'Beh\xe4lter'), (u'beh\xe9mmert', u'beh\xe4mmert'), (u'beiB', u'bei\xdf'), (u'beiBen', u'bei\xdfen'), (u'beiBt', u'bei\xdft'), (u'beif$t', u'bei\xdft'), (u'beif2>en', u'bei\xdfen'), (u'beifken', u'bei\xdfen'), (u'beiflsen', u'bei\xdfen'), (u'beijenen', u'bei jenen'), (u'Beiliring', u'Bei\xdfring'), (u'BEKAMPFEN', u'BEK\xc4MPFEN'), (u'bekannf', u'bekannt'), (u'bekanntermafken', u'bekannterma\xdfen'), (u'bek\xe9me', u'bek\xe4me'), (u'bek\xe9mpfen', u'bek\xe4mpfen'), (u'Bek\xe9mpfung', u'Bek\xe4mpfung'), (u'bel', u'bei'), (u'belde', u'beide'), (u'beliellsen', u'belie\xdfen'), (u'belm', u'beim'), (u'Beltlftungstunnels', u'Bel\xfcftungstunnels'), (u'Beluftungstunnel', u'Bel\xfcftungstunnel'), (u'Beluftungstunnell', u'Bel\xfcftungstunnel!'), (u'bel\xe9stigen', u'bel\xe4stigen'), (u'Bemiihe', u'Bem\xfche'), (u'Bemiihen', u'Bem\xfchen'), (u"bemL'lhe", u'bem\xfche'), (u'bemtuht', u'bem\xfcht'), (u'bemuhen', u'bem\xfchen'), (u'bemuhten', u'bem\xfchten'), (u'Ben\xe9tigen', u'Ben\xf6tigen'), (u'ben\xe9tigt', u'ben\xf6tigt'), (u'ben\xe9tigten', u'ben\xf6tigten'), (u'Beobachtar', u'Beobachter'), (u'bereft', u'bereit'), (u'bereitf\xe9ndet', u'bereitf\xe4ndet'), (u'beriichtigtsten', u'ber\xfcchtigtsten'), (u'beriichtlgten', u'ber\xfcchtigten'), (u'beriihmt', u'ber\xfchmt'), (u'Beriihmtheiten', u'Ber\xfchmtheiten'), (u'beriihren', u'ber\xfchren'), (u'Beriihrend', u'Ber\xfchrend'), (u'beriihrt', u'ber\xfchrt'), (u'Beriihrtl', u'Ber\xfchrt!'), (u'berijhrt', u'ber\xfchrt'), (u'berilhmter', u'ber\xfchmter'), (u'berilhrt', u'ber\xfchrt'), (u'Berilhrung', u'Ber\xfchrung'), (u'Berks/1/re', u'Berkshire'), (u"BerL'lhre", u'Ber\xfchre'), (u'berllichtigter', u'ber\xfcchtigter'), (u'berllihren', u'ber\xfchren'), (u'berllihrt', u'ber\xfchrt'), (u'berlllhmten', u'ber\xfchmten'), (u'Bern/e', u'Bernie'), (u'beruhrt', u'ber\xfchrt'), (u'beruhrte', u'ber\xfchrte'), (u'ber\ufb02hmter', u'ber\xfchmter'), (u'besafi', u'besa\xdf'), (u"Besch'a'ftigt", u'Besch\xe4ftigt'), (u'bescheifien', u'beschei\xdfen'), (u'beschiftigt', u'besch\xe4ftigt'), (u'beschiiftigt', u'besch\xe4ftigt'), (u'beschiitzen', u'besch\xfctzen'), (u'beschiitzt', u'besch\xfctzt'), (u'beschiltze', u'besch\xfctze'), (u'beschiltzen', u'besch\xfctzen'), (u'beschleun/gt', u'beschleunigt'), (u'beschliefkt', u'beschlie\xdft'), (u'beschlie\ufb02tloszuziehen', u'beschlie\xdft loszuziehen'), (u'beschllitzet', u'besch\xfctzet'), (u'beschllitzt', u'besch\xfctzt'), (u'beschr\xe9nkt', u'beschr\xe4nkt'), (u'Beschr\xe9nkungen', u'Beschr\xe4nkungen'), (u'beschtitze', u'besch\xfctze'), (u'beschutzen', u'besch\xfctzen'), (u'besch\xe9digt', u'besch\xe4digt'), (u'besch\xe9ftigen', u'besch\xe4ftigen'), (u'besch\xe9ftigt', u'besch\xe4ftigt'), (u'besch\xe9ftigte', u'besch\xe4ftigte'), (u'besch\xe9ftigten', u'besch\xe4ftigten'), (u'besch\xe9iftige', u'besch\xe4ftige'), (u'besch\xe9iftigt', u'besch\xe4ftigt'), (u'Besch\xe9imen', u'Besch\xe4men'), (u'besch\xe9mendste', u'besch\xe4mendste'), (u'besch\xe9oligen', u'besch\xe4digen'), (u'besch\ufb02tzen', u'besch\xfctzen'), (u'Besch\ufb02tzer', u'Besch\xfctzer'), (u'Besf\xe9f/gen', u'Best\xe4tigen'), (u'Besitztijmer', u'Besitzt\xfcmer'), (u'BESTATIGE', u'BEST\xc4TIGE'), (u'BESTATIGT', u'BEST\xc4TIGT'), (u'bestenl', u'besten!'), (u'bestiirzt', u'best\xfcrzt'), (u'bestiitigen', u'best\xe4tigen'), (u'bestltigt', u'best\xe4tigt'), (u"bestx'mmt", u'bestimmt'), (u'best\xe9indige', u'best\xe4ndige'), (u'best\xe9itigt', u'best\xe4tigt'), (u'Best\xe9itigung', u'Best\xe4tigung'), (u'Best\xe9itigungen', u'Best\xe4tigungen'), (u'Best\xe9tige', u'Best\xe4tige'), (u'Best\xe9tigen', u'Best\xe4tigen'), (u'best\xe9tigt', u'best\xe4tigt'), (u'Best\xe9tigung', u'Best\xe4tigung'), (u'bes\xe9inftigen', u'bes\xe4nftigen'), (u'bes\xe9inftigt', u'bes\xe4nftigt'), (u'bes\xe9nftigen', u'bes\xe4nftigen'), (u'Betiiubt', u'Bet\xe4ubt'), (u'betriibt', u'betr\xfcbt'), (u'betriigen', u'betr\xfcgen'), (u'Betriiger', u'Betr\xfcger'), (u'betriigt', u'betr\xfcgt'), (u'betrijgen', u'betr\xfcgen'), (u'Betrijgerl', u'Betr\xfcger!'), (u'betrilgen', u'betr\xfcgen'), (u'betrtlgerischer', u'betr\xfcgerischer'), (u'betr\xe9chtliches', u'betr\xe4chtliches'), (u'Betr\xe9ge', u'Betr\xe4ge'), (u'betr\xe9gt', u'betr\xe4gt'), (u'Bettw\xe9ische', u'Bettw\xe4sche'), (u'Beviilkerung', u'Bev\xf6lkerung'), (u'bevorwir', u'bevor wir'), (u'bev\xe9lkern', u'bev\xf6lkern'), (u'bewegf', u'bewegt'), (u'Bew\xe9hrungsauflage', u'Bew\xe4hrungsauflage'), (u'bew\xe9ihrte', u'bew\xe4hrte'), (u'bew\xe9iltigen', u'bew\xe4ltigen'), (u'bew\xe9issern', u'bew\xe4ssern'), (u'bew\xe9lkten', u'bew\xf6lkten'), (u'bew\xe9ltigen', u'bew\xe4ltigen'), (u'Bew\xe9ltigung', u'Bew\xe4ltigung'), (u'bew\xe9ssern', u'bew\xe4ssern'), (u'Bew\xe9sserungssysteme', u'Bew\xe4sserungssysteme'), (u'Bezirksgelinde', u'Bezirksgel\xe4nde'), (u'bezuglich', u'bez\xfcglich'), (u'be\xe9ingstigende', u'be\xe4ngstigende'), (u'be\xe9ngstigend', u'be\xe4ngstigend'), (u'be\xe9ngstigender', u'be\xe4ngstigender'), (u'bffnen', u'\xf6ffnen'), (u'Bficher', u'B\xfccher'), (u'Bfiro', u'B\xfcro'), (u'bfirsten', u'b\xfcrsten'), (u'bfise', u'b\xf6se'), (u'bfisen', u'b\xf6sen'), (u'bfiser', u'b\xf6ser'), (u'bfises', u'b\xf6ses'), (u'bfiseste', u'b\xf6seste'), (u'bfisesten', u'b\xf6sesten'), (u'bgsonderen', u'besonderen'), (u'BI6de', u'Bl\xf6de'), (u'Bierbfichse', u'Bierb\xfcchse'), (u'Biicher', u'B\xfccher'), (u'Biicherei', u'B\xfccherei'), (u'Biick', u'B\xfcck'), (u'Biiffel', u'B\xfcffel'), (u'BIiHlt', u'Bl\xfcht'), (u'Biihne', u'B\xfchne'), (u'Biilcherei', u'B\xfccherei'), (u'BIind', u'Blind'), (u'Biirger', u'B\xfcrger'), (u'Biirgerrechte', u'B\xfcrgerrechte'), (u'Biiro', u'B\xfcro'), (u'Biiros', u'B\xfcros'), (u'Biirotiir', u'B\xfcrot\xfcr'), (u'biirsten', u'b\xfcrsten'), (u'Biise', u'B\xf6se'), (u'Biisen', u'B\xf6sen'), (u'biises', u'b\xf6ses'), (u'Bijchern', u'B\xfcchern'), (u'Bijhne', u'B\xfchne'), (u'Bijndnis', u'B\xfcndnis'), (u'Bijrger', u'B\xfcrger'), (u'Bijrgermeister', u'B\xfcrgermeister'), (u'Bijro', u'B\xfcro'), (u'Bijrokraten', u'B\xfcrokraten'), (u'Bijrzel', u'B\xfcrzel'), (u'Bilchern', u'B\xfcchern'), (u'Bildseitenverh\xe9ltnis', u'Bildseitenverh\xe4ltnis'), (u'Bilndel', u'B\xfcndel'), (u'Bilro', u'B\xfcro'), (u'BIood', u'Blood'), (u'BIQIS', u'Blo\xdf'), (u'Bischiife', u'Bisch\xf6fe'), (u'Bischiifen', u'Bisch\xf6fen'), (u'Bisch\xe9fe', u'Bisch\xf6fe'), (u'bistja', u'bist ja'), (u'bistjetzt', u'bist jetzt'), (u'Bittejetzt', u'Bitte jetzt'), (u'bittersiJl3es', u'bitters\xfc\xdfes'), (u'Bittesch\xe9n', u'Bittesch\xf6n'), (u'BIue', u'Blue'), (u'bi\xdfchen', u'bisschen'), (u'BL1hne', u'B\xfchne'), (u'Bl6cke', u'Bl\xf6cke'), (u'bl6d', u'bl\xf6d'), (u'bl6de', u'bl\xf6de'), (u'bl6den', u'bl\xf6den'), (u'bl6der', u'bl\xf6der'), (u'bl6des', u'bl\xf6des'), (u'Bl6dian', u'Bl\xf6dian'), (u'Bl6dmann', u'Bl\xf6dmann'), (u'Bl6dsinn', u'Bl\xf6dsinn'), (u'Blauaugel', u'Blauauge!'), (u'Blddes', u'Bl\xf6des'), (u'Ble/bf', u'Bleibt'), (u'bleibenl', u'bleiben!'), (u'blelbenl', u'blelben!'), (u'Blfidmann', u'Bl\xf6dmann'), (u'Blfidsinn', u'Bl\xf6dsinn'), (u'Blfimchen', u'Bl\xfcmchen'), (u'BLicher', u'B\xfccher'), (u'BLihne', u'B\xfchne'), (u'Bliid', u'Bl\xf6d'), (u'bliide', u'bl\xf6de'), (u'bliiden', u'bl\xf6den'), (u'bliidere', u'bl\xf6dere'), (u'bliides', u'bl\xf6des'), (u'Bliidmann', u'Bl\xf6dmann'), (u'Bliidsinn', u'Bl\xf6dsinn'), (u'bliiht', u'bl\xfcht'), (u'bliirgerlichen', u'b\xfcrgerlichen'), (u'Blijmchen', u'Bl\xfcmchen'), (u'Bllck', u'Blick'), (u'Bllindel', u'B\xfcndel'), (u'Blllroklammer', u'B\xfcroklammer'), (u'bln', u'bin'), (u'bloB', u'blo\xdf'), (u'bloBen', u'blo\xdfen'), (u'bloBstellen', u'blo\xdfstellen'), (u'blockiertl', u'blockiert!'), (u'BLODE', u'BL\xd6DE'), (u'blof$', u'blo\xdf'), (u'blofl', u'blo\xdf'), (u'Blol2>', u'Blo\xdf'), (u'blol3', u'blo\xdf'), (u'blol3>', u'blo\xdf'), (u'blol3stellen', u'blo\xdfstellen'), (u'bloli', u'blo\xdf'), (u'blolistellen', u'blo\xdfstellen'), (u'blolls', u'blo\xdf'), (u'bls', u'bis'), (u'Blst', u'Bist'), (u'bltte', u'bitte'), (u'Blumenstr\xe9iulichen', u'Blumenstr\xe4u\xdfchen'), (u'Blument\xe9pfen', u'Blument\xf6pfen'), (u'Blutgetr\xe4nkte', u'Blut getr\xe4nkte'), (u'Blutgetr\xe9nkte', u'Blutgetr\xe4nkte'), (u'blutjungl', u'blutjung!'), (u'blutriinstig', u'blutr\xfcnstig'), (u'Blutvergiefien', u'Blutvergie\xdfen'), (u'bl\xe9d', u'bl\xf6d'), (u'Bl\xe9de', u'Bl\xf6de'), (u'bl\xe9den', u'bl\xf6den'), (u'bl\xe9der', u'bl\xf6der'), (u'Bl\xe9des', u'Bl\xf6des'), (u'Bl\xe9dheit', u'Bl\xf6dheit'), (u'Bl\xe9dmann', u'Bl\xf6dmann'), (u'Bl\xe9dsinn', u'Bl\xf6dsinn'), (u'Bl\xe9iser', u'Bl\xe4ser'), (u'Bl\xe9ser', u'Bl\xe4ser'), (u'bl\xe9st', u'bl\xe4st'), (u'Bnjicke', u'Br\xfccke'), (u'Bodensch\xe9tze', u'Bodensch\xe4tze'), (u'Bogenschiefien', u'Bogenschie\xdfen'), (u'Bogenschiefienl', u'Bogenschie\xdfen!'), (u'Bogenschiefiens', u'Bogenschie\xdfens'), (u'Bogenschiitze', u'Bogensch\xfctze'), (u'Bogenschiitzen', u'Bogensch\xfctzen'), (u'Bogenschijtze', u'Bogensch\xfctze'), (u'Bogenschijtzen', u'Bogensch\xfctzen'), (u'Bogenschutzen', u'Bogensch\xfctzen'), (u'Bogenschutzenl', u'Bogensch\xfctzen!'), (u'BOnjour', u'Bonjour'), (u'bosartige', u'b\xf6sartige'), (u'Bracken', u'Brocken'), (u'Briicke', u'Br\xfccke'), (u'Briicken', u'Br\xfccken'), (u'Briider', u'Br\xfcder'), (u'Briihe', u'Br\xfche'), (u'Briillen', u'Br\xfcllen'), (u'briillt', u'br\xfcllt'), (u'Brijcke', u'Br\xfccke'), (u'Brijderlichkeit', u'Br\xfcderlichkeit'), (u'brijllen', u'br\xfcllen'), (u'Brilcke', u'Br\xfccke'), (u'Brilder', u'Br\xfcder'), (u'Brilllen', u'Br\xfcllen'), (u'brillltjeden', u'br\xfcllt jeden'), (u'Brilnette', u'Br\xfcnette'), (u'Brilsten', u'Br\xfcsten'), (u'brilten', u'br\xfcten'), (u"BrL'lcke", u'Br\xfccke'), (u"brL'lllen", u'br\xfcllen'), (u'brlliderliche', u'br\xfcderliche'), (u'Brllidern', u'Br\xfcdern'), (u'Brlliste', u'Br\xfcste'), (u'Broschijre', u'Brosch\xfcre'), (u'Broschilren', u'Brosch\xfcren'), (u'Broschuren', u'Brosch\xfcren'), (u'Brucke', u'Br\xfccke'), (u'Brucken', u'Br\xfccken'), (u'Brudern', u'Br\xfcdern'), (u'Bruhe', u'Br\xfche'), (u'brullen', u'br\xfcllen'), (u'brullt', u'br\xfcllt'), (u'Brutalitiit', u'Brutalit\xe4t'), (u'Brutzelhtihnchen', u'Brutzelh\xfchnchen'), (u'Br\xe9chtet', u'Br\xe4chtet'), (u'Br\xe9iutigam', u'Br\xe4utigam'), (u'Br\xe9sel', u'Br\xf6sel'), (u'Br\xe9tchen', u'Br\xf6tchen'), (u'br\xe9uchte', u'br\xe4uchte'), (u'br\xe9uchten', u'br\xe4uchten'), (u'br\xe9unen', u'br\xe4unen'), (u'Br\xe9ute', u'Br\xe4ute'), (u'Br\ufb02cke', u'Br\xfccke'), (u'Br\ufb02der', u'Br\xfcder'), (u'Btiro', u'B\xfcro'), (u'Btiser', u'B\xf6ser'), (u'Bucher', u'B\xfccher'), (u'Buchern', u'B\xfcchern'), (u'Budgetkiirzung', u'Budgetk\xfcrzung'), (u'BUFO', u'B\xfcro'), (u'Bugschutzgerate', u'Bugschutzger\xe4te'), (u'Buhnenbild', u'B\xfchnenbild'), (u'Bullel', u'Bulle!'), (u'Buml', u'Bum!'), (u'Bundnis', u'B\xfcndnis'), (u'Burger', u'B\xfcrger'), (u'Burgerrechtlerin', u'B\xfcrgerrechtlerin'), (u'Buro', u'B\xfcro'), (u'BURO', u'B\xdcRO'), (u'Burol', u'B\xfcro!'), (u'Burottlr', u'B\xfcrot\xfcr'), (u'Busche', u'B\xfcsche'), (u'B\xe9ickchen', u'B\xe4ckchen'), (u'B\xe9ickerei', u'B\xe4ckerei'), (u'B\xe9ille', u'B\xe4lle'), (u'B\xe9inder', u'B\xe4nder'), (u'B\xe9ir', u'B\xe4r'), (u'B\xe9irgermeister', u'B\xfcrgermeister'), (u'B\xe9iro', u'B\xfcro'), (u'b\xe9ise', u'b\xf6se'), (u'B\xe9iume', u'B\xe4ume'), (u'B\xe9nder', u'B\xe4nder'), (u'B\xe9r', u'B\xe4r'), (u'B\xe9ren', u'B\xe4ren'), (u'B\xe9renhasser', u'B\xe4renhasser'), (u'B\xe9renhunger', u'B\xe4renhunger'), (u'B\xe9renj\xe9ger', u'B\xe4renj\xe4ger'), (u'B\xe9renk\xe9nig', u'B\xe4renk\xf6nig'), (u'B\xe9renlaute', u'B\xe4renlaute'), (u'B\xe9renrolle', u'B\xe4renrolle'), (u'B\xe9renschnitzereien', u'B\xe4renschnitzereien'), (u'B\xe9renstimmen', u'B\xe4renstimmen'), (u'B\xe9rin', u'B\xe4rin'), (u'B\xe9risch', u'B\xe4risch'), (u'B\xe9rs', u'B\xe4rs'), (u'B\xe9rte', u'B\xe4rte'), (u'b\xe9s', u'b\xf6s'), (u'b\xe9se', u'b\xf6se'), (u'b\xe9sen', u'b\xf6sen'), (u'B\xe9ses', u'B\xf6ses'), (u'B\xe9ume', u'B\xe4ume'), (u'B\xe9umen', u'B\xe4umen'), (u'B\ufb02chern', u'B\xfcchern'), (u'B\ufb02ste', u'B\xfcste'), (u'Cafe', u'Caf\xe9'), (u'Caf\xe4', u'Caf\xe9'), (u'CASAREN', u'C\xc4SAREN'), (u'Charakterm\xe9ngel', u'Charakterm\xe4ngel'), (u'Charakterst\xe9rke', u'Charakterst\xe4rke'), (u'Chrlntlna', u'Christina'), (u'Ciden', u'\xf6den'), (u'Ciffnet', u'\xd6ffnet'), (u'Cihrchen', u'\xd6hrchen'), (u'Citro\xe9n', u'Citro\xebn'), (u'clamit', u'damit'), (u'class', u'dass'), (u'Clbernimmt', u'\xfcbernimmt'), (u'cler', u'der'), (u'Coimbrasl', u'Coimbras!'), (u'CommanderWill', u'Commander Will'), (u'Corenillal', u'Corenilla!'), (u'Cowboyscheifi', u'Cowboyschei\xdf'), (u'C\xe9sar', u'C\xe4sar'), (u'D/e', u'Die'), (u'd/ese', u'diese'), (u'd/esem', u'diesem'), (u'd/esen', u'diesen'), (u'D/eser', u'Dieser'), (u'D/eses', u'Dieses'), (u'D/sko', u'Disko'), (u'dabel', u'dabei'), (u'dachfen', u'dachten'), (u'daffir', u'daf\xfcr'), (u'dafiir', u'daf\xfcr'), (u'Dafijr', u'Daf\xfcr'), (u'Dafijur', u'Daf\xfcr'), (u'Dafilr', u'Daf\xfcr'), (u"dafL'lr", u'daf\xfcr'), (u'dafLir', u'daf\xfcr'), (u'dafljr', u'daf\xfcr'), (u'dafllir', u'daf\xfcr'), (u'Daflllrwar', u'Daf\xfcr war'), (u'daftir', u'daf\xfcr'), (u'dafUr', u'daf\xfcr'), (u'dafzjir', u'daf\xfcr'), (u'dajemand', u'da jemand'), (u'dal', u'da!'), (u'Damenh\xe9nde', u'Damenh\xe4nde'), (u'damitl', u'damit!'), (u'damlt', u'damit'), (u'DANEMARK', u'D\xc4NEMARK'), (u'darfiber', u'dar\xfcber'), (u'Dariiber', u'Dar\xfcber'), (u'darijber', u'dar\xfcber'), (u'Darilber', u'Dar\xfcber'), (u"dart/'ber", u'dar\xfcber'), (u'dartlber', u'dar\xfcber'), (u'DARUBER', u'DAR\xdcBER'), (u'DarUber', u'Dar\xfcber'), (u'dasjetzt', u'das jetzt'), (u'dasl', u'das!'), (u'Dateniibermittlung', u'Daten\xfcbermittlung'), (u'dauem', u'dauern'), (u'dauerf', u'dauert'), (u'dazugeh\xe9ren', u'dazugeh\xf6ren'), (u'Da\xdf', u'Dass'), (u'Da\ufb02lr', u'Daf\xfcr'), (u'Ddrfern', u'D\xf6rfern'), (u'def', u'der'), (u'Defekf/v', u'Detektiv'), (u'deinerZelle', u'deiner Zelle'), (u'deln', u'dein'), (u'delne', u'deine'), (u'demfiltigen', u'dem\xfctigen'), (u'Demijtigung', u'Dem\xfctigung'), (u'demllitige', u'dem\xfctige'), (u'demllitigen', u'dem\xfctigen'), (u'denkwurdiger', u'denkw\xfcrdiger'), (u'denkw\ufb02rdiger', u'denkw\xfcrdiger'), (u'derAbgeordnete', u'der Abgeordnete'), (u'derAusgabe', u'der Ausgabe'), (u'derAusl6ser', u'der Ausl\xf6ser'), (u"DerjL'lngste", u'Der j\xfcngste'), (u'derjunge', u'der junge'), (u'dermaben', u'derma\xdfen'), (u'derTyp', u'der Typ'), (u'derWeg', u'der Weg'), (u'derWelle', u'der Welle'), (u'DerWL1rfel', u'Der W\xfcrfel'), (u'DerZauberer', u'Der Zauberer'), (u'de__n', u'den'), (u'dfeserr', u'diesem'), (u'dffentlichen', u'\xf6ffentlichen'), (u'dffnen', u'\xf6ffnen'), (u'Dfimonen', u'D\xe4monen'), (u'dfinn', u'd\xfcnn'), (u'dichl', u'dich!'), (u'diej\xfcngste', u'die J\xfcngste'), (u'dienstunfahig', u'dienstunf\xe4hig'), (u'Dieselkapit\xe9in', u'Dieselkapit\xe4n'), (u'Dieselkapit\xe9n', u'Dieselkapit\xe4n'), (u'Dieselmotorenl', u'Dieselmotoren!'), (u'dieserAufnahme', u'dieser Aufnahme'), (u'Dieserjunge', u'Dieser junge'), (u'Diiit', u'Di\xe4t'), (u'diirfe', u'd\xfcrfe'), (u'Diirfen', u'D\xfcrfen'), (u'diirft', u'd\xfcrft'), (u'diirfte', u'd\xfcrfte'), (u'dijfien', u'd\xfcrfen'), (u'dijnn', u'd\xfcnn'), (u'dijrfen', u'd\xfcrfen'), (u'Dijrfte', u'D\xfcrfte'), (u'dijstere', u'd\xfcstere'), (u'dilmmer', u'd\xfcmmer'), (u'dilrfen', u'd\xfcrfen'), (u'dilrft', u'd\xfcrft'), (u'dilrften', u'd\xfcrften'), (u'dilrftig', u'd\xfcrftig'), (u'Dine', u'D\xe4ne'), (u'dirja', u'dir ja'), (u'dirjemand', u'dir jemand'), (u'dirjetzt', u'dir jetzt'), (u'dirJulie', u'dir Julie'), (u'dirl', u'dir!'), (u'dirwehzutun', u'dir wehzutun'), (u'Di\xe9t', u'Di\xe4t'), (u'Di\xe9tberaterin', u'Di\xe4tberaterin'), (u'Di\xe9tbier', u'Di\xe4tbier'), (u'dlch', u'dich'), (u'Dle', u'Die'), (u'dles', u'dies'), (u'Dlese', u'Diese'), (u'Dlfit', u'Di\xe4t'), (u'Dlitplan', u'Di\xe4tplan'), (u'dllirfen', u'd\xfcrfen'), (u'dllirft', u'd\xfcrft'), (u'dllirstet', u'd\xfcrstet'), (u'dlr', u'dir'), (u'doc/1', u'doch'), (u'dochl', u'doch!'), (u'dolthin', u'dorthin'), (u'Doppelgfiner', u'Doppelg\xe4nger'), (u'Doppelgfinger', u'Doppelg\xe4nger'), (u'Doppelg\xe9inger', u'Doppelg\xe4nger'), (u'Doppelg\xe9nger', u'Doppelg\xe4nger'), (u'Doppelzijngig', u'Doppelz\xfcngig'), (u'doppelztmgiger', u'doppelz\xfcngiger'), (u'dor', u'der'), (u"Dr'a'ngt", u'Dr\xe4ngt'), (u'drachengriinen', u'drachengr\xfcnen'), (u'Drahte', u'Dr\xe4hte'), (u'dranl', u'dran!'), (u'drau/3en', u'drau\xdfen'), (u'drau/Sen', u'drau\xdfen'), (u'drauBen', u'drau\xdfen'), (u'drauf$en', u'drau\xdfen'), (u'draufdrilcken', u'draufdr\xfccken'), (u'draufgestllirzt', u'draufgest\xfcrzt'), (u'draufg\xe9ngerisch', u'draufg\xe4ngerisch'), (u'draufien', u'drau\xdfen'), (u'draufken', u'drau\xdfen'), (u'drauflsenl', u'drau\xdfen!'), (u'drauf\xe9en', u'drau\xdfen'), (u'drauilen', u'drau\xdfen'), (u'draul3en', u'drau\xdfen'), (u'draul5en', u'drau\xdfen'), (u'draulien', u'drau\xdfen'), (u'draullen', u'drau\xdfen'), (u'draulSen', u'drau\xdfen'), (u'Dreckl\xe9chern', u'Dreckl\xf6chern'), (u'Drecksmiihle', u'Drecksm\xfchle'), (u'Drecks\xe9cke', u'Drecks\xe4cke'), (u'drfiben', u'dr\xfcben'), (u'Drfick', u'Dr\xfcck'), (u'Drfingeln', u'Dr\xe4ngeln'), (u'drih', u'dritt'), (u'driiben', u'dr\xfcben'), (u'driicken', u'dr\xfccken'), (u'driickt', u'dr\xfcckt'), (u'drijben', u'dr\xfcben'), (u'drijber', u'dr\xfcber'), (u'drijck', u'dr\xfcck'), (u'drijckt', u'dr\xfcckt'), (u'drilben', u'dr\xfcben'), (u'drilber', u'dr\xfcber'), (u'drilcken', u'dr\xfccken'), (u'drLiber', u'dr\xfcber'), (u'drlliben', u'dr\xfcben'), (u'drlllben', u'dr\xfcben'), (u'Drogenabh\xe9ngige', u'Drogenabh\xe4ngige'), (u'Drticken', u'Dr\xfccken'), (u'druben', u'dr\xfcben'), (u'drubenl', u'dr\xfcben!'), (u'druber', u'dr\xfcber'), (u'Druckkn\xe9pfe', u'Druckkn\xf6pfe'), (u'drunterliegt', u'drunter liegt'), (u'Dr\xe9nage', u'Dr\xe4nage'), (u'dr\xe9ngeln', u'dr\xe4ngeln'), (u'dr\xe9ngen', u'dr\xe4ngen'), (u'dr\xe9ngt', u'dr\xe4ngt'), (u'dr\ufb02ben', u'dr\xfcben'), (u'dtirft', u'd\xfcrft'), (u'dtlrfen', u'd\xfcrfen'), (u'Dudels\xe9cken', u'Dudels\xe4cken'), (u"dUFf\u20acl'1", u'd\xfcrfen'), (u'dul', u'du!'), (u'dull', u'dass'), (u'Dummk6pfe', u'Dummk\xf6pfe'), (u'Dummkiipfe', u'Dummk\xf6pfe'), (u'Dunnschiss', u'D\xfcnnschiss'), (u'durchdrficken', u'durchdr\xfccken'), (u'durchdr\xe9ngen', u'durchdr\xe4ngen'), (u'Durchfiihrung', u'Durchf\xfchrung'), (u'durchfuhren', u'durchf\xfchren'), (u'durchgefiihlt', u'durchgef\xfchrt'), (u'durchgefijhrt', u'durchgef\xfchrt'), (u'durchgefuhrt', u'durchgef\xfchrt'), (u'durchgef\ufb02hrt', u'durchgef\xfchrt'), (u'Durchg\xe9nge', u'Durchg\xe4nge'), (u'Durchladenl', u'Durchladen!'), (u'durchlfichere', u'durchl\xf6chere'), (u'durchsetzungsf\xe9higer', u'durchsetzungsf\xe4higer'), (u'durchst\xe9bern', u'durchst\xf6bern'), (u'durchwilhlt', u'durchw\xfchlt'), (u'durchzufilhren', u'durchzuf\xfchren'), (u'durchzufuhren', u'durchzuf\xfchren'), (u'Durfen', u'D\xfcrfen'), (u'durft', u'd\xfcrft'), (u'dusterer', u'd\xfcsterer'), (u'D\xe9cher', u'D\xe4cher'), (u'D\xe9imon', u'D\xe4mon'), (u'D\xe9imonen', u'D\xe4monen'), (u'D\xe9inemark', u'D\xe4nemark'), (u'D\xe9inemarks', u'D\xe4nemarks'), (u'D\xe9inen', u'D\xe4nen'), (u'd\xe9inisches', u'd\xe4nisches'), (u'd\xe9mlich', u'd\xe4mlich'), (u'D\xe9mliche', u'D\xe4mliche'), (u'd\xe9mlichen', u'd\xe4mlichen'), (u'd\xe9mlicher', u'd\xe4mlicher'), (u'd\xe9mlichl', u'd\xe4mlich'), (u'd\xe9mmert', u'd\xe4mmert'), (u'D\xe9monenb\xe9ren', u'D\xe4monenb\xe4ren'), (u'd\xe9monischen', u'd\xe4monischen'), (u'D\xe9rme', u'D\xe4rme'), (u'D\xe9rrfleisch', u'D\xf6rrfleisch'), (u'D\xe9umchen', u'D\xe4umchen'), (u'd\ufb02rfen', u'd\xfcrfen'), (u'E//e', u'Elle'), (u'e/n', u'ein'), (u'e/ne', u'eine'), (u'e/nem', u'einem'), (u'e/nen', u'einen'), (u'e/ner', u'einer'), (u'e/nes', u'eines'), (u'e/ns', u'eins'), (u'e/nsf', u'einst'), (u'E9YPt', u'Egypt'), (u'Ea/vtes', u'Echtes'), (u'ebenbfirtig', u'ebenb\xfcrtig'), (u'ebenburtige', u'ebenb\xfcrtige'), (u'Ec/vte', u'Echte'), (u'echfen', u'echten'), (u'edelm\ufb02tig', u'edelm\xfctig'), (u'efn', u'ein'), (u'efwas', u'etwas'), (u'Eheminner', u'Ehem\xe4nner'), (u'Ehem\xe9nnern', u'Ehem\xe4nnern'), (u'Ehezerstfirerin', u'Ehezerst\xf6rerin'), (u'Ehrenbijrger', u'Ehrenb\xfcrger'), (u'EHRENBURGERSCHAFT', u'EHRENB\xdcRGERSCHAFT'), (u'Ehreng\xe9iste', u'Ehreng\xe4ste'), (u'Eichhfirnchen', u'Eichh\xf6rnchen'), (u'Eichhiirnchen', u'Eichh\xf6rnchen'), (u'Eichh\xe9rnchens', u'Eichh\xf6rnchens'), (u'eifersfichtig', u'eifers\xfcchtig'), (u'eifersiichtig', u'eifers\xfcchtig'), (u'eifers\ufb02chtig', u'eifers\xfcchtig'), (u'eigenh\xe9ndig', u'eigenh\xe4ndig'), (u'eigenmlchtig', u'eigenm\xe4chtig'), (u'eigenntltziges', u'eigenn\xfctziges'), (u'Eihnlich', u'\xe4hnlich'), (u'Eimen/veise', u'Eimerweise'), (u'Einbruche', u'Einbr\xfcche'), (u'eindriicken', u'eindr\xfccken'), (u'Eindring/Inge', u'Eindringlinge'), (u'eindrucken', u'eindr\xfccken'), (u'einejunge', u'eine junge'), (u'einerfr\ufb02hen', u'einer fr\xfchen'), (u'einervorfuhrung', u'einer Vorf\xfchrung'), (u'einfiihren', u'einf\xfchren'), (u'Einfiihrung', u'Einf\xfchrung'), (u'einfilgen', u'einf\xfcgen'), (u'einfilhlsamsten', u'einf\xfchlsamsten'), (u'einflllgen', u'einf\xfcgen'), (u'Einflusse', u'Einfl\xfcsse'), (u'einfugen', u'einf\xfcgen'), (u'einfuhrten', u'einf\xfchrten'), (u'Einfuhrung', u'Einf\xfchrung'), (u'Einf\xe9ltige', u'Einf\xe4ltige'), (u'eingefiigt', u'eingef\xfcgt'), (u'eingef\ufb02gt', u'eingef\xfcgt'), (u'eingehiillt', u'eingeh\xfcllt'), (u'eingepr\xe9gt', u'eingepr\xe4gt'), (u'einger\xe9iumt', u'einger\xe4umt'), (u'einger\xe9umt', u'einger\xe4umt'), (u'eingeschl\xe9fert', u'eingeschl\xe4fert'), (u'eingeschr\xe9nkt', u'eingeschr\xe4nkt'), (u'eingesch\xe9itzt', u'eingesch\xe4tzt'), (u'eingesch\xe9tzt', u'eingesch\xe4tzt'), (u'eingesturzt', u'eingest\xfcrzt'), (u'eingieBt', u'eingie\xdft'), (u'eingschaltet', u'eingeschaltet'), (u'Einh\xe9rnern', u'Einh\xf6rner'), (u'einlegenl', u'einlegen!'), (u'einl\xe9dt', u'einl\xe4dt'), (u'einl\xe9sen', u'einl\xf6sen'), (u'Einsatzfahigkeit', u'Einsatzf\xe4higkeit'), (u'Einschiichterung', u'Einsch\xfcchterung'), (u'Einschliefklich', u'Einschlie\xdflich'), (u'Einschlielilich', u'Einschlie\xdflich'), (u'einstellenl', u'einstellen!'), (u'Eins\xe9tze', u'Eins\xe4tze'), (u'eint\xe9nig', u'eint\xf6nig'), (u'Einzelg\xe9ngerin', u'Einzelg\xe4ngerin'), (u'einzusch\xe9tzen', u'einzusch\xe4tzen'), (u'Eisstiirme', u'Eisst\xfcrme'), (u'Elektrizit\xe9t', u'Elektrizit\xe4t'), (u'elfenbeingetfinte', u'elfenbeinget\xf6nte'), (u'elit\xe9rer', u'elit\xe4rer'), (u'Eln', u'Ein'), (u'Elne', u'Eine'), (u'elnem', u'einem'), (u'Elnen', u'Einen'), (u'elner', u'einer'), (u'Elnes', u'Eines'), (u'empfindungsf\xe9higen', u'empfindungsf\xe4higen'), (u'Empf\xe9inger', u'Empf\xe4nger'), (u'empf\xe9ngt', u'empf\xe4ngt'), (u'Empiirend', u'Emp\xf6rend'), (u'Empiirendste', u'Emp\xf6rendste'), (u'empiirt', u'emp\xf6rt'), (u'emst', u'ernst'), (u'en/varten', u'erwarten'), (u'En/vartungen', u'Erwartungen'), (u'en/v\xe9hnt', u'erw\xe4hnt'), (u'Enchant\xe4', u'Enchant\xe9'), (u'endgiiltig', u'endg\xfcltig'), (u'endgultig', u'endg\xfcltig'), (u'endgultigen', u'endg\xfcltigen'), (u'endg\ufb02ltig', u'endg\xfcltig'), (u'endlichl', u'endlich!'), (u'ENERIGE', u'ENERGIE'), (u'enfternt', u'entfernt'), (u'Engl\xe9nder', u'Engl\xe4nder'), (u'Engl\xe9nderin', u'Engl\xe4nderin'), (u'eniillen', u'erf\xfcllen'), (u'entbl6Bte', u'entbl\xf6\xdfte'), (u'entbl6f$en', u'entbl\xf6\xdfen'), (u'entfiihre', u'entf\xfchre'), (u'entfiihrt', u'entf\xfchrt'), (u'entfiihrte', u'entf\xfchrte'), (u'Entfiihrung', u'Entf\xfchrung'), (u'Entftihrung', u'Entf\xfchrung'), (u'ENTFUHRUNGSVERDACHTIGER', u'ENTF\xdcHRUNGSVERD\xc4CHTIGER'), (u'enthllt', u'enth\xe4lt'), (u'enthUllt', u'enth\xfcllt'), (u'enth\xe9lt', u'enth\xe4lt'), (u'entliiften', u'entl\xfcften'), (u'Entliiftungen', u'Entl\xfcftungen'), (u'Entlijlftungen', u'Entl\xfcftungen'), (u'entluften', u'entl\xfcften'), (u'entl\xe9sst', u'entl\xe4sst'), (u'Entreilit', u'Entrei\xdft'), (u'entriistet', u'entr\xfcstet'), (u'entr\xe9itseln', u'entr\xe4tseln'), (u'Entschlrfen', u'Entsch\xe4rfen'), (u'Entschlull', u'Entschluss'), (u'ENTSCHLUSSELN', u'ENTSCHL\xdcSSELN'), (u'Entschlussen', u'Entschl\xfcssen'), (u'entsch\xe9rfen', u'entsch\xe4rfen'), (u'enttausche', u'entt\xe4usche'), (u'enttiiuscht', u'entt\xe4uscht'), (u'Enttluscht', u'Entt\xe4uscht'), (u'Enttluschungen', u'Entt\xe4uschungen'), (u'entt\xe9iuschen', u'entt\xe4uschen'), (u'entt\xe9uschen', u'entt\xe4uschen'), (u'entt\xe9uschst', u'entt\xe4uschst'), (u'entt\xe9uscht', u'entt\xe4uscht'), (u'Entv\\/Urfe', u'Entw\xfcrfe'), (u'Entwicklungsl\xe9ndern', u'Entwicklungsl\xe4ndern'), (u'entzllickt', u'entz\xfcckt'), (u'entzllindet', u'entz\xfcndet'), (u'entzuckend', u'entz\xfcckend'), (u'entzundet', u'entz\xfcndet'), (u'enzv\xe9rmt', u'erw\xe4rmt'), (u'Er6ffnen', u'Er\xf6ffnen'), (u'erb\xe9rml/ch', u'erb\xe4rmlich'), (u'erb\xe9rmlich', u'erb\xe4rmlich'), (u'Erb\xe9rmliches', u'Erb\xe4rmliches'), (u'Erdnijsse', u'Erdn\xfcsse'), (u'erdriickt', u'erdr\xfcckt'), (u'erd\xe9ihnliche', u'erd\xe4hnliche'), (u'erfebst', u'erlebst'), (u'erffillen', u'erf\xfcllen'), (u'erfiffnet', u'er\xf6ffnet'), (u'erfiille', u'erf\xfclle'), (u'erfiillen', u'erf\xfcllen'), (u'erfiillt', u'erf\xfcllt'), (u'erfijllt', u'erf\xfcllt'), (u'erfillle', u'erf\xfclle'), (u'erfilllen', u'erf\xfcllen'), (u'erfilllt', u'erf\xfcllt'), (u'erfllille', u'erf\xfclle'), (u'erfllillt', u'erf\xfcllt'), (u'erflllllen', u'erf\xfcllen'), (u'Erfolgl', u'Erfolg!'), (u'erfullen', u'erf\xfcllen'), (u'erfullt', u'erf\xfcllt'), (u'erf\xe9hrst', u'erf\xe4hrst'), (u'erf\xe9hrt', u'erf\xe4hrt'), (u'erf\ufb02llen', u'erf\xfcllen'), (u'ergrllindet', u'ergr\xfcndet'), (u'erhalfen', u'erhalten'), (u'Erhdhe', u'Erh\xf6he'), (u'erhiihter', u'erh\xf6hter'), (u'erhiiren', u'erh\xf6ren'), (u'ERHKLT', u'ERH\xc4LT'), (u'erhllt', u'erh\xe4lt'), (u'erh\xe9hen', u'erh\xf6hen'), (u'erh\xe9ht', u'erh\xf6ht'), (u'erh\xe9ilt', u'erh\xe4llt'), (u'erh\xe9lt', u'erh\xe4lt'), (u'erh\xe9rt', u'erh\xf6rt'), (u'erh\xe9rte', u'erh\xf6rte'), (u'eriiffnet', u'er\xf6ffnet'), (u'erja', u'er ja'), (u'erjetzt', u'er jetzt'), (u'erjung', u'er jung'), (u"erkl'a'ren", u'erkl\xe4ren'), (u"erkl'air's", u"erkl\xe4r's"), (u'erklaren', u'erkl\xe4ren'), (u'erklfire', u'erkl\xe4re'), (u'Erklfirung', u'Erkl\xe4rung'), (u'erklirt', u'erkl\xe4rt'), (u'erkllre', u'erkl\xe4re'), (u'erkllrt', u'erkl\xe4rt'), (u'erkllrte', u'erkl\xe4rte'), (u'erkllrten', u'erkl\xe4rten'), (u'Erkllrung', u'Erkl\xe4rung'), (u'erkl\xe9ir', u'erkl\xe4r'), (u'erkl\xe9ire', u'erkl\xe4re'), (u'erkl\xe9iren', u'erkl\xe4ren'), (u'erkl\xe9r', u'erkl\xe4r'), (u"erkl\xe9r's", u"erkl\xe4r's"), (u'erkl\xe9rbar', u'erkl\xe4rbar'), (u'Erkl\xe9re', u'Erkl\xe4re'), (u'erkl\xe9ren', u'erkl\xe4ren'), (u'erkl\xe9rt', u'erkl\xe4rt'), (u'Erkl\xe9rung', u'Erkl\xe4rung'), (u'erk\xe9ltest', u'erkaltest'), (u"erlC'>st", u'erl\xf6st'), (u'erldse', u'erl\xf6se'), (u'Erled/gen', u'Erledigen'), (u'erlieB', u'erlie\xdf'), (u'erlnnem', u'erinnern'), (u'erl\xe9scht', u'erl\xf6scht'), (u'erl\xe9sen', u'erl\xf6sen'), (u'erl\xe9st', u'erl\xf6st'), (u'Erl\xe9sung', u'Erl\xf6sung'), (u'ermbglichen', u'erm\xf6glichen'), (u'Erm\xe9chtige', u'Erm\xe4chtige'), (u'erm\xe9glicht', u'erm\xf6glicht'), (u'erm\xe9glichte', u'erm\xf6glichte'), (u'ernlllchtert', u'ern\xfcchtert'), (u'ern\xe9hren', u'ern\xe4hren'), (u'Ern\xe9hrung', u'Ern\xe4hrung'), (u'eroffnet', u'er\xf6ffnet'), (u'Erpressungsscheilie', u'Erpressungsschei\xdfe'), (u'err\xe9tst', u'err\xe4tst'), (u'erschieB', u'erschie\xdf'), (u'erschieBen', u'erschie\xdfen'), (u'erschiefien', u'erschie\xdfen'), (u'erschiefit', u'erschie\xdft'), (u'erschiefke', u'erschie\xdfe'), (u'erschielie', u'erschie\xdfe'), (u'Erschielit', u'Erschie\xdft'), (u'erschiipft', u'ersch\xf6pft'), (u'erschiittert', u'ersch\xfcttert'), (u'erschilttert', u'ersch\xfcttert'), (u'erschl\xe9gt', u'erschl\xe4gt'), (u'ERTCHDNT', u'ERT\xd6NT'), (u'ERTCNT', u'ERT\xd6NT'), (u'ERTGNT', u'ERT\xd6NT'), (u'ertiffnen', u'er\xf6ffnen'), (u'ertr\xe9gst', u'ertr\xe4gst'), (u'ertr\xe9inken', u'ertr\xe4nken'), (u'ert\xe9nt', u'ert\xf6nt'), (u'ervvartez', u'erwartet'), (u'ervvilrgen', u'erw\xfcrgen'), (u'ervv\xe9hnen', u'erw\xe4hnen'), (u'ervv\xe9ihnen', u'erw\xe4hnen'), (u'ervv\xe9ihnt', u'erw\xe4hnt'), (u'ervv\xe9ihnte', u'erw\xe4hnte'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u"erw'a'hnt", u'erw\xe4hnt'), (u'Erwar', u'Er war'), (u'erwe/sen', u'erweisen'), (u'Erwfirmung', u'Erw\xe4rmung'), (u'Erwird', u'Er wird'), (u'Erwtirde', u'Er w\xfcrde'), (u'erw\xe9gt', u'erw\xe4gt'), (u'Erw\xe9gung', u'Erw\xe4gung'), (u'Erw\xe9hne', u'Erw\xe4hne'), (u'erw\xe9hnen', u'erw\xe4hnen'), (u'erw\xe9hnt', u'erw\xe4hnt'), (u'erw\xe9hnte', u'erw\xe4hnte'), (u'Erw\xe9hnung', u'Erw\xe4hnung'), (u'erw\xe9ihlt', u'erw\xe4hlt'), (u'erw\xe9ihnt', u'erw\xe4hnt'), (u'erw\xe9rmt', u'erw\xe4rmt'), (u"erz'a'hlt", u'erz\xe4hlt'), (u'Erzdiiizese', u'Erzdi\xf6zese'), (u'erzfihlen', u'erz\xe4hlen'), (u'Erzfihler', u'Erz\xe4hler'), (u'erzihlenl', u'erz\xe4hlen!'), (u'erziihlen', u'erz\xe4hlen'), (u'erziihlt', u'erz\xe4hlt'), (u'erziirnt', u'erz\xfcrnt'), (u'erzilrnt', u'erz\xfcrnt'), (u'erzllirnt', u'erz\xfcrnt'), (u'erzurnen', u'erz\xfcrnen'), (u'erz\xe9hl', u'erz\xe4hl'), (u'erz\xe9hle', u'erz\xe4hle'), (u'Erz\xe9hlen', u'Erz\xe4hlen'), (u'erz\xe9hlerische', u'erz\xe4hlerische'), (u'erz\xe9hlerischen', u'erz\xe4hlerischen'), (u'erz\xe9hlerischer', u'erz\xe4hlerischer'), (u'Erz\xe9hlkunste', u'Erz\xe4hlk\xfcnste'), (u'erz\xe9hlst', u'erz\xe4hlst'), (u'erz\xe9hlt', u'erz\xe4hlt'), (u'erz\xe9hlte', u'erz\xe4hlte'), (u'Erz\xe9hlung', u'Erz\xe4hlung'), (u'Erz\xe9ihl', u'Erz\xe4hl'), (u'Erz\xe9ihle', u'Erz\xe4hle'), (u'erz\xe9ihlen', u'erz\xe4hlen'), (u'erz\xe9ihlst', u'erz\xe4hlst'), (u'erz\xe9ihlt', u'erz\xe4hlt'), (u'erz\xe9ihlte', u'erz\xe4hlte'), (u'er\xe9ffnen', u'er\xf6ffnen'), (u'er\xe9ffnet', u'er\xf6ffnet'), (u'er\xe9ffnete', u'er\xf6ffnete'), (u'Er\xe9ffnungsaufnahme', u'Er\xf6ffnungsaufnahme'), (u'Er\xe9ffnungssequenz', u'Er\xf6ffnungssequenz'), (u'Er\xe9ffnungsszene', u'Er\xf6ffnungsszene'), (u'Er\ufb02lllen', u'Erf\xfcllen'), (u'etemity', u'eternity'), (u'etvva', u'etwa'), (u'euc/1', u'euch'), (u'Europ\xe9er', u'Europ\xe4er'), (u'europ\xe9ische', u'europ\xe4ische'), (u"ex'nfac'/7", u'einfach'), (u'Examenspriifungen', u'Examenspr\xfcfungen'), (u'Exekutivzust\xe9noligkeit', u'Exekutivzust\xe4ndigkeit'), (u'Explosionenl', u'Explosionen!'), (u'Extrablattl', u'Extrablatt!'), (u'F/nden', u'Finden'), (u'F/ugba/I', u'Flugball'), (u'Fahnrich', u'F\xe4hnrich'), (u'fahrlissiges', u'fahrl\xe4ssiges'), (u'Fairbankverlieh', u'Fairbank verlieh'), (u'Fallef', u'Falle!'), (u'fallengelassen', u'fallen gelassen'), (u'Fallschirmj\xe9gereinheiten', u'Fallschirmj\xe4gereinheiten'), (u'Fam/Z/e', u'Familie'), (u'Fa\xdf', u'Fass'), (u'FBl', u'FBI'), (u'Fe/nd', u'Feind'), (u'fehlschl\xe9gt', u'fehlschl\xe4gt'), (u'Feindberllihrung', u'Feindber\xfchrung'), (u'Feind\xfcbewvachung', u'Feind\xfcberwachung'), (u'feltig', u'fertig'), (u'femen', u'fernen'), (u'fernh\xe9ilt', u'fernh\xe4lt'), (u'Festhaltenl', u'Festhalten!'), (u'Fettw\xe9nste', u'Fettw\xe4nste'), (u'Feuen/vehr', u'Feuerwehr'), (u'Feuerliischer', u'Feuerl\xf6scher'), (u'Feuervvehrrnann', u'Feuerwehrrnann'), (u'Feuerwehrl', u'Feuerwehr!'), (u'Feuerwfirmen', u'Feuer w\xe4rmen'), (u'Feue\ufb02', u'Feuer!'), (u"ff'Ul'1\u20acf'\u20acl'1", u'fr\xfcheren'), (u'Ffiegen', u'Fliegen'), (u'ffihft', u'f\xfchlt'), (u'ffihren', u'f\xfchren'), (u'ffinf', u'f\xfcnf'), (u'ffir', u'f\xfcr'), (u'ffirchte', u'f\xfcrchte'), (u'ffirs', u'f\xfcrs'), (u'ffittere', u'f\xfcttere'), (u'FI6he', u'Fl\xf6he'), (u'Fiasenm\xe9iher', u'Rasenm\xe4her'), (u'fibel', u'\xfcbel'), (u'fiber', u'\xfcber'), (u'fiberdressierter', u'\xfcberdressierter'), (u'fibergezogen', u'\xfcbergezogen'), (u'fiberhaupt', u'\xfcberhaupt'), (u'fiberholt', u'\xfcberholt'), (u'fiberlegt', u'\xfcberlegt'), (u'fibernachtet', u'\xfcbernachtet'), (u'fiberspannt', u'\xfcberspannt'), (u'fibertreiben', u'\xfcbertreiben'), (u'fiberzfichtete', u'\xfcberz\xfcchtete'), (u'fibrig', u'\xfcbrig'), (u'Fieferenz', u'Referenz'), (u'Fieifi', u'Rei\xdf'), (u'fiffentlichkeit', u'\xd6ffentlichkeit'), (u'fiffnen', u'\xf6ffnen'), (u'fiffnest', u'\xf6ffnest'), (u'fifter', u'\xf6fter'), (u'Fihigkeit', u'F\xe4higkeit'), (u'fihneln', u'\xe4hneln'), (u'Fihrt', u'F\xe4hrt'), (u'fiihl', u'f\xfchl'), (u'fiihle', u'f\xfchle'), (u'fiihlen', u'f\xfchlen'), (u'fiihlst', u'f\xfchlst'), (u'fiihlt', u'f\xfchlt'), (u'Fiihlte', u'F\xfchlte'), (u'Fiihre', u'F\xfchre'), (u'Fiihren', u'F\xfchren'), (u'Fiihrerin', u'F\xfchrerin'), (u'Fiihrerschein', u'F\xfchrerschein'), (u'fiihrfe', u'f\xfchrte'), (u'fiihrt', u'f\xfchrt'), (u'fiihrte', u'f\xfchrte'), (u'Fiihrungsf\xe9ihigkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fiihrungsprogramm', u'F\xfchrungsprogramm'), (u'Fiihrungsstil', u'F\xfchrungsstil'), (u'Fiilcksicht', u'R\xfccksicht'), (u'fiillen', u'f\xfcllen'), (u'fiinden', u'f\xe4nden'), (u'fiinf', u'f\xfcnf'), (u'fiinfhundert', u'f\xfcnfhundert'), (u'fiinfzehn', u'f\xfcnfzehn'), (u'fiir', u'f\xfcr'), (u'fiirchte', u'f\xfcrchte'), (u'fiirchten', u'f\xfcrchten'), (u'fiirchterlich', u'f\xfcrchterlich'), (u'fiirchterlichl', u'f\xfcrchterlich!'), (u'fiirchterllches', u'f\xfcrchterliches'), (u'fiirchtet', u'f\xfcrchtet'), (u'fiirchteten', u'f\xfcrchteten'), (u'fiirjeden', u'f\xfcr jeden'), (u'Fiirmchen', u'F\xf6rmchen'), (u'fiirs', u'f\xfcrs'), (u'Fijgen', u'F\xfcgen'), (u'fijhl', u'f\xfchl'), (u'fijhle', u'f\xfchle'), (u'fijhlen', u'f\xfchlen'), (u'fijhlst', u'f\xfchlst'), (u'fijhlt', u'f\xfchlt'), (u'fijhren', u'f\xfchren'), (u'Fijhrer', u'F\xfchrer'), (u'fijhrt', u'f\xfchrt'), (u'Fijhrungsqualit\xe9iten', u'F\xfchrungsqualit\xe4ten'), (u'FiJl3en', u'F\xfc\xdfen'), (u'Fijlie', u'F\xfc\xdfe'), (u'fijlr', u'f\xfcr'), (u'Fijnf', u'F\xfcnf'), (u'Fijnfziger', u'F\xfcnfziger'), (u'fijr', u'f\xfcr'), (u'fijrchte', u'f\xfcrchte'), (u'fijrchten', u'f\xfcrchten'), (u'Fijrjedenl', u'F\xfcr jeden!'), (u'fijrs', u'f\xfcrs'), (u'fiJrVorteile', u'f\xfcr Vorteile'), (u'fijttern', u'f\xfcttern'), (u'fijur', u'f\xfcr'), (u'filhl', u'f\xfchl'), (u'filhle', u'f\xfchle'), (u'filhlen', u'f\xfchlen'), (u'filhlte', u'f\xfchlte'), (u'filhre', u'f\xfchre'), (u'filhren', u'f\xfchren'), (u'Filhrern', u'F\xfchrern'), (u'Filhrerschein', u'F\xfchrerschein'), (u'filhrst', u'f\xfchrst'), (u'filhrt', u'f\xfchrt'), (u'filhrte', u'f\xfchrte'), (u'filhrten', u'f\xfchrten'), (u'Filhrung', u'F\xfchrung'), (u'Fillle', u'F\xfclle'), (u'Filll\xe9en', u'F\xfc\xdfen'), (u'Filmemachen', u'Filme machen'), (u'Filml', u'Film!'), (u'filnf', u'f\xfcnf'), (u'Filn\ufb02', u'F\xfcnf!'), (u'Filr', u'F\xfcr'), (u"filr'ne", u"f\xfcr'ne"), (u'filrchten', u'f\xfcrchten'), (u'filrchterlich', u'f\xfcrchterlich'), (u'filrs', u'f\xfcrs'), (u'filter', u'\xe4lter'), (u'findem', u'\xe4ndern'), (u'findenlassen', u'finden lassen'), (u'Fingerabdrijcke', u'Fingerabdr\xfccke'), (u'Fingerabdrilcke', u'Fingerabdr\xfccke'), (u'Fingerniigeln', u'Fingern\xe4geln'), (u'Fingern\xe9gel', u'Fingern\xe4gel'), (u'Fingern\xe9geln', u'Fingern\xe4geln'), (u'fingstlich', u'\xe4ngstlich'), (u'Fiothaarige', u'Rothaarige'), (u'Firmen\xe9rzte', u'Firmen\xe4rzte'), (u'Fischk\xe9pfe', u'Fischk\xf6pfe'), (u'FIUssigkeitsgleichgewicht', u'Fl\xfcssigkeitsgleichgewicht'), (u'Fiusten', u'F\xe4usten'), (u'FIynn', u'Flynn'), (u'fjffnen', u'\xf6ffnen'), (u"fL'1'r", u'f\xfcr'), (u"fL'1hle", u'f\xfchle'), (u"FL'1r", u'F\xfcr'), (u"fL'ir", u'f\xfcr'), (u"fL'lr", u'f\xfcr'), (u'fL1r', u'f\xfcr'), (u'Fl6he', u'Fl\xf6he'), (u'Flclse', u'Rose'), (u'fleifkige', u'flei\xdfige'), (u'fleifkiges', u'flei\xdfiges'), (u'fleil3ig', u'flei\xdfig'), (u'Fleischb\xe9llchen', u'Fleischb\xe4llchen'), (u"Fleischkl6l'Sen", u'Fleischkl\xf6\xdfen'), (u'Flfige', u'Fl\xfcge'), (u'Flfigell', u'Fl\xfcgel!'), (u'flfistert', u'fl\xfcstert'), (u'Flhigkeiten', u'F\xe4higkeiten'), (u'Flhnrich', u'F\xe4hnrich'), (u'Flhnriche', u'F\xe4hnriche'), (u'flieBen', u'flie\xdfen'), (u'Fliefiband', u'Flie\xdfband'), (u'Fliefiheck', u'Flie\xdfheck'), (u'Flieflsb\xe9nder', u'Flie\xdfb\xe4nder'), (u'flielit', u'flie\xdft'), (u'flielSt', u'flie\xdft'), (u'FLif$e', u'F\xfc\xdfe'), (u'fLihlt', u'f\xfchlt'), (u'fliichtige', u'fl\xfcchtige'), (u'Fliigel', u'Fl\xfcgel'), (u'flijchtig', u'fl\xfcchtig'), (u'Flijgel', u'Fl\xfcgel'), (u'Flijgelfedernl', u'Fl\xfcgelfedern!'), (u'Flilssige', u'Fl\xfcssige'), (u'flilstert', u'fl\xfcstert'), (u'fLir', u'f\xfcr'), (u'fljhrt', u'f\xfchrt'), (u'Fljr', u'F\xfcr'), (u"flJr'n", u"f\xfcr'n"), (u'fllihrst', u'f\xfchrst'), (u'Fllihrt', u'F\xfchrt'), (u'fllinf', u'f\xfcnf'), (u'fllinften', u'f\xfcnften'), (u'Fllinkchen', u'F\xfcnkchen'), (u'Fllir', u'F\xfcr'), (u'fllirchte', u'f\xfcrchte'), (u'fllirchten', u'f\xfcrchten'), (u'fllirchterlichen', u'f\xfcrchterlichen'), (u'fllirchtet', u'f\xfcrchtet'), (u'Fllirsten', u'F\xfcrsten'), (u'Fllitterungszeitenl', u'F\xfctterungszeiten!'), (u'flllgte', u'f\xfcgte'), (u'flllgten', u'f\xfcgten'), (u'flllhrten', u'fl\xfchrten'), (u'Flllhrung', u'F\xfchrung'), (u'Fllligel', u'Fl\xfcgel'), (u'flllistern', u'fl\xfcstern'), (u'fllllstert', u'fl\xfcstert'), (u'flllrchte', u'f\xfcrchte'), (u'flllrchten', u'f\xfcrchten'), (u'flllrjede', u'f\xfcr jede'), (u'Flohtransporterl', u'Flohtransporter!'), (u'Floli', u'Flo\xdf'), (u'Flottenalzt', u'Flottenarzt'), (u'Flottenstiitzpunkt', u'Flottenst\xfctzpunkt'), (u'Flottenstutzpunkt', u'Flottenst\xfctzpunkt'), (u'Flrma', u'Firma'), (u'fltlsterte', u'fl\xfcsterte'), (u'Fluchtig', u'Fl\xfcchtig'), (u'Flughdhe', u'Flugh\xf6he'), (u'Flughiihe', u'Flugh\xf6he'), (u'Flugh\xe9ifen', u'Flugh\xe4fen'), (u'Flugunf\xe9ihig', u'Flugunf\xe4hig'), (u'flugunf\xe9ihigen', u'flugunf\xe4higen'), (u'Flugunf\xe9ihigl', u'Flugunf\xe4hig!'), (u'Flugzeugl', u'Flugzeug!'), (u'FLUSSIGER', u'FL\xdcSSIGER'), (u'Flustereffekt', u'Fl\xfcstereffekt'), (u'Flustern', u'Fl\xfcstern'), (u'FLUSTERT', u'FL\xdcSTERT'), (u'fl\ufb02stern', u'fl\xfcstern'), (u'fl\ufb02sterten', u'fl\xfcsterten'), (u'Folgendesz', u'Folgendes:'), (u'fortgespiilt', u'fortgesp\xfclt'), (u'fortspiilen', u'fortsp\xfclen'), (u'fortw\xe9hrend', u'fortw\xe4hrend'), (u'Fr/ed/10/', u'Friedhof'), (u'Fr5ulein', u'Fr\xe4ulein'), (u'Fr6hliche', u'Fr\xf6hliche'), (u'Frachfmodule', u'Frachtmodule'), (u'Frafi', u'Fra\xdf'), (u'fragfe', u'fragte'), (u"Fral'S", u'Fra\xdf'), (u'fralken', u'fra\xdfen'), (u'Franzfisisch', u'Franz\xf6sisch'), (u'Franziisin', u'Franz\xf6sin'), (u'franziisische', u'franz\xf6sische'), (u'franziisischen', u'franz\xf6sischen'), (u'franziisischer', u'franz\xf6sischer'), (u'franziisisches', u'franz\xf6sisches'), (u'Franz\xe9sisch', u'Franz\xf6sisch'), (u'franz\xe9sische', u'franz\xf6sische'), (u'franz\xe9sischen', u'franz\xf6sischen'), (u'franz\xe9sischer', u'franz\xf6sischer'), (u'Franz\xe9sisches', u'Franz\xf6sisches'), (u'FRAULEIN', u'FR\xc4ULEIN'), (u'fre/em', u'freiem'), (u'freffen', u'treffen'), (u'freilieB', u'freilie\xdf'), (u'freimiitigen', u'freim\xfctigen'), (u'Fressger\xe9usche', u'Fressger\xe4usche'), (u'Frfichtekuchen', u'Fr\xfcchtekuchen'), (u'frfih', u'fr\xfch'), (u'frfiher', u'fr\xfcher'), (u'Friedh\xe9fe', u'Friedh\xf6fe'), (u'Friichtchen', u'Fr\xfcchtchen'), (u'friih', u'fr\xfch'), (u'friihen', u'fr\xfchen'), (u'friiher', u'fr\xfcher'), (u'friihere', u'fr\xfchere'), (u'friihliche', u'fr\xf6hliche'), (u'friihlichen', u'fr\xf6hlichen'), (u'Friihstiick', u'Fr\xfchst\xfcck'), (u'friilher', u'fr\xfcher'), (u'friilhesten', u'fr\xfchesten'), (u'Frijchte', u'Fr\xfcchte'), (u'frijh', u'fr\xfch'), (u'frijher', u'fr\xfcher'), (u'frijherer', u'fri\xfcherer'), (u'frilh', u'fr\xfch'), (u'frilhen', u'fr\xfchen'), (u'Frilher', u'Fr\xfcher'), (u'frilhere', u'fr\xfchere'), (u'Frilhst\ufb02ck', u'Fr\xfchst\xfcck'), (u'Fris6r', u'Fris\xf6r'), (u"frL'lher", u'fr\xfcher'), (u'Frljihling', u'Fr\xfchling'), (u'Frllichte', u'Fr\xfcchte'), (u'frllih', u'fr\xfch'), (u'frlliher', u'fr\xfcher'), (u'Frllihstiickskiiche', u'Fr\xfchst\xfccksk\xfcche'), (u'fro/1', u'froh'), (u'FROHLICHE', u'FR\xd6HLICHE'), (u'frtih', u'fr\xfch'), (u'Frtiher', u'Fr\xfcher'), (u'Frtihliche', u'Fr\xf6hliche'), (u'Frtihstticksei', u'Fr\xfchst\xfccksei'), (u'Frtlh', u'Fr\xfch'), (u'FrUh', u'Fr\xfch'), (u'FRUHE', u'FR\xdcHE'), (u'fruhe', u'fr\xfche'), (u'fruhen', u'fr\xfchen'), (u'Fruher', u'Fr\xfcher'), (u'fruheren', u'fr\xfcheren'), (u'Fruhling', u'Fr\xfchling'), (u'Fruhlingsrolle', u'Fr\xfchlingsrolle'), (u'FrUhstUck', u'Fr\xfchstuck'), (u'Fruhstuck', u'Fr\xfchst\xfcck'), (u'frUhstUcken', u'fr\xfchst\xfccken'), (u'fr\xe9hliches', u'fr\xf6hliches'), (u'fr\xe9ihfiches', u'fr\xf6hliches'), (u'fr\xe9ihlich', u'fr\xf6hlich'), (u'Fr\xe9iulein', u'Fr\xe4ulein'), (u'fr\xe9nen', u'fr\xf6nen'), (u'Fr\xe9sche', u'Fr\xf6sche'), (u'Fr\xe9ulein', u'Fr\xe4ulein'), (u'ftihlen', u'f\xfchlen'), (u'Ftillhorn', u'F\xfcllhorn'), (u'Ftir', u'F\xfcr'), (u'Ftirs', u'F\xfcrs'), (u'Ftlhrung', u'F\xfchrung'), (u'ftlrchte', u'f\xfcrchte'), (u'ftmf', u'f\xfcnf'), (u'Fu/3', u'Fu\xdf'), (u'FuB', u'Fu\xdf'), (u'FuBballspieler', u'Fu\xdfballspieler'), (u'FUBen', u'F\xfc\xdfen'), (u'Fuf$', u'Fu\xdf'), (u'Fufi', u'Fu\xdf'), (u'Fufiabdrucke', u'Fu\xdfabdr\xfccke'), (u'Fufiballtraining', u'Fu\xdfballtraining'), (u'FufL', u'Fu\xdf'), (u'Fuflsball', u'Fu\xdfball'), (u'Fuflsballszene', u'Fu\xdfballszene'), (u"fUhl't", u'f\xfchrt'), (u'fuhle', u'f\xfchle'), (u'fuhlst', u'f\xfchlst'), (u'fUhlt', u'f\xfchlt'), (u'fUhre', u'f\xfchre'), (u'fUhrt', u'f\xfchrt'), (u'fuhrte', u'f\xfchrte'), (u'fuhrten', u'f\xfchrten'), (u'Fuhrung', u'F\xfchrung'), (u'Fuhrungsf\xe9higkeiten', u'F\xfchrungsf\xe4higkeiten'), (u'Fuhrungsoffizier', u'F\xfchrungsoffizier'), (u'Fuhrungsqualit\xe9t', u'F\xfchrungsqualit\xe4t'), (u'FUI3en', u'F\xfc\xdfen'), (u'Fuli', u'Fu\xdf'), (u'Fuliball', u'Fu\xdfball'), (u'Fulisohlen', u'Fu\xdfsohlen'), (u'FUller', u'F\xfcller'), (u'fUllten', u'f\xfcllten'), (u'fumt', u'f\xfchlt'), (u'Fundbiiro', u'Fundb\xfcro'), (u'FUnf', u'F\xfcnf'), (u'Funftbeste', u'F\xfcnftbeste'), (u'Funkchen', u'F\xfcnkchen'), (u'Funkger\xe9it', u'Funkger\xe4t'), (u'Funkger\xe9ite', u'Funkger\xe4te'), (u'Funkger\xe9t', u'Funkger\xe4t'), (u'funktionstilchtig', u'funktionst\xfcchtig'), (u'FUR', u'F\xdcR'), (u'Fur', u'F\xfcr'), (u"fUrAusweichmanc'\xa7ver", u'f\xfcr Ausweichman\xf6ver'), (u'furchteinfl6Bend', u'furchteinfl\xf6\xdfend'), (u'furchteinfl6Bende', u'furchteinfl\xf6\xdfende'), (u'furchten', u'f\xfcrchten'), (u'Furchtest', u'F\xfcrchtest'), (u'furchtet', u'f\xfcrchtet'), (u'furchteten', u'f\xfcrchteten'), (u'fureinander', u'f\xfcreinander'), (u'furjeden', u'f\xfcr jeden'), (u'furjemanden', u'f\xfcr jemanden'), (u'furjudische', u'fur j\xfcdische'), (u'furs', u'f\xfcrs'), (u'FUrWalter', u'F\xfcr Walter'), (u'fut', u'tut'), (u'Fu\ufb02ballspiel', u'Fu\xdfballspiel'), (u'F\xa7hnlein', u'F\xe4hnlein'), (u'f\xe9//t', u'f\xe4llt'), (u'f\xe9hig', u'f\xe4hig'), (u'F\xe9higkeit', u'F\xe4higkeit'), (u'F\xe9higkeiten', u'F\xe4higkeiten'), (u'f\xe9hnen', u'f\xf6hnen'), (u'F\xe9hnens', u'F\xf6hnens'), (u'F\xe9hnerei', u'F\xf6hnerei'), (u'F\xe9hnleinmiitter', u'F\xe4hnleinm\xfctter'), (u'F\xe9hre', u'F\xe4hre'), (u'f\xe9hrst', u'f\xe4hrst'), (u'f\xe9hrt', u'f\xe4hrt'), (u'F\xe9ihigkeit', u'F\xe4higkeit'), (u'F\xe9ihigkeiten', u'F\xe4higkeiten'), (u'f\xe9ihrt', u'f\xe4hrt'), (u'f\xe9illst', u'f\xe4llst'), (u'f\xe9illt', u'f\xe4llt'), (u'F\xe9ilschung', u'F\xe4lschung'), (u'F\xe9ingt', u'F\xe4ngt'), (u'f\xe9ir', u'f\xfcr'), (u'F\xe9lle', u'F\xe4lle'), (u'F\xe9llen', u'F\xe4llen'), (u'f\xe9lligl', u'f\xe4llig'), (u'F\xe9llt', u'F\xe4llt'), (u"f\xe9llt's", u"f\xe4llt's"), (u'F\xe9lschen', u'F\xe4lschen'), (u'F\xe9lschung', u'F\xe4lschung'), (u'f\xe9nde', u'f\xe4nde'), (u'F\xe9ngst', u'F\xe4ngst'), (u'F\xe9ngt', u'F\xe4ngt'), (u'f\xe9rben', u'f\xe4rben'), (u'f\xe9rbt', u'f\xe4rbt'), (u'f\xe9rdern', u'f\xf6rdern'), (u'f\xe9rmlich', u'f\xf6rmlich'), (u'F\xe9ustlinge', u'F\xe4ustlinge'), (u"f\xfcr'ne", u"f\xfcr 'ne"), (u'f\xfcrchlerlichen', u'f\xfcrchterlichen'), (u'f\xfcrjede', u'f\xfcr jede'), (u'f\xfcrjeden', u'f\xfcr jeden'), (u'F\ufb02hrungsprogramm', u'F\xfchrungsprogramm'), (u'F\ufb02hrungsstil', u'F\xfchrungsstil'), (u'f\ufb02llen', u'f\xfcllen'), (u'f\ufb02llt', u'f\xe4llt'), (u'f\ufb02nf', u'f\xfcnf'), (u'F\ufb02r', u'F\xfcr'), (u'f\ufb02rchte', u'f\xfcrchte'), (u'f\ufb02rjeden', u'f\xfcr jeden'), (u'g/bf', u'gibt'), (u'g/bsf', u'gibst'), (u'G5ste', u'G\xe4ste'), (u'G6nn', u'G\xf6nn'), (u"G6t'lllche", u'G\xf6ttliche'), (u'G6tter', u'G\xf6tter'), (u'G6ttern', u'G\xf6ttern'), (u'Gamilonl', u'Gamilon!'), (u'ganzlich', u'g\xe4nzlich'), (u'gardel', u'garde!'), (u'Gasbrfiter', u'Gasbr\xe4ter'), (u'gauze', u'ganze'), (u'GCJKTEN', u'G\xd6KTEN'), (u'ge6lt', u'ge\xf6lt'), (u'gebauf', u'gebaut'), (u'Gebiez', u'Gebiet'), (u'Gebi\xe9ude', u'Geb\xe4ude'), (u'gebliebenl', u'geblieben!'), (u'GEBRAUCHTWAGENIPOLIZEIITAXI', u'GEBRAUCHTWAGEN/POLIZEI/TAXI'), (u'Gebr\xe9u', u'Gebr\xe4u'), (u'gebs', u"geb's"), (u'gebuhrend', u'geb\xfchrend'), (u'Geb\xe9ick', u'Geb\xe4ck'), (u'Geb\xe9iude', u'Geb\xe4ude'), (u'geb\xe9rdet', u'geb\xe4rdet'), (u'Geb\xe9rmutter', u'Geb\xe4rmutter'), (u'Geb\xe9rmutterhals', u'Geb\xe4rmutterhals'), (u'Geb\xe9ude', u'Geb\xe4ude'), (u'Geb\xe9udedach', u'Geb\xe4udedach'), (u'Geb\xe9uden', u'Geb\xe4uden'), (u'Geb\xe9udes', u'Geb\xe4udes'), (u'gedemiitigt', u'gedem\xfctigt'), (u'gedemijtigt', u'gedem\xfctigt'), (u'gedemllitigt', u'gedem\xfctigt'), (u'gedrtickt', u'gedr\xfcckt'), (u'gedr\xe9ngt', u'gedr\xe4ngt'), (u'Ged\xe9chtnisverlustes', u'Ged\xe4chtnisverlustes'), (u'Ged\xe9ichtnis', u'Ged\xe4chtnis'), (u'ged\xe9mpft', u'ged\xe4mpft'), (u"gef'a'hrlich", u'gef\xe4hrlich'), (u"gef'a'llt", u'gef\xe4llt'), (u'gef5IIt', u'gef\xe4llt'), (u'gefahrdet', u'gef\xe4hrdet'), (u'gefahrlich', u'gef\xe4hrlich'), (u'gefallsllichtige', u'gefalls\xfcchtige'), (u'GEFANGNISTECHNOLOGIE', u'GEF\xc4NGNISTECHNOLOGIE'), (u'Gefechtsausrustung', u'Gefechtsausr\xfcstung'), (u'Geffihl', u'Gef\xfchl'), (u'geffihrt', u'gef\xfchrt'), (u'geffillt', u'gef\xe4llt'), (u'Gefihrliche', u'Gef\xe4rliche'), (u'Gefiihl', u'Gef\xfchl'), (u'Gefiihle', u'Gef\xfchle'), (u'Gefiihlen', u'Gef\xfchlen'), (u'Gefiihlslebens', u'Gef\xfchlslebens'), (u'gefiihlsmiliigen', u'gef\xfchlsm\xe4\xdfigen'), (u'gefiihrt', u'gef\xfchrt'), (u'gefiillst', u'gef\xe4llst'), (u'gefiillt', u'gef\xfcllt'), (u'gefiirchtet', u'gef\xfcrchtet'), (u'Gefijhl', u'Gef\xfchl'), (u'Gefijhle', u'Gef\xfchle'), (u'gefijhlt', u'gef\xfchlt'), (u'gefijllte', u'gef\xfcllte'), (u'Gefilhl', u'Gef\xfchl'), (u'Gefilhle', u'Gef\xfchle'), (u'gefillt', u'gef\xe4llt'), (u'Gefingnis', u'Gef\xe4ngnis'), (u"gefL'lllten", u'gef\xfcllten'), (u'Geflilster', u'Gefl\xfcster'), (u'gefllihllos', u'gef\xfchllos'), (u'Geflllhlsduselige', u'Gef\xfchlsduselige'), (u'GEFLUSTERT', u'GEFL\xdcSTERT'), (u'Geftuhle', u'Gef\xfchle'), (u'Gefuhl', u'Gef\xfchl'), (u'Gefuhle', u'Gef\xfchle'), (u'Gefuhlen', u'Gef\xfchlen'), (u'gefuhlt', u'gef\xfchlt'), (u'gefuhlvolle', u'gef\xfchlvolle'), (u'gefurchtet', u'gef\xfcrchtet'), (u'Gef\xe9hrde', u'Gef\xe4hrde'), (u'gef\xe9hrden', u'gef\xe4hrden'), (u'gef\xe9hrdet', u'gef\xe4hrdet'), (u'Gef\xe9hrdung', u'Gef\xe4hrdung'), (u'gef\xe9hrlich', u'gef\xe4hrlich'), (u'gef\xe9hrliche', u'gef\xe4hrliche'), (u'gef\xe9hrlicher', u'gef\xe4hrlicher'), (u'gef\xe9hrlicheren', u'gef\xe4hrlicheren'), (u'Gef\xe9hrliches', u'Gef\xe4hrliches'), (u'Gef\xe9hrt', u'Gef\xe4hrt'), (u'gef\xe9ihrden', u'gef\xe4hrden'), (u'gef\xe9ihrdet', u'gef\xe4hrdet'), (u'gef\xe9ihrlich', u'gef\xe4hrlich'), (u'Gef\xe9ihrte', u'Gef\xe4hrte'), (u'Gef\xe9ihrten', u'Gef\xe4hrten'), (u'gef\xe9illt', u'gef\xe4llt'), (u"Gef\xe9illt's", u"Gef\xe4llt's"), (u'gef\xe9llf', u'gef\xe4llt'), (u'gef\xe9llfs', u"gef\xe4llt's"), (u'gef\xe9llig', u'gef\xe4llig'), (u'gef\xe9lligst', u'gef\xe4lligst'), (u'gef\xe9llst', u'gef\xe4llst'), (u'Gef\xe9llt', u'Gef\xe4llt'), (u"Gef\xe9llt's", u"Gef\xe4llt's"), (u'gef\xe9lscht', u'gef\xe4lscht'), (u'Gef\xe9ngnis', u'Gef\xe4ngnis'), (u'Gef\xe9ngnisregeln', u'Gef\xe4ngnisregeln'), (u'Gef\xe9ngnisse', u'Gef\xe4ngnisse'), (u'Gef\xe9ngnissen', u'Gef\xe4ngnissen'), (u'Gef\xe9ngnisses', u'Gef\xe4ngnisses'), (u'Gef\xe9ngniswagen', u'Gef\xe4ngniswagen'), (u'gef\ufb02gig', u'gef\xfcgig'), (u'gegenfiber', u'gegen\xfcber'), (u'gegeniiber', u'gegen\xfcber'), (u'gegeniibertritt', u'gegen\xfcbertritt'), (u'gegeniiberzusfehen', u'gegen\xfcberzustehen'), (u'gegenijber', u'gegen\xfcber'), (u'gegenlliber', u'gegen\xfcber'), (u'gegenlliberstehen', u'gegen\xfcberstehen'), (u'Gegenstrfimung', u'Gegenstr\xf6mung'), (u'Gegenstr\xe9mung', u'Gegenstr\xf6mung'), (u'Gegensttlck', u'Gegenst\xfcck'), (u'Gegenst\xe9nde', u'Gegenst\xe4nde'), (u'gegenuber', u'gegen\xfcber'), (u'Gegenverschwiirung', u'Gegenverschw\xf6rung'), (u'gegenw\xe9rtigen', u'gegenw\xe4rtigen'), (u'gegriindet', u'gegr\xfcndet'), (u'gegrijfit', u'gegr\xfc\xdft'), (u'gegrilfit', u'gegr\xfc\xdft'), (u'GegrUl3t', u'Gegr\xfc\xdft'), (u'gegrundet', u'gegr\xfcndet'), (u'geh6ren', u'geh\xf6ren'), (u'geh6rt', u'geh\xf6rt'), (u'gehdrt', u'geh\xf6rt'), (u'GeheilS', u'Gehei\xdf'), (u'geheilSen', u'gehei\xdfen'), (u'gehejetzt', u'gehe jetzt'), (u'gehf', u'geht'), (u'gehfiirt', u'geh\xf6rt'), (u'gehfire', u'geh\xf6re'), (u'gehfiren', u'geh\xf6ren'), (u'gehfirt', u'geh\xf6rt'), (u'gehiipft', u'geh\xfcpft'), (u'Gehiir', u'Geh\xf6r'), (u'gehiire', u'geh\xf6re'), (u'gehiiren', u'geh\xf6ren'), (u'gehiirst', u'geh\xf6rst'), (u'gehiirt', u'geh\xf6rt'), (u'Gehim', u'Gehirn'), (u'Gehirnsch\xe9den', u'Gehirnsch\xe4den'), (u'gehlngt', u'geh\xe4ngt'), (u'gehore', u'geh\xf6re'), (u'gehoren', u'geh\xf6ren'), (u'gehort', u'geh\xf6rt'), (u"geht'sl", u"geht's!"), (u'Gehtirt', u'Geh\xf6rt'), (u'gehtjetzt', u'geht jetzt'), (u'geh\xe9irt', u'geh\xf6rt'), (u'Geh\xe9iuteten', u'Geh\xe4uteten'), (u'geh\xe9r', u'geh\xf6r'), (u'geh\xe9re', u'geh\xf6re'), (u'geh\xe9ren', u'geh\xf6ren'), (u'geh\xe9rst', u'geh\xf6rst'), (u'Geh\xe9rt', u'Geh\xf6rt'), (u'geh\xe9rten', u'geh\xf6rten'), (u'geh\xe9rtf', u'geh\xf6rt!'), (u'geiiffnet', u'ge\xf6ffnet'), (u'geilbt', u'ge\xfcbt'), (u'geistesgestort', u'geistesgest\xf6rt'), (u'Gei\ufb02blatt', u'Gei\xdfblatt'), (u'Gei\ufb02blattstaude', u'Gei\xdfblattstaude'), (u'gekiisst', u'gek\xfcsst'), (u'gekiisstl', u'gek\xfcsst!'), (u'gekijndigt', u'gek\xfcndigt'), (u'gekijsst', u'gek\xfcsst'), (u'gekilsst', u'gek\xfcsst'), (u'gekimpfl', u'gek\xe4mpft'), (u'gekimpft', u'gek\xe4mpft'), (u'geklautl', u'geklaut!'), (u'gekliirt', u'gekl\xe4rt'), (u'gekllrt', u'gekl\xe4rt'), (u'gekl\xe9rt', u'gekl\xe4rt'), (u'gekriint', u'gekr\xf6nt'), (u'gekrijmmt', u'gekr\xfcmmt'), (u'GEKUHLTER', u'GEK\xdcHLTER'), (u'gekurzt', u'gek\xfcrzt'), (u'gek\xe9mpft', u'gek\xe4mpft'), (u'gelaufenl', u'gelaufen!'), (u'gelegf', u'gelegt'), (u'gelegtwurde', u'gelegt wurde'), (u'geliist', u'gel\xf6st'), (u'gelilftet', u'gel\xfcftet'), (u'gelndert', u'ge\xe4ndert'), (u'Gelst', u'Geist'), (u'Geltungsbedurfnis', u'Geltungsbed\xfcrfnis'), (u'GELUBDE', u'GEL\xdcBDE'), (u'Gel\xe9chter', u'Gel\xe4chter'), (u'gel\xe9hmt', u'gel\xe4hmt'), (u'gel\xe9ischt', u'gel\xf6scht'), (u'Gel\xe9nde', u'Gel\xe4nde'), (u'gel\xe9nge', u'gel\xe4nge'), (u'gel\xe9st', u'gel\xf6st'), (u'gem', u'gern'), (u'gemafiregelt', u'gema\xdfregelt'), (u'Geme', u'Gerne'), (u'gemfitliches', u'gem\xfctliches'), (u'Gemiise', u'Gem\xfcse'), (u'gemiitlich', u'gem\xfctlich'), (u'Gemijlse', u'Gem\xfcse'), (u'Gemilt', u'Gem\xfct'), (u'gemiltlicher', u'gem\xfctlicher'), (u'GemLise', u'Gem\xfcse'), (u'Gemut', u'Gem\xfct'), (u'gem\xe9fi', u'gem\xe4\xdf'), (u'Gem\xe9fk', u'Gem\xe4\xdf'), (u'gem\xe9ht', u'gem\xe4ht'), (u'Gem\xe9ili', u'Gem\xe4\xdf'), (u'Gem\xe9lde', u'Gem\xe4lde'), (u'Gem\xe9lden', u'Gem\xe4lden'), (u'Genaul', u'Genau!'), (u'genieBt', u'genie\xdft'), (u'genief$en', u'genie\xdfen'), (u'Geniefien', u'Genie\xdfen'), (u'geniefk', u'genie\xdf'), (u'genielien', u'genie\xdfen'), (u'genielken', u'genie\xdfen'), (u'genie\ufb02en', u'genie\xdfen'), (u'genligen', u'gen\xfcgen'), (u'genlligend', u'gen\xfcgend'), (u'genlligt', u'gen\xfcgt'), (u'genlllgend', u'gen\xfcgend'), (u'genugt', u'gen\xfcgt'), (u'genugte', u'gen\xfcgte'), (u'georfef', u'geortet'), (u'gepfluckt', u'gepfl\xfcckt'), (u'gepriifter', u'gepr\xfcfter'), (u'gepruft', u'gepr\xfcft'), (u'Gep\xe9ck', u'Gep\xe4ck'), (u'gerfit', u'ger\xe4t'), (u'Geriichte', u'Ger\xfcchte'), (u'Geriite', u'Ger\xe4te'), (u'Gerijcht', u'Ger\xfccht'), (u'Gerllicht', u'Ger\xfccht'), (u'gerllistet', u'ger\xfcstet'), (u'gernhaben', u'gern-haben'), (u'gernntgt', u'ger\xf6ntgt'), (u'ger\xe9it', u'ger\xe4t'), (u'Ger\xe9iusch', u'Ger\xe4usch'), (u'Ger\xe9t', u'Ger\xe4t'), (u'Ger\xe9te', u'Ger\xe4te'), (u'Ger\xe9tschaften', u'Ger\xe4tschaften'), (u'ger\xe9umt', u'ger\xe4umt'), (u'Ger\xe9usch', u'Ger\xe4usch'), (u'Ger\xe9usche', u'Ger\xe4usche'), (u'ger\xe9uschvoll', u'ger\xe4uschvoll'), (u'geschafff', u'geschafft'), (u'GESCHAFTSFUHRER', u'GESCH\xc4FTSF\xdcHRER'), (u'gescha\ufb02i', u'geschafft'), (u'Geschfift', u'Gesch\xe4ft'), (u'geschfimt', u'gesch\xe4mt'), (u'Geschift', u'Gesch\xe4ft'), (u'Geschifte', u'Gesch\xe4fte'), (u'Geschiftsleute', u'Gesch\xe4ftsleute'), (u'Geschiftswelt', u'Gesch\xe4ftswelt'), (u'geschiidigt', u'gesch\xe4digt'), (u'Geschiift', u'Gesch\xe4ft'), (u'Geschiiftsleben', u'Gesch\xe4ftsleben'), (u'geschijtzten', u'gesch\xfctzten'), (u'Geschiltz', u'Gesch\xfctz'), (u'Geschiltze', u'Gesch\xfctze'), (u'Geschiltzrohre', u'Gesch\xfctzrohre'), (u'Geschiltzturm', u'Gesch\xfctzturm'), (u'geschlijpftl', u'geschl\xfcpft!'), (u'Geschllitzstellungen', u'Gesch\xfctzstellungen'), (u'geschnfiffelt', u'geschn\xfcffelt'), (u'Geschtitz', u'Gesch\xfctz'), (u'Geschtltz', u'Gesch\xfctz'), (u'Geschutz', u'Gesch\xfctz'), (u'Geschutze', u'Gesch\xfctze'), (u'Geschwiir', u'Geschw\xfcr'), (u'Geschwllir', u'Geschw\xfcr'), (u'Geschwur', u'Geschw\xfcr'), (u'geschw\xe9cht', u'geschw\xe4cht'), (u'geschw\xe9ingert', u'geschw\xe4ngert'), (u'Geschw\xe9tz', u'Geschw\xe4tz'), (u'Gesch\xe9ft', u'Gesch\xe4ft'), (u'Gesch\xe9fte', u'Gesch\xe4fte'), (u'Gesch\xe9ftige', u'Gesch\xe4ftige'), (u'gesch\xe9ftlich', u'gesch\xe4ftlich'), (u'Gesch\xe9fts', u'Gesch\xe4fts'), (u'Gesch\xe9ftsleben', u'Gesch\xe4ftsleben'), (u'Gesch\xe9ift', u'Gesch\xe4ft'), (u'Gesch\xe9ifte', u'Gesch\xe4fte'), (u'gesch\xe9iftsm\xe9ifiig', u'gesch\xe4ftsm\xe4\xdfig'), (u'gesch\xe9itzt', u'gesch\xe4tzt'), (u'gesch\xe9nolet', u'gesch\xe4ndet'), (u'Gesch\ufb02tze', u'Gesch\xfctze'), (u'Gesetzeshiiter', u'Gesetzesh\xfcter'), (u'Gesichtl', u'Gesicht!'), (u'Gesichtsausdrijcke', u'Gesichtsausdr\xfccke'), (u'Gesiiff', u'Ges\xf6ff'), (u'gesiindigt', u'ges\xfcndigt'), (u'gespiirt', u'gesp\xfcrt'), (u'Gesprach', u'Gespr\xe4ch'), (u'GESPRACH', u'GESPR\xc4CH'), (u'GESPRACHE', u'GESPR\xc4CHE'), (u'Gespr\xe9ch', u'Gespr\xe4ch'), (u'Gespr\xe9che', u'Gespr\xe4che'), (u'Gespr\xe9iche', u'Gespr\xe4che'), (u'Gespr\xe9ichsthema', u'Gespr\xe4chsthema'), (u'Gespur', u'Gesp\xfcr'), (u'gestiirt', u'gest\xf6rt'), (u'gestijrzt', u'gest\xfcrzt'), (u'gestijtzte', u'gest\xfctzte'), (u'gestof$en', u'gesto\xdfen'), (u'gestolken', u'gesto\xdfen'), (u'Gestriipp', u'Gestr\xfcpp'), (u'Gestrijpp', u'Gestr\xfcpp'), (u'GESTURZT', u'GEST\xdcRZT'), (u'gest\xe9irt', u'gest\xf6rt'), (u'Gest\xe9ndnis', u'Gest\xe4ndnis'), (u'gest\xe9rt', u'gest\xf6rt'), (u'gest\ufb02rzt', u'gest\xfcrzt'), (u'Gesundheitsbehijrde', u'Gesundheitsbeh\xf6rde'), (u'Gesundheitsftlrsorge', u'Gesundheitsf\xfcrsorge'), (u'Ges\xe9fitaschel', u'Ges\xe4\xdftasche!'), (u'Ges\xe9iffstaschenl', u'Ges\xe4\xdftaschen!'), (u'get6tet', u'get\xf6tet'), (u'Getiise', u'Get\xf6se'), (u'getiitet', u'get\xf6tet'), (u"getr'a'umt", u'getr\xe4umt'), (u'getr\xe9umt', u'getr\xe4umt'), (u'get\xe9tet', u'get\xf6tet'), (u'get\xe9tetf', u'get\xf6tet!'), (u'get\xe9uscht', u'get\xe4uscht'), (u'gev\xe9gelt', u'gev\xf6gelt'), (u'gew6hnt', u'gew\xf6hnt'), (u'GEWACHSHAUS', u'GEW\xc4CHSHAUS'), (u'gewaltt\xe9tig', u'gewaltt\xe4tig'), (u'gewarnf', u'gewarnt'), (u'Gewerkschaftsfunktion\xe9ren', u'Gewerkschaftsfunktion\xe4ren'), (u'gewfinscht', u'gew\xfcnscht'), (u'Gewiasenskon\ufb02ikte', u'Gewissenskon\ufb02ikte'), (u'gewiihlt', u'gew\xe4hlt'), (u'gewiihnen', u'gew\xf6hnen'), (u'gewiihnlich', u'gew\xf6hnlich'), (u'gewiihnlicher', u'gew\xf6hnlicher'), (u'gewiihnliches', u'gew\xf6hnliches'), (u'gewiihnt', u'gew\xf6hnt'), (u'gewiinscht', u'gew\xfcnscht'), (u'gewijhnlichen', u'gew\xf6hnlichen'), (u'gewijnscht', u'gew\xfcnscht'), (u'gewissermafien', u'gewisserma\xdfen'), (u'gewissermallsen', u'gewisserma\xdfen'), (u'gewlllnscht', u'gew\xfcnscht'), (u'Gewohnheitstiter', u'Gewohnheitst\xe4ter'), (u'gewtinscht', u'gew\xfcnscht'), (u'gewunscht', u'gew\xfcnscht'), (u'gewunschten', u'gew\xfcnschten'), (u'Gew\xe9chshaus', u'Gew\xe4chshaus'), (u'gew\xe9hlt', u'gew\xe4hlt'), (u'gew\xe9hnen', u'gew\xf6hnen'), (u'gew\xe9hnlicher', u'gew\xf6hnlicher'), (u'gew\xe9hnst', u'gew\xf6hnst'), (u'gew\xe9hnt', u'gew\xf6hnt'), (u'Gew\xe9hren', u'Gew\xe4hren'), (u'gew\xe9hrt', u'gew\xe4hrt'), (u'Gew\xe9isser', u'Gew\xe4sser'), (u'Gew\xe9ssern', u'Gew\xe4ssern'), (u'gezfichtet', u'gez\xfcchtet'), (u'gezilndet', u'gez\xfcndet'), (u'gez\xe9hlt', u'gez\xe4hlt'), (u'gez\xe9ihlt', u'gez\xe4hlt'), (u'gez\xe9ihmt', u'gez\xe4hmt'), (u'ge\xe9ndert', u'ge\xe4ndert'), (u"GF6l'1Z6fUf", u'Grenze f\xfcr'), (u'Gfirtel', u'G\xfcrtel'), (u'Gfirtner', u'G\xe4rtner'), (u'Gfiste', u'G\xe4ste'), (u'Gfitter', u'G\xf6tter'), (u'Ghrchen', u'\xd6hrchen'), (u'gibtjede', u'gibt jede'), (u'gibtk', u"gibt's"), (u'gibts', u"gibt's"), (u'gieBen', u'gie\xdfen'), (u'GieBkanne', u'Gie\xdfkanne'), (u'gief$t', u'gie\xdft'), (u'giefit', u'gie\xdft'), (u'gielit', u'gie\xdft'), (u'gignalton', u'Signalton'), (u'giinstiger', u'g\xfcnstiger'), (u'Giire', u'G\xf6re'), (u'Giite', u'G\xfcte'), (u'giitiger', u'g\xfctiger'), (u'Giitter', u'G\xf6tter'), (u'Giittliche', u'G\xf6ttliche'), (u'giittlichen', u'g\xf6ttlichen'), (u'Gijte', u'G\xfcte'), (u'Gijtel', u'G\xfcte!'), (u'Gilrtel', u'G\xfcrtel'), (u'Gilte', u'G\xfcte'), (u'Giltiger', u'G\xfctiger'), (u'Gitarrenkl\xe9nge', u'Gitarrenkl\xe4nge'), (u'Gite', u'G\xfcte'), (u'GIUck', u'Gl\xfcck'), (u"GIUCKliCl'1", u'Gl\xfccklich'), (u"GL'lte", u'G\xfcte'), (u'Glaubwurdigkeit', u'Glaubw\xfcrdigkeit'), (u'Glaubwurdigkeitl', u'Glaubw\xfcrdigkeit!'), (u'glaubw\ufb02rdig', u'glaubw\xfcrdig'), (u'glb', u'gib'), (u'glbt', u'gibt'), (u'Gle/ch', u'Gleich'), (u'gleichgiiltig', u'gleichg\xfcltig'), (u'gleichm\xe9mig', u'gleichm\xe4\xdfig'), (u'Glfick', u'Gl\xfcck'), (u'glficklich', u'gl\xfccklich'), (u'Glfickspilz', u'Gl\xfcckspilz'), (u'Gliick', u'Gl\xfcck'), (u'Gliickchen', u'Gl\xf6ckchen'), (u'gliicklich', u'gl\xfccklich'), (u'gliicklicher', u'gl\xfccklicher'), (u'Gliicksbringer', u'Gl\xfccksbringer'), (u'Gliickssfr\xe9hne', u'Gl\xfccksstr\xe4hne'), (u'Gliickwunsch', u'Gl\xfcckwunsch'), (u'gliilcklich', u'gl\xfccklich'), (u'Glijck', u'Gl\xfcck'), (u'glijcklich', u'gl\xfccklich'), (u'Glilck', u'Gl\xfcck'), (u'glilcklich', u'gl\xfccklich'), (u'Glilckwunsch', u'Gl\xfcckwunsch'), (u'Glillck', u'Gl\xfcck'), (u'gllinstig', u'g\xfcnstig'), (u'gllinstigem', u'g\xfcnstigem'), (u'gllinstigen', u'g\xfcnstigen'), (u'glljcklich', u'gl\xfccklich'), (u'glllicklich', u'gl\xfccklich'), (u'glllickliche', u'gl\xfcckliche'), (u'Glllte', u'G\xfcte'), (u'Glorifiziertl', u'Glorifiziert!'), (u'glticklich', u'gl\xfccklich'), (u'Gltickszahlen', u'Gl\xfcckszahlen'), (u'gltlckliohes', u'gl\xfcckliches'), (u'Gluck', u'Gl\xfcck'), (u'glucklich', u'gl\xfccklich'), (u'gluckliche', u'gl\xfcckliche'), (u'GLUCKSELIGKEIT', u'GL\xdcCKSELIGKEIT'), (u'Gluckwunsch', u'Gl\xfcckwunsch'), (u'Gluok', u'Gl\xfcck'), (u'gluoklich', u'gl\xfccklich'), (u'Glupsch\xe9ugige', u'Glupsch\xe4ugige'), (u'glutheilie', u'gluthei\xdfe'), (u'gl\xe9inzende', u'gl\xe4nzende'), (u'gl\xe9nzende', u'gl\xe4nzende'), (u'gl\xe9nzte', u'gl\xe4nzte'), (u'Gl\xe9ser', u'Gl\xe4ser'), (u'gl\xe9ubige', u'gl\xe4ubige'), (u'Gl\xe9ubigen', u'Gl\xe4ubigen'), (u'Gl\ufb02ck', u'Gl\xfcck'), (u'Gl\ufb02cklich', u'Gl\xfccklich'), (u'Gl\ufb02ckstag', u'Gl\xfcckstag'), (u'Gl\ufb02ckwilnsche', u'Gl\xfcckw\xfcnsche'), (u'gnidig', u'gn\xe4dig'), (u'Gnllnden', u'Gr\xfcnden'), (u'gn\xe9dig', u'gn\xe4dig'), (u'gn\xe9dige', u'gn\xe4dige'), (u'gn\xe9digen', u'gn\xe4digen'), (u'Gn\xe9digste', u'Gn\xe4digste'), (u'gn\xe9idig', u'gn\xe4dig'), (u'Goff', u'Gott'), (u'Golfballweili', u'Golfballwei\xdf'), (u'gonnst', u'g\xf6nnst'), (u'gottesfllirchtiger', u'gottesf\xfcrchtiger'), (u'Gottverdammt', u'Gott verdammt'), (u'Go\ufb02', u'Gott'), (u'Gr6Be', u'Gr\xf6\xdfe'), (u'gr6Ber', u'gr\xf6\xdfer'), (u'gr6Bere', u'gr\xf6\xdfere'), (u'gr6Beren', u'gr\xf6\xdferen'), (u'Gr6Bte', u'Gr\xf6\xdfte'), (u'Gr6Bten', u'Gr\xf6\xdften'), (u'gr6Bter', u'gr\xf6\xdfter'), (u'gr6Btes', u'gr\xf6\xdftes'), (u'gr6f$te', u'gr\xf6\xdfte'), (u'gr6f$ten', u'gr\xf6\xdften'), (u'gr6f5ten', u'gr\xf6\xdften'), (u'gr6I3ter', u'gr\xf6\xdfter'), (u'gr6ISten', u'gr\xf6\xdften'), (u'Gr6l3e', u'Gr\xf6\xdfe'), (u'gr6l3ter', u'gr\xf6\xdfter'), (u'Grabst\xe9tte', u'Grabst\xe4tte'), (u'gratulierel', u'gratuliere!'), (u'grClf$en', u'gr\xfc\xdfen'), (u'grfilieren', u'gr\xf6\xdferen'), (u'Grfiner', u'Gr\xfcner'), (u'griil3e', u'gr\xfc\xdfe'), (u'griiliere', u'gr\xf6\xdfere'), (u'griiliten', u'gr\xf6\xdften'), (u'griin', u'gr\xfcn'), (u'Griinde', u'Gr\xfcnde'), (u'Griinden', u'Gr\xfcnden'), (u'griindlich', u'gr\xfcndlich'), (u'Griine', u'Gr\xfcne'), (u'griinen', u'gr\xfcnen'), (u'Griiner', u'Gr\xfcner'), (u'griin\xe9iugige', u'gr\xfcn\xe4ugige'), (u'griin\xe9iugiges', u'gr\xfcn\xe4ugiges'), (u'grii\ufb02te', u'gr\xf6\xdfte'), (u'Grijbeln', u'Gr\xfcbeln'), (u'griJBen', u'gr\xfc\xdfen'), (u'grijn', u'gr\xfcn'), (u'Grijnde', u'Gr\xfcnde'), (u'grijnden', u'gr\xfcnden'), (u'grijndlich', u'gr\xfcndlich'), (u'grijnes', u'gr\xfcnes'), (u'Grijnfutter', u'Gr\xfcnfutter'), (u'Grilbelt', u'Gr\xfcbelt'), (u'grilfken', u'gr\xfc\xdfen'), (u'Grillh\xe9hnchen', u'Grillh\xe4hnchen'), (u'Grilnde', u'Gr\xfcnde'), (u'Grilnden', u'Gr\xfcnden'), (u'grilndet', u'gr\xfcndet'), (u'grilndlich', u'gr\xfcndlich'), (u'grilndlicherf', u'gr\xfcndlicher!'), (u'grilndlichl', u'gr\xfcndlich!'), (u'grilne', u'gr\xfcne'), (u'Grilnschn\xe9bel', u'Gr\xfcnschn\xe4bel'), (u'grim', u'gr\xfcn'), (u'Grime', u'Gr\xf6\xdfe'), (u'grinco', u'gringo'), (u'Grllinde', u'Gr\xfcnde'), (u'grllinden', u'gr\xfcnden'), (u'grllindlich', u'gr\xfcndlich'), (u'grlllnes', u'gr\xfcnes'), (u'Gro/3artig', u'Gro\xdfartig'), (u'gro/3es', u'gro\xdfes'), (u'gro/3zUgig', u'gro\xdfz\xfcgig'), (u'Gro/Bstadt', u'Gro\xdfstadt'), (u'gro/Ken', u'gro\xdfen'), (u'groB', u'gro\xdf'), (u'groBartig', u'gro\xdfartig'), (u'GroBe', u'Gro\xdfe'), (u'GroBes', u'Gro\xdfes'), (u'GroBmutter', u'Gro\xdfmutter'), (u'GroBteil', u'Gro\xdfteil'), (u'groBziJgiger', u'gro\xdfz\xfcgiger'), (u'grof$', u'gro\xdf'), (u'grof$artig', u'gro\xdfartig'), (u'grof$artigen', u'gro\xdfartigen'), (u'grof$e', u'gro\xdfe'), (u'grof$er', u'gro\xdfer'), (u'grof$es', u'gro\xdfes'), (u'grof3', u'gro\xdf'), (u'grof3>artige', u'gro\xdfartige'), (u'Grof3e', u'Gro\xdfe'), (u'grof3en', u'gro\xdfen'), (u'grof3erAlien', u'gro\xdfer Alien'), (u'grof5es', u'gro\xdfes'), (u'Grofbvaters', u'Gro\xdfvaters'), (u'grofi', u'gro\xdf'), (u'Grofiangriffs', u'Gro\xdfangriffs'), (u'Grofiartig', u'Gro\xdfartig'), (u'grofiartige', u'gro\xdfartige'), (u'grofiartigen', u'gro\xdfartigen'), (u'grofiartiger', u'gro\xdfartiger'), (u'Grofiartiges', u'Gro\xdfartiges'), (u'Grofibritannien', u'Gro\xdfbritannien'), (u'Grofidiebstahl', u'Gro\xdfdiebstahl'), (u'Grofie', u'Gro\xdfe'), (u'grofier', u'gro\xdfer'), (u'grofies', u'gro\xdfes'), (u'grofiten', u'gr\xf6\xdften'), (u'grofk', u'gro\xdf'), (u'Grofkartig', u'Gro\xdfartig'), (u'grofke', u'gro\xdfe'), (u'Grofken', u'Gro\xdfen'), (u'Grofker', u'Gro\xdfer'), (u'Grofkvater', u'Gro\xdfvater'), (u'grofLe', u'gro\xdfe'), (u'grofler', u'gro\xdfer'), (u'groflsartig', u'gro\xdfartig'), (u'groflsartige', u'gro\xdfartige'), (u'Groflse', u'Gro\xdfe'), (u'groflsen', u'gro\xdfen'), (u'Grofser', u'Gro\xdfer'), (u'grol', u'gro\xdf'), (u"grol'3>en", u'gro\xdfen'), (u'grol2>', u'gro\xdf'), (u'grol2>en', u'gro\xdfen'), (u'grol3>es', u'gro\xdfes'), (u'grol3e', u'gro\xdfe'), (u'grol3er', u'gro\xdfer'), (u'Grol3raum', u'Gro\xdfraum'), (u'groli', u'gro\xdf'), (u'Groliartig', u'Gro\xdfartig'), (u'groliartige', u'gro\xdfartige'), (u'groliartigen', u'gro\xdfartigen'), (u'grolie', u'gro\xdfe'), (u'grolien', u'gro\xdfen'), (u'groliherzig', u'gro\xdfherzig'), (u'Grolimutter', u'Gro\xdfmutter'), (u'Grolisegel', u'Gro\xdfsegel'), (u'Grolkvater', u'Gro\xdfvater'), (u'groller', u'gro\xdfer'), (u'Grollser', u'Gro\xdfer'), (u'grollzugig', u'gro\xdfz\xfcgig'), (u'grolS', u'gro\xdf'), (u'grolSe', u'gro\xdfe'), (u'GrolSeltern', u'Gro\xdfeltern'), (u'grolSer', u'gro\xdfer'), (u'GrolSvater', u'Gro\xdfvater'), (u'grolZ~', u'gro\xdfe'), (u'gror$er', u'gro\xdfer'), (u'grorker', u'gro\xdfer'), (u'grosses', u'gro\xdfes'), (u'GROSSTE', u'GR\xd6SSTE'), (u'gro\ufb02', u'gro\xdf'), (u'gro\ufb02e', u'gro\xdfe'), (u'Gro\ufb02stadtkind', u'Gro\xdfstadtkind'), (u'Gro\ufb02vater', u'Gro\xdfvater'), (u'Grtin', u'Gr\xfcn'), (u'Grtmde', u'Gr\xfcnde'), (u'GruB', u'Gru\xdf'), (u'Grubenausg\xe9nge', u'Grubenausg\xe4nge'), (u'Gruf$', u'Gru\xdf'), (u'grUf$en', u'gr\xfc\xdfen'), (u'grufit', u'gr\xfc\xdft'), (u'Gruli', u'Gru\xdf'), (u'Grulikarte', u'Gru\xdfkarte'), (u'Grulikarten', u'Gru\xdfkarten'), (u'Grun', u'Gr\xfcn'), (u'grundlich', u'gr\xfcndlich'), (u'Grundstiick', u'Grundst\xfcck'), (u'grunds\xe9tzlich', u'grunds\xe4tzlich'), (u'grune', u'gr\xfcne'), (u'grunen', u'gr\xfcnen'), (u'Gr\xe9ben', u'Gr\xe4ben'), (u'gr\xe9bst', u'gr\xe4bst'), (u'gr\xe9fier', u'gr\xf6\xdfer'), (u'gr\xe9fkte', u'gr\xf6\xdfte'), (u'gr\xe9flserer', u'gr\xf6\xdferer'), (u'Gr\xe9ifite', u'Gr\xf6\xdfte'), (u'gr\xe9illten', u'gr\xf6\xdften'), (u'gr\xe9sslich', u'gr\xe4sslich'), (u'Gr\xe9uel', u'Gr\xe4uel'), (u'gr\ufb02ndlich', u'gr\xfcndlich'), (u'gr\ufb02ne', u'gr\xfcne'), (u'gull', u'gut!'), (u'Gummist\xe9psel', u'Gummist\xf6psel'), (u'Gumml', u'Gummi'), (u'GUNSTIGSTEN', u'G\xdcNSTIGSTEN'), (u'Gurtell', u'G\xfcrtel!'), (u'gutaussehend', u'gut aussehend'), (u'gutaussehender', u'gut aussehender'), (u'GUte', u'G\xfcte'), (u'gutgebaut', u'gut gebaut'), (u'gutgehen', u'gut gehen'), (u'Gutmijtigkeit', u'Gutm\xfctigkeit'), (u'g\xe9be', u'g\xe4be'), (u'g\xe9ben', u'g\xe4ben'), (u'g\xe9ibe', u'g\xe4be'), (u'G\xe9ittern', u'G\xf6ttern'), (u'G\xe9lisch', u'G\xe4lisch'), (u'G\xe9lische', u'G\xe4lische'), (u'g\xe9lisches', u'g\xe4lisches'), (u'G\xe9nsehaut', u'G\xe4nsehaut'), (u'G\xe9nsen', u'G\xe4nsen'), (u'G\xe9nze', u'G\xe4nze'), (u'G\xe9rfen', u'G\xe4rten'), (u'G\xe9rtnern', u'G\xe4rtnern'), (u'G\xe9ste', u'G\xe4ste'), (u'G\xe9stezimmer', u'G\xe4stezimmer'), (u'G\xe9tter', u'G\xf6tter'), (u'G\xe9tterspeise', u'G\xf6tterspeise'), (u'G\xe9ttin', u'G\xf6ttin'), (u'G\xe9ttliche', u'G\xf6ttliche'), (u'g\xe9ttlichen', u'g\xf6ttlichen'), (u'G\xe9tze', u'G\xf6tze'), (u'G\u20acfUhl6', u'Gef\xfchle'), (u'G\u20acStFUpp', u'Gestr\xfcpp'), (u"h<'>'r't", u'h\xf6rt'), (u"h<'5r", u'h\xf6r'), (u"h'a'lt", u'h\xe4lt'), (u"H'a'nde", u'H\xe4nde'), (u"H'a'nden", u'H\xe4nden'), (u"H'a'ttest", u'H\xe4ttest'), (u'H/', u'Hi'), (u'H/er', u'Hier'), (u'h/nfer', u'hinter'), (u'h5tte', u'h\xe4tte'), (u'H6fe', u'H\xf6fe'), (u'h6flich', u'h\xf6flich'), (u'H6fling', u'H\xf6fling'), (u'H6hen', u'H\xf6hen'), (u'h6her', u'h\xf6her'), (u'h6here', u'h\xf6here'), (u'H6HERER', u'H\xd6HERER'), (u'H6hle', u'H\xf6hle'), (u'H6l1e', u'H\xf6rte'), (u'H6lle', u'H\xf6lle'), (u'H6llen', u'H\xf6llen'), (u'h6lte', u'h\xf6rte'), (u'H6r', u'H\xf6r'), (u'h6re', u'h\xf6re'), (u'h6ren', u'h\xf6ren'), (u'H6rer', u'H\xf6rer'), (u'H6rner', u'H\xf6rner'), (u'h6rst', u'h\xf6rst'), (u'h6rt', u'h\xf6rt'), (u'h6rte', u'h\xf6rte'), (u'Ha/s', u'Hals'), (u'Haarbijrstel', u'Haarb\xfcrste!'), (u'Haarhfirste', u'Haarb\xfcrste'), (u'Haarl', u'Haar!'), (u'Haarstr\xe9hne', u'Haarstr\xe4hne'), (u"hab'jemanden", u"hab' jemanden"), (u'Hah', u'H\xe4h'), (u'halbstlllndiges', u'halbst\xfcndiges'), (u'halbvervvandelt', u'halbverwandelt'), (u'halfef', u'haltet'), (u'Hallfjchen', u'Hall\xf6chen'), (u'hallol', u'hallo!'), (u'Halsb\xe9nder', u'Halsb\xe4nder'), (u'Halsl', u'Hals!'), (u'haltenl', u'halten!'), (u'Haltjohnny', u'Halt Johnny'), (u'Hammersch\xe9del', u'Hammersch\xe4del'), (u'Handfl\xe9che', u'Handfl\xe4che'), (u'Handlungsstr\xe9nge', u'Handlungsstr\xe4nge'), (u'harfe', u'harte'), (u'hartn\xe9ickig', u'hartn\xe4ckig'), (u'Hasenful', u'Hasenfu\xdf'), (u'Hasenfull', u'Hasenfu\xdf'), (u'hassq', u'hasse'), (u'Hastja', u'Hast ja'), (u'hatjetzt', u'hat jetzt'), (u'hatta', u'hatte'), (u'Haupfbus', u'Hauptbus'), (u'Hauptaktion\xe9ire', u'Hauptaktion\xe4re'), (u'Hauptaktion\xe9irinnen', u'Hauptaktion\xe4rinnen'), (u'Hauptkabell', u'Hauptkabel!'), (u'haupts\xe9chlich', u'haupts\xe4chlich'), (u'haupts\xe9ichlich', u'haupts\xe4chlich'), (u'Haupttrib\ufb02ne', u'Haupttrib\xfcne'), (u'Hauptverschwiirer', u'Hauptverschw\xf6rer'), (u'Hauptwasserrohrwar', u'Hauptwasserrohr war'), (u'Hausfirzte', u'Haus\xe4rzte'), (u'Haush\xe9lterin', u'Haush\xe4lterin'), (u'Hausschlilssel', u'Hausschl\xfcssel'), (u'Haustilr', u'Haust\xfcr'), (u'Hausubervvachung', u'Haus\xfcberwachung'), (u'ha\xdft', u'hasst'), (u'Hbr', u'H\xf6r'), (u"hc'5ren", u'h\xf6ren'), (u"hc'\xa7r", u'h\xf6r'), (u'hdchsfens', u'h\xf6chstens'), (u'Hdchstleistung', u'H\xf6chstleistung'), (u'hdher', u'h\xf6her'), (u'Hdlle', u'H\xf6lle'), (u'Hdllenfeuer', u'H\xf6llenfeuer'), (u'hdre', u'h\xf6re'), (u'hdren', u'h\xf6ren'), (u'hdrsf', u'h\xf6rst'), (u'hdrten', u'horten'), (u'He/nr/ch', u'Heinrich'), (u'hedeutest', u'bedeutest'), (u'hegrfille', u'begr\xfc\xdfe'), (u'heiB', u'hei\xdf'), (u'heiBe', u'hei\xdfe'), (u'heiBen', u'hei\xdfen'), (u'HeiBer', u'Hei\xdfer'), (u'heiBes', u'hei\xdfes'), (u'heiBt', u'hei\xdft'), (u'heif$', u'hei\xdf'), (u'heif$e', u'hei\xdfe'), (u'heif$es', u'hei\xdfes'), (u'Heif$t', u'Hei\xdft'), (u'heif3>en', u'hei\xdfen'), (u'heif3t', u'hei\xdft'), (u'heif5en', u'hei\xdfen'), (u'heifie', u'hei\xdfe'), (u'heifiem', u'hei\xdfem'), (u'heifien', u'hei\xdfen'), (u'heifit', u'hei\xdft'), (u'heifkt', u'hei\xdft'), (u'heifLt', u'hei\xdft'), (u'heifZ>e', u'hei\xdfe'), (u"heil'$", u'hei\xdf'), (u"heil'$en", u'hei\xdfen'), (u"heil'$t", u'hei\xdft'), (u"heil'Se", u'hei\xdfe'), (u'heil2>en', u'hei\xdfen'), (u'heil2>t', u'hei\xdft'), (u'heil3en', u'hei\xdfen'), (u'heil3t', u'hei\xdft'), (u'heil5e', u'hei\xdfe'), (u'heil5t', u'hei\xdft'), (u'heili', u'hei\xdf'), (u'heilies', u'hei\xdfes'), (u'heilit', u'hei\xdft'), (u'heillst', u'hei\xdft'), (u'heilZ~', u'hei\xdft'), (u'heir$', u'hei\xdf'), (u'heisst', u'hei\xdft'), (u'Helllger', u'Heiliger'), (u'Helzlichen', u'Herzlichen'), (u"Hen'je", u'Herrje'), (u'herabstofien', u'herabsto\xdfen'), (u'heransttlrmtet', u'heranst\xfcrmtet'), (u'heraush\xe9ngendem', u'heraush\xe4ngendem'), (u'herhfiren', u'herh\xf6ren'), (u'herh\xe9ren', u'herh\xf6ren'), (u'heriiber', u'her\xfcber'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herumf\xe9hrt', u'herumf\xe4hrt'), (u'herumkehren', u'herum kehren'), (u'herumlluft', u'heruml\xe4uft'), (u'herumzuwijhlen', u'herumzuw\xfchlen'), (u'Herzrhythmusst\xe9rungen', u'Herzrhythmusst\xf6rungen'), (u'Herzschlielierei', u'Herzschlie\xdferei'), (u'Herzstlllck', u'Herzst\xfcck'), (u'Heuta', u'Heute'), (u'Hexenhtltte', u'Hexenh\xfctte'), (u'HeY\xb7', u'Hey.'), (u'Hfibscheste', u'H\xfcbscheste'), (u'hfiherer', u'h\xf6herer'), (u'hfihsch', u'h\xfcbsch'), (u'Hfilfte', u'H\xe4fte'), (u'Hfille', u'H\xf6lle'), (u'hfilt', u'h\xe4lt'), (u'hfiltst', u'h\xe4ltst'), (u'Hfin', u'H\xf6rt'), (u'hfipft', u'h\xfcpft'), (u'Hfir', u'H\xf6r'), (u'hfiren', u'h\xf6ren'), (u'hfirst', u'h\xf6rst'), (u'hfirt', u'h\xf6rt'), (u'hfitte', u'h\xe4tte'), (u'hfitten', u'h\xe4tten'), (u'hie/3', u'hie\xdf'), (u'hieB', u'hie\xdf'), (u'hiefL', u'hie\xdf'), (u'hiel3', u'hie\xdf'), (u'hiells', u'hie\xdf'), (u'hierhergereist', u'hierher gereist'), (u'hierherzuriick', u'hierher zur\xfcck'), (u'hierijber', u'hier\xfcber'), (u'hierjede', u'hier jede'), (u'hierjeder', u'hier jeder'), (u'hierl', u'hier!'), (u'hierL', u'hie\xdf'), (u'hierwar', u'hier war'), (u'hierzum', u'hier-zum'), (u'hie\ufb02', u'hie\xdf'), (u'Hiibsch', u'H\xfcbsch'), (u'Hiibsche', u'H\xfcbsche'), (u'Hiibscher', u'H\xfcbscher'), (u'hiibschl', u'h\xfcbsch!'), (u'hiichst', u'h\xf6chst'), (u'hiichstens', u'h\xf6chstens'), (u'hiichster', u'h\xf6chster'), (u'hiichstpersiinlich', u'h\xf6chstpers\xf6nlich'), (u'Hiifen', u'H\xf6fen'), (u'hiifischen', u'h\xf6fischen'), (u'Hiifling', u'H\xf6fling'), (u'Hiigel', u'H\xfcgel'), (u'Hiihe', u'H\xf6he'), (u'Hiihepunkt', u'H\xf6hepunkt'), (u'hiiher', u'h\xf6her'), (u'hiihere', u'h\xf6here'), (u'Hiihlen', u'H\xf6hlen'), (u'Hiihnchen', u'H\xfchnchen'), (u'Hiihner', u'H\xfchner'), (u'Hiihnerkl\xe9fkchen', u'H\xfchnerkl\xf6\xdfchen'), (u'Hiilfte', u'H\xe4lfte'), (u'Hiille', u'H\xf6lle'), (u'Hiillenstreitmacht', u'H\xf6llenstreitmacht'), (u'hiillischen', u'h\xf6llischen'), (u'hiipfen', u'h\xfcpfen'), (u'Hiir', u'H\xf6r'), (u'hiire', u'h\xf6re'), (u'Hiiren', u'H\xf6ren'), (u'Hiirer', u'H\xf6rer'), (u'Hiiret', u'H\xf6ret'), (u'Hiirjetzt', u'H\xf6r jetzt'), (u'Hiirt', u'H\xf6rt'), (u'hiirte', u'h\xf6rte'), (u'hiirtest', u'h\xf6rtest'), (u'Hiissliches', u'H\xe4ssliches'), (u'Hiite', u'H\xfcte'), (u'Hiiten', u'H\xfcten'), (u'hiitet', u'h\xfctet'), (u'Hiitte', u'H\xe4tte'), (u'hiitten', u'h\xe4tten'), (u'Hiitten', u'H\xfctten'), (u'hijbsch', u'h\xfcbsch'), (u'hijbschen', u'h\xfcbschen'), (u'hijbsches', u'h\xfcbsches'), (u'Hijfte', u'H\xfcfte'), (u'Hijften', u'H\xfcften'), (u'Hijgel', u'H\xfcgel'), (u'Hijgels', u'H\xfcgels'), (u'Hijpfburgl', u'H\xfcpfburg!'), (u'hijpfe', u'h\xfcpfe'), (u'hijpfen', u'h\xfcpfen'), (u'hijre', u'h\xf6re'), (u'Hijren', u'H\xf6ren'), (u'Hijrer', u'H\xf6rer'), (u'hilbsch', u'h\xfcbsch'), (u'hilbsche', u'h\xfcbsche'), (u'hilbschen', u'h\xfcbschen'), (u'hilbscher', u'h\xfcbscher'), (u'Hilfel', u'Hilfe!'), (u'HILFSPERSONALI', u'HILFSPERSONAL:'), (u'Hilgel', u'H\xfcgel'), (u'hillig', u'billig'), (u'Hilt', u'H\xe4lt'), (u'hil\ufb02', u'hilft'), (u'Him', u'Hirn'), (u'Himmell', u'Himmel!'), (u'hineintr\xe9umen', u'hineintr\xe4umen'), (u'hinfijhrt', u'hinf\xfchrt'), (u'hingefiihrt', u'hingef\xfchrt'), (u'hingehdren', u'hingeh\xf6ren'), (u'hingehiiren', u'hingeh\xf6ren'), (u'hinilber', u'hin\xfcber'), (u'hinreiliend', u'hinrei\xdfend'), (u'hinschmeifit', u'hinschmei\xdft'), (u'HintenN\xe4ldler', u'Hinterw\xe4ldler'), (u'Hintergrundl\xe9rm', u'Hintergrundl\xe4rm'), (u'hinterhfiltig', u'hinterh\xe4ltig'), (u'hinterh\xe9iltiger', u'hinterh\xe4ltiger'), (u'Hinterh\xe9iltigl', u'Hinterh\xe4ltig!'), (u'hinterh\xe9ltige', u'hinterh\xe4ltige'), (u'hinterh\xe9ltiger', u'hinterh\xe4ltiger'), (u'Hinterk\xe9pfen', u'Hinterk\xf6pfen'), (u'hinterlieBe', u'hinterlie\xdfe'), (u'hinterl\xe9sst', u'hinterl\xe4sst'), (u'Hintersttlbchen', u'Hinterst\xfcbchen'), (u'Hintertur', u'Hintert\xfcr'), (u'hinwollen', u'hin wollen'), (u'hinzufuhren', u'hinzuf\xfchren'), (u'hinzuf\ufb02gten', u'hinzuf\xfcgten'), (u'Hirnrnel', u'Himmel'), (u'hirteste', u'h\xe4rteste'), (u'hisslich', u'h\xe4sslich'), (u'Hi\xe9tte', u'H\xe4tte'), (u'Hler', u'Her'), (u'hler', u'hier'), (u'hllf', u'hilf'), (u'hllibsch', u'h\xfcbsch'), (u'Hllindinnen', u'H\xfcndinnen'), (u'Hlllpf', u'H\xfcpf'), (u'hln', u'hin'), (u'Hlnbllck', u'Hinblick'), (u'hltte', u'h\xe4tte'), (u'Hltten', u'H\xe4tten'), (u'Hochfrequenzst\xe9rungenl', u'Hochfrequenzst\xf6rungen!'), (u'hochl', u'hoch!'), (u'Hochsicherheitsgef\xe9ngnis', u'Hochsicherheitsgef\xe4ngnis'), (u'Hochstens', u'H\xf6chstens'), (u'Hochzeitskostiime', u'Hochzeitskost\xfcme'), (u'Hohek', u'Hoheit'), (u'Hohepunkt', u'H\xf6hepunkt'), (u'hohere', u'h\xf6here'), (u'HoHo', u'Hoho'), (u'Holle', u'H\xf6lle'), (u'Holzsttlck', u'Holzst\xfcck'), (u'hor', u'h\xf6r'), (u'Horen', u'H\xf6ren'), (u'Hosenscheifker', u'Hosenschei\xdfer'), (u'Hosenscheiiker', u'Hosenschei\xdfer'), (u'Hosenschei\ufb02er', u'Hosenschei\xdfer'), (u'Hotelg\xe9ste', u'Hotelg\xe4ste'), (u'HQHE', u'H\xd6HE'), (u'htibscher', u'h\xfcbscher'), (u'Htihnchen', u'H\xfchnchen'), (u'Htipfen', u'H\xfcpfen'), (u'Htipfenl', u'H\xfcpfen!'), (u'htiren', u'h\xf6ren'), (u'hubsch', u'h\xfcbsch'), (u'hubsche', u'h\xfcbsche'), (u'hubschen', u'h\xfcbschen'), (u'Hubscher', u'H\xfcbscher'), (u'hubscheres', u'h\xfcbscheres'), (u'Hubsches', u'H\xfcbsches'), (u'Huhner', u'H\xfchner'), (u'humon/oll', u'humorvoll'), (u'Hundchen', u'H\xfcndchen'), (u'Hundebullel', u'Hundebulle!'), (u'Hunden\xe9pfe', u'Hunden\xe4pfe'), (u'Hundescheilie', u'Hundeschei\xdfe'), (u'Hundl', u'Hund!'), (u'HUNG', u'H\xfclle'), (u'hunte', u'bunte'), (u'Hurensiihne', u'Hurens\xf6hne'), (u'Hurensohnl', u'Hurensohn!'), (u'Huterin', u'H\xfcterin'), (u'HUtte', u'H\xfctte'), (u'Hypoglyk\xe9mie', u'Hypoglyk\xe4mie'), (u'h\xe9', u'h\xe4'), (u'H\xe9chste', u'H\xf6chste'), (u'h\xe9chsten', u'h\xf6chsten'), (u'H\xe9chstens', u'H\xf6chstens'), (u'H\xe9chstpers\xe9nlich', u'H\xf6chstpers\xf6nlich'), (u'H\xe9fen', u'H\xe4fen'), (u'h\xe9flich', u'h\xf6flich'), (u'H\xe9ftling', u'H\xe4ftling'), (u'H\xe9ftlinge', u'H\xe4ftlinge'), (u'H\xe9ftlingsr\xe9te', u'H\xe4ftlingsr\xe4te'), (u'H\xe9hef', u'H\xf6he!'), (u'H\xe9hepunkt', u'H\xf6hepunkt'), (u'h\xe9her', u'h\xf6her'), (u'h\xe9heren', u'h\xf6heren'), (u'H\xe9i', u'H\xe4'), (u'H\xe9ifen', u'H\xe4fen'), (u'H\xe9ilften', u'H\xe4lften'), (u'h\xe9iltst', u'h\xe4ltst'), (u'H\xe9inde', u'H\xe4nde'), (u'h\xe9ing', u'h\xe4ng'), (u'h\xe9ingen', u'h\xe4ngen'), (u'h\xe9ingt', u'h\xe4ngt'), (u'h\xe9ir', u'h\xf6r'), (u'h\xe9irter', u'h\xe4rter'), (u'h\xe9itt', u'h\xe4tt'), (u'H\xe9itte', u'H\xe4tte'), (u'h\xe9itten', u'h\xe4tten'), (u'h\xe9ittest', u'h\xe4ttest'), (u'h\xe9iufig', u'h\xe4ufig'), (u'H\xe9lfte', u'H\xe4lfte'), (u'H\xe9lle', u'H\xf6lle'), (u'H\xe9llen', u'H\xf6llen'), (u'H\xe9llenloch', u'H\xf6llenloch'), (u'h\xe9llisch', u'h\xf6llisch'), (u'h\xe9llische', u'h\xf6llische'), (u'h\xe9lt', u'h\xe4lt'), (u'H\xe9ltst', u'H\xe4ltst'), (u'h\xe9lzernes', u'h\xf6lzernes'), (u'h\xe9misch', u'h\xe4misch'), (u'H\xe9mmer', u'H\xe4mmer'), (u'h\xe9mmernde', u'h\xe4mmernde'), (u'H\xe9moglobin', u'H\xe4moglobin'), (u'H\xe9morrhoiden', u'H\xe4morrhoiden'), (u'H\xe9ndchen', u'H\xe4ndchen'), (u'H\xe9nde', u'H\xe4nde'), (u'H\xe9ndedruck', u'H\xe4ndedruck'), (u'H\xe9nden', u'H\xe4nden'), (u'H\xe9ndlerin', u'H\xe4ndlerin'), (u'h\xe9ng', u'h\xe4ng'), (u'h\xe9ngen', u'h\xe4ngen'), (u'h\xe9ngend', u'h\xe4ngend'), (u'h\xe9ngst', u'h\xe4ngst'), (u'h\xe9ngt', u'h\xe4ngt'), (u'H\xe9r', u'H\xf6r'), (u'h\xe9re', u'h\xf6re'), (u'h\xe9ren', u'h\xf6ren'), (u'H\xe9rgesch\xe9idigte', u'H\xf6rgesch\xe4digte'), (u'h\xe9rst', u'h\xf6rst'), (u'h\xe9rt', u'h\xf6rt'), (u'h\xe9rte', u'h\xf6rte'), (u'h\xe9rten', u'h\xf6rten'), (u'h\xe9rter', u'h\xe4rter'), (u'H\xe9rzu', u'H\xf6r zu'), (u'H\xe9schen', u'Haschen'), (u'h\xe9sslich', u'h\xe4sslich'), (u'h\xe9sslicher', u'h\xe4sslicher'), (u'h\xe9sslichl', u'h\xe4sslich'), (u'h\xe9sslichste', u'h\xe4sslichste'), (u'h\xe9tt', u'h\xe4tt'), (u'H\xe9tte', u'H\xe4tte'), (u'h\xe9tten', u'h\xe4tten'), (u"h\xe9tten's", u"h\xe4tten's"), (u'h\xe9ttest', u'h\xe4ttest'), (u'H\xe9ttet', u'H\xe4ttet'), (u'H\xe9ufi', u'H\xe4ufi'), (u'h\xe9ufig', u'h\xe4ufig'), (u'h\xe9ufiger', u'h\xe4ufiger'), (u'H\xe9ufigkeit', u'H\xe4ufigkeit'), (u'h\xe9ufigsten', u'h\xe4ufigsten'), (u'H\xe9user', u'H\xe4user'), (u'H\xe9usern', u'H\xe4usern'), (u'h\xe9ute', u'h\xe4ute'), (u'H\u20acY', u'Hey'), (u'H\ufb02geln', u'H\xfcgeln'), (u"i'\xa7ffne", u'\xd6ffne'), (u'I/egen', u'liegen'), (u'I5sst', u'l\xe4sst'), (u'I5stern', u'l\xe4stern'), (u'I6sen', u'l\xf6sen'), (u'Ia\xdf', u'lass'), (u'Ia\xdft', u'lasst'), (u'Icll', u'Ich'), (u'identifizieet', u'identifiziert'), (u'IDENTITAT', u'IDENTIT\xc4T'), (u'IE', u'I\xdf'), (u'Iebendigl', u'lebendig!'), (u'Iebenslinglich', u'lebensl\xe4glich'), (u'Iebtjetzt', u'lebt jetzt'), (u'Ieck', u'leck'), (u'Iehn', u'lehn'), (u'Ieid\u201a', u'leid\u201a'), (u'Ieinenlose', u'leinenlose'), (u'Ienistische', u'leninistische'), (u'Ietztendlich', u'letztendlich'), (u'Ifigt', u'l\xfcgt'), (u'Ihrdllirft', u'Ihr d\xfcrft'), (u'ihrja', u'ihr ja'), (u'ihrjemals', u'ihr jemals'), (u'ihrjetzt', u'ihr jetzt'), (u'ihrjeweiliges', u'ihr jeweiliges'), (u'ihrVater', u'ihr Vater'), (u'ihrvorstrafenregister', u'ihr Vorstrafenregister'), (u'ihrwahres', u'ihr wahres'), (u'Ihrwerdet', u'Ihr werdet'), (u'ihrzwei', u'ihr zwei'), (u'iibel', u'\xfcbel'), (u'iibemehmen', u'\xfcbernehmen'), (u'iiber', u'\xfcber'), (u'iiberall', u'\xfcberall'), (u'iiberallhin', u'\xfcberallhin'), (u'iiberdauern', u'\xfcberdauern'), (u'iiberdauerte', u'\xfcberdauerte'), (u'iibereinstimmte', u'\xfcbereinstimme'), (u'iiberfallen', u'\xfcberfallen'), (u'iiberfiel', u'\xfcberfiel'), (u'iibergeben', u'\xfcbergeben'), (u'iiberhaupt', u'\xfcberhaupt'), (u'iiberhiirt', u'\xfcberh\xf6rt'), (u'iiberholt', u'\xfcberholt'), (u'iiberholter', u'\xfcberholter'), (u'iiberkam', u'\xfcberkam'), (u'iiberlassen', u'\xfcberlassen'), (u'iiberleben', u'\xfcberleben'), (u'iiberlebt', u'\xfcberlebt'), (u'iiberlegen', u'\xfcberlegen'), (u'iiberlegten', u'\xfcberlegten'), (u'iibernahmen', u'\xfcbernahmen'), (u'iibernehme', u'\xfcbernehme'), (u'iibernehmen', u'\xfcbernehmen'), (u'iibernimmt', u'\xfcbernimmt'), (u'iibernommen', u'\xfcbernommen'), (u'iiberpriife', u'\xfcberpr\xfcfe'), (u'iiberpriifen', u'\xfcberpr\xfcfen'), (u'iiberpriift', u'\xfcberpr\xfcft'), (u'iiberpriiften', u'\xfcberpr\xfcften'), (u'iiberqueren', u'\xfcberqueren'), (u'iiberragen', u'\xfcberragen'), (u'iiberrascht', u'\xfcberrascht'), (u'iiberraschte', u'\xfcberraschte'), (u'iiberreden', u'\xfcberreden'), (u'iiberschritten', u'\xfcberschritten'), (u'iibersetzen', u'\xfcbersetzen'), (u'iibersetzt', u'\xfcbersetzt'), (u'iibersteigt', u'\xfcbersteigt'), (u'iibertragen', u'\xfcbertragen'), (u'iibertreffen', u'\xfcbertreffen'), (u'iibertreib', u'\xfcbertreib'), (u'iibertreiben', u'\xfcbertreiben'), (u'iibertrieben', u'\xfcbertrieben'), (u'iiberzeugen', u'\xfcberzeugen'), (u'iiberzeugt', u'\xfcberzeugt'), (u'iiblich', u'\xfcblich'), (u'iibliche', u'\xfcbliche'), (u'iibrig', u'\xfcbrig'), (u'IieB', u'lie\xdf'), (u'Iiebte', u'liebte'), (u"Iief's", u"lief's"), (u'Iiehe', u'liebe'), (u'Iie\ufb02est', u'lie\xdfest'), (u'iiffentlichen', u'\xf6ffentlichen'), (u'iiffentliches', u'\xf6ffentliches'), (u'iiffnest', u'\xf6ffnest'), (u'iifter', u'\xf6fter'), (u'iihnllchkelt', u'\xc4hnllchkelt'), (u'Iisst', u'l\xe4sst'), (u'ijbel', u'\xfcbel'), (u'ijben', u'\xfcben'), (u'ijberall', u'\xfcberall'), (u'ijberhaupt', u'\xfcberhaupt'), (u'ijberlegene', u'\xfcberlegene'), (u'ijbernehme', u'\xfcbernehme'), (u'ijbernimmst', u'\xfcbernimmst'), (u'ijberprijfen', u'\xfcberpr\xfcfen'), (u'ijberreden', u'\xfcberreden'), (u'ijbertrage', u'\xfcbertrage'), (u'ijberwunden', u'\xfcberwunden'), (u'ijberzeugen', u'\xfcberzeugen'), (u'ijberzogen', u'\xfcberzogen'), (u'Il6her', u'h\xf6her'), (u'IleiB', u'hei\xdf'), (u'Ill', u'III'), (u'Illfie', u'Wie'), (u'Ilrger', u'\xc4rger'), (u'Ilufierste', u'\xc4u\xdferste'), (u'immerja', u'immer ja'), (u'immerjung', u'immer jung'), (u'immerweinen', u'immer weinen'), (u'immerw\xe4hrende', u'immer w\xe4hrende'), (u'immerw\xe9hrende', u'immerw\xe4hrende'), (u'Improvisiation', u'Improvisation'), (u'Impulswellengeschutz', u'Impulswellengesch\xfctz'), (u'INBRUNSTIGE', u'INBR\xdcNSTIGE'), (u'instfindig', u'inst\xe4ndig'), (u'intramuskul\xe9r', u'intramuskul\xe4r'), (u'INVASIONSFLOTFE', u'INVASIONSFLOTTE'), (u'Iosgeliist', u'losgel\xf6st'), (u'Iosgel\xe9st', u'losgel\xf6st'), (u'Ioszuliisen', u'loszul\xf6sen'), (u'ip', u'in'), (u'irn', u'im'), (u'irrefuhren', u'irref\xfchren'), (u'irrefuhrende', u'irref\xfchrende'), (u'istja', u'ist ja'), (u'istjedoch', u'ist jedoch'), (u'istjemand', u'ist jemand'), (u'istjetzt', u'ist jetzt'), (u'istJohnny', u'ist Johnny'), (u'istjung', u'ist jung'), (u'istweg', u'ist weg'), (u'ITIUSSEFI', u'm\xfcssen'), (u'ITIUSSGI7', u'm\xfcssen'), (u'ITTITTRZ', u'Danke.'), (u'Ivl\xe9gliche', u'M\xf6gliche'), (u'I\xe9cheln', u'l\xe4cheln'), (u'I\xe9cherlich', u'l\xe4cherlich'), (u'I\xe9cherlichen', u'l\xe4cherlichen'), (u'I\xe9hmt', u'l\xe4hmt'), (u'I\xe9iuft', u'l\xe4uft'), (u'I\xe9nger', u'l\xe4nger'), (u'I\xe9sst', u'l\xe4sst'), (u'I\xe9sste', u'l\xe4sste'), (u'I\xe9uft', u'l\xe4uft'), (u'J0Shua', u'Joshua'), (u'Jackettkaufen', u'Jackett kaufen'), (u'jahr', u'Jahr'), (u'jahre', u'Jahre'), (u'jahren', u'Jahren'), (u'JAHRIGE', u'J\xc4HRIGE'), (u'jal', u'ja!'), (u'jemandenl', u'jemanden!'), (u'jetztl', u'jetzt!'), (u'jiidisch', u'j\xfcdisch'), (u'Jiingem', u'J\xfcngern'), (u'jiingerwar', u'j\xfcnger war'), (u'Jiingste', u'J\xfcngste'), (u'jilnger', u'j\xfcnger'), (u'Jlllngling', u'J\xfcngling'), (u'job', u'Job'), (u'Jogglng', u'Jogging'), (u'john', u'John'), (u'johnny', u'Johnny'), (u'journalisten', u'Journalisten'), (u'Jullo', u'Julie'), (u'JUNGFRAULICHE', u'JUNGFR\xc4ULICHE'), (u'jungfr\xe9uliche', u'jungfr\xe4uliche'), (u'jungfr\xe9ulichen', u'jungfr\xe4ulichen'), (u'jungfr\xe9ulicher', u'jungfr\xe4ulicher'), (u'Jungfr\xe9ulichkeit', u'Jungfr\xe4ulichkeit'), (u'Jungsl', u'Jungs!'), (u'Jungste', u'J\xfcngste'), (u'Jurlgs', u'Jungs'), (u'Justitzministeriums', u'Justizministeriums'), (u'J\xe9ger', u'J\xe4ger'), (u'J\xe9hrige', u'J\xe4hrige'), (u'j\xe9hrigen', u'j\xe4hrigen'), (u'j\xe9hriger', u'j\xe4hriger'), (u'j\xe9hrlich', u'j\xe4hrlich'), (u'J\xe9iger', u'J\xe4ger'), (u'j\xe9ihrigen', u'j\xe4hrigen'), (u'j\xe9mmerlich', u'j\xe4mmerlich'), (u"k'a'mpfen", u'k\xe4mpfen'), (u'K/no', u'Kino'), (u'K/Varte', u'Warte'), (u'K/Velle', u'Welle'), (u'K5NIGIN', u'K\xd6NIGIN'), (u'K6der', u'K\xf6der'), (u'K6ln', u'K\xf6ln'), (u'K6nig', u'K\xf6nig'), (u'K6nige', u'K\xf6nige'), (u'K6nigin', u'K\xf6nigin'), (u'k6nnen', u'k\xf6nnen'), (u"k6nnen's", u"k\xf6nnen's"), (u'k6nnest', u'k\xf6nntest'), (u'k6nnt', u'k\xf6nnt'), (u'K6nnte', u'K\xf6nnte'), (u"k6nnte's", u"k\xf6nnte's"), (u'k6nnten', u'k\xf6nnten'), (u'k6nntest', u'k\xf6nntest'), (u'K6pfe', u'K\xf6pfe'), (u'K6rper', u'K\xf6rper'), (u'K6rpers', u'K\xf6rpers'), (u'K6stlich', u'K\xf6stlich'), (u'Kabelm\xe9nner', u'Kabelm\xe4nner'), (u'kalf', u'kalt'), (u'kaltblijtig', u'kaltbl\xfctig'), (u'kampfen', u'k\xe4mpfen'), (u'Kampfj\xe9ger', u'Kampfj\xe4ger'), (u'Kanarienviigeln', u'Kanarienv\xf6geln'), (u"kann'sja", u"kann's ja"), (u'kannstja', u'kannst ja'), (u'Kan\xe9len', u'Kan\xe4len'), (u'Kapitan', u'Kapit\xe4n'), (u'Kapitln', u'Kapit\xe4n'), (u'Kapitlnen', u'Kapit\xe4nen'), (u'Kapitlns', u'Kapit\xe4ns'), (u'Kapit\xe9in', u'Kapit\xe4n'), (u'Kapit\xe9inleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ins', u'Kapit\xe4ns'), (u'Kapit\xe9n', u'Kapit\xe4n'), (u'Kapit\xe9nleutnant', u'Kapit\xe4nleutnant'), (u'Kapit\xe9ns', u'Kapit\xe4ns'), (u"Kapt'n", u"K\xe4pt'n"), (u'kaputthaust', u'kaputt haust'), (u'Kartoffelsch\xe9len', u'Kartoffelsch\xe4len'), (u'Kassettenger\xe9it', u'Kassettenger\xe4t'), (u'kbnnen', u'k\xf6nnen'), (u'kbnnten', u'k\xf6nnten'), (u'kdnnen', u'k\xf6nnen'), (u'kdnnfe', u'k\xf6nnte'), (u'kdnnte', u'k\xf6nnte'), (u'ke/ne', u'keine'), (u'Kefn', u'Kein'), (u'Keh/1', u'Kehrt'), (u'Keithl', u'Keith!'), (u'keln', u'kein'), (u'kelne', u'keine'), (u'Keri', u'Kerl'), (u'kfime', u'k\xe4me'), (u'Kfimmer', u'K\xfcmmer'), (u'kfimmere', u'k\xfcmmere'), (u'kfimmern', u'k\xfcmmern'), (u'kfimmert', u'k\xfcmmert'), (u'kfimpft', u'k\xe4mpft'), (u'kfimpften', u'k\xe4mpften'), (u'Kfinig', u'K\xf6nig'), (u'Kfinnen', u'K\xf6nnen'), (u'kfinnte', u'k\xf6nnte'), (u'Kfinnten', u'K\xf6nnten'), (u'Kfinntest', u'K\xf6nntest'), (u'Kfiss', u'K\xfcss'), (u'Kfisschen', u'K\xfcsschen'), (u'Kfissen', u'K\xfcssen'), (u'Kfjnnte', u'K\xf6nnte'), (u'Khnlichkeit', u'\xc4hnlichkeit'), (u'KIar', u'Klar'), (u'Kifig', u'K\xe4fig'), (u'Kiiche', u'K\xfcche'), (u'Kiichenhelfer', u'K\xfcchenhelfer'), (u'Kiichln', u'K\xf6chin'), (u'Kiihe', u'K\xfche'), (u'Kiihlbox', u'K\xfchlbox'), (u'kiihler', u'k\xfchler'), (u'Kiihlschrank', u'K\xfchlschrank'), (u'kiimmem', u'k\xfcmmern'), (u'kiimmer', u'k\xfcmmer'), (u'kiimmere', u'k\xfcmmere'), (u'Kiimmern', u'K\xfcmmern'), (u'kiindigen', u'k\xfcndigen'), (u'Kiinig', u'K\xf6nig'), (u'Kiinige', u'K\xf6nige'), (u'Kiinigen', u'K\xf6nigen'), (u'Kiinigin', u'K\xf6nigin'), (u'Kiiniginnen', u'K\xf6niginnen'), (u'kiinigliche', u'k\xf6nigliche'), (u'kiiniglichen', u'k\xf6niglichen'), (u'kiiniglicher', u'k\xf6niglicher'), (u'Kiinigreichs', u'K\xf6nigreichs'), (u'Kiinigs', u'K\xf6nigs'), (u'Kiinigtum', u'K\xf6nigtum'), (u'kiinne', u'k\xf6nne'), (u'kiinnen', u'k\xf6nnen'), (u'kiinnt', u'k\xf6nnt'), (u'Kiinnte', u'K\xf6nnte'), (u'kiinnten', u'k\xf6nnten'), (u'kiinntest', u'k\xf6nntest'), (u'kiinntet', u'k\xf6nntet'), (u'Kiinstler', u'K\xfcnstler'), (u'kiinstlerischen', u'k\xfcnstlerischen'), (u'kiipfen', u'k\xf6pfen'), (u'Kiirper', u'K\xf6rper'), (u'Kiirperfunktionen', u'K\xf6rperfunktionen'), (u'Kiirperhaltung', u'K\xf6rperhaltung'), (u'kiirperliche', u'k\xf6rperliche'), (u'Kiirperliches', u'K\xf6rperliches'), (u'Kiirpersprache', u'K\xf6rpersprache'), (u'Kiirperverletzung', u'K\xf6rperverletzung'), (u'kiirzen', u'k\xfcrzen'), (u'kiirzerzutreten', u'k\xfcrzerzutreten'), (u'kiirzeste', u'k\xfcrzeste'), (u'Kiisschen', u'K\xfcsschen'), (u'Kiissen', u'K\xfcssen'), (u'Kiisst', u'K\xfcsst'), (u'Kiiste', u'K\xfcste'), (u'kiistlich', u'k\xf6stlich'), (u'Kijche', u'K\xfcche'), (u'Kijhlschrank', u'K\xfchlschrank'), (u'Kijmmere', u'K\xfcmmere'), (u'kijmmern', u'k\xfcmmern'), (u'kijmmernl', u'k\xfcmmern!'), (u'kijmmerst', u'k\xfcmmerst'), (u'kijmmerten', u'k\xfcmmerten'), (u'kijndigt', u'k\xfcndigt'), (u'kijnnen', u'k\xf6nnen'), (u'kijnnt', u'k\xf6nnt'), (u'kijnnte', u'k\xf6nnte'), (u'kijnnten', u'k\xf6nnten'), (u'Kijnstler', u'K\xfcnstler'), (u'Kijrbis', u'K\xfcrbis'), (u'kijrzlich', u'k\xfcrzlich'), (u'kijrzliche', u'k\xfcrzliche'), (u'Kijrzungen', u'K\xfcrzungen'), (u'kijsst', u'k\xfcsst'), (u'Kijste', u'K\xfcste'), (u'Kilche', u'K\xfcche'), (u'Kilchlein', u'K\xfcchlein'), (u'kilhlen', u'k\xfchlen'), (u'kilhler', u'k\xfchler'), (u'Kilhlkreislauf', u'K\xfchlkreislauf'), (u'Kilhlschrank', u'K\xfchlschrank'), (u'Kilmmern', u'K\xfcmmern'), (u'Kilmmert', u'K\xfcmmert'), (u'kilndigen', u'k\xfcndigen'), (u'kilnstliche', u'k\xfcnstliche'), (u'kilss', u'k\xfcss'), (u'kilsse', u'k\xfcsse'), (u'kilssen', u'k\xfcssen'), (u'Kinderm\xe9dchen', u'Kinderm\xe4dchen'), (u'Kinderspiell', u'Kinderspiel!'), (u'Kindsk\xe9pfe', u'Kindsk\xf6pfe'), (u'kiokflip', u'kickflip'), (u'KIotz', u'Klotz'), (u"KL'lr", u'K\xfcr'), (u"KL'lste", u'K\xfcste'), (u'Klapsmiihle', u'Klapsm\xfchle'), (u'Klassem\xe9dchen', u'Klassem\xe4dchen'), (u'kle/ne', u'kleine'), (u'Kleidergr6Be', u'Kleidergr\xf6\xdfe'), (u'Kleidergrfilie', u'Kleidergr\xf6\xdfe'), (u'Kleinerl', u'Kleiner!'), (u'kleinwiichsige', u'kleinw\xfcchsige'), (u'kleinwilchsiges', u'kleinw\xfcchsiges'), (u'klijger', u'kl\xfcger'), (u'klijgsten', u'kl\xfcgsten'), (u'klilger', u'kl\xfcger'), (u"kLinft'gen", u"k\xfcnft'gen"), (u'klirst', u'kl\xe4rst'), (u'kljmmere', u'k\xfcmmere'), (u'Kllirze', u'K\xfcrze'), (u'kllissen', u'k\xfcssen'), (u'Klliste', u'K\xfcste'), (u'Klllche', u'K\xfcche'), (u'klllhnsten', u'k\xfchnsten'), (u'kllllger', u'kl\xfcger'), (u'Klobtlrsten', u'Klob\xfcrsten'), (u'klop\ufb02l', u'klopft!'), (u"Klpt'n", u"K\xe4pt'n"), (u"Klpt'nl", u"K\xe4pt'n!"), (u"Klpt'ns", u"K\xe4pt'ns"), (u'Klse', u'K\xe4se'), (u'Klseschnuffelei', u'K\xe4seschn\xfcffelei'), (u'Kltigste', u'Kl\xfcgste'), (u'Klugschei\ufb02er', u'Klugschei\xdfer'), (u'kl\xe9ffen', u'kl\xe4ffen'), (u'Kl\xe9iren', u'Kl\xe4ren'), (u'Kl\xe9ranlage', u'Kl\xe4ranlage'), (u'Kl\xe9re', u'Kl\xe4re'), (u'kl\xe9ren', u'kl\xe4ren'), (u'Kn6pf', u'Kn\xf6pf'), (u'Knallttite', u'Knallt\xfcte'), (u'Knastwill', u'Knast will'), (u'Knderung', u'\xc4nderung'), (u'Knochengrfinde', u'Knochengr\xfcnde'), (u'Knofen', u'Knoten'), (u'Knuller', u'Kn\xfcller'), (u'Knupf', u'Kn\xfcpf'), (u'Knupfe', u'Kn\xfcpfe'), (u'knupfen', u'kn\xfcpfen'), (u'knzjipfe', u'kn\xfcpfe'), (u'Kn\xe9dell', u'Kn\xf6del!'), (u'kn\xe9pf', u'kn\xf6pf'), (u'Kn\xe9pfe', u'Kn\xf6pfe'), (u'Kn\xe9sten', u'Kn\xe4sten'), (u'Kofferraumschliissel', u'Kofferraumschl\xfcssel'), (u'Kohlens\xe9ure', u'Kohlens\xe4ure'), (u'Komaf\xe9lle', u'Komaf\xe4lle'), (u'Komaf\xe9llen', u'Komaf\xe4llen'), (u'Kombiise', u'Komb\xfcse'), (u'Kombuse', u'Komb\xfcse'), (u'Komiidie', u'Kom\xf6die'), (u'kommerz/ellen', u'kommerziellen'), (u'kommjetzt', u'komm jetzt'), (u'Kompatibilitfits', u'Kompatibilit\xe4ts'), (u'Kompatibilit\xe9its', u'Kompatibilit\xe4ts'), (u'Kompatiblit5ts', u'Kompatiblit\xe4ts'), (u'Kom\xe9die', u'Kom\xf6die'), (u'KONIGIN', u'K\xd6NIGIN'), (u'konne', u'k\xf6nne'), (u'konnen', u'k\xf6nnen'), (u'konnt', u'k\xf6nnt'), (u'konsen/ativ', u'konservativ'), (u'Kopfabreifimann', u'Kopfabrei\xdfmann'), (u'Kopfgeldj\xe9ger', u'Kopfgeldj\xe4ger'), (u'Kopfgeldj\xe9gern', u'Kopfgeldj\xe4gern'), (u'Kopfm\xe9fiig', u'Kopfm\xe4\xdfig'), (u'Kopfnijsse', u'Kopfn\xfcsse'), (u'kostengtlnstige', u'kosteng\xfcnstige'), (u'Kostiim', u'Kost\xfcm'), (u'Kostiimdesigner', u'Kost\xfcmdesigner'), (u'Kostiimdesignerin', u'Kost\xfcmdesignerin'), (u'Kostiimdrama', u'Kost\xfcmdrama'), (u'Kostiime', u'Kost\xfcme'), (u'Kostiims', u'Kost\xfcms'), (u'Kostume', u'Kost\xfcme'), (u'Kost\ufb02m', u'Kost\xfcm'), (u'kr/egen', u'kriegen'), (u'kr6ne', u'kr\xf6ne'), (u'kr6nen', u'kr\xf6nen'), (u'Kr6ten', u'Kr\xf6ten'), (u'Krafte', u'Kr\xe4fte'), (u'Kraftwfirfel', u'Kraftw\xfcrfel'), (u'Kranf\ufb02hrer', u'Kranf\xfchrer'), (u'Kreativit\xe9t', u'Kreativit\xe4t'), (u'Kreuzverhor', u'Kreuzverh\xf6r'), (u'krfiftiger', u'kr\xe4ftiger'), (u'Krfiutertee', u'Kr\xe4utertee'), (u'Kriegserkl\xe9rungen', u'Kriegserkl\xe4rungen'), (u'Kriegsfuhrung', u'Kriegsf\xfchrung'), (u'Kriegsschauplatze', u'Kriegsschaupl\xe4tze'), (u'Kriifte', u'Kr\xe4fte'), (u'Kriinung', u'Kr\xf6nung'), (u'Kriinungsfeier', u'Kr\xf6nungsfeier'), (u'Krijppel', u'Kr\xfcppel'), (u'Krijte', u'Kr\xf6te'), (u'Kronjuwell', u'Kronjuwel!'), (u'KROTE', u'KR\xd6TE'), (u'Krsche', u'\xc4rsche'), (u'Kr\xe9fte', u'Kr\xe4fte'), (u'Kr\xe9ften', u'Kr\xe4ften'), (u'Kr\xe9ftigsten', u'Kr\xe4ftigsten'), (u'Kr\xe9he', u'Kr\xe4he'), (u'kr\xe9ht', u'kr\xe4ht'), (u'kr\xe9ichzt', u'kr\xe4chzt'), (u'Kr\xe9ifte', u'Kr\xe4fte'), (u'Kr\xe9iutertee', u'Kr\xe4utertee'), (u'Kr\xe9mpfe', u'Kr\xe4mpfe'), (u'kr\xe9nte', u'kr\xf6nte'), (u'Kr\xe9te', u'Kr\xf6te'), (u'Kr\xe9tes', u'Kr\xf6tes'), (u'Kr\xe9utern', u'Kr\xe4utern'), (u'Kr\xe9utersenf', u'Kr\xe4utersenf'), (u'Ktiche', u'K\xfcche'), (u'Ktinige', u'K\xf6nige'), (u'ktinntest', u'k\xf6nntest'), (u'Ktisschen', u'K\xfcsschen'), (u'ktlmmere', u'k\xfcmmere'), (u'ktznnen', u'k\xf6nnen'), (u'Kuche', u'K\xfcche'), (u'KUCHE', u'K\xdcCHE'), (u'Kuckucksger\xe9usch', u'Kuckucksger\xe4usch'), (u"KUl'ZSCl'1lUSS9", u'K\xfcrzschl\xfcsse'), (u'kulz', u'kurz'), (u'kummer', u'k\xfcmmer'), (u'Kummere', u'K\xfcmmere'), (u'kummern', u'k\xfcmmern'), (u'kummert', u'k\xfcmmert'), (u'Kumpell', u'Kumpel!'), (u'Kunststficke', u'Kunstst\xfccke'), (u'Kunststticke', u'Kunstst\xfccke'), (u'Kuriosit\xe9ten', u'Kuriosit\xe4ten'), (u'kurzeste', u'k\xfcrzeste'), (u'kurzte', u'k\xfcrzte'), (u'Kurzwellenfunkger\xe9te', u'Kurzwellenfunkger\xe4te'), (u'Kurzzeitgediichtnis', u'Kurzzeitged\xe4chtnis'), (u'Kurzzeitged\xe9chtnis', u'Kurzzeitged\xe4chtnis'), (u'KUS1I\u20ac', u'K\xfcste'), (u'Kuschelhengstl', u'Kuschelhengst!'), (u'KUSSE', u'K\xdcSSE'), (u'KUSSGH', u'k\xfcssen'), (u'kusste', u'k\xfcsste'), (u'KUSTE', u'K\xdcSTE'), (u'Kuste', u'K\xfcste'), (u'K\xe9fer', u'K\xe4fer'), (u'K\xe9fig', u'K\xe4fig'), (u'k\xe9ime', u'k\xe4me'), (u'k\xe9impfen', u'k\xe4mpfen'), (u'k\xe9impfend', u'k\xe4mpfend'), (u'k\xe9impft', u'k\xe4mpft'), (u'k\xe9impfte', u'k\xe4mpfte'), (u'k\xe9impften', u'k\xe4mpften'), (u'k\xe9impftest', u'k\xe4mpftest'), (u'k\xe9impfwie', u'k\xe4mpf wie'), (u'K\xe9inguru', u'K\xe4nguru'), (u'k\xe9innen', u'k\xf6nnen'), (u'k\xe9innte', u'k\xf6nnte'), (u'K\xe9irper', u'K\xf6rper'), (u'K\xe9ise', u'K\xe4se'), (u'K\xe9isebrunnen', u'K\xe4sebrunnen'), (u'K\xe9lte', u'K\xe4lte'), (u'k\xe9lter', u'k\xe4lter'), (u'k\xe9lteste', u'k\xe4lteste'), (u'k\xe9me', u'k\xe4me'), (u'k\xe9men', u'k\xe4men'), (u'k\xe9mpfe', u'k\xe4mpfe'), (u'K\xe9mpfen', u'K\xe4mpfen'), (u'K\xe9mpfer', u'K\xe4mpfer'), (u'k\xe9mpferische', u'k\xe4mpferische'), (u'k\xe9mpfst', u'k\xe4mpfst'), (u'k\xe9mpft', u'k\xe4mpft'), (u'k\xe9mpfte', u'k\xe4mpfte'), (u'k\xe9mpften', u'k\xe4mpften'), (u'k\xe9mt', u'k\xe4mt'), (u'K\xe9nig', u'K\xf6nig'), (u'K\xe9nige', u'K\xf6nige'), (u'K\xe9nigin', u'K\xf6nigin'), (u'K\xe9niginl', u'K\xf6nigin!'), (u'K\xe9niginnen', u'K\xf6niginnen'), (u'k\xe9niglich', u'k\xf6niglich'), (u'k\xe9nigliche', u'k\xf6nigliche'), (u'k\xe9niglichen', u'k\xf6niglichen'), (u'k\xe9nigliches', u'k\xf6nigliches'), (u'K\xe9nigreich', u'K\xf6nigreich'), (u'K\xe9nigreichs', u'K\xf6nigreichs'), (u'K\xe9nigs', u'K\xf6nigs'), (u'K\xe9nigsfamilie', u'K\xf6nigsfamilie'), (u'k\xe9nne', u'k\xf6nne'), (u'k\xe9nnen', u'k\xf6nnen'), (u'k\xe9nnt', u'k\xf6nnt'), (u'k\xe9nnte', u'k\xf6nnte'), (u'K\xe9nnten', u'K\xf6nnten'), (u'K\xe9nntest', u'K\xf6nntest'), (u'K\xe9nntet', u'K\xf6nntet'), (u'K\xe9pfchen', u'K\xf6pfchen'), (u'K\xe9pfe', u'K\xf6pfe'), (u'K\xe9pfen', u'K\xf6pfen'), (u'k\xe9pft', u'k\xf6pft'), (u"K\xe9pt'n", u"K\xe4pt'n"), (u'K\xe9rbchen', u'K\xf6rbchen'), (u'K\xe9rbchengr\xe9fie', u'K\xf6rbchengr\xf6\xdfe'), (u'K\xe9rben', u'K\xf6rben'), (u'K\xe9rper', u'K\xf6rper'), (u'K\xe9rperfunktionen', u'K\xf6rperfunktionen'), (u'k\xe9rperlich', u'k\xf6rperlich'), (u'k\xe9rperliche', u'k\xf6rperliche'), (u'K\xe9rperproportionen', u'K\xf6rperproportionen'), (u'K\xe9rpersprache', u'K\xf6rpersprache'), (u'K\xe9rpertyp', u'K\xf6rpertyp'), (u'K\xe9rperverletzung', u'K\xf6rperverletzung'), (u'K\xe9rper\xe9ffnungen', u'K\xf6rper\xf6ffnungen'), (u'K\xe9se', u'K\xe4se'), (u'K\xe9sebrett', u'K\xe4sebrett'), (u'K\xe9secracker', u'K\xe4secracker'), (u'k\xe9stlich', u'k\xf6stlich'), (u'K\xe9ter', u'K\xf6ter'), (u'K\xe9tern', u'K\xf6tern'), (u'K\ufb02mmere', u'K\xfcmmere'), (u'k\ufb02mmern', u'k\xfcmmern'), (u"L'a'cherlich", u'L\xe4cherlich'), (u"L'a'ndern", u'L\xe4ndern'), (u"l'a'sst", u'l\xe4sst'), (u"l'a'uft", u'l\xe4uft'), (u'l/chtes', u'lichtes'), (u'l/Vings', u'Wings'), (u'L5cheln', u'L\xe4cheln'), (u'L6ffel', u'L\xf6ffel'), (u'L6schen', u'L\xf6schen'), (u'L6se', u'L\xf6se'), (u'l6sen', u'l\xf6sen'), (u'L6wen', u'L\xf6wen'), (u'L6win', u'L\xf6win'), (u'LADIESMANZ17', u'LADIESMAN217'), (u'Landh\xe9user', u'Landh\xe4user'), (u'Landstra\ufb02e', u'Landstra\xdfe'), (u'Lands\xe9iugetier', u'Lands\xe4ugetier'), (u'langl', u'lang!'), (u'langweiligl', u'langweilig!'), (u'Lasergestutzte', u'Lasergest\xfctzte'), (u'Laserzielger\xe9t', u'Laserzielger\xe4t'), (u'Lattenzaunwei\ufb02', u'Lattenzaunwei\xdf'), (u'Laudal', u'Lauda!'), (u'laufl', u'lauf!'), (u'Lau\ufb02', u'Lauf!'), (u'La\xdf', u'Lass'), (u'lch', u'Ich'), (u'ldee', u'Idee'), (u'ldeen', u'Ideen'), (u'ldelia', u'Idelia'), (u'ldentifikation', u'Identifikation'), (u'ldentifikationsnummer', u'Identifikationsnummer'), (u'ldentifikationssignal', u'Identifikationssignal'), (u'ldentifizierung', u'Identifizierung'), (u"ldentit'a'tsscheibe", u'ldentit\xe4tsscheibe'), (u'ldioten', u'Idioten'), (u'ldloten', u'Idioten'), (u'Le/d', u'Leid'), (u'Lebenl', u'Leben!'), (u'lebensf\xe9hig', u'lebensf\xe4hig'), (u'lebensl\xe9nglich', u'lebensl\xe4nglich'), (u'lebensmijlde', u'lebensm\xfcde'), (u'Lebersch\xe9den', u'Lebersch\xe4den'), (u'leergegessen', u'leer gegessen'), (u'legend\xe9re', u'legend\xe4re'), (u'legend\xe9ren', u'legend\xe4ren'), (u'Legion\xe9r', u'Legion\xe4r'), (u'Legion\xe9re', u'Legion\xe4re'), (u'Lehe', u'Lebe'), (u'Leichensch\xe9ndung', u'Leichensch\xe4ndung'), (u'leichtjemanden', u'leicht jemanden'), (u'leidl', u'leid!'), (u'Leistuljg', u'Leistung'), (u'Lelbwfichter', u'Leibw\xe4chter'), (u'Leld', u'Leid'), (u'lemen', u'lernen'), (u'Lenks\xe9ule', u'Lenks\xe4ule'), (u'lfidt', u'l\xe4dt'), (u'lfigt', u'l\xfcgt'), (u'lfinger', u'l\xe4nger'), (u'lfiuft', u'l\xe4uft'), (u'Lfiuterung', u'L\xe4uterung'), (u'lgitt', u'Igitt'), (u'lgnorier', u'Ignorier'), (u'lhm', u'Ihm'), (u'lhn', u'Ihn'), (u'lhnen', u'Ihnen'), (u'lhnenl', u'Ihnen!'), (u'lhr', u'Ihr'), (u'lhre', u'Ihre'), (u'lhrem', u'Ihrem'), (u'lhren', u'Ihren'), (u'lhrer', u'Ihrer'), (u'lhrerverffigung', u'Ihrer Verf\xfcgung'), (u'lhres', u'Ihres'), (u'lhrfehlt', u'Ihr fehlt'), (u'lhrjemalsjemanden', u'lhr jemals jemanden'), (u'lhrVerteidiger', u'lhr Verteidiger'), (u'Libel', u'\xfcbel'), (u'Libelwollen', u'\xfcbelwollen'), (u'Liben', u'\xfcben'), (u'Liber', u'\xfcber'), (u'Liberall', u'\xfcberall'), (u'Liberdenken', u'\xfcberdenken'), (u'Liberdrllissig', u'\xfcberdr\xfcssig'), (u'Liberfallen', u'\xfcberfallen'), (u'Libergebrannt', u'\xfcbergebrannt'), (u'Liberhaupt', u'\xfcberhaupt'), (u'Liberlasst', u'\xfcberlasst'), (u'Liberleben', u'\xdcberleben'), (u'Liberlegen', u'\xfcberlegen'), (u'Liberlegt', u'\xfcberlegt'), (u'Libernimmt', u'\xfcbernimmt'), (u'Liberpriift', u'\xfcberpr\xfcft'), (u'Liberreden', u'\xfcberreden'), (u'Libersteht', u'\xfcbersteht'), (u'Liberstllirzen', u'\xfcberst\xfcrzen'), (u'Liberwachen', u'\xfcberwachen'), (u'Liberwacht', u'\xfcberwacht'), (u'Liberwinden', u'\xfcberwinden'), (u'Liberw\xe9ltigen', u'\xfcberw\xe4ltigen'), (u'Liberw\xe9ltigt', u'\xfcberw\xe4ltigt'), (u'Liberzeugt', u'\xfcberzeugt'), (u'Lible', u'\xfcble'), (u'Liblich', u'\xfcblich'), (u'Libliche', u'\xdcbliche'), (u'Librig', u'\xfcbrig'), (u'lie/3', u'lie\xdf'), (u'lie/Se', u'lie\xdfe'), (u'lieB', u'lie\xdf'), (u'lieBe', u'lie\xdfe'), (u'liebenswilrdig', u'liebensw\xfcrdig'), (u'liebenswurdiger', u'liebensw\xfcrdiger'), (u'Liebesgestiindnis', u'Liebesgest\xe4ndnis'), (u'Lieblingsbesch\xe9ftigung', u'Lieblingsbesch\xe4ftigung'), (u'Lieblingsrockerl', u'Lieblingsrocker!'), (u'Lieblingss\xe9tze', u'Lieblingss\xe4tze'), (u'lief2>en', u'lie\xdfen'), (u'Liefergebiihren', u'Liefergeb\xfchren'), (u'lieflsen', u'lie\xdfen'), (u'liegenlassen', u'liegen lassen'), (u'Liehe', u'Liebe'), (u'lieli', u'lie\xdf'), (u'lielien', u'lie\xdfen'), (u'Liellen', u'Lie\xdfen'), (u'liells', u'lie\xdf'), (u'lien', u'lie\xdf'), (u'Liicher', u'L\xf6cher'), (u'Liige', u'L\xfcge'), (u'Liigner', u'L\xfcgner'), (u'liinger', u'l\xe4nger'), (u'liischen', u'l\xf6schen'), (u'liischt', u'l\xf6scht'), (u'Liisst', u'L\xe4sst'), (u'liist', u'l\xf6st'), (u'Liisung', u'L\xf6sung'), (u'Liisungen', u'L\xf6sungen'), (u'Liiwen', u'L\xf6wen'), (u'Lii\ufb02ung', u'L\xfcftung'), (u'lijgen', u'l\xfcgen'), (u'Lijgner', u'L\xfcgner'), (u'Lilgner', u'L\xfcgner'), (u'lilgst', u'l\xfcgst'), (u'lilgt', u'l\xfcgt'), (u'Lilterer', u'\xc4lterer'), (u'LIMOUSINENSERVICE10I06', u'LIMOUSINENSERVICE 10:06'), (u'linger', u'l\xe4nger'), (u"lke's", u"Ike's"), (u'lkone', u'Ikone'), (u"lL'lgt", u'l\xfcgt'), (u'Llberstehen', u'\xfcberstehen'), (u'Llebe', u'Liebe'), (u'llebt', u'liebt'), (u'lllfie', u'Wie'), (u'lllfillensstark', u'Willensstark'), (u"lllfillie's", u"Willie's"), (u'lllfir', u'Wir'), (u'Lllignerl', u'L\xfcgner!'), (u'llligtl', u'l\xfcgt!'), (u'lllusionen', u'Illusionen'), (u'llngst', u'l\xe4ngst'), (u'llztlicher', u'\xe4rztlicher'), (u'lm', u'Im'), (u'lmbiss', u'Imbiss'), (u'lmmer', u'Immer'), (u'lmmigranten', u'Immigranten'), (u'lmpuls', u'Impuls'), (u'lmpulsantrieb', u'Impulsantrieb'), (u'lndianer', u'Indianer'), (u'lndianerin', u'Indianerin'), (u'lndianerm\xe9dchen', u'Indianerm\xe4dchen'), (u'lndianertanz', u'Indianertanz'), (u'lndikation', u'Indikation'), (u'lndividualit\xe9t', u'Individualit\xe4t'), (u'lndividuen', u'Individuen'), (u'lndividuum', u'Individuum'), (u'lnduktion', u'Induktion'), (u'lneffizienz', u'Ineffizienz'), (u'lnformationen', u'Informationen'), (u'lnfos', u'Infos'), (u'lngenieur', u'Ingenieur'), (u'lngenieure', u'Ingenieure'), (u'lnhalt', u'Inhalt'), (u'lnhalte', u'Inhalte'), (u'lnnenraum', u'Innenraum'), (u'lnnenr\xe9ume', u'Innenr\xe4ume'), (u'lnsekt', u'Insekt'), (u'lnsekten', u'Insekten'), (u'lnsel', u'Insel'), (u'lnserat', u'Inserat'), (u'lnspektion', u'Inspektion'), (u'lnstinkt', u'Instinkt'), (u'lnstinkte', u'Instinkte'), (u'lnstitut', u'Institut'), (u'lnstrumente', u'Instrumente'), (u'lnstrumentenwagen', u'Instrumentenwagen'), (u'lnsubordination', u'Insubordination'), (u'lntellektuellste', u'Intellektuellste'), (u'lntelligenz', u'Intelligenz'), (u'lntensivstation', u'Intensivstation'), (u'lnteraktion', u'Interaktion'), (u'lnteresse', u'Interesse'), (u'lnteressen', u'Interessen'), (u'lnternat', u'Internat'), (u'lntrigantin', u'Intrigantin'), (u'lntrigantl', u'Intrigant!'), (u'lntrigen', u'Intrigen'), (u'lnverness', u'Inverness'), (u'lnvestition', u'Investition'), (u'lnvestoren', u'Investoren'), (u'lnzucht', u'Inzucht'), (u'lo', u'Io'), (u'Lordk\xe9mmerer', u'Lordk\xe4mmerer'), (u'losf', u'los!'), (u'losl', u'los!'), (u'losw\ufb02rde', u'losw\xfcrde'), (u'Lou/e', u'Louie'), (u'Loyalit\xe9t', u'Loyalit\xe4t'), (u'lrak', u'Irak'), (u'lraner', u'Iraner'), (u'lren', u'Iren'), (u'Lrgendetvvas', u'Irgendetwas'), (u'lrland', u'Irland'), (u'lronhide', u'Ironhide'), (u'lronie', u'Ironie'), (u'lrre', u'Irre'), (u'lrren', u'Irren'), (u'lrrenanstalt', u'Irrenanstalt'), (u'lrrenhaus', u'Irrenhaus'), (u'lrrer', u'Irrer'), (u'lrrgarten', u'Irrgarten'), (u'lrrlicht', u'Irrlicht'), (u'lrrlichter', u'Irrlichter'), (u'lrrsinn', u'Irrsinn'), (u'lrrsinns', u'Irrsinns'), (u'lrrtum', u'Irrtum'), (u'lscandar', u'Iscandar'), (u'lscandars', u'Iscandars'), (u'lsolierband', u'Isolierband'), (u'lss', u'Iss'), (u'lstja', u'Ist ja'), (u'ltaker', u'Itaker'), (u'ltakerflossen', u'Itakerflossen'), (u'ltalo', u'Italo'), (u'Ltiffel', u'L\xf6ffel'), (u'ltlgen', u'l\xfcgen'), (u'Lufijagen', u'Luft jagen'), (u'Luftballonsl', u'Luftballons!'), (u'Luftjagen', u'Luft jagen'), (u'Luftunterst\ufb02tzung', u'Luftunterst\xfctzung'), (u'LUgen', u'L\xfcgen'), (u'lvl\xe9idchen', u'M\xe4dchen'), (u'lwan', u'Iwan'), (u"l\xa7uft's", u"l\xe4uft's"), (u'L\xe9chelmfinderl', u'L\xe4chelm\xfcnder!'), (u'l\xe9cheln', u'l\xe4cheln'), (u'l\xe9chelt', u'l\xe4chelt'), (u'L\xe9cher', u'L\xf6cher'), (u'L\xe9cherlich', u'L\xe4cherlich'), (u'l\xe9cherliches', u'l\xe4cherliches'), (u'L\xe9chle', u'L\xe4chle'), (u'l\xe9dt', u'l\xe4dt'), (u'L\xe9ffel', u'L\xf6ffel'), (u'l\xe9ge', u'l\xe4ge'), (u'L\xe9icheln', u'L\xe4cheln'), (u'L\xe9icherlich', u'L\xe4cherlich'), (u'l\xe9ichle', u'l\xe4chle'), (u'L\xe9indchen', u'L\xe4ndchen'), (u'l\xe9ingst', u'l\xe4ngst'), (u'l\xe9isen', u'l\xf6sen'), (u'l\xe9issig', u'l\xe4ssig'), (u'l\xe9isst', u'l\xe4sst'), (u'L\xe9iuft', u'L\xe4uft'), (u'L\xe9jsung', u'L\xf6sung'), (u'L\xe9mmchen', u'L\xe4mmchen'), (u'L\xe9mmer', u'L\xe4mmer'), (u'L\xe9nder', u'L\xe4nder'), (u'L\xe9ndern', u'L\xe4ndern'), (u'L\xe9nge', u'L\xe4nge'), (u'L\xe9ngen', u'L\xe4ngen'), (u'l\xe9nger', u'l\xe4nger'), (u'l\xe9ngst', u'l\xe4ngst'), (u'l\xe9ngste', u'l\xe4ngste'), (u'L\xe9rm', u'L\xe4rm'), (u'L\xe9rmbeschwerden', u'L\xe4rmbeschwerden'), (u'l\xe9schen', u'l\xf6schen'), (u'L\xe9se', u'L\xf6se'), (u'L\xe9segeld', u'L\xf6segeld'), (u'l\xe9sst', u'l\xe4sst'), (u'l\xe9st', u'l\xf6st'), (u'l\xe9ste', u'l\xf6ste'), (u'l\xe9sten', u'l\xf6sten'), (u'l\xe9stig', u'listig'), (u'L\xe9sung', u'L\xf6sung'), (u'l\xe9ufig', u'l\xe4ufig'), (u'l\xe9ufst', u'l\xe4ufst'), (u'L\xe9uft', u'L\xe4uft'), (u'l\xe9uten', u'l\xe4uten'), (u'l\xe9utet', u'l\xe4utet'), (u'L\xe9we', u'L\xf6we'), (u'L\ufb02gner', u'L\xfcgner'), (u"M'a'dchen", u'M\xe4dchen'), (u'm/ese', u'miese'), (u'M/ffsommernachfsfraum', u'Mittsommernachtstraum'), (u'M/r', u'Mir'), (u'M0I8KUI', u'Molek\xfcl'), (u'm6belt', u'm\xf6belt'), (u'm6chte', u'm\xf6chte'), (u'm6chtest', u'm\xf6chtest'), (u'm6gen', u'm\xf6gen'), (u'm6glich', u'm\xf6glich'), (u'm6glichen', u'm\xf6glichen'), (u'm6glicher', u'm\xf6glicher'), (u'm6gt', u'm\xf6gt'), (u'M6rder', u'M\xf6rder'), (u'MaB', u'Ma\xdf'), (u'MaBgabe', u'Ma\xdfgabe'), (u'mac/1e', u'mache'), (u'mac/7', u'nach'), (u'machs', u"mach's"), (u'Machtiibernahme', u'Macht\xfcbernahme'), (u'madenschw\xe9inziger', u'madenschw\xe4nziger'), (u'Mafinahme', u'Ma\xdfnahme'), (u'Magengeschwiire', u'Magengeschw\xfcre'), (u'Magengeschwilr', u'Magengeschw\xfcr'), (u'Magengeschwtir', u'Magengeschw\xfcr'), (u'Magnolienbliiten', u'Magnolienbl\xfcten'), (u'Majesfait', u'Majest\xe4t'), (u'Majest\xe9it', u'Majest\xe4t'), (u'Majest\xe9t', u'Majest\xe4t'), (u'Majest\xe9ten', u'Majest\xe4ten'), (u'Mal2>en', u'Ma\xdfen'), (u'Mal3en', u'Ma\xdfen'), (u'malf', u'mal!'), (u'Malinahme', u'Ma\xdfnahme'), (u'mall', u'mal!'), (u'Mallregelten', u'Ma\xdfregelten'), (u'Mandverstation', u'Man\xf6verstation'), (u'Manfiver', u'Man\xf6ver'), (u'Maniiver', u'Man\xf6ver'), (u'Manikfire', u'Manik\xfcre'), (u'Mannscha\ufb02', u'Mannschaft'), (u"Mansclle\ufb02'enkm'5pfe", u'Manschettenkn\xf6pfe'), (u'Man\xe9iver', u'Man\xf6ver'), (u'Man\xe9ver', u'Man\xf6ver'), (u'man\xe9vrieren', u'man\xf6vrieren'), (u'man\xe9vrierf\xe9hig', u'man\xf6vrierf\xe4hig'), (u'Man\xe9vriermodus', u'Man\xf6vriermodus'), (u'Margoliserklfirung', u'Margoliserkl\xe4rung'), (u'Margoliserkl\xe9rung', u'Margoliserkl\xe4rung'), (u'marsch\xe9hnliche', u'marsch\xe4hnliche'), (u'Massagestllihlen', u'Massagest\xfchlen'), (u'Massenzerst\xe9rung', u'Massenzerst\xf6rung'), (u'Massenzerst\xe9rungswaffen', u'Massenzerst\xf6rungswaffen'), (u'Mater/al', u'Material'), (u'Maxiriicke', u'Maxir\xf6cke'), (u'Mayonaise', u'Mayonnaise'), (u'mbglichst', u'm\xf6glichst'), (u'Mdge', u'M\xf6ge'), (u'mdglichen/veise', u'm\xf6glicherweise'), (u'mdglicherweise', u'm\xf6glicherweise'), (u'Mdglichkeit', u'M\xf6glichkeit'), (u'me/n', u'mein'), (u'mehrZeit', u'mehr Zeit'), (u"mein'ja", u"mein' ja"), (u'meinerjetzigen', u'meiner jetzigen'), (u'Meinungs\xe9ufierung', u'Meinungs\xe4u\xdferung'), (u'Meisterbr\xe9u', u'Meisterbr\xe4u'), (u'Meisterstijck', u'Meisterst\xfcck'), (u'meistgehasste', u'meist gehasste'), (u'meln', u'mein'), (u'melne', u'meine'), (u'Mend', u'Mond'), (u'Menschenh\xe9indler', u'Menschenh\xe4ndler'), (u'Menstruationsst\xe9rungen', u'Menstruationsst\xf6rungen'), (u'Merkwiirdig', u'Merkw\xfcrdig'), (u'Merkwiirdige', u'Merkw\xfcrdige'), (u'merkwiirdiger', u'merkw\xfcrdiger'), (u'merkwilrdig', u'merkw\xfcrdig'), (u'merkwlllrdige', u'merkw\xfcrdige'), (u'merkwurdig', u'merkw\xfcrdig'), (u'merkwurolig', u'merkw\xfcrdig'), (u'merkw\ufb02rdig', u'merkw\xfcrdig'), (u'Messger\xe9t', u'Messger\xe4t'), (u'mfichte', u'm\xf6chte'), (u'Mfichten', u'M\xf6chten'), (u'Mfidchen', u'M\xe4dchen'), (u'Mfidchenl', u'M\xe4dchen!'), (u'Mfidels', u'M\xe4dels'), (u'mfigen', u'm\xf6gen'), (u'Mfigliche', u'M\xf6gliche'), (u'mfiglichen', u'm\xf6glichen'), (u'mfiglicherweise', u'm\xf6glicherweise'), (u'Mfill', u'M\xfcll'), (u'Mfillhalde', u'M\xfcllhalde'), (u'Mfinchen', u'M\xfcnchen'), (u'Mfinder', u'M\xfcnder'), (u'Mfinnern', u'M\xe4nnern'), (u'Mfissen', u'M\xfcssen'), (u'mfisst', u'm\xfcsst'), (u'mfisste', u'm\xfcsste'), (u'Mfjrder', u'M\xf6rder'), (u'Midchen', u'M\xe4dchen'), (u'Migrane', u'Migr\xe4ne'), (u'Migr\xe9ne', u'Migr\xe4ne'), (u'Migr\ufb02ne', u'Migr\xe4ne'), (u'miichte', u'm\xf6chte'), (u'Miichtegern', u'M\xf6chtegern'), (u'Miichten', u'M\xf6chten'), (u'miichtest', u'm\xf6chtest'), (u'miide', u'm\xfcde'), (u'Miidels', u'M\xe4dels'), (u'miides', u'm\xfcdes'), (u'miige', u'm\xf6ge'), (u'miigen', u'm\xf6gen'), (u'miiglich', u'm\xf6glich'), (u'miigliche', u'm\xf6gliche'), (u'miiglichen', u'm\xf6glichen'), (u'miigliches', u'm\xf6gliches'), (u'Miiglichkeit', u'M\xf6glichkeit'), (u'Miiglichkeiten', u'M\xf6glichkeiten'), (u'miigt', u'm\xf6gt'), (u'Miill', u'M\xfcll'), (u'Miillhalde', u'M\xfcllhalde'), (u'Miilltonnen', u'M\xfclltonnen'), (u'miilssen', u'm\xfcssen'), (u'miirderisch', u'm\xf6rderisch'), (u'miisse', u'm\xfcsse'), (u'Miissen', u'M\xfcssen'), (u'miisst', u'm\xfcsst'), (u'miisste', u'm\xfcsste'), (u'Miiuse', u'M\xe4use'), (u'mijchte', u'm\xf6chte'), (u'Mijcken', u'M\xfccken'), (u'Mijhe', u'M\xfche'), (u'Mijnzen', u'M\xfcnzen'), (u'mijssen', u'm\xfcssen'), (u'mijsst', u'm\xfcsst'), (u'mijsste', u'm\xfcsste'), (u'mijsstest', u'm\xfcsstest'), (u'Milchstrafie', u'Milchstra\xdfe'), (u'Milhe', u'M\xfche'), (u'Milhle', u'M\xfchle'), (u'MILITAR', u'MILIT\xc4R'), (u'Militiirprogramme', u'Milit\xe4rprogramme'), (u'Militir', u'Milit\xe4r'), (u'militlrische', u'milit\xe4rische'), (u'Milit\xe9irkodex', u'Milit\xe4rkodex'), (u'Milit\xe9r', u'Milit\xe4r'), (u'Milit\xe9rakademie', u'Milit\xe4rakademie'), (u'Milit\xe9rdienst', u'Milit\xe4rdienst'), (u'milit\xe9rischen', u'milit\xe4rischen'), (u'Milit\xe9rkodex', u'Milit\xe4rkodex'), (u'Milit\xe9rluftraum', u'Milit\xe4rluftraum'), (u'Milit\xe9rnetzwerk', u'Milit\xe4rnetzwerk'), (u'Milit\xe9rs', u'Milit\xe4rs'), (u'Milit\xe9rsystem', u'Milit\xe4rsystem'), (u'Millbilligung', u'Missbilligung'), (u'Millefs', u"Miller's"), (u'Millgeburt', u'Missgeburt'), (u'Milliard\xe9iren', u'Milliard\xe4ren'), (u'Million\xe9rssohn', u'Million\xe4rssohn'), (u'Milli\xe9quivalent', u'Milli\xe4quivalent'), (u'Millltonne', u'M\xfclltonne'), (u'millverstanden', u'missverstanden'), (u'milssen', u'm\xfcssen'), (u'milsst', u'm\xfcsst'), (u'milsste', u'm\xfcsste'), (u'milssten', u'm\xfcssten'), (u'Miltter', u'M\xfctter'), (u'Minenraumen', u'Minenr\xe4umen'), (u'Miniriicke', u'Minir\xf6cke'), (u'mirglauben', u'mir glauben'), (u'mirja', u'mir ja'), (u'mirje', u'mir je'), (u'mirjeglichen', u'mir jeglichen'), (u'mirjemals', u'mir jemals'), (u'mirjemand', u'mir jemand'), (u'mirjetzt', u'mir jetzt'), (u'mirso', u'mir so'), (u'mirvon', u'mir von'), (u'mirzu', u'mir zu'), (u'Miserabell', u'Miserabel!'), (u'missf\xe9llt', u'missf\xe4llt'), (u'Missverstfindnisl', u'Missverst\xe4ndnis!'), (u'Missverstiindnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnis', u'Missverst\xe4ndnis'), (u'Missverst\xe9ndnissen', u'Missverst\xe4ndnissen'), (u'Mistkerlel', u'Mistkerle!'), (u'Mistkiiter', u'Mistk\xf6ter'), (u'Miststiick', u'Mistst\xfcck'), (u'Mistst\ufb02cke', u'Mistst\xfccke'), (u'Mitbijrger', u'Mitb\xfcrger'), (u'Mitbilrger', u'Mitb\xfcrger'), (u'mitfiihlend', u'mitf\xfchlend'), (u'mitfiihlender', u'mitf\xfchlender'), (u'mitfuhlend', u'mitf\xfchlend'), (u'Mitgefiihl', u'Mitgef\xfchl'), (u'Mitgefuhl', u'Mitgef\xfchl'), (u'mitgehiirt', u'mitgeh\xf6rt'), (u'mitgez\xe9hlt', u'mitgez\xe4hlt'), (u'mitjedem', u'mit jedem'), (u'mitjemandem', u'mit jemandem'), (u'mittlen/veile', u'mittlerweile'), (u"ML'1nze", u'M\xfcnze'), (u'mlch', u'mich'), (u'Mldchen', u'M\xe4dchen'), (u'mLissen', u'm\xfcssen'), (u'Mljnder', u'M\xfcnder'), (u'Mllillschlucker', u'M\xfcllschlucker'), (u'Mllindel', u'M\xfcndel'), (u'Mllindung', u'M\xfcndung'), (u'mllissen', u'm\xfcssen'), (u'mllisst', u'm\xfcsst'), (u'Mlllhe', u'M\xfche'), (u'Mllllon', u'Million'), (u'Mllllonen', u'Millionen'), (u'mlllsst', u'm\xfcsst'), (u'Mllltterjedoch', u'M\xfctter jedoch'), (u'Mlnnern', u'M\xe4nnern'), (u'mlr', u'mir'), (u'mlrl', u'mir!'), (u'mlt', u'mit'), (u'moglich', u'm\xf6glich'), (u'Moglichkeit', u'M\xf6glichkeit'), (u'Moglichkeiten', u'M\xf6glichkeiten'), (u'Molekijle', u'Molek\xfcle'), (u"MolekL'lle", u'Molek\xfcle'), (u'Mondeinhiirner', u'Mondeinh\xf6rner'), (u'Mondeinhiirnerl', u'Mondeinh\xf6rner!'), (u'Mondeinh\xe9irner', u'Mondeinh\xf6rner'), (u'Mondk\xe9ilber', u'Mondk\xe4lber'), (u'Monl', u'Mom'), (u'MONTONEI', u'MONTONE:'), (u'Mordsiiberraschung', u'Mords\xfcberraschung'), (u'Mordverd\xe9chtiger', u'Mordverd\xe4chtiger'), (u'Morsealphabetl', u'Morsealphabet!'), (u'Motorger\xe9usch', u'Motorger\xe4usch'), (u'Motorger\xe9usche', u'Motorger\xe4usche'), (u"Mousset\ufb02e's", u"Moussette's"), (u'Mowen', u'M\xf6wen'), (u'Mtihe', u'M\xfche'), (u'Mtillschlucker', u'M\xfcllschlucker'), (u'mtissen', u'm\xfcssen'), (u'mtissenl', u'm\xfcssen!'), (u'Mtitzel', u'M\xfctze!'), (u'mtlde', u'm\xfcde'), (u'mtlsste', u'm\xfcsste'), (u'muBt', u'musst'), (u'Mucken', u'M\xfccken'), (u'mucksm\xe9uschenstill', u'mucksm\xe4uschenstill'), (u'mude', u'm\xfcde'), (u'Muhe', u'M\xfche'), (u'MUII', u'M\xfcll'), (u'mull', u'muss'), (u'MULL', u'M\xdcLL'), (u'mullte', u'musste'), (u'Mundl', u'Mund!'), (u'Mundung', u'M\xfcndung'), (u'Munzfernsprecher', u'M\xfcnzfernsprecher'), (u'Muskatnijsse', u'Muskatn\xfcsse'), (u'Muskelkumpelsl', u'Muskelkumpels!'), (u'muskul\xe9ren', u'muskul\xe4ren'), (u'mussen', u'm\xfcssen'), (u'MUSSEN', u'M\xdcSSEN'), (u"mUssen's", u"m\xfcssen's"), (u"muss_'\xa7e", u'musste'), (u'Musterschuler', u'Mustersch\xfcler'), (u'Mutterja', u'Mutter ja'), (u'mutterlich', u'm\xfctterlich'), (u'Mutze', u'M\xfctze'), (u'mu\xdf', u'muss'), (u'mu\xdft', u'musst'), (u'mu\xdfte', u'musste'), (u"mx't", u'mit'), (u'Mzlinnern', u'M\xe4nnern'), (u'M\xe9bel', u'M\xf6bel'), (u'm\xe9cht', u'm\xf6cht'), (u'M\xe9chte', u'M\xe4chte'), (u'm\xe9chte', u'm\xf6chte'), (u'M\xe9chtegern', u'M\xf6chtegern'), (u'm\xe9chten', u'm\xf6chten'), (u'm\xe9chtest', u'm\xf6chtest'), (u'm\xe9chtet', u'm\xf6chtet'), (u'm\xe9chtig', u'm\xe4chtig'), (u'm\xe9chtige', u'm\xe4chtige'), (u'm\xe9chtigen', u'm\xe4chtigen'), (u'm\xe9chtiger', u'm\xe4chtiger'), (u'm\xe9chtiges', u'm\xe4chtiges'), (u'm\xe9chtigste', u'm\xe4chtigste'), (u'm\xe9chtigsten', u'm\xe4chtigsten'), (u'M\xe9dchen', u'M\xe4dchen'), (u'M\xe9dchenh\xe9nden', u'M\xe4dchenh\xe4nden'), (u'M\xe9dchens', u'M\xe4dchens'), (u'M\xe9del', u'M\xe4del'), (u'M\xe9dels', u'M\xe4dels'), (u'M\xe9delsl', u'M\xe4dels!'), (u'M\xe9fiigung', u'M\xe4\xdfigung'), (u'm\xe9ge', u'm\xf6ge'), (u'M\xe9gen', u'M\xf6gen'), (u'M\xe9glich', u'M\xf6glich'), (u'm\xe9gliche', u'm\xf6gliche'), (u'M\xe9glichen', u'M\xf6glichen'), (u'M\xe9gliches', u'M\xf6gliches'), (u'M\xe9glichkeit', u'M\xf6glichkeit'), (u'M\xe9glichkeiten', u'M\xf6glichkeiten'), (u'm\xe9glichst', u'm\xf6glichst'), (u'm\xe9gt', u'm\xf6gt'), (u'm\xe9ichtig', u'm\xe4chtig'), (u'm\xe9ichtige', u'm\xe4chtige'), (u'm\xe9ichtigen', u'm\xe4chtigen'), (u'm\xe9ichtiger', u'm\xe4chtiger'), (u'M\xe9idchen', u'M\xe4dchen'), (u'M\xe9idel', u'M\xe4del'), (u'M\xe9inner', u'M\xe4nner'), (u'M\xe9innl', u'M\xe4nnl'), (u'm\xe9innlicher', u'm\xe4nnlicher'), (u'M\xe9irder', u'M\xf6rder'), (u'M\xe9irz', u'M\xe4rz'), (u'M\xe9nnchen', u'M\xe4nnchen'), (u'M\xe9nnchens', u'M\xe4nnchens'), (u'M\xe9nner', u'M\xe4nner'), (u'M\xe9nnerfreundschaft', u'M\xe4nnerfreundschaft'), (u'M\xe9nnern', u'M\xe4nnern'), (u'M\xe9nnersache', u'M\xe4nnersache'), (u'm\xe9nnlich', u'm\xe4nnlich'), (u'm\xe9nnliche', u'm\xe4nnliche'), (u'M\xe9ntel', u'M\xe4ntel'), (u'M\xe9olel', u'M\xe4del'), (u'M\xe9olels', u'M\xe4dels'), (u'M\xe9rchen', u'M\xe4rchen'), (u'M\xe9rchenl', u'M\xe4rchen!'), (u'M\xe9rchenprinzen', u'M\xe4rchenprinzen'), (u'M\xe9rder', u'M\xf6rder'), (u'M\xe9rtyrer', u'M\xe4rtyrer'), (u'M\xe9rz', u'M\xe4rz'), (u'M\xe9tresse', u'M\xe4tresse'), (u'M\xe9uschen', u'M\xe4uschen'), (u'M\xe9use', u'M\xe4use'), (u'M\xe9usehtipfer', u'M\xe4useh\xfcpfer'), (u'M\xe9usen', u'M\xe4usen'), (u'M\xe9userennen', u'M\xe4userennen'), (u'm\xfc\xdft', u'm\xfcsst'), (u'm\ufb02de', u'm\xfcde'), (u'm\ufb02ssen', u'm\xfcssen'), (u"n'a'chste", u'n\xe4chste'), (u"n'a'hert", u'n\xe4hert'), (u'n/chfs', u'nichts'), (u'n/chi', u'nicht'), (u'N/ck', u'Nick'), (u'n/e', u'nie'), (u'N6', u'N\xf6'), (u'n6tig', u'n\xf6tig'), (u'nac/1', u'nach'), (u'Nachf', u'Nacht'), (u'nachllssig', u'nachl\xe4ssig'), (u'nachl\xe9ssig', u'nachl\xe4ssig'), (u'nachl\xe9sst', u'nachl\xe4sst'), (u'nachprufen', u'nachpr\xfcfen'), (u'Nachschlussel', u'Nachschl\xfcssel'), (u'Nachste', u'N\xe4chste'), (u'NAHERT', u'N\xc4HERT'), (u'NAHERTE', u'N\xc4HERTE'), (u'Nat/on', u'Nation'), (u'natfirlich', u'nat\xfcrlich'), (u'Natiilrlich', u'Nat\xfcrlich'), (u'Natiirlich', u'Nat\xfcrlich'), (u'Natiirllch', u'Nat\xfcrlich'), (u'natijrlich', u'nat\xfcrlich'), (u'natijrlichen', u'nat\xfcrlichen'), (u'natilrlich', u'nat\xfcrlich'), (u'natilrliche', u'nat\xfcrliche'), (u"natL'lrlich", u'nat\xfcrlich'), (u'Natllirlich', u'Nat\xfcrlich'), (u'Nattirlich', u'Nat\xfcrlich'), (u'Nattlrlich', u'Nat\xfcrlich'), (u'Nattlrliohl', u'Nat\xfcrlich!'), (u'Naturlich', u'Naturloch'), (u'naturlich', u'nat\xfcrlich'), (u'naturlichen', u'nat\xfcrlichen'), (u'naturlichsten', u'nat\xfcrlichsten'), (u'Navajoweifi', u'Navajowei\xdf'), (u'ndtige', u'n\xf6tige'), (u'ne/n', u'nein'), (u'Nebengeb\xe9ude', u'Nebengeb\xe4ude'), (u'Nebengesch\xe9ift', u'Nebengesch\xe4ft'), (u'neffes', u'nettes'), (u'Nehmf', u'Nehmt'), (u'neinl', u'nein!'), (u'Neln', u'Nein'), (u'nerv6s', u'nerv\xf6s'), (u'Nervens\xe9ge', u'Nervens\xe4ge'), (u'Nervens\xe9ige', u'Nervens\xe4ge'), (u'nerviis', u'nerv\xf6s'), (u'Nerv\xe9s', u'Nerv\xf6s'), (u'ner\\/t', u'nervt'), (u'Neuankiimmlinge', u'Neuank\xf6mmlinge'), (u'neuromuskul\xe9ren', u'neuromuskul\xe4ren'), (u'Neuzug\xe9inge', u'Neuzug\xe4nge'), (u'Nfichster', u'N\xe4chster'), (u'NIANN', u'MANN'), (u'nichsten', u'n\xe4chsten'), (u'nichtim', u'nicht im'), (u'nichtjemand', u'nicht jemand'), (u'Nichtjetzt', u'Nicht jetzt'), (u'Nichtsl', u'Nichts!'), (u'nichtzurilckgelassen', u'nicht zur\xfcckgelassen'), (u'nic_l_1t', u'nicht'), (u'niederk\xe9mpfen', u'niederk\xe4mpfen'), (u'niederliells', u'niederlie\xdf'), (u'niedlichl', u'niedlich!'), (u'niher', u'n\xe4her'), (u'niichsten', u'n\xe4chsten'), (u'niichstes', u'n\xe4chstes'), (u'niirgeln', u'n\xf6rgeln'), (u'niitig', u'n\xf6tig'), (u'niitige', u'n\xf6tige'), (u'Nijssen', u'N\xfcssen'), (u'Nijsternl', u'N\xfcstern!'), (u'nijtzlich', u'n\xfctzlich'), (u'nilchtern', u'n\xfcchtern'), (u'niltzen', u'n\xfctzen'), (u'Nlagnaten', u'Magnaten'), (u'Nlannern', u'M\xe4nnern'), (u'nlchste', u'n\xe4chste'), (u'nlchsthoheren', u'n\xe4chsth\xf6heren'), (u'nlcht', u'nicht'), (u'nle', u'nie'), (u'Nlemalsl', u'Niemals!'), (u'Nlhe', u'N\xe4he'), (u'nlir', u'mir'), (u'nllitzen', u'n\xfctzen'), (u'Nl\xe9inner', u'M\xe4nner'), (u'noc/1', u'noch'), (u"Not/'all", u'Notfall'), (u'Notfalll', u'Notfall!'), (u'notig', u'n\xf6tig'), (u'notigen', u'n\xf6tigen'), (u'Notliige', u'Notl\xfcge'), (u'Notziindung', u'Notz\xfcndung'), (u'NUFI', u'Nur:'), (u'Nunja', u'Nun ja'), (u'Nurdich', u'Nur dich'), (u'nureins', u'nur eins'), (u'nurflustern', u'nur fl\xfcstern'), (u'Nurjetzt', u'Nur jetzt'), (u'nurl', u'nur 1'), (u'nurwunscht', u'nur w\xfcnscht'), (u'Nurzu', u'Nur zu'), (u'nus', u'aus'), (u'NUSSS', u'N\xfcsse'), (u'nutzlich', u'n\xfctzlich'), (u"Nx'emand", u'Niemand'), (u'N\xe9chste', u'N\xe4chste'), (u'n\xe9chsten', u'n\xe4chsten'), (u'N\xe9chster', u'N\xe4chster'), (u'n\xe9chstes', u'n\xe4chstes'), (u'N\xe9chte', u'N\xe4chte'), (u'N\xe9chten', u'N\xe4chten'), (u'n\xe9chtlichen', u'n\xe4chtlichen'), (u'N\xe9gel', u'N\xe4gel'), (u'N\xe9h', u'N\xe4h'), (u'N\xe9he', u'N\xe4he'), (u'n\xe9henf', u'n\xe4hert'), (u'n\xe9her', u'n\xe4her'), (u'n\xe9here', u'n\xe4here'), (u'N\xe9hern', u'N\xe4hern'), (u'n\xe9hernde', u'n\xe4hernde'), (u'n\xe9hert', u'n\xe4hert'), (u'n\xe9herte', u'n\xe4herte'), (u'n\xe9hren', u'n\xe4hren'), (u'n\xe9ht', u'n\xe4ht'), (u'N\xe9hten', u'N\xe4hten'), (u'N\xe9ichste', u'N\xe4chste'), (u'n\xe9ichsten', u'n\xe4chsten'), (u'N\xe9ichstes', u'N\xe4chstes'), (u'N\xe9ihe', u'N\xe4he'), (u'n\xe9iher', u'n\xe4her'), (u'n\xe9ihern', u'n\xe4hern'), (u'n\xe9ihert', u'n\xe4hert'), (u'N\xe9ihten', u'N\xe4hten'), (u'n\xe9imlich', u'n\xe4mlich'), (u'n\xe9mlich', u'n\xe4mlich'), (u'N\xe9pfe', u'N\xe4pfe'), (u'n\xe9rdlich', u'n\xf6rdlich'), (u'n\xe9rgelnde', u'n\xf6rgelnde'), (u'N\xe9rrin', u'N\xe4rrin'), (u'N\xe9schen', u'N\xe4schen'), (u'n\xe9tig', u'n\xf6tig'), (u'n\xe9tige', u'n\xf6tige'), (u'n\xe9tiges', u'n\xf6tiges'), (u'O8', u'08'), (u'obdachlosl', u'obdachlos!'), (u'Obefil\xe9iche', u'Oberfl\xe4che'), (u'OBERFLACHENSCHWERKRAFT', u'OBERFL\xc4CHENSCHWERKRAFT'), (u'Oberfl\xe9che', u'Oberfl\xe4che'), (u'Oberfl\xe9chen', u'Oberfl\xe4chen'), (u'oberfl\xe9chlich', u'oberfl\xe4chlich'), (u'oberfl\xe9chliche', u'oberfl\xe4chliche'), (u'Oberm\xe9inner', u'Oberm\xe4nner'), (u'Ober\ufb02fiche', u'Oberfl\xe4che'), (u"of/'en", u'offen'), (u'Offenslchtllch', u'Offensichtlich'), (u'Offentliches', u'\xd6ffentliches'), (u'Offentlichkeit', u'\xd6ffentlichkeit'), (u'Offne', u'\xd6ffne'), (u'Offnen', u'\xd6ffnen'), (u'Offnet', u'\xd6ffnet'), (u'ofi', u'oft'), (u'Ofiiziere', u'Offiziere'), (u'Ofiiziers', u'Offiziers'), (u'Oftweg', u'Oft weg'), (u'Of\ufb02cer', u'Officer'), (u'Ohnejede', u'Ohne jede'), (u'ohnm\xe9chtig', u'ohnm\xe4chtig'), (u'ohnm\xe9ichtig', u'ohnm\xe4chtig'), (u'OI', u'\xd6l'), (u'olas', u'das'), (u'oles', u'des'), (u'Oltanks', u'\xd6ltanks'), (u'OO', u'00'), (u'Orgelt\xe9ne', u'Orgelt\xf6ne'), (u'ORTI', u'ORT:'), (u'Ortl', u'Ort!'), (u'Ostfltlgel', u'Ostfl\xfcgel'), (u'Paliontologie', u'Pal\xe4ontologie'), (u'pallt', u'passt'), (u'Pal\xe9sten', u'Pal\xe4sten'), (u'Panfike/chen', u'Partikelchen'), (u'Papierbl\xe9tter', u'Papierbl\xe4tter'), (u'Papiertiite', u'Papiert\xfcte'), (u'Papiertilcher', u'Papiert\xfccher'), (u'Parfyknaller', u'Partyknaller'), (u'Partyhiite', u'Partyh\xfcte'), (u'Partyhijte', u'Partyh\xfcte'), (u'Passendervveise', u'Passenderweise'), (u'Paulgenauso', u'Paul genauso'), (u'pa\xdf', u'pass'), (u'pa\xdft', u'passt'), (u'peinliohl', u'peinlich'), (u'persdnlich', u'pers\xf6nlich'), (u'persfinlich', u'pers\xf6nlich'), (u'persiinlich', u'pers\xf6nlich'), (u'persiinliche', u'pers\xf6nliche'), (u'persiinlicher', u'pers\xf6nlicher'), (u'Persiinllchkeltsspaltun', u'Pers\xf6nllchkeltsspaltung'), (u'persijnliche', u'pers\xf6nliche'), (u'personlich', u'pers\xf6nlich'), (u'Personlichkeit', u'Pers\xf6nlichkeit'), (u'pers\xe9nlich', u'pers\xf6nlich'), (u'pers\xe9nliche', u'pers\xf6nliche'), (u'pers\xe9nlicher', u'pers\xf6nlicher'), (u'Pers\xe9nliches', u'Pers\xf6nliches'), (u'Pers\xe9nlichkeit', u'Pers\xf6nlichkeit'), (u'pe\ufb02g', u'peng'), (u'Pfadfindervvappen', u'Pfadfinderwappen'), (u'Pfad\ufb02ndeml', u'Pfad\ufb02ndern!'), (u'Pffitzen', u'Pf\xfctzen'), (u'Pfiitchen', u'Pf\xf6tchen'), (u'Pfippchen', u'P\xfcppchen'), (u"pflL'lgen", u'pfl\xfcgen'), (u'Pfllitze', u'Pf\xfctze'), (u'pflugte', u'pfl\xfcgte'), (u'Pfundbijro', u'Pfundb\xfcro'), (u'ph\xe9nomenal', u'ph\xe4nomenal'), (u'PIatz', u'Platz'), (u'Piimpel', u'P\xf6mpel'), (u'Piinlttchenltrawatte', u'P\xfcnktchenkrawatte'), (u'Pijppchen', u'P\xfcppchen'), (u'Pijppchenl', u'P\xfcppchen!'), (u'Planetenf', u'Planeten!'), (u'planm\xe9fiigen', u'planm\xe4\xdfigen'), (u'Plastikfr\xe9iuleinl', u'Plastikfr\xe4ulein!'), (u'plattmachen', u'platt machen'), (u'Plfitzchen', u'Pl\xe4tzchen'), (u'plfitzlich', u'pl\xf6tzlich'), (u'pliitzlich', u'pl\xf6tzlich'), (u'pliitzllch', u'pl\xf6tzlich'), (u'Pllllnderer', u'Pl\xfcnderer'), (u'plotzlich', u'pl\xf6tzlich'), (u'pl\xe9dieren', u'pl\xe4dieren'), (u'Pl\xe9ine', u'Pl\xe4ne'), (u'Pl\xe9inen', u'Pl\xe4nen'), (u'Pl\xe9itzchen', u'Pl\xe4tzchen'), (u'Pl\xe9itze', u'Pl\xe4tze'), (u'Pl\xe9ne', u'Pl\xe4ne'), (u'Pl\xe9tzchen', u'Pl\xe4tzchen'), (u'Pl\xe9tze', u'Platze'), (u'Pl\xe9tzel', u'Pl\xe4tze!'), (u'pl\xe9tzlich', u'pl\xf6tzlich'), (u'pl\xe9tzliche', u'pl\xf6tzliche'), (u'Pofkawoche', u'Polkawoche'), (u'Polizistl', u'Polizist!'), (u'pompiise', u'pomp\xf6se'), (u'popul\xe9r', u'popul\xe4r'), (u'potth\xe9sslich', u'potth\xe4sslich'), (u'prasentleren', u'pr\xe4sentieren'), (u'prfignant', u'pr\xe4gnant'), (u'Prfisentation', u'Pr\xe4sentation'), (u'Prfisi', u'Pr\xe4si'), (u'priide', u'pr\xfcde'), (u'Priife', u'Pr\xfcfe'), (u'priifen', u'pr\xfcfen'), (u'prijfen', u'pr\xfcfen'), (u"Priorit2a't", u'Priorit\xe4t'), (u'PRIORITKT', u'PRIORIT\xc4T'), (u'PRIORITKTSZUGANG', u'PRIORIT\xc4TSZUGANG'), (u'Priorit\xe9itszugang', u'Priorit\xe4tszugang'), (u'Priorit\xe9t', u'Priorit\xe4t'), (u'Prisident', u'Pr\xe4sident'), (u'Privatgem\xe9chern', u'Privatgem\xe4chern'), (u'Privatsph\xe9re', u'Privatsph\xe4re'), (u'Probfeme', u'Probleme'), (u'Profitinzerinnen', u'Profit\xe4nzerinnen'), (u'Protege', u'Prot\xe9g\xe9'), (u'prude', u'pr\xfcde'), (u'Pruf', u'Pr\xfcf'), (u'prufen', u'pr\xfcfen'), (u'Prugelei', u'Pr\xfcgelei'), (u'prugeln', u'pr\xfcgeln'), (u'pr\xe9chtig', u'pr\xe4chtig'), (u'Pr\xe9fekt', u'Pr\xe4fekt'), (u'pr\xe9historischer', u'pr\xe4historischer'), (u'pr\xe9ichtiger', u'pr\xe4chtiger'), (u'pr\xe9ichtiges', u'pr\xe4chtiges'), (u'Pr\xe9imie', u'Pr\xe4mie'), (u'pr\xe9ipotente', u'pr\xe4potente'), (u'pr\xe9isentiert', u'pr\xe4sentiert'), (u'Pr\xe9isidenten', u'Pr\xe4sidenten'), (u'Pr\xe9itorianer', u'Pr\xe4torianer'), (u'Pr\xe9mie', u'Pr\xe4mie'), (u'Pr\xe9operative', u'Pr\xe4operative'), (u'pr\xe9sentiere', u'pr\xe4sentiere'), (u'pr\xe9sentieren', u'pr\xe4sentieren'), (u'Pr\xe9sentiert', u'Pr\xe4sentiert'), (u'Pr\xe9senz', u'Pr\xe4senz'), (u'Pr\xe9sident', u'Pr\xe4sident'), (u'Pr\xe9sidenten', u'Pr\xe4sidenten'), (u'Pr\xe9sidentin', u'Pr\xe4sidentin'), (u'Pr\xe9sidentschaft', u'Pr\xe4sidentschaft'), (u'Pr\xe9torianer', u'Pr\xe4torianer'), (u'pr\xe9zise', u'pr\xe4zise'), (u'pr\xe9ziser', u'pr\xe4ziser'), (u'Pr\ufb02fungen', u'Pr\xfcfungen'), (u'Pubert\xe9it', u'Pubert\xe4t'), (u'Publlkuml', u'Publlkum!'), (u'PUPPCHEN', u'P\xdcPPCHEN'), (u'PUpst', u'Pupst'), (u'Purzelb\xe9ume', u'Purzelb\xe4ume'), (u'P\xe9ckchen', u'P\xe4ckchen'), (u'p\xe9idagogisch', u'p\xe4dagogisch'), (u'P\xe9irchen', u'P\xe4rchen'), (u'P\xe9rchen', u'P\xe4rchen'), (u'p\ufb02egen', u'pflegen'), (u'P\ufb02icht', u'Pflicht'), (u'p\ufb02ichtbewullt', u'pflichtbewusst'), (u'Qas', u'Das'), (u'Qualit\xe9tskontrolle', u'Qualit\xe4tskontrolle'), (u'Quten', u'guten'), (u'qu\xe9ilen', u'qu\xe4len'), (u'qu\xe9ilt', u'qu\xe4lt'), (u'Qu\xe9l', u'Qu\xe4l'), (u'Qu\xe9lt', u'Qu\xe4lt'), (u"R'a'che", u'R\xe4che'), (u'R/ck', u'Rick'), (u'R/nge', u'Ringe'), (u'R6mer', u'R\xf6mer'), (u'rachsiichtiger', u'rachs\xfcchtiger'), (u'ranghfiheren', u'rangh\xf6heren'), (u'rangh\xe9heren', u'rangh\xf6heren'), (u'ranzukommen', u'ran-zukommen'), (u'Rasenm\xe9herunfall', u'Rasenm\xe4herunfall'), (u'Rasterllibertragung', u'Raster\xfcbertragung'), (u'Rasterubertragung', u'Raster\xfcbertragung'), (u'Ratschl\xe9ige', u'Ratschl\xe4ge'), (u'Rattenf\xe9nger', u'Rattenf\xe4nger'), (u'Rauc/7', u'Rauch'), (u'Rauc/vender', u'Rauchender'), (u'rauhen', u'rauen'), (u'RAUMFAHRE', u'RAUMF\xc4HRE'), (u'Raumf\xe9hre', u'Raumf\xe4hre'), (u'Raumsschiff', u'Raumschiff'), (u'rausf\xe9hrt', u'rausf\xe4hrt'), (u'rausgeprtigeltl', u'rausgepr\xfcgelt!'), (u'rausliefien', u'rauslie\xdfen'), (u'rauszuschmeifien', u'rauszuschmei\xdfen'), (u'rau\ufb02', u'rau!'), (u'Re/se', u'Reise'), (u'Realit\xe9it', u'Realit\xe4t'), (u'Realit\xe9t', u'Realit\xe4t'), (u'Rechtgl\xe9ubige', u'Rechtgl\xe4ubige'), (u'rechtm\xe9fkigen', u'rechtm\xe4\xdfigen'), (u'RECHTSANWALTE', u'RECHTSANW\xc4LTE'), (u'rechtsl', u'rechts!'), (u'Reffer', u'Retter'), (u'regelm\xe9fiige', u'regelm\xe4\xdfige'), (u'Regenh\xe9igen', u'Regenb\xf6gen'), (u'Regenm\xe9ntel', u'Regenm\xe4ntel'), (u'Regierungsgehirnw\xe9ischesignal', u'Regierungsgehirnw\xe4schesignal'), (u'regul\xe9re', u'regul\xe4re'), (u'reiB', u'rei\xdf'), (u'reiBt', u'rei\xdft'), (u'Reichtfimer', u'Reicht\xfcmer'), (u'Reichtllimern', u'Reicht\xfcmern'), (u'reif$', u'rei\xdf'), (u'reif$en', u'rei\xdfen'), (u'Reifiverschluss', u'Rei\xdfverschluss'), (u'Reil3t', u'Rei\xdft'), (u'reil5', u'rei\xdf'), (u'Reili', u'Rei\xdf'), (u'reilien', u'rei\xdfen'), (u'Reilin\xe9gel', u'Rei\xdfn\xe4gel'), (u'Reillt', u'Rei\xdft'), (u'reilZ>', u'rei\xdf'), (u'reingeh\xe9ngt', u'reingeh\xe4ngt'), (u'Reingelegtl', u'Reingelegt!'), (u'reinhupft', u'reinh\xfcpft'), (u'reinl', u'rein!'), (u'reinstilrmen', u'reinst\xfcrmen'), (u'reiohen', u'reichen'), (u'REISSVERSCHLUSSGERAUSCH', u'REISSVERSCHLUSSGER\xc4USCH'), (u'rei\ufb02', u'rei\xdf'), (u'rei\ufb02en', u'rei\xdfen'), (u'relch', u'reich'), (u'religi6s', u'religi\xf6s'), (u'religiiiser', u'religi\xf6ser'), (u'religi\xe9s', u'religi\xf6s'), (u'Rels', u'Reis'), (u'Rentenbezuge', u'Rentenbez\xfcge'), (u'Repr\xe9sentantin', u'Repr\xe4sentantin'), (u'Rettungsflofi', u'Rettungsflo\xdf'), (u'Rev/er', u'Revier'), (u'rfiber', u'r\xfcber'), (u'rfiberwachsen', u'r\xfcberwachsen'), (u'Rfickseite', u'R\xfcckseite'), (u'rfihrselige', u'r\xfchrselige'), (u'rfilpse', u'r\xfclpse'), (u'Rfissel', u'R\xfcssel'), (u'RGMISCHE', u'R\xd6MISCHE'), (u'Richer', u'R\xe4cher'), (u'Riesenhfipfer', u'Riesenh\xfcpfer'), (u'Riesenspafi', u'Riesenspa\xdf'), (u'Riesentijr', u'Riesent\xfcr'), (u'riiber', u'r\xfcber'), (u'Riicheln', u'R\xf6cheln'), (u'riichelt', u'r\xf6chelt'), (u'Riick', u'R\xfcck'), (u'Riickblickend', u'R\xfcckblickend'), (u'Riicken', u'R\xfccken'), (u'Riickenlage', u'R\xfcckenlage'), (u'Riickenwind', u'R\xfcckenwind'), (u'riicksichtslos', u'r\xfccksichtslos'), (u'Riicksichtslosigkeit', u'R\xfccksichtslosigkeit'), (u'Riicksitz', u'R\xfccksitz'), (u'Riickw\xe9irts', u'R\xfcckw\xe4rts'), (u'Riickzug', u'R\xfcckzug'), (u'Riick\ufb02ug', u'R\xfcck\ufb02ug'), (u'riihrt', u'r\xfchrt'), (u'Riilpsen', u'R\xfclpsen'), (u'riilpst', u'r\xfclpst'), (u'Riimischen', u'R\xf6mischen'), (u'Riistung', u'R\xfcstung'), (u'Riiumlichkeiten', u'R\xe4umlichkeiten'), (u'Rijbe', u'R\xfcbe'), (u'rijber', u'r\xfcber'), (u'rijckgfingig', u'r\xfcckg\xe4ngig'), (u'rijckw\xe9irts', u'r\xfcckw\xe4rts'), (u'Rijsseltierl', u'R\xfcsseltier!'), (u'Rilbe', u'R\xfcbe'), (u'rilber', u'r\xfcber'), (u'rilberkommen', u'r\xfcberkommen'), (u'Rilckkehr', u'R\xfcckkehr'), (u'rilcksichtsloses', u'r\xfccksichtsloses'), (u'rilckw\xe9rts', u'r\xfcckw\xe4rts'), (u'Rillpsen', u'R\xfclpsen'), (u'Riol', u'Rio!'), (u'Rivalit\xe9t', u'Rivalit\xe4t'), (u"rL'lber", u'r\xfcber'), (u"RL'lhr", u'R\xfchr'), (u'rllicken', u'r\xfccken'), (u'rllickt', u'r\xfcckt'), (u'Rlllckgrat', u'R\xfcckgrat'), (u'Rlnge', u'Ringe'), (u'Rlumgerate', u'R\xe4umger\xe4te'), (u'ROMISCHE', u'R\xd6MISCHE'), (u'ROMISCHEN', u'R\xd6MISCHEN'), (u'rosa\xe9ugiges', u'rosa\xe4ugiges'), (u'rotiugiger', u'rot\xe4ugiger'), (u'Rotk\xe9ppchen', u'Rotk\xe4ppchen'), (u'Rott\xe9nen', u'Rott\xf6nen'), (u'Routinetlberprijfung', u'Routine\xfcberpr\xfcfung'), (u'Rticken', u'R\xfccken'), (u'rticksichtslos', u'r\xfccksichtslos'), (u'rtlber', u'r\xfcber'), (u'Rtlckseite', u'R\xfcckseite'), (u'ruber', u'r\xfcber'), (u'Ruberrutschen', u'R\xfcberrutschen'), (u'Ruckblende', u'R\xfcckblende'), (u'Ruckblick', u'R\xfcckblick'), (u'Rucken', u'R\xfccken'), (u'Ruckenlage', u'R\xfcckenlage'), (u'Ruckenwind', u'R\xfcckenwind'), (u'Ruckfall', u'R\xfcckfall'), (u'Ruckfrage', u'R\xfcckfrage'), (u'Ruckgriff', u'R\xfcckgriff'), (u'Ruckkehr', u'R\xfcckkehr'), (u'Rucksitz', u'R\xfccksitz'), (u'Ruckzugl', u'R\xfcckzug!'), (u'ruhlg', u'ruhig'), (u'ruhrenl', u'r\xfchren!'), (u'Ruhrt', u'R\xfchrt'), (u'Rul3', u'Ru\xdf'), (u'Rumgebrfillel', u'Rumgebr\xfclle!'), (u'rumhingen', u'rumh\xe4ngen'), (u'rumh\xe9ngen', u'rumh\xe4ngen'), (u'rumh\xe9ngst', u'rumh\xe4ngst'), (u'ruml\xe9uft', u'ruml\xe4uft'), (u'rumwuhlen', u'rumw\xfchlen'), (u'rumzuf\ufb02hren', u'rumzuf\xfchren'), (u'rum\xe9rgern', u'rum\xe4rgern'), (u'runterffihrt', u'runterf\xe4hrt'), (u'runtergespillt', u'runtergesp\xfclt'), (u'runtergesp\ufb02lt', u'runtergesp\xfclt'), (u'Runterl', u'Runter!'), (u'runterspillen', u'runtersp\xfclen'), (u'runterspllllen', u'runtersp\xfclen'), (u'runtersp\xfclt', u'runter-sp\xfclt'), (u'runtervverfen', u'runterwerfen'), (u'Rupem', u'Rupert!'), (u'Rustung', u'R\xfcstung'), (u'r\xe9che', u'r\xe4che'), (u'r\xe9chen', u'r\xe4chen'), (u'R\xe9cher', u'R\xe4cher'), (u'r\xe9cht', u'r\xe4cht'), (u'R\xe9der', u'R\xe4der'), (u'R\xe9dern', u'R\xe4dern'), (u'R\xe9hre', u'R\xf6hre'), (u'R\xe9idern', u'R\xe4dern'), (u'R\xe9itsel', u'R\xe4tsel'), (u'r\xe9itseln', u'r\xe4tseln'), (u'r\xe9itst', u'r\xe4tst'), (u'R\xe9iume', u'R\xe4ume'), (u'R\xe9mern', u'R\xf6mern'), (u'r\xe9mische', u'r\xf6mische'), (u'r\xe9mischen', u'r\xf6mischen'), (u'r\xe9mischer', u'r\xf6mischer'), (u'R\xe9nder', u'R\xe4nder'), (u'R\xe9nke', u'R\xe4nke'), (u'R\xe9nken', u'R\xe4nken'), (u'R\xe9ntgenaufnahme', u'R\xf6ntgenaufnahme'), (u'R\xe9ntgenbild', u'R\xf6ntgenbild'), (u'R\xe9son', u'R\xe4son'), (u'r\xe9t', u'r\xe4t'), (u'R\xe9tsel', u'R\xe4tsel'), (u'r\xe9tselhaft', u'r\xe4tselhaft'), (u'R\xe9tselhaftes', u'R\xe4tselhaftes'), (u'R\xe9ume', u'R\xe4ume'), (u'R\xe9umen', u'R\xe4umen'), (u'R\xe9umlichkeiten', u'R\xe4umlichkeiten'), (u'R\xe9umt', u'R\xe4umt'), (u'r\xe9uspert', u'r\xe4uspert'), (u'R\ufb02be', u'R\xfcbe'), (u'r\ufb02bergeguckt', u'r\xfcbergekuckt'), (u'R\ufb02ckkehr', u'R\xfcckkehr'), (u'S/e', u'Sie'), (u's/nd', u'sind'), (u'S5tze', u'S\xe4tze'), (u'S6hne', u'S\xf6hne'), (u'saB', u'sa\xdf'), (u'Sachverstlndiger', u'Sachverst\xe4ndiger'), (u'sagf', u'sagt'), (u'sagfen', u'sagten'), (u'Sammlerstiicken', u'Sammlerst\xfccken'), (u'Sands\xe9cke', u'Sands\xe4cke'), (u'Sanftmiltigen', u'Sanftm\xfctigen'), (u'Sanierungsbeh\xe9rde', u'Sanierungsbeh\xf6rde'), (u'Sanit\xe9ter', u'Sanit\xe4ter'), (u'Sargn\xe9gel', u'Sargn\xe4gel'), (u'sari', u'sa\xdf'), (u'Satellitenschijssel', u'Satellitensch\xfcssel'), (u'Satellitenschusseln', u'Satellitensch\xfcsseln'), (u'Satellitenuberwachung', u'Satelliten\xfcberwachung'), (u'Saugf\ufb02flsen', u'Saugf\xfc\xdfen'), (u'sc/10/1', u'schon'), (u'sc/16/1', u'sch\xf6n'), (u'sch/cken', u'schicken'), (u'Sch/ffe', u'Schiffe'), (u'sch6n', u'sch\xf6n'), (u'Schadeniiberpriifung', u'Schaden\xfcberpr\xfcfung'), (u'Schadenuberprtlfung', u'Schaden\xfcberpr\xfcfung'), (u'Scharfschijtze', u'Scharfsch\xfctze'), (u'schbn', u'sch\xf6n'), (u"schc'\xa7n", u'sch\xf6n'), (u'Schdn', u'Sch\xf6n'), (u'schdnen', u'sch\xf6nen'), (u'Schecksl', u'Schecks!'), (u'ScheiB', u'Schei\xdf'), (u'ScheiBe', u'Schei\xdfe'), (u'scheiBegal', u'schei\xdfegal'), (u'Scheif$e', u'Schei\xdfe'), (u'scheiffsel', u'schei\xdfe!'), (u'Scheifi', u'Schei\xdf'), (u'Scheifiding', u'Schei\xdfding'), (u'scheifie', u'schei\xdfe'), (u'Scheifiel', u'Schei\xdfe!'), (u'Scheifier', u'Schei\xdfer'), (u'Scheifihelm', u'Schei\xdfhelm'), (u'Scheifiloch', u'Schei\xdfloch'), (u'Scheifipascha', u'Schei\xdfpascha'), (u'Scheifisofa', u'Schei\xdfsofa'), (u'Scheifiweiber', u'Schei\xdfweiber'), (u'Scheifle', u'Schei\xdfe'), (u'Scheiiislangweilig', u'Schei\xdflangweilig'), (u"Scheil'$e", u'Schei\xdfe'), (u'Scheil3>er', u'Schei\xdfer'), (u'Scheil3e', u'Schei\xdfe'), (u'Scheili', u'Schei\xdf'), (u'Scheilie', u'Schei\xdfe'), (u'scheilien', u'schei\xdfen'), (u'Scheille', u'Schei\xdfe'), (u'Scheillel', u'Schei\xdfe!'), (u'ScheilSe', u'Schei\xdfe'), (u'ScheilZ>', u'Schei\xdf'), (u'Scheir$oling', u'Schei\xdfding'), (u'scheissegal', u'schei\xdfegal'), (u'Scheisskarre', u'Schei\xdfkarre'), (u'Schei\ufb02e', u'Schei\xdfe'), (u'scheme', u'schei\xdfe'), (u'scheuf$lich', u'scheu\xdflich'), (u'Scheulilich', u'Scheu\xdflich'), (u'schfichtern', u'sch\xfcchtern'), (u'schfimen', u'sch\xe4men'), (u'schfin', u'sch\xf6n'), (u'Schfine', u'Sch\xf6ne'), (u'schfinen', u'sch\xf6nen'), (u'Schfines', u'Sch\xf6nes'), (u'schfirfer', u'sch\xe4rfer'), (u'Schfissel', u'Sch\xfcssel'), (u'Schfitzchen', u'Sch\xe4tzchen'), (u'schfjnes', u'sch\xf6nes'), (u'Schideln', u'Sch\xe4deln'), (u'schief$en', u'schie\xdfen'), (u'Schief3>en', u'Schie\xdfen'), (u'Schiefien', u'Schie\xdfen'), (u'schiefit', u'schie\xdft'), (u'schiefZ>t', u'schie\xdft'), (u"schiel'5", u'schie\xdf'), (u'Schiel3t', u'Schie\xdft'), (u'schiellen', u'schie\xdfen'), (u'Schielmbung', u'Schie\xdf\xfcbung'), (u'schie\ufb02en', u'schie\xdfen'), (u'schie\ufb02t', u'schie\xdft'), (u'Schiffs\xe9rzte', u'Schiffs\xe4rzte'), (u'Schiffzerstfiren', u'Schiff zerst\xf6ren'), (u'Schifies', u'Schiffes'), (u'Schiidel', u'Sch\xe4del'), (u'schiilzen', u'sch\xe4tzen'), (u'schiin', u'sch\xf6n'), (u'schiine', u'sch\xf6ne'), (u'Schiinen', u'Sch\xf6nen'), (u'Schiiner', u'Sch\xf6ner'), (u'schiines', u'sch\xf6nes'), (u'Schiinheit', u'Sch\xf6nheit'), (u'Schiipfer', u'Sch\xf6pfer'), (u'Schiipfung', u'Sch\xf6pfung'), (u'Schiisse', u'Sch\xfcsse'), (u'Schiitt', u'Sch\xfctt'), (u'Schiittelfrost', u'Sch\xfcttelfrost'), (u'schiitten', u'sch\xfctten'), (u'schiittet', u'sch\xfcttet'), (u'schiitze', u'sch\xe4tze'), (u'schiitzen', u'sch\xfctzen'), (u'schiitzt', u'sch\xfctzt'), (u'schijn', u'sch\xf6n'), (u'Schijnes', u'Sch\xf6nes'), (u'schijng', u'sch\xf6n!'), (u'Schijssel', u'Sch\xfcssel'), (u'schijttelt', u'sch\xfcttelt'), (u'Schijtze', u'Sch\xfctze'), (u'schijtzen', u'sch\xfctzen'), (u'Schildkr\xe9te', u'Schildkr\xf6te'), (u'Schilrze', u'Sch\xfcrze'), (u'Schilsse', u'Sch\xfcsse'), (u'schiltten', u'sch\xfctten'), (u'schiltzen', u'sch\xfctzen'), (u'schimte', u'sch\xe4mte'), (u'Schizophrenia', u'Schizophrenie'), (u'Schi\xe9tze', u'Sch\xe4tze'), (u'Schlachtgetllimmels', u'Schlachtget\xfcmmels'), (u'Schlachtschifl', u'Schlachtschiff'), (u'schlafenl', u'schlafen!'), (u'Schlafk\xe9fern', u'Schlafk\xe4fern'), (u'Schlafmiitzenl', u'Schlafm\xfctzen!'), (u'Schlafm\ufb02tzel', u'Schlafm\xfctze!'), (u'Schlangeng\xe9ttin', u'Schlangeng\xf6ttin'), (u'Schlappschw\xe9nze', u'Schlappschw\xe4nze'), (u'Schlaumeierl', u'Schlaumeier!'), (u'schlechf', u'schlecht'), (u'Schlelistiinde', u'Schie\xdfst\xe4nde'), (u'Schlellen', u'Schie\xdfen'), (u'Schle\ufb02t', u'Schie\xdft'), (u'Schlfilsselparty', u'Schl\xfcsselparty'), (u'Schlfisse', u'Schl\xfcsse'), (u'SchlieBe', u'Schlie\xdfe'), (u'schlieBen', u'schlie\xdfen'), (u'schlieBIich', u'schlie\xdflich'), (u'schlieBlich', u'schlie\xdflich'), (u'SchlieBt', u'Schlie\xdft'), (u'schlief$en', u'schlie\xdfen'), (u'Schlief$lich', u'Schlie\xdflich'), (u'schlief2>lich', u'schlie\xdflich'), (u'schlief3t', u'schlie\xdft'), (u'Schliefie', u'Schlie\xdfe'), (u'schliefien', u'schlie\xdfen'), (u'Schliefilich', u'Schlie\xdflich'), (u'schlieflslich', u'schlie\xdflich'), (u'schliel3en', u'schlie\xdfen'), (u'schliel3lich', u'schlie\xdflich'), (u'Schliel5t', u'Schlie\xdft'), (u'schlielie', u'schlie\xdfe'), (u'schlielien', u'schlie\xdfen'), (u'schlielilich', u'schlie\xdflich'), (u'schliellsen', u'schlie\xdfen'), (u'SchlielSt', u'Schlie\xdft'), (u'Schliissel', u'Schl\xfcssel'), (u'Schliissell', u'Schl\xfcssel!'), (u'Schliisselmoment', u'Schl\xfcsselmoment'), (u'Schliisseln', u'Schl\xfcsseln'), (u'Schlijsse', u'Schl\xfcsse'), (u'Schlijssel', u'Schl\xfcssel'), (u'Schlijsselloch', u'Schl\xfcsselloch'), (u'Schlilssel', u'Schl\xfcssel'), (u'Schlilssell', u'Schl\xfcssel'), (u'Schlilsselparty', u'Schl\xfcsselparty'), (u'schlimmsterAlbtraum', u'schlimmster Albtraum'), (u'Schlle\ufb02en', u'Schlie\xdfen'), (u'Schllisse', u'Sch\xfcsse'), (u'schllitze', u'sch\xfctze'), (u'schllitzen', u'sch\xfctzen'), (u'Schlllissell', u'Schl\xfcssel!'), (u'Schlull', u'Schluss'), (u'Schlupfern', u'Schl\xfcpfern'), (u'Schlusselmoment', u'Schl\xfcsselmoment'), (u'Schlusselszenen', u'Schl\xfcsselszenen'), (u'Schlusselw\xe9rter', u'Schlusselw\xf6rter'), (u'Schlussl', u'Schluss!'), (u'Schlu\xdf', u'Schluss'), (u'Schl\xe9chter', u'Schl\xe4chter'), (u'schl\xe9fst', u'schl\xe4fst'), (u'Schl\xe9ft', u'Schl\xe4ft'), (u'Schl\xe9ge', u'Schl\xe4ge'), (u'Schl\xe9ger', u'Schl\xe4ger'), (u'Schl\xe9gerei', u'Schl\xe4gerei'), (u'schl\xe9gt', u'schl\xe4gt'), (u'schl\xe9ift', u'schl\xe4ft'), (u'schl\xe9igst', u'schl\xe4gst'), (u'Schl\ufb02ssel', u'Schl\xfcssel'), (u'Schmatzger\xe9usche', u'Schmatzger\xe4usche'), (u'SchmeiBt', u'Schmei\xdft'), (u'Schmeif$', u'Schmei\xdf'), (u'Schmeif$t', u'Schmei\xdft'), (u'Schmeifien', u'Schmei\xdfen'), (u'schmeifit', u'schmei\xdft'), (u'Schmeilit', u'Schmei\xdft'), (u'Schmei\ufb02', u'Schmei\xdf'), (u'Schmier\xe9l', u'Schmier\xf6l'), (u'schmiicken', u'schm\xfccken'), (u'schmilztl', u'schmilzt!'), (u'schmi\ufb02', u'schmiss'), (u'Schmuckk\xe9stchen', u'Schmuckk\xe4stchen'), (u'Schmuckstiick', u'Schmuckst\xfcck'), (u'Schnappschijsse', u'Schnappsch\xfcsse'), (u'Schnauzel', u'Schnauze!'), (u'Schneegest\xe9ber', u'Schneegest\xf6ber'), (u'Schneidez\xe9hnen', u'Schneidez\xe4hnen'), (u'Schneidez\xe9ihne', u'Schneidez\xe4hne'), (u'schnellf', u'schnell!'), (u'Schnfiffeln', u'Schn\xfcffeln'), (u'schnfiffelnl', u'schn\xfcffeln!'), (u'schnfiffelst', u'schn\xfcffelst'), (u'Schnfirsenkel', u'Schn\xfcrsenkel'), (u'schniiffele', u'schn\xfcffele'), (u'schnijffelt', u'schn\xfcffelt'), (u'Schnilffeln', u'Schn\xfcffeln'), (u'schnilrt', u'schn\xfcrt'), (u'Schnitzereigesch\xe9ft', u'Schnitzereigesch\xe4ft'), (u'Schniuzer', u'Schn\xe4uzer'), (u'Schnuoki', u'Schnucki'), (u'Schn\xe9ppchen', u'Schn\xe4ppchen'), (u'SchoB', u'Scho\xdf'), (u'Schofk', u'Scho\xdf'), (u'ScholShund', u'Scho\xdfhund'), (u'Schones', u'Sch\xf6nes'), (u'schonl', u'schon!'), (u'schopferische', u'sch\xf6pferische'), (u'scho\xdf', u'schoss'), (u'Schrankw\xe9nde', u'Schrankw\xe4nde'), (u'Schraubenschlijssel', u'Schraubenschl\xfcssel'), (u'schrecklichl', u'schrecklich!'), (u'Schriftist', u'Schrift ist'), (u'Schriftstijcks', u'Schriftst\xfccks'), (u'schr\xe9ge', u'schr\xe4ge'), (u'Schr\xe9ges', u'Schr\xe4ges'), (u'Schr\xe9nke', u'Schr\xe4nke'), (u'Schr\xe9nken', u'Schr\xe4nken'), (u'schtin', u'sch\xf6n'), (u'schtine', u'sch\xf6ne'), (u'Schtisse', u'Sch\xfcsse'), (u'schuchtern', u'sch\xfcchtern'), (u'Schuchterne', u'Sch\xfcchterne'), (u'Schuhl', u'Schuh!'), (u'Schuldgeftihlen', u'Schuldgef\xfchlen'), (u'Schulterl', u'Schulter!'), (u'Schutzen', u'Sch\xfctzen'), (u'Schutzr\xe9ume', u'Schutzr\xe4ume'), (u'SCHUTZT', u'SCH\xdcTZT'), (u"Schw6r's", u"Schw\xf6r's"), (u'Schwachkop\ufb02', u'Schwachkop!'), (u'Schwanzlutscherl', u'Schwanzlutscher!'), (u'Schwarzh\xe9ndler', u'Schwarzh\xe4ndler'), (u'Schwarzweills', u'Schwarzwei\xdf'), (u'schwei\ufb02durchnisst', u'schwei\xdfdurchn\xe4sst'), (u'schwerh\xe9rig', u'schwerh\xf6rig'), (u'schwiicht', u'schw\xe4cht'), (u'schwiire', u'schw\xf6re'), (u'schwiiren', u'schw\xf6ren'), (u'Schwimmanziige', u'Schwimmanz\xfcge'), (u'schwi\xe9rmten', u'schw\xe4rmten'), (u'schwnre', u'schw\xf6re'), (u'Schw\xe9che', u'Schw\xe4che'), (u'Schw\xe9chen', u'Schw\xe4chen'), (u'schw\xe9cher', u'schw\xe4cher'), (u'schw\xe9cheren', u'schw\xe4cheren'), (u'schw\xe9chsten', u'schw\xe4chsten'), (u'Schw\xe9icheanfall', u'Schw\xe4cheanfall'), (u'Schw\xe9ichen', u'Schw\xe4chen'), (u'schw\xe9icher', u'schw\xe4cher'), (u'Schw\xe9ichling', u'Schw\xe4chling'), (u'Schw\xe9irmerei', u'Schw\xe4rmerei'), (u'schw\xe9irzeste', u'schw\xe4rzeste'), (u'Schw\xe9mme', u'Schw\xe4mme'), (u'schw\xe9re', u'schw\xf6re'), (u'schw\xe9ren', u'schw\xf6ren'), (u'Schw\xe9rme', u'Schw\xe4rme'), (u'schw\xe9rmt', u'schw\xe4rmt'), (u'schw\xe9rmte', u'schw\xe4rmte'), (u'Schw\xe9tzer', u'Schw\xe4tzer'), (u'sch\xe9biger', u'sch\xe4biger'), (u'Sch\xe9del', u'Sch\xe4del'), (u'Sch\xe9den', u'Sch\xe4den'), (u'Sch\xe9inder', u'Sch\xe4nder'), (u'sch\xe9ine', u'sch\xf6ne'), (u'sch\xe9inen', u'sch\xf6nen'), (u'Sch\xe9iner', u'Sch\xf6ner'), (u'sch\xe9irfen', u'sch\xe4rfen'), (u'sch\xe9le', u'sch\xe4le'), (u'sch\xe9me', u'sch\xe4me'), (u'Sch\xe9n', u'Sch\xf6n'), (u'sch\xe9ne', u'sch\xf6ne'), (u'Sch\xe9nen', u'Sch\xf6nen'), (u'Sch\xe9ner', u'Sch\xf6ner'), (u'Sch\xe9nes', u'Sch\xf6nes'), (u'Sch\xe9nheit', u'Sch\xf6nheit'), (u'sch\xe9nl', u'sch\xf6n!'), (u'sch\xe9nste', u'sch\xf6nste'), (u'sch\xe9nsten', u'sch\xf6nsten'), (u'sch\xe9nstes', u'sch\xf6nstes'), (u'Sch\xe9tzchen', u'Sch\xe4tzchen'), (u'Sch\xe9tze', u'Sch\xe4tze'), (u'sch\xe9tzen', u'sch\xe4tzen'), (u'sch\xe9tzt', u'sch\xe4tzt'), (u'Sch\xe9tzung', u'Sch\xe4tzung'), (u'Sch\xe9umen', u'Sch\xe4umen'), (u'sch\ufb02chtern', u'sch\xfcchtern'), (u"SCl'1lUSS6l", u'Schl\xfcssel'), (u'Scllrift', u'Schrift'), (u'scmoss', u'SCHLOSS'), (u'se/n', u'sein'), (u'Se/wen', u'Sehen'), (u'sehenl', u'sehen!'), (u'Sehenswlllrdigkeiten', u'Sehensw\xfcrdigkeiten'), (u'Sehnsilchte', u'Sehns\xfcchte'), (u'sehrangespannt', u'sehr angespannt'), (u'sehrjung', u'sehr jung'), (u'Sehrwohl', u'Sehr wohl'), (u'sehrzufrieden', u'sehr zufrieden'), (u'sehtjetzt', u'seht jetzt'), (u'Seidenglattl', u'Seidenglatt!'), (u'seidjetzt', u'seid jetzt'), (u'Seitwann', u'Seit wann'), (u'SEKRETARIN', u'SEKRET\xc4RIN'), (u'Sekretiir', u'Sekret\xe4r'), (u'Sekretir', u'Sekret\xe4r'), (u'Sekret\xe9irin', u'Sekret\xe4rin'), (u'Sekret\xe9rin', u'Sekret\xe4rin'), (u'sel/g', u'selig'), (u'selbstl', u'selbst!'), (u'selbststiindig', u'selbstst\xe4ndig'), (u'selbstsuchtige', u'selbsts\xfcchtige'), (u'selbstverstindlich', u'selbstverst\xe4ndlich'), (u'Selbstverstlndlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9indlich', u'Selbstverst\xe4ndlich'), (u'Selbstverst\xe9ndlich', u'Selbstverst\xe4ndlich'), (u'seld', u'seid'), (u'selhst', u'selbst'), (u'SeligerVater', u'Seliger Vater'), (u'seln', u'sein'), (u'Selt', u'Seit'), (u'sentimalen', u'sentimentalen'), (u'seri\xe9ser', u'seri\xf6ser'), (u'Sexualit\xe9t', u'Sexualit\xe4t'), (u'Sfe', u'Sie'), (u'Sfidamerikas', u'S\xfcdamerikas'), (u'Sfidwind', u'S\xfcdwind'), (u'Sfifies', u'S\xfc\xdfes'), (u'Sfihne', u'S\xf6hne'), (u'Sfildner', u'S\xf6ldner'), (u'Sfilie', u'S\xfc\xdfe'), (u'Sfilieste', u'S\xfc\xdfeste'), (u'Sfi\ufb02igkeiten', u'S\xfc\xdfigkeiten'), (u'sfnd', u'sind'), (u'SICHERHEITSBEHORDE', u'SICHERHEITSBEH\xd6RDE'), (u'Sicherheitsgrijnden', u'Sicherheitsgr\xfcnden'), (u'Sichtubervvachung', u'Sicht\xfcberwachung'), (u'Sichtunterstutzung', u'Sichtunterst\xfctzung'), (u'Sieja', u'Sie ja'), (u'Sifihnchen', u'S\xf6hnchen'), (u'Signalst\xe9rke', u'Signalst\xe4rke'), (u'Siiden', u'S\xfcden'), (u'Siidfrankreich', u'S\xfcdfrankreich'), (u'siidliche', u's\xfcdliche'), (u'siil$', u's\xfc\xdf'), (u'siili', u's\xfc\xdf'), (u'Siilie', u'S\xfc\xdfe'), (u'siilier', u's\xfc\xdfer'), (u"SIim's", u"Slim's"), (u'Siinde', u'S\xfcnde'), (u'Siinden', u'S\xfcnden'), (u'Siinder', u'S\xfcnder'), (u'siindigen', u's\xfcndigen'), (u'sii\ufb02en', u's\xfc\xdfen'), (u'siJB', u's\xfc\xdf'), (u'SiJBe', u'S\xfc\xdfe'), (u'siJchtige', u's\xfcchtige'), (u'sijlien', u'si\xfc\xdfen'), (u'sijliesten', u's\xfc\xdfesten'), (u'Sijsser', u'S\xfc\xdfer'), (u'Sildtunnel', u'S\xfcdtunnel'), (u'Silfie', u'S\xfc\xdfe'), (u'Silfier', u'S\xfc\xdfer'), (u'Silfies', u'S\xfc\xdfes'), (u'silfker', u's\xfc\xdfer'), (u'Silnden', u'S\xfcnden'), (u'Silndenbock', u'S\xfcndenbock'), (u'sindja', u'sind ja'), (u'Sirl', u'Sir!'), (u'Sj_r', u'Sir'), (u'Skilaufen', u'Ski laufen'), (u'skrupelloserAnw\xe9lte', u'skrupelloser Anw\xe4lte'), (u"sL'lf$e", u's\xfc\xdfe'), (u'sL1B', u's\xfc\xdf'), (u'slch', u'sich'), (u'sle', u'sie'), (u'slebe', u'siebe'), (u'sLif$', u's\xfc\xdf'), (u'SLif$e', u'S\xfc\xdfe'), (u'SLif$er', u'S\xfc\xdfer'), (u'sLif$es', u's\xfc\xdfes'), (u'SLilSe', u'S\xfc\xdfe'), (u'Slliden', u'S\xfcden'), (u'Sllinde', u'S\xfcnde'), (u'sllindigen', u's\xfcndigen'), (u'Slnd', u'Sind'), (u'Slr', u'Sir'), (u'Slrs', u'Sirs'), (u'SoBen', u'So\xdfen'), (u'sofortl', u'sofort!'), (u'soh\xe9nen', u'sch\xf6nen'), (u'Solien', u'So\xdfen'), (u'sollenl', u'sollen!'), (u'SONDERMULL', u'SONDERM\xdcLL'), (u'sorgf\xe9iltig', u'sorgf\xe4ltig'), (u'sorgf\xe9ltig', u'sorgf\xe4ltig'), (u'souver\xe9ine', u'souver\xe4ne'), (u'souver\xe9inen', u'souver\xe4nen'), (u'souver\xe9ner', u'souver\xe4ner'), (u"sp'a'ter", u'sp\xe4ter'), (u'sp/elen', u'spielen'), (u'SpaB', u'Spa\xdf'), (u'Spaf$', u'Spa\xdf'), (u'Spaf2>', u'Spa\xdf'), (u'Spaffs', u'Spa\xdf'), (u'Spafi', u'Spa\xdf'), (u'Spafls', u'Spa\xdf'), (u'SpafS', u'Spa\xdf'), (u"Spal'5", u'Spa\xdf'), (u'Spal2>', u'Spa\xdf'), (u'Spal3', u'Spa\xdf'), (u'Spali', u'Spa\xdf'), (u'Spall', u'Spa\xdf'), (u'Spass', u'Spa\xdf'), (u'spat', u'sp\xe4t'), (u'spektakular', u'spektakul\xe4r'), (u'Spell', u'Sp\xe4\xdf'), (u'Spells', u'Sp\xe4\xdf'), (u'Spell\xbb', u'Spa\xdf'), (u'Spezialit\xe9t', u'Spezialit\xe4t'), (u'spfit', u'sp\xe4t'), (u'SpieB', u'Spie\xdf'), (u'spief$ig', u'spie\xdfig'), (u'Spielzeuggeschfiftn', u'Spielzeuggesch\xe4ft--'), (u'spiilte', u'sp\xfclte'), (u'spiiren', u'sp\xfcren'), (u'spiirt', u'sp\xfcrt'), (u'spiit', u'sp\xe4t'), (u'spijre', u'sp\xfcre'), (u'spijren', u'sp\xfcren'), (u'spijrt', u'sp\xfcrt'), (u'Spillmeier', u'Sp\xfclmeier'), (u'spilre', u'sp\xfcre'), (u'spilren', u'sp\xfcren'), (u'spit', u'sp\xe4t'), (u'Spitzenfriihstiick', u'Spitzenfr\xfchst\xfcck'), (u"spLir's", u"sp\xfcr's"), (u'splliren', u'sp\xfcren'), (u'splter', u'sp\xe4ter'), (u'Sportilbertragung', u'Sport\xfcbertragung'), (u'Sportsfraund', u'Sportsfreund'), (u'Sprachpijppchen', u'Sprachp\xfcppchen'), (u'SPRACHPUPPCHEN', u'SPRACHP\xdcPPCHEN'), (u'Spriichlein', u'Spr\xfcchlein'), (u'Sprilht', u'Spr\xfcht'), (u'spr\xe9che', u'spr\xe4che'), (u'spr\xe9chen', u'spr\xe4chen'), (u'spr\xe9chet', u'spr\xe4chet'), (u'Spr\ufb02che', u'Spr\xfcche'), (u'spr\ufb02ht', u'spr\xfcht'), (u'spUl', u'sp\xfcl'), (u'spUr', u'sp\xfcr'), (u'spurbare', u'sp\xfcrbare'), (u'spUrt', u'sp\xfcrt'), (u'sp\xa7ter', u'sp\xe4ter'), (u'Sp\xe4\xdf', u'Spa\xdf'), (u'sp\xe9it', u'sp\xe4t'), (u'sp\xe9iter', u'sp\xe4ter'), (u'sp\xe9t', u'sp\xe4t'), (u'Sp\xe9ter', u'Sp\xe4ter'), (u'Sp\xe9tzchen', u'Sp\xe4tzchen'), (u'Sp\xe9tzchenl', u'Sp\xe4tzchen!'), (u'ssh', u'sah'), (u'st6Bt', u'st\xf6\xdft'), (u'st6hnt', u'st\xf6hnt'), (u'st6lSt', u'st\xf6\xdft'), (u'St6rt', u'St\xf6rt'), (u'ST@HNT', u'ST\xd6HNT'), (u'Staatsaff\xe9ren', u'Staatsaff\xe4ren'), (u'staatsbllirgerliches', u'staatsb\xfcrgerliches'), (u'Staatsgesch\xe9fte', u'Staatsgesch\xe4fte'), (u'Standardan\xe9sthesie', u'Standardan\xe4sthesie'), (u'standig', u'st\xe4ndig'), (u'STARSCREAMI', u'STARSCREAM:'), (u'station\xe9r', u'station\xe4r'), (u'Statusmeldungl', u'Statusmeldung!'), (u'stdrte', u'st\xf6rte'), (u'stecktjede', u'steckt jede'), (u'Stehenbleiben', u'Stehen bleiben'), (u'Stehvermiigen', u'Stehverm\xf6gen'), (u'Steigbilgeldinger', u'Steigb\xfcgeldinger'), (u'Steinh\xe9user', u'Steinh\xe4user'), (u'Sternenkijsse', u'Sternenk\xfcsse'), (u'Steuererkl\xe9rung', u'Steuererkl\xe4rung'), (u'Steuererkl\xe9rungen', u'Steuererkl\xe4rungen'), (u'Steuerprtifer', u'Steuerpr\xfcfer'), (u'Steuerprtifung', u'Steuerpr\xfcfung'), (u'Steuersiitzen', u'Steuers\xe4tzen'), (u'stfipseln', u'st\xf6pseln'), (u'stfiren', u'st\xf6ren'), (u'stfirker', u'st\xe4rker'), (u'Stfirt', u'St\xf6rt'), (u'stfirzt', u'st\xfcrzt'), (u'stieB', u'stie\xdf'), (u'Stiefbriider', u'Stiefbr\xfcder'), (u'Stiicke', u'St\xfccke'), (u'Stiihle', u'St\xfchle'), (u'Stiihlen', u'St\xfchlen'), (u'stiihnt', u'st\xf6hnt'), (u'Stiillen', u'St\xe4llen'), (u'Stiire', u'St\xf6re'), (u'stiiren', u'st\xf6ren'), (u'Stiirme', u'St\xfcrme'), (u'stiirmischen', u'st\xfcrmischen'), (u'Stiirsignale', u'St\xf6rsignale'), (u'stiirt', u'st\xf6rt'), (u'Stiirung', u'St\xf6rung'), (u'stiirzen', u'st\xfcrzen'), (u'Stiitzpunkt', u'St\xfctzpunkt'), (u'Stijck', u'St\xfcck'), (u'Stijckchen', u'St\xfcckchen'), (u'Stijcke', u'St\xfccke'), (u'stijhle', u'st\xfchle'), (u'stijrme', u'st\xfcrme'), (u'stijrzen', u'st\xfcrzen'), (u'Stilck', u'St\xfcck'), (u'Stilcke', u'St\xfccke'), (u'Stillckchen', u'St\xfcckchen'), (u'Stillst\xe9nde', u'Stillst\xe4nde'), (u'Stilvolll', u'Stilvoll!'), (u'stinden', u'st\xe4nden'), (u'Stldseite', u'S\xfcdseite'), (u'stleg', u'stieg'), (u'Stllihle', u'St\xfchle'), (u'Stllirmen', u'St\xfcrmen'), (u'stllirzt', u'st\xfcrzt'), (u'stlllrzen', u'st\xfcrzen'), (u'Stl\ufb02', u'Stift'), (u'sto/3en', u'sto\xdfen'), (u'StoB', u'Sto\xdf'), (u'stoBe', u'sto\xdfe'), (u'stof$en', u'sto\xdfen'), (u'Stofi', u'Sto\xdf'), (u'STOHNT', u'ST\xd6HNT'), (u'Stol3zahn', u'Sto\xdfzahn'), (u'Stol3zeit', u'Sto\xdfzeit'), (u'stolie', u'sto\xdfe'), (u'Storung', u'St\xf6rung'), (u'Str6men', u'Str\xf6men'), (u'str6mt', u'str\xf6mt'), (u'StraBe', u'Stra\xdfe'), (u'StraBen', u'Stra\xdfen'), (u'StraBenk6tern', u'Stra\xdfenk\xf6tern'), (u'Straf$e', u'Stra\xdfe'), (u'Strafiengang', u'Stra\xdfengang'), (u'Strafienratten', u'Stra\xdfenratten'), (u'Strafienschlacht', u'Stra\xdfenschlacht'), (u'Straflsenecke', u'Stra\xdfenecke'), (u'Straflsenmaler', u'Stra\xdfenmaler'), (u'Straflsenschilder', u'Stra\xdfenschilder'), (u'Straft\xe9ter', u'Straft\xe4ter'), (u'Strahlenschutzger\xe9t', u'Strahlenschutzger\xe4t'), (u'Strahlungsintensit\xe9t', u'Strahlungsintensit\xe4t'), (u'Stral3en', u'Stra\xdfen'), (u'Stral5e', u'Stra\xdfe'), (u'Stralie', u'Stra\xdfe'), (u'Straliengang', u'Stra\xdfengang'), (u'Stralienk\xe9ter', u'Stra\xdfenk\xf6ter'), (u'Straliensperre', u'Stra\xdfensperre'), (u'Streitkr\xe9fte', u'Streitkr\xe4fte'), (u'Streitkr\xe9ften', u'Streitkr\xe4ften'), (u'Streit\xe9xte', u'Streit\xe4xte'), (u'strfimten', u'str\xf6mten'), (u'Striimen', u'Str\xf6men'), (u'Striimungen', u'Str\xf6mungen'), (u'Stromschliige', u'Stromschl\xe4ge'), (u'Stromschnellenl', u'Stromschnellen!'), (u'Stromung', u'Str\xf6mung'), (u'Strullerl', u'Struller!'), (u'Str\xe9mung', u'Str\xf6mung'), (u'Str\xe9mungen', u'Str\xf6mungen'), (u'sturzte', u'st\xfcrzte'), (u'STUTZPUNKT', u'ST\xdcTZPUNKT'), (u'St\xe9be', u'St\xe4be'), (u'st\xe9hnt', u'st\xf6hnt'), (u'st\xe9hnte', u'st\xf6hnte'), (u'St\xe9idtchen', u'St\xe4dtchen'), (u'St\xe9idte', u'St\xe4dte'), (u'st\xe9indig', u'st\xe4ndig'), (u'St\xe9irke', u'St\xe4rke'), (u'st\xe9irker', u'st\xe4rker'), (u'St\xe9irkeres', u'St\xe4rkeres'), (u'st\xe9llst', u'st\xf6\xdft'), (u'St\xe9ndchen', u'St\xe4ndchen'), (u'St\xe9nder', u'St\xe4nder'), (u'St\xe9ndig', u'St\xe4ndig'), (u'st\xe9pseln', u'st\xf6pseln'), (u'st\xe9ren', u'st\xf6ren'), (u'St\xe9rke', u'St\xe4rke'), (u'St\xe9rken', u'St\xe4rken'), (u'st\xe9rker', u'st\xe4rker'), (u'St\xe9rkere', u'St\xe4rkere'), (u'st\xe9rkeres', u'st\xe4rkeres'), (u'st\xe9rkste', u'st\xe4rkste'), (u'st\xe9rst', u'st\xf6rst'), (u'st\xe9rt', u'st\xf6rt'), (u'St\xe9rung', u'St\xf6rung'), (u'St\xe9tten', u'St\xe4tten'), (u'St\ufb02ck', u'St\xfcck'), (u'St\ufb02hlen', u'St\xfchlen'), (u'sUB', u's\xfc\xdf'), (u'sUBe', u's\xfc\xdfe'), (u'Suchfeam', u'Suchteam'), (u'SUden', u'S\xfcden'), (u'Sudseite', u'S\xfcdseite'), (u'Sudwest', u'S\xfcdwest'), (u'sUf$', u's\xfc\xdf'), (u'SUf$e', u'S\xfc\xdfe'), (u'suMM\u2020', u'SUMMT'), (u'Suohet', u'Suchet'), (u'Superkr\xe9fte', u'Superkr\xe4fte'), (u'superl\xe9cherlich', u'superl\xe4cherlich'), (u"s\xa2'il3", u's\xfc\xdf'), (u'S\xe9cke', u'S\xe4cke'), (u'S\xe9ge', u'S\xe4ge'), (u's\xe9he', u's\xe4he'), (u'S\xe9hne', u'S\xf6hne'), (u'S\xe9hnen', u'S\xf6hnen'), (u'S\xe9icke', u'S\xe4cke'), (u'S\xe9inger', u'S\xe4nger'), (u'S\xe9iulen', u'S\xe4ulen'), (u'S\xe9ldner', u'S\xf6ldner'), (u's\xe9mfl/che', u's\xe4mtliche'), (u's\xe9mtliche', u's\xe4mtliche'), (u's\xe9mtlichen', u's\xe4mtlichen'), (u'S\xe9nger', u'S\xe4nger'), (u'S\xe9ngerin', u'S\xe4ngerin'), (u's\xe9ubern', u's\xe4ubern'), (u's\xe9uft', u's\xe4uft'), (u's\xe9ugen', u's\xe4ugen'), (u'S\xe9ulen', u'S\xe4ulen'), (u'S\xe9urewannen', u'S\xe4urewannen'), (u'S\ufb02dh\xe9ingen', u'S\xfcdh\xe4ngen'), (u'T6chter', u'T\xf6chter'), (u'T6pfchen', u'T\xf6pfchen'), (u'T6rn', u'T\xf6rn'), (u'T6rtchen', u'T\xf6rtchen'), (u't6te', u't\xf6te'), (u'T6ten', u'T\xf6ten'), (u't6tet', u't\xf6tet'), (u'TANZERINNEN', u'T\xc4NZERINNEN'), (u'Tater', u'T\xe4ter'), (u'tats\xe9chlich', u'tats\xe4chlich'), (u'tats\xe9chliche', u'tats\xe4chliche'), (u'tats\xe9ichlich', u'tats\xe4chlich'), (u'Tatverd\xe9ichtigen', u'Tatverd\xe4chtigen'), (u'Tauchg\xe9inge', u'Tauchg\xe4nge'), (u'Tauchg\xe9nge', u'Tauchg\xe4nge'), (u'Tauschgesch\xe9fte', u'Tauschgesch\xe4fte'), (u'Tauschgesch\xe9\ufb02e', u'Tauschgesch\xe4fte'), (u'Tbrn', u'T\xf6rn'), (u'tbten', u't\xf6ten'), (u'tdten', u't\xf6ten'), (u'tdtete', u't\xf6tete'), (u'Telefongespr\xe9che', u'Telefongespr\xe4che'), (u'Tempelsch\xe9nderf', u'Tempelsch\xe4nder!'), (u'TemPO', u'Tempo'), (u'TESTGELANDE', u'TESTGEL\xc4NDE'), (u'Testvorf\ufb02hrungen', u'Testvorf\xfchrungen'), (u'tfidlich', u't\xf6dlich'), (u'tfiitet', u't\xf6tet'), (u'Tfir', u'T\xfcr'), (u'tfirkischen', u't\xfcrkischen'), (u'Tfite', u'T\xfcte'), (u'Theaterstfick', u'Theaterst\xfcck'), (u'Therapiel', u'Therapie!'), (u'Thermalger\xe9t', u'Thermalger\xe4t'), (u'Thronr\xe9uber', u'Thronr\xe4uber'), (u'Thronr\xe9uberin', u'Thronr\xe4uberin'), (u'Tiefkilhlung', u'Tiefk\xfchlung'), (u'Tiefktih/system', u'Tiefk\xfchlsystem'), (u'Tiefktihleind\xe9mmung', u'Tiefk\xfchleind\xe4mmung'), (u'TIEFKUHL', u'TIEFK\xdcHL'), (u'Tiefkuhlstasis', u'Tiefk\xfchlstasis'), (u'Tiefkuhlung', u'Tiefk\xfchlung'), (u'tiglich', u't\xe4glich'), (u'tiichtige', u't\xfcchtige'), (u'tiint', u't\xf6nt'), (u'Tiipfchen', u'T\xf6pfchen'), (u'Tiipfchennummer', u'T\xf6pfchennummer'), (u'Tiir', u'T\xfcr'), (u'Tiiren', u'T\xfcren'), (u'Tiirl', u'T\xfcr!'), (u'Tiirme', u'T\xfcrme'), (u'tiite', u't\xf6te'), (u'Tiite', u'T\xfcte'), (u'tiiten', u't\xf6ten'), (u'tiitet', u't\xf6tet'), (u'tiitete', u't\xf6tete'), (u'TiJr', u'T\xfcr'), (u'Tijrme', u'T\xfcrme'), (u'Tilr', u'T\xfcr'), (u'Tilrglocke', u'T\xfcrglocke'), (u'Tilrklingel', u'T\xfcrklingel'), (u'Tilr\xe9ffner', u'T\xfcr\xf6ffner'), (u'Tippger\xe9usch', u'Tippger\xe4usch'), (u'Tischlenuerkstatt', u'Tischlerwerkstatt'), (u"TL'lr", u'T\xfcr'), (u'tlglich', u't\xe4glich'), (u'Tllir', u'T\xfcr'), (u'Tllirkei', u'T\xfcrkei'), (u'Tlllpfelchen', u'T\xfcpfelchen'), (u'TOILETTENSPULUNG', u'TOILETTENSP\xdcLUNG'), (u'Tonl', u'Ton'), (u'Toreroabs\xe9tze', u'Toreroabs\xe4tze'), (u'Tortenb\xe9ickerin', u'Tortenb\xe4ckerin'), (u'Tragfidie', u'Trag\xf6die'), (u'Tragiidie', u'Trag\xf6die'), (u'Trag\xe9die', u'Trag\xf6die'), (u'Trainingsijbung', u'Trainings\xfcbung'), (u'TRAUMKCRPER', u'TRAUMK\xd6RPER'), (u'treffan', u'treffen'), (u'trfiumen', u'tr\xe4umen'), (u'Tribiinen', u'Trib\xfcnen'), (u"trif'f't", u'trifft'), (u'trigt', u'tr\xe4gt'), (u'Triibsal', u'Tr\xfcbsal'), (u'Triimmem', u'Tr\xfcmmern'), (u'triistllch', u'tr\xf6stlich'), (u'Triistungen', u'Tr\xf6stungen'), (u'Triiume', u'Tr\xe4ume'), (u'Trilmmer', u'Tr\xfcmmer'), (u'triume', u'tr\xe4ume'), (u'Trockenger\xe9ite', u'Trockenger\xe4te'), (u'Trockenger\xe9te', u'Trockenger\xe4te'), (u'Tropfsteinhiihle', u'Tropfsteinh\xf6hle'), (u'Trottell', u'Trottel!'), (u'Trubsal', u'Tr\xfcbsal'), (u'tr\xe9ge', u'tr\xe4ge'), (u'Tr\xe9gerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9gt', u'tr\xe4gt'), (u'Tr\xe9igerschiff', u'Tr\xe4gerschiff'), (u'tr\xe9igt', u'tr\xe4gt'), (u'tr\xe9ium', u'tr\xe4um'), (u'tr\xe9iume', u'tr\xe4ume'), (u'tr\xe9iumen', u'tr\xe4umen'), (u'tr\xe9iumt', u'tr\xe4umt'), (u'tr\xe9llert', u'tr\xe4llert'), (u'Tr\xe9ne', u'Tr\xe4ne'), (u'Tr\xe9nen', u'Tr\xe4nen'), (u'Tr\xe9um', u'Tr\xe4um'), (u'tr\xe9ume', u'tr\xe4ume'), (u'Tr\xe9umen', u'Tr\xe4umen'), (u'Tr\xe9umer', u'Tr\xe4umer'), (u'tr\xe9umst', u'tr\xe4umst'), (u'Tr\xe9umt', u'Tr\xe4umt'), (u'Tschiiss', u'Tsch\xfcss'), (u'Tschiissl', u'Tsch\xfcss!'), (u'tschijss', u'tsch\xfcss'), (u'Tschtiss', u'Tsch\xfcss'), (u'tsch\xfc\xdf', u'tsch\xfcss'), (u'Tsch\ufb02s', u'Tsch\xfcs'), (u'Ttir', u'T\xfcr'), (u'ttlckisch', u't\xfcckisch'), (u'Ttlte', u'T\xfcte'), (u'tubul\xe9re', u'tubul\xe4re'), (u'Tupperschiissel', u'Tuppersch\xfcssel'), (u'TUR', u'T\xdcR'), (u'TUr', u'T\xfcr'), (u'Turen', u'T\xfcren'), (u'TURKEI', u'T\xdcRKEI'), (u'Turmwiichter', u'Turmw\xe4chter'), (u'tutjetzt', u'tut jetzt'), (u'typlschl', u'typlsch!'), (u'T\xe9chter', u'T\xf6chter'), (u't\xe9d/ichen', u't\xf6dlichen'), (u't\xe9dlich', u't\xf6dlich'), (u't\xe9dliche', u't\xf6dliche'), (u't\xe9dlichen', u't\xf6dlichen'), (u't\xe9glich', u't\xe4glich'), (u't\xe9glichen', u't\xe4glichen'), (u't\xe9iglich', u't\xe4glich'), (u't\xe9itowieren', u't\xe4towieren'), (u't\xe9itowierte', u't\xe4towierte'), (u'T\xe9itowierung', u'T\xe4towierung'), (u't\xe9iuschen', u't\xe4uschen'), (u'T\xe9ler', u'T\xe4ler'), (u'T\xe9lpell', u'T\xf6lpel!'), (u'T\xe9nze', u'T\xe4nze'), (u'T\xe9nzerin', u'T\xe4nzerin'), (u'T\xe9pfchen', u'T\xf6pfchen'), (u'T\xe9pfchenquatsch', u'T\xf6pfchenquatsch'), (u'T\xe9pfchensache', u'T\xf6pfchensache'), (u't\xe9te', u't\xf6te'), (u'T\xe9ten', u'T\xf6ten'), (u't\xe9test', u't\xe4test'), (u't\xe9tet', u't\xf6tet'), (u't\xe9tete', u't\xf6tete'), (u't\xe9towieren', u't\xe4towieren'), (u't\xe9towierte', u't\xe4towierte'), (u'T\xe9towierung', u'T\xe4towierung'), (u'T\xe9towierungen', u'T\xe4towierungen'), (u't\xe9uschen', u't\xe4uschen'), (u't\xe9uscht', u't\xe4uscht'), (u'T\xe9uschung', u'T\xe4uschung'), (u'T\xe9uschungsman\xe9ver', u'T\xe4uschungsman\xf6ver'), (u"Ub6FpFUfl'T1al", u'\xfcberpr\xfcf'), (u"Ub6l'pl'Uf\u20ac", u'\xdcberpr\xfcfe'), (u'Ube', u'\xdcbe'), (u'Ubel', u'\xfcbel'), (u'Ubelkeit', u'\xdcbelkeit'), (u'Ubelt\xe9ter', u'\xdcbelt\xe4ter'), (u'Uben', u'\xdcben'), (u'Uben/vachen', u'\xdcberwachen'), (u'Uben/vacher', u'\xdcberwacher'), (u'Uben/vacht', u'\xdcberwacht'), (u'Uben/vachungen', u'\xdcberwachungen'), (u'Uben/vachungsgesetz', u'\xdcberwachungsgesetz'), (u'Uben/vinden', u'\xfcberwinden'), (u'Uber', u'\xfcber'), (u'UBER', u'\xdcBER'), (u'Uberall', u'\xfcberall'), (u'Uberanstrenge', u'\xfcberanstrenge'), (u'Uberanstrengung', u'\xdcberanstrengung'), (u'Uberarbeiten', u'\xdcberarbeiten'), (u'UberAuf$erirdische', u'\xfcber Au\xdferirdische'), (u'Uberaus', u'\xfcberaus'), (u'Uberbleibsel', u'\xdcberbleibsel'), (u'Uberblick', u'\xdcberblick'), (u'Uberbringe', u'\xfcberbringe'), (u'Uberdauern', u'\xfcberdauern'), (u'Uberdecken', u'\xfcberdecken'), (u'Ubereinstimmung', u'\xdcbereinstimmung'), (u'Uberfahren', u'\xfcberfahren'), (u'Uberfall', u'\xdcberfall'), (u'Uberflilssig', u'\xfcberfl\xfcssig'), (u'Ubergabe', u'\xdcbergabe'), (u'Ubergaben', u'\xdcbergaben'), (u'Ubergabepunkt', u'\xdcbergabepunkt'), (u'Ubergangen', u'\xfcbergangen'), (u'Ubergangsweise', u'\xfcbergangsweise'), (u'Ubergeben', u'\xfcbergeben'), (u'Ubergehen', u'\xfcbergehen'), (u'Uberhaupt', u'\xdcberhaupt'), (u'Uberholt', u'\xdcberholt'), (u'Uberholter', u'\xfcberholter'), (u'Uberh\xe9rt', u'\xfcberh\xf6rt'), (u'Uberjemanden', u'\xfcber jemanden'), (u'Uberlagerungs', u'\xdcberlagerungs'), (u'Uberlandleitungen', u'\xdcberlandleitungen'), (u'Uberlass', u'\xdcberlass'), (u'Uberlasse', u'\xfcberlasse'), (u'Uberlassen', u'\xfcberlassen'), (u'Uberlassenl', u'\xfcberlassen!'), (u'Uberlasteten', u'\xdcberlasteten'), (u'Uberleben', u'\xdcberleben'), (u'Uberlebende', u'\xdcberlebende'), (u'Uberlebenden', u'\xdcberlebenden'), (u'Uberlebenschancen', u'\xdcberlebenschancen'), (u'Uberlebenswichtigen', u'\xfcberlebenswichtigen'), (u'Uberlebt', u'\xfcberlebt'), (u'Uberleg', u'\xfcberleg'), (u'Uberlegen', u'\xdcberlegen'), (u'Uberlegenheit', u'\xdcberlegenheit'), (u'uberlegt', u'\xfcberlegt'), (u'Uberlegten', u'\xfcberlegten'), (u'Uberleiten', u'\xfcberleiten'), (u'Uberleitung', u'\xdcberleitung'), (u'Uberlieferungen', u'\xdcberlieferungen'), (u'Uberl\xe9sst', u'\xfcberl\xe4sst'), (u'Uberm', u'\xfcberm'), (u'Ubermorgen', u'\xdcbermorgen'), (u'Ubernachtungsgast', u'\xdcbernachtungsgast'), (u'Ubernahm', u'\xfcbernahm'), (u'Ubernahme', u'\xdcbernahme'), (u'Ubernahmen', u'\xfcbernahmen'), (u'Ubernehme', u'\xfcbernehme'), (u'Ubernehmen', u'\xfcbernehmen'), (u'Ubernimmst', u'\xfcbernimmst'), (u'ubernimmt', u'\xfcbernimmt'), (u'Ubernommen', u'\xfcbernommen'), (u'Uberpriifen', u'\xfcberpr\xfcfen'), (u'Uberprilfen', u'\xfcberpr\xfcfen'), (u'Uberprliifen', u'\xdcberpr\xfcfen'), (u'Uberprufe', u'\xfcberpr\xfcfe'), (u'Uberprufen', u'\xfcberpr\xfcfen'), (u'Uberpruft', u'\xfcberpr\xfcft'), (u'Uberraschend', u'\xdcberraschend'), (u'Uberrascht', u'\xdcberrascht'), (u'Uberraschte', u'\xdcberraschte'), (u'Uberraschter', u'\xfcberraschter'), (u'Uberraschung', u'\xdcberraschung'), (u'Uberraschungen', u'\xdcberraschungen'), (u'Uberraschungl', u'\xdcberraschung!'), (u'Uberreagiert', u'\xfcberreagiert'), (u'Uberreden', u'\xfcberreden'), (u'Uberredet', u'\xdcberredet'), (u'Uberreste', u'\xdcberreste'), (u'Uberrumpeln', u'\xfcberrumpeln'), (u'Uberrumple', u'\xdcberrumple'), (u'Ubers', u'\xfcbers'), (u'Uberschl\xe9gt', u'\xdcberschl\xe4gt'), (u'Uberschreiten', u'\xdcberschreiten'), (u'Uberschritten', u'\xfcberschritten'), (u'Uberschwemmung', u'\xdcberschwemmung'), (u'Ubersehen', u'\xfcbersehen'), (u'Ubersensibilit\xe9t', u'\xdcbersensibilit\xe4t'), (u'Ubersetzung', u'\xdcbersetzung'), (u'Uberspannte', u'\xfcberspannte'), (u'Uberspielt', u'\xfcberspielt'), (u'Uberstehen', u'\xdcberstehen'), (u'Ubersteigerten', u'\xfcbersteigerten'), (u'Ubersteigt', u'\xfcbersteigt'), (u'Uberstunden', u'\xdcberstunden'), (u'Ubertraf', u'\xfcbertraf'), (u'UBERTRAGEN', u'\xdcBERTRAGEN'), (u'Ubertragen', u'\xfcbertragen'), (u'UBERTRAGUNG', u'\xdcBERTRAGUNG'), (u'ubertreibe', u'\xfcbertreibe'), (u'Ubertreiben', u'\xfcbertreiben'), (u'Ubertrieben', u'\xfcbertrieben'), (u'Ubertriebene', u'\xdcbertriebene'), (u'ubertriebener', u'\xfcbertriebener'), (u'Ubertrifft', u'\xdcbertrifft'), (u'Ubervvachen', u'\xfcberwachen'), (u'Ubervvacht', u'\xfcberwacht'), (u'Ubervvachung', u'\xdcberwachung'), (u'Ubervvachungs', u'\xdcberwachungs'), (u'Ubervvachungsstaat', u'\xdcberwachungsstaat'), (u'Ubervvachungsstaats', u'\xdcberwachungsstaats'), (u'Ubervvachungsvideos', u'\xdcberwachungsvideos'), (u'Ubervv\xe9iltigend', u'\xfcberw\xe4ltigend'), (u'Uberwachen', u'\xfcberwachen'), (u'Uberwacher', u'\xdcberwacher'), (u'Uberwachung', u'\xdcberwachung'), (u'Uberzeuge', u'\xfcberzeuge'), (u'Uberzeugen', u'\xfcberzeugen'), (u'Uberzeugend', u'\xfcberzeugend'), (u'Uberzeugt', u'\xfcberzeugt'), (u'Uberzeugung', u'\xdcberzeugung'), (u'Uberzeugungen', u'\xdcberzeugungen'), (u'Uberziehen', u'\xfcberziehen'), (u'Uberzuleiten', u'\xfcberzuleiten'), (u'ublem', u'\xfcblem'), (u'Ubler', u'\xdcbler'), (u'Ubles', u'\xdcbles'), (u'Ublich', u'\xfcblich'), (u'Ubliche', u'\xdcbliche'), (u'ublichen', u'\xfcblichen'), (u'Ubrig', u'\xfcbrig'), (u'Ubrige', u'\xdcbrige'), (u'Ubrigen', u'\xdcbrigen'), (u'Ubrigens', u'\xfcbrigens'), (u'Ubrlgens', u'\xdcbrigens'), (u'Ubrllccol', u'Ubriacco!'), (u'Ubung', u'\xdcbung'), (u'Ubungsbedingungen', u'\xdcbungsbedingungen'), (u'Ubungsschiisse', u'\xdcbungssch\xfcsse'), (u'Ubungsschusse', u'\xdcbungssch\xfcsse'), (u"Ub\u20acf'pf'Uf\u20acl'1", u'\xfcberpr\xfcfen'), (u'Uher', u'\xdcber'), (u'ultrakiistlichl', u'ultrak\xf6stlich!'), (u'umgeriistet', u'umger\xfcstet'), (u'umg\xe9nglich', u'umg\xe4nglich'), (u'umhdren', u'umh\xf6ren'), (u'umh\xe9ngt', u'umh\xe4ngt'), (u'Umschlfigen', u'Umschl\xe4gen'), (u'umschlieBt', u'umschlie\xdft'), (u'Umst\xe9inden', u'Umst\xe4nden'), (u'Umst\xe9nde', u'Umst\xe4nde'), (u'Umst\xe9nden', u'Umst\xe4nden'), (u'umst\xe9ndlich', u'umst\xe4ndlich'), (u'umweltsch\xe9dlich', u'umweltsch\xe4dlich'), (u'unabhiingiges', u'unabh\xe4ngiges'), (u'unabh\xe9ingig', u'unabh\xe4ngig'), (u'unabh\xe9ngig', u'unabh\xe4ngig'), (u'unabl\xe9ssig', u'unabl\xe4ssig'), (u'Unauff\xe9lligeres', u'Unauff\xe4lligeres'), (u'unaufhalfsam', u'unaufhaltsam'), (u'unaufhiirlich', u'unaufh\xf6rlich'), (u'unaufh\xe9rlich', u'unaufh\xf6rlich'), (u'unaufi\xe9llig', u'unauff\xe4llig'), (u'unberijhrbar', u'unber\xfchrbar'), (u'unberllihrten', u'unber\xfchrten'), (u'unbesch\xe9digt', u'unbesch\xe4digt'), (u'Uncl', u'Und'), (u'undja', u'und ja'), (u'undjeder', u'und jeder'), (u'undjemand', u'und jemand'), (u'undjetzt', u'und jetzt'), (u'undlassenihn', u'und lassen ihn'), (u'undlhnen', u'und Ihnen'), (u'undurchfuhrbar', u'undurchf\xfchrbar'), (u'uneingeschr\xe9nkten', u'uneingeschr\xe4nkten'), (u'unergrilndliche', u'unergr\xfcndliche'), (u'unerhort', u'unerh\xf6rt'), (u'unerhorte', u'unerh\xf6rte'), (u'unerkl\xe9rliche', u'unerkl\xe4rliche'), (u'unerkl\xe9rlichen', u'unerkl\xe4rlichen'), (u'unertr\xe9glich', u'unertr\xe4glich'), (u"unf'a'hig", u'unf\xe4hig'), (u'Unfahigkeit', u'Unf\xe4higkeit'), (u'unfersfellen', u'unterstellen'), (u'unfiirmigen', u'unf\xf6rmigen'), (u'unf\xe9hig', u'unf\xe4hig'), (u'unf\xe9higste', u'unf\xe4higste'), (u'unf\xe9ihigste', u'unf\xe4higste'), (u'Unf\xe9ille', u'Unf\xe4lle'), (u'Unf\xe9lle', u'Unf\xe4lle'), (u'ungef\xe9hr', u'ungef\xe4hr'), (u'ungef\xe9hre', u'ungef\xe4hre'), (u'Ungef\xe9ihr', u'Ungef\xe4hr'), (u'ungef\xe9ihrlich', u'ungef\xe4hrlich'), (u'ungemutlich', u'ungem\xfctlich'), (u'ungenugend', u'ungen\xfcgend'), (u'ungestbrt', u'ungest\xf6rt'), (u'ungewfihnliche', u'ungew\xf6hnliche'), (u'Ungewfjhnliches', u'Ungew\xf6hnliches'), (u'ungewiihnlich', u'ungew\xf6hnlich'), (u'Ungewijhnliches', u'Ungew\xf6hnliches'), (u'ungew\xe9hnlich', u'ungew\xf6hnlich'), (u'ungew\xe9hnliche', u'ungew\xf6hnliche'), (u'ungew\xe9hnlichste', u'ungew\xf6hnlichste'), (u'ungfinstigen', u'ung\xfcnstigen'), (u'ungiiltig', u'ung\xfcltig'), (u'ungilnstig', u'ung\xfcnstig'), (u'Unglaubliohl', u'Unglaublich!'), (u'unglaubwurdig', u'unglaubw\xfcrdig'), (u'Unglfiubige', u'Ungl\xe4ubige'), (u'Ungliicklicherweise', u'Ungl\xfccklicherweise'), (u'Unglilck', u'Ungl\xfcck'), (u"Ungll'Jcklichervveise", u'Ungl\xfccklicherweise'), (u'Unglllick', u'Ungl\xfcck'), (u'unglllicklich', u'ungl\xfccklich'), (u'ungllllckliche', u'ungl\xfcckliche'), (u'unglucklich', u'ungl\xfccklich'), (u'Ungl\xe9ubiger', u'Ungl\xe4ubiger'), (u'ungultig', u'ung\xfcltig'), (u'ungunstigen', u'ung\xfcnstigen'), (u'unheimlichl', u'unheimlich!'), (u'UNHORBARES', u'UNH\xd6RBARES'), (u'unh\xe9flich', u'unh\xf6flich'), (u'Universitlt', u'Universit\xe4t'), (u'Universit\xe9t', u'Universit\xe4t'), (u'unlfisbare', u'unl\xf6sbare'), (u'unm6glich', u'unm\xf6glich'), (u'unmfiglich', u'unm\xf6glich'), (u'Unmiiglich', u'Unm\xf6glich'), (u'Unmiigliche', u'Unm\xf6gliche'), (u'unmijglich', u'unm\xf6glich'), (u'unmissverst\xe9ndlich', u'unmissverst\xe4ndlich'), (u'unmoglich', u'unm\xf6glich'), (u'Unmtioglich', u'Unm\xf6glich'), (u'Unm\xe9glich', u'Unm\xf6glich'), (u'unm\xe9glioh', u'unm\xf6glich'), (u'unnatiirliche', u'unnat\xfcrliche'), (u'unnaturliche', u'unnat\xfcrliche'), (u'unnfitigen', u'unn\xf6tigen'), (u'unniitig', u'unn\xf6tig'), (u'unnllitz', u'unn\xfctz'), (u'unn\xe9tig', u'unn\xf6tig'), (u'unn\xe9tigen', u'unn\xf6tigen'), (u'unol', u'und'), (u'unp\xe9sslich', u'unp\xe4sslich'), (u'UNREGELMASSIG', u'UNREGELM\xc4SSIG'), (u'Unregelm\xe9fiigkeiten', u'Unregelm\xe4\xdfigkeiten'), (u'unschliissig', u'unschl\xfcssig'), (u'unserejungen', u'unsere jungen'), (u'unsererAnw\xe9lte', u'unserer Anw\xe4lte'), (u'unsererjungfr\xe9ulichen', u'unserer jungfr\xe4ulichen'), (u'unsjede', u'uns jede'), (u'uns\xe9glich', u'uns\xe4glich'), (u'Untenuelt', u'Unterwelt'), (u'unterdriickten', u'unterdr\xfcckten'), (u'Unterdrilckung', u'\xdcnterdr\xfcckung'), (u'unterdrtlckte', u'unterdr\xfcckte'), (u'Unterdr\ufb02ckung', u'Unterdr\xfcckung'), (u'Unterhaltskostenl', u'Unterhaltskosten!'), (u'Unterhaltungsm\xe9fiig', u'Unterhaltungsm\xe4\xdfig'), (u'unterhfilt', u'unterh\xe4lt'), (u'unterh\xe9lt', u'unterh\xe4lt'), (u'unterschitzt', u'untersch\xe4tzt'), (u'untersch\xe9tzte', u'untersch\xe4tzte'), (u'unterstiitzt', u'unterst\xfctzt'), (u'Unterstiitzung', u'Unterst\xfctzung'), (u'unterstijtzt', u'unterst\xfctzt'), (u'Unterstiltzung', u'Unterst\xfctzung'), (u'Unterstllitzung', u'Unterst\xfctzung'), (u'unterstutzen', u'unterst\xfctzen'), (u'unterstutzt', u'unterst\xfctzt'), (u'Unterstutzten', u'Unterst\xfctzten'), (u'Unterstutzung', u'Unterst\xfctzung'), (u'Untersuchungsausschijsse', u'Untersuchungsaussch\xfcsse'), (u'Unterw\xe9sche', u'Unterw\xe4sche'), (u'untr\xe9stlich', u'untr\xf6stlich'), (u'Unt\xe9tigkeit', u'Unt\xe4tigkeit'), (u'unumg\xe9nglich', u'unumg\xe4nglich'), (u'unverm\xe9hlt', u'unverm\xe4hlt'), (u'Unverschfimtheitl', u'Unversch\xe4mtheit'), (u'unversch\xe9mte', u'unversch\xe4mte'), (u'Unversch\xe9mtheitl', u'Unversch\xe4mtheit'), (u'UNVERSTANDLICH', u'UNVERST\xc4NDLICH'), (u'UNVERSTANDLICHE', u'UNVERST\xc4NDLICHE'), (u'UNVERSTANDLICHER', u'UNVERST\xc4NDLICHER'), (u'UNVERSTANDLICHES', u'UNVERST\xc4NDLICHES'), (u'Unverst\xe9ndliche', u'Unverst\xe4ndliche'), (u'unverst\xe9ndlichen', u'unverst\xe4ndlichen'), (u'unverst\xe9ndliches', u'unverst\xe4ndliches'), (u'unverzlliglich', u'unverz\xfcglich'), (u'unver\xe9ndert', u'unver\xe4ndert'), (u'Unzerbrechliohen', u'Unzerbrechlichen'), (u'unzurechnungsfahig', u'unzurechnungsf\xe4hig'), (u'unzuverlassiger', u'unzuverl\xe4ssiger'), (u'Unzuverl\xe9ssiger', u'Unzuverl\xe4ssiger'), (u'unzuverl\xe9ssiges', u'unzuverl\xe4ssiges'), (u'unz\xe9hlige', u'unz\xe4hlige'), (u'unz\xe9hligen', u'unz\xe4hligen'), (u'unz\xe9ihlige', u'unz\xe4hlige'), (u'Urgrofivaters', u'Urgro\xdfvaters'), (u'Urlaubsuberschreitung', u'Urlaubs\xfcberschreitung'), (u'Ursprijnglich', u'Urspr\xfcnglich'), (u'ursprtmglich', u'urspr\xfcnglich'), (u'Ursprunglich', u'Urspr\xfcnglich'), (u'Ururgrofivater', u'Ururgro\xdfvater'), (u'v/el', u'viel'), (u'v/er', u'vier'), (u'v/erfe', u'vierte'), (u'v/erfes', u'viertes'), (u'V6gel', u'V\xf6gel'), (u'v6IIig', u'v\xf6llig'), (u'V6lker', u'V\xf6lker'), (u'V6llig', u'V\xf6llig'), (u'v6lllg', u'v\xf6llig'), (u'vdllig', u'v\xf6llig'), (u'Ve/Teidigungskr\xe9fte', u'Verteidigungskr\xe4fte'), (u'Velzeih', u'Verzeih'), (u'Velzeihung', u'Verzeihung'), (u'velzichte', u'verzichte'), (u'Ven/vandter', u'Verwandter'), (u'ven/v\xe9hntl', u'verw\xf6hnt!'), (u'Ventilationsfiffnung', u'Ventilations\xf6ffnung'), (u'Ventilatorsch\xe9chte', u'Ventilatorsch\xe4chte'), (u'VERACHTLICH', u'VER\xc4CHTLICH'), (u'verandert', u'ver\xe4ndert'), (u'Verbiindeten', u'Verb\xfcndeten'), (u'Verbilndeter', u'Verb\xfcndeter'), (u'verbliidet', u'verbl\xf6det'), (u'Verbliidung', u'Verbl\xf6dung'), (u'verbllirgen', u'verb\xfcrgen'), (u'verbrachfe', u'verbrachte'), (u'Verbrec/ver', u'Verbrecher'), (u'Verbtmdeter', u'Verb\xfcndeter'), (u'Verbundeten', u'Verb\xfcndeten'), (u'Verb\ufb02nolete', u'Verb\xfcndete'), (u'verdiichtigen', u'verd\xe4chtigen'), (u'verdiinnt', u'verd\xfcnnt'), (u'verdllistern', u'verd\xfcstern'), (u'verdr\ufb02ckt', u'verdr\xfcckt'), (u'verdunnt', u'verd\xfcnnt'), (u'verd\xe9chtig', u'verd\xe4chtig'), (u'Verd\xe9chtigen', u'Verd\xe4chtigen'), (u'verd\xe9chtiger', u'verd\xe4chtiger'), (u'verffilgbares', u'verf\xfcgbares'), (u'Verfiigung', u'Verf\xfcgung'), (u'verfiihren', u'verf\xfchren'), (u'verfiihrt', u'verf\xfchrt'), (u'verfiittem', u'verf\xfcttern'), (u'Verfijgung', u'Verf\xfcgung'), (u'verfilgst', u'verf\xfcgst'), (u'verfilgte', u'verf\xfcgte'), (u'Verfilgung', u'Verf\xfcgung'), (u'Verfilhrungskilnste', u'Verf\xfchrungsk\xfcnste'), (u'verflligen', u'verf\xfcgen'), (u'verfllihrt', u'verf\xfchrt'), (u'Verflllgung', u'Verf\xfcgung'), (u'verfolgf', u'verfolgt'), (u'verfolgtl', u'verfolgt!'), (u'VERFUGBAR', u'VERF\xdcGBAR'), (u'verfugt', u'verf\xfcgt'), (u'vergafk', u'verga\xdf'), (u'Vergniigen', u'Vergn\xfcgen'), (u'Vergniigens', u'Vergn\xfcgens'), (u'Vergniigungsausflug', u'Vergn\xfcgungsausflug'), (u'Vergnijgen', u'Vergn\xfcgen'), (u'Vergnilgen', u'Vergn\xfcgen'), (u'Vergnlligen', u'Vergn\xfcgen'), (u'Vergntigen', u'Vergn\xfcgen'), (u'Vergnugen', u'Vergn\xfcgen'), (u'vergnugt', u'vergn\xfcgt'), (u'vergnugte', u'vergn\xfcgte'), (u'Vergnugungsausflug', u'Vergn\xfcgungsausflug'), (u'vergr6Bern', u'vergr\xf6\xdfern'), (u'vergr\xe9fiern', u'vergr\xf6\xdfern'), (u'Vergr\xe9fierung', u'Vergr\xf6\xdferung'), (u'verg\xe9nglich', u'verg\xe4nglich'), (u'verhiirt', u'verh\xf6rt'), (u'Verhiitung', u'Verh\xfctung'), (u'Verhor', u'Verh\xf6r'), (u'verhort', u'verh\xf6rt'), (u'verhorten', u'verh\xf6rten'), (u'verh\xe9ilt', u'verh\xe4lt'), (u'verh\xe9lt', u'verh\xe4lt'), (u'Verh\xe9ltnis', u'Verh\xe4ltnis'), (u'Verh\xe9ltnisse', u'Verh\xe4ltnisse'), (u'verh\xe9ltst', u'verh\xe4ltst'), (u'veriindert', u'ver\xe4ndert'), (u'Verinderungen', u'Ver\xe4nderungen'), (u'verkilnden', u'verk\xfcnden'), (u'verkilndet', u'verk\xfcndet'), (u'verkniipft', u'verkn\xfcpft'), (u"verknUpf't", u'verkn\xfcpft'), (u'verkunde', u'verk\xfcnde'), (u'verkunden', u'verk\xfcnden'), (u'verkundet', u'verk\xfcndet'), (u'VERKUNDIGUNG', u'VERK\xdcNDIGUNG'), (u'Verk\xe9ufer', u'Verk\xe4ufer'), (u'verletztl', u'verletzt!'), (u'verlieB', u'verlie\xdf'), (u'verlielien', u'verlie\xdfen'), (u'verlorenl', u'verloren!'), (u'verl\xe9ingert', u'verl\xe4ngert'), (u'Verl\xe9ingerungskabel', u'Verl\xe4ngerungskabel'), (u'verl\xe9isst', u'verl\xe4sst'), (u'verl\xe9sst', u'verl\xe4sst'), (u'verl\xe9uft', u'verl\xe4uft'), (u"verm'aihlen", u'verm\xe4hlen'), (u'verm/ssf', u'vermisst'), (u'vermiibelt', u'verm\xf6belt'), (u'Vermiigt', u'Verm\xf6gt'), (u'Verm\xe9gen', u'Verm\xf6gen'), (u'verm\xe9hle', u'verm\xe4hle'), (u'verm\xe9hlen', u'verm\xe4hlen'), (u'verm\xe9hlt', u'verm\xe4hlt'), (u'Verm\xe9ihlung', u'Verm\xe4hlung'), (u'vernachl\xe9ssigt', u'vernachl\xe4ssigt'), (u'Vernachl\xe9ssigung', u'Vernachl\xe4ssigung'), (u'vernfinftig', u'vern\xfcnftig'), (u'vernfinftige', u'vern\xfcnftige'), (u'vernilnftig', u'vern\xfcnftig'), (u'vernllmftigsten', u'vern\xfcnftigsten'), (u'verntmftige', u'vern\xfcnftige'), (u'vernunftig', u'vern\xfcnftig'), (u'vernunftigsten', u'vern\xfcnftigsten'), (u'vern\ufb02nftig', u'vern\xfcnftig'), (u'verpa\xdft', u'verpasst'), (u'verpesfefe', u'verpestete'), (u'verprilgle', u'verpr\xfcgle'), (u'verprugeln', u'verpr\xfcgeln'), (u'Verp\ufb02ichtungen', u'Verpflichtungen'), (u'verrat', u'verr\xe4t'), (u'verrfickter', u'verr\xfcckter'), (u'verriickt', u'verr\xfcckt'), (u'Verriickte', u'Verr\xfcckte'), (u'Verriickten', u'Verr\xfcckten'), (u'Verriickter', u'Verr\xfcckter'), (u'verriicktes', u'verr\xfccktes'), (u'verrijckt', u'verr\xfcckt'), (u'verrijckte', u'verr\xfcckte'), (u'verrilckt', u'verr\xfcckt'), (u'Verrilckte', u'Verr\xfcckte'), (u'Verrilckter', u'Verr\xfcckter'), (u'Verrilcktes', u'Verr\xfccktes'), (u"verrL'lckt", u'verr\xfcckt'), (u'verrljckt', u'verr\xfcckt'), (u'verrllickt', u'verr\xfcckt'), (u'Verrllickte', u'Verr\xfcckte'), (u'Verrllickter', u'Verr\xfcckter'), (u'verrlllckte', u'verr\xfcckte'), (u'verrtickt', u'verr\xfcckt'), (u'verrUckt', u'verr\xfcckt'), (u'Verruckte', u'Verr\xfcckte'), (u'verruckten', u'verr\xfcckten'), (u'Verruckter', u'Verr\xfcckter'), (u'Verr\xe9iter', u'Verr\xe4ter'), (u'verr\xe9itst', u'verr\xe4itst'), (u'verr\xe9t', u'verr\xe4t'), (u'Verr\xe9ter', u'Verr\xe4ter'), (u'Verr\xe9terin', u'Verr\xe4terin'), (u'verr\xe9terisch', u'verr\xe4terisch'), (u'verr\xe9terischen', u'verr\xe4terischen'), (u'verr\ufb02ckt', u'verr\xfcckt'), (u'versaumt', u'vers\xe4umt'), (u'Verscheifier', u'Verschei\xdfer'), (u'verschiichtert', u'versch\xfcchtert'), (u'verschiitten', u'versch\xfctten'), (u'verschlucktl', u'verschluckt!'), (u'VERSCHLUSSELN', u'VERSCHL\xdcSSELN'), (u'VERSCHLUSSELT', u'VERSCHL\xdcSSELT'), (u'Verschlusselung', u'Verschl\xfcsselung'), (u'Verschnauferst', u'Verschnauf erst'), (u'Verschwdrung', u'Verschw\xf6rung'), (u'verschweilit', u'verschwei\xdft'), (u'Verschwiirer', u'Verschw\xf6rer'), (u'verschwiirerisch', u'verschw\xf6rerisch'), (u'Verschwiirern', u'Verschw\xf6rern'), (u'Verschwiirung', u'Verschw\xf6rung'), (u'Verschwiirungen', u'Verschw\xf6rungen'), (u'Verschw\xe9rer', u'Verschw\xf6rer'), (u'Verschw\xe9rung', u'Verschw\xf6rung'), (u'Verschw\xe9rungstheoretiker', u'Verschw\xf6rungstheoretiker'), (u'versch\xe9rft', u'versch\xe4rft'), (u'versfanden', u'verstanden'), (u'Versfehen', u'Verstehen'), (u'versiihnlich', u'vers\xf6hnlich'), (u'Versiihnung', u'Vers\xf6hnung'), (u'verslumte', u'vers\xe4umte'), (u'Verspfitung', u'Versp\xe4tung'), (u'verspiire', u'versp\xfcre'), (u'verspilre', u'versp\xfcre'), (u'verspiten', u'versp\xe4ten'), (u'versprijht', u'verspr\xfcht'), (u'verst0I3en', u'versto\xdfen'), (u'verst6Bt', u'verst\xf6\xdft'), (u'Verst6ISt', u'Verst\xf6\xdft'), (u'verst6l3t', u'verst\xf6\xdft'), (u'verstehejetzt', u'verstehe jetzt'), (u'Verstiindnis', u'Verst\xe4ndnis'), (u'verstiirkt', u'verst\xe4rkt'), (u'Verstiirkung', u'Verst\xe4rkung'), (u'verstilmmelst', u'verst\xfcmmelst'), (u'verstoBen', u'Versto\xdfen'), (u'verstofken', u'versto\xdfen'), (u'verstolien', u'versto\xdfen'), (u'verstummelt', u'verst\xfcmmelt'), (u'verstunde', u'verst\xfcnde'), (u'verstundest', u'verst\xfcndest'), (u'verst\xe9fkt', u'verst\xf6\xdft'), (u'verst\xe9indlich', u'verst\xe4ndlich'), (u'Verst\xe9irkung', u'Verst\xe4rkung'), (u'Verst\xe9ndigen', u'Verst\xe4ndigen'), (u'Verst\xe9ndigt', u'Verst\xe4ndigt'), (u'verst\xe9ndlich', u'verst\xe4ndlich'), (u'Verst\xe9ndnis', u'Verst\xe4ndnis'), (u'verst\xe9rken', u'verst\xe4rken'), (u'verst\xe9rkt', u'verst\xe4rkt'), (u'verst\xe9rkte', u'verst\xe4rkte'), (u'verst\xe9rkter', u'verst\xe4rkter'), (u'Verst\xe9rkung', u'Verst\xe4rkung'), (u'verst\xe9rt', u'verst\xf6rt'), (u'vers\xe9hnen', u'vers\xf6hnen'), (u'vers\xe9hnt', u'vers\xf6hnt'), (u'vers\xe9umen', u'vers\xe4umen'), (u'vers\xe9umt', u'vers\xe4umt'), (u'VERTRAGSLANGE', u'VERTRAGSL\xc4NGE'), (u'vertrauenswiirdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdig', u'vertrauensw\xfcrdig'), (u'vertrauenswtlrdigen', u'vertrauensw\xfcrdigen'), (u'vertr\xe9umte', u'vertr\xe4umte'), (u'vervvanzt', u'verwanzt'), (u'verwiistete', u'verw\xfcstete'), (u'verwllisten', u'verw\xfcsten'), (u'verwustet', u'verw\xfcstet'), (u'verw\xe9hnten', u'verw\xf6hnten'), (u'verw\xe9ihnen', u'verw\xf6hnen'), (u'verw\xe9ssert', u'verw\xe4ssert'), (u'verz\xe9gere', u'verz\xf6gere'), (u'Verz\xe9gerte', u'Verz\xf6gerte'), (u'Verz\xe9gerung', u'Verz\xf6gerung'), (u'ver\xe9ffentliche', u'ver\xf6ffentliche'), (u'ver\xe9ffentlichen', u'ver\xf6ffentlichen'), (u'ver\xe9ffentlicht', u'ver\xf6ffentlicht'), (u'ver\xe9indert', u'ver\xe4ndert'), (u'Ver\xe9inderung', u'Ver\xe4nderung'), (u'ver\xe9ndern', u'ver\xe4ndern'), (u'ver\xe9ndert', u'ver\xe4ndert'), (u'ver\xe9nderte', u'ver\xe4nderte'), (u'ver\xe9nderten', u'ver\xe4nderten'), (u'Ver\xe9nderung', u'Ver\xe4nderung'), (u'Ver\xe9nderungen', u'Ver\xe4nderungen'), (u'ver\xe9ngstigtes', u'ver\xe4ngstigtes'), (u'ver\xe9ppelt', u'ver\xe4ppelt'), (u'ver\xe9rgert', u'ver\xe4rgert'), (u'vewvendet', u'verwendet'), (u'vfillig', u'v\xf6llig'), (u'VGFKUFZGH', u'verk\xfcrzen'), (u'VI/illkommen', u'Willkommen'), (u'VI/itwicky', u'Witwicky'), (u'vial', u'viel'), (u'Videoiiben/vachung', u'Video\xfcberwachung'), (u'Vie/e', u'Viele'), (u'Vielfrafi', u'Vielfra\xdf'), (u'vielf\xe9ltig', u'vielf\xe4ltig'), (u'Vielleichtja', u'Vielleicht ja'), (u'vielversprechend', u'viel versprechend'), (u'Vieraugengespr\xe9ch', u'Vieraugengespr\xe4ch'), (u'vieriunge', u'vier junge'), (u'vierj\xe9hriges', u'vierj\xe4hriges'), (u'vierk\xe9pfige', u'vierk\xf6pfige'), (u'Viigel', u'V\xf6gel'), (u'viillig', u'v\xf6llig'), (u'viilliges', u'v\xf6lliges'), (u'Viterchen', u'V\xe4terchen'), (u'Vizepr\xe9isident', u'Vizepr\xe4sident'), (u'vlel', u'viel'), (u'Vlellelcht', u'Vielleicht'), (u'Vogelscheifke', u'Vogelschei\xdfe'), (u'Vogelscheilie', u'Vogelschei\xdfe'), (u'Volksm\xe9rchen', u'Volksm\xe4rchen'), (u'vollerjeder', u'voller jeder'), (u'vollmachen', u'voll machen'), (u'vollst\xe9ndig', u'vollst\xe4ndig'), (u'vollst\xe9ndige', u'vollst\xe4ndige'), (u'Volltrefferl', u'Volltreffer!'), (u'vollz\xe9hlig', u'vollz\xe4hlig'), (u'Volumenl', u'Volumen!'), (u'von/vagten', u'vorwagten'), (u'von/v\xe9irts', u'vorw\xe4rts'), (u'vonn6ten', u'vonn\xf6ten'), (u'Vonn\xe9irts', u'Vorw\xe4rts'), (u'Vordertiir', u'Vordert\xfcr'), (u'Vorderturl', u'Vordert\xfcr!'), (u'vordr\xe9ngelnl', u'vordr\xe4ngeln!'), (u'vorfibergehend', u'vor\xfcbergehend'), (u'Vorfuhrungen', u'Vorf\xfchrungen'), (u'vorgef\ufb02hrt', u'vorgef\xfchrt'), (u'Vorgiinge', u'Vorg\xe4nge'), (u'Vorg\xe9nger', u'Vorg\xe4nger'), (u'Vorg\xe9ngern', u'Vorg\xe4ngern'), (u'Vorh\xe9nge', u'Vorh\xe4nge'), (u'vorijbergehend', u'vor\xfcbergehend'), (u'vorilber', u'vor\xfcber'), (u'vorilbergehende', u'vor\xfcbergehende'), (u'vorkniipfen', u'vorkn\xf6pfen'), (u'Vorl\xe9ufer', u'Vorl\xe4ufer'), (u'Vorl\xe9ufig', u'Vorl\xe4ufig'), (u'Vorraus', u'Voraus'), (u'Vorschl\xe9ge', u'Vorschl\xe4ge'), (u'vorschriftsm\xe9fiig', u'vorschriftsm\xe4\xdfig'), (u'vorschriftsm\xe9iliig', u'vorschriftsm\xe4\xdfig'), (u'Vorsichtsmaflnahme', u'Vorsichtsma\xdfnahme'), (u'Vorstellungsgespr\xe9ch', u'Vorstellungsgespr\xe4ch'), (u'Vorstellungsgespr\xe9che', u'Vorstellungsgespr\xe4che'), (u'Vorstof$', u'Vorsto\xdf'), (u'Vortlbergehende', u'Vor\xfcbergehende'), (u'vort\xe9uschen', u'vort\xe4uschen'), (u'vorubergehend', u'vor\xfcbergehend'), (u'vorvv\xe9rts', u'vorw\xe4rts'), (u'Vorwfirts', u'Vorw\xe4rts'), (u'vorw\xe9rts', u'vorw\xe4rts'), (u'vorzfiglichl', u'vorz\xfcglich!'), (u'vor\ufb02ber', u'vor\xfcber'), (u'Vor\ufb02bergehend', u'Vor\xfcbergehend'), (u'VVACHMANN', u'WACHMANN'), (u'Vvaffen', u'Waffen'), (u'Vvagen', u'Wagen'), (u'VVarte', u'Warte'), (u'VVeif3>t', u'Wei\xdft'), (u"VVeil'2>t", u'Wei\xdft'), (u'VVir', u'Wir'), (u'VVM', u'WM'), (u'v\\/as', u'was'), (u'V\\/e', u'We'), (u'V\xe9gel', u'V\xf6gel'), (u'v\xe9geln', u'v\xf6geln'), (u'v\xe9gelt', u'v\xf6gelt'), (u'v\xe9llig', u'v\xf6llig'), (u"w/'r", u'wir'), (u'W/e', u'Wie'), (u'w/eder', u'wieder'), (u'W/nkel', u'Winkel'), (u'w/r', u'wir'), (u'w/rd', u'wird'), (u'w/rkl/ch', u'wirklich'), (u'W0', u'Wo'), (u'w5r', u'w\xe4r'), (u"w5r's", u"w\xe4r's"), (u'W6lfe', u'W\xf6lfe'), (u'W6lfen', u'W\xf6lfen'), (u'W99', u'Weg'), (u'Waffenschr\xe9nke', u'Waffenschr\xe4nke'), (u'wafs', u"w\xe4r's"), (u'wahrend', u'w\xe4hrend'), (u'WAHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u'Wahrheitl', u'Wahrheit!'), (u'wail', u'weil'), (u'Walbl', u'Wal\xf6l'), (u'Walsinghaml', u'Walsingham!'), (u'wankelmiltig', u'wankelm\xfctig'), (u'ware', u'w\xe4re'), (u'WAREST', u'W\xc4REST'), (u'Warfe', u'Warte'), (u'warja', u'war ja'), (u'Waschbrettb\xe9uche', u'Waschbrettb\xe4uche'), (u'Waschb\xe9ir', u'Waschb\xe4r'), (u'Waschb\xe9iren', u'Waschb\xe4ren'), (u'Wasseranschlljssen', u'Wasseranschl\xfcssen'), (u'Wattekn\xe9uel', u'Wattekn\xe4uel'), (u'Wattest\xe9bchen', u'Wattest\xe4bchen'), (u"we're", u'w\xe4re'), (u"We'ro", u"We're"), (u'we/B', u'wei\xdf'), (u'We/Bf', u'Wei\xdft'), (u'we/fere', u'weitere'), (u'Wechsell', u'Wechsel!'), (u'weggebfirstet', u'weggeb\xfcrstet'), (u'weggespllllt', u'weggesp\xfclt'), (u'weggesplllltl', u'weggesp\xfclt!'), (u'weggesp\ufb02lt', u'weggesp\xfclt'), (u'wegl', u'weg!'), (u'wegreiflsen', u'wegrei\xdfen'), (u'wegschieBen', u'wegschie\xdfen'), (u'Wegtratan', u'Wegtreten'), (u'wegzuwefien', u'wegzuwerfen'), (u'wei/3', u'wei\xdf'), (u'WeiB', u'Wei\xdf'), (u'weiBe', u'wei\xdfe'), (u'weiBen', u'wei\xdfen'), (u'weiBer', u'wei\xdfer'), (u'weiBes', u'wei\xdfes'), (u'WeiBfresse', u'Wei\xdffresse'), (u'weiBt', u'wei\xdft'), (u'Weif$', u'Wei\xdf'), (u'Weif$t', u'Wei\xdft'), (u'weif2>', u'wei\xdf'), (u'weif3', u'wei\xdf'), (u'weif3>', u'wei\xdf'), (u'Weif3t', u'Wei\xdft'), (u'weif5', u'wei\xdf'), (u'Weifbe', u'Wei\xdfe'), (u'weifbt', u'wei\xdft'), (u'Weifi', u'Wei\xdf'), (u'Weifie', u'Wei\xdfe'), (u'weifies', u'wei\xdfes'), (u'Weifist', u'Wei\xdft'), (u'Weifit', u'Wei\xdft'), (u'weifk', u'wei\xdf'), (u'weifken', u'wei\xdfen'), (u'Weifker', u'Wei\xdfer'), (u'weifkes', u'wei\xdfes'), (u'weifkt', u'wei\xdft'), (u'weifL', u'wei\xdf'), (u'weifLt', u'wei\xdft'), (u'weifl\xbb', u'wei\xdf'), (u'weifS', u'wei\xdf'), (u'WeifSt', u'Wei\xdft'), (u'weifZ>', u'wei\xdf'), (u'WeifZ>t', u'Wei\xdft'), (u'weif\xe9t', u'wei\xdft'), (u'Weihnachtseink\xe9ufe', u'Weihnachtseink\xe4ufe'), (u'Weihnachtsm\xe9nner', u'Weihnachtsm\xe4nner'), (u"weil'5", u'wei\xdf'), (u"weil'5t", u'wei\xdft'), (u'weil3', u'wei\xdf'), (u'Weil3t', u'Wei\xdft'), (u'weil5', u'wei\xdf'), (u'Weil5t', u'Wei\xdft'), (u'weili', u'wei\xdf'), (u'weilit', u'wei\xdft'), (u'weilke', u'wei\xdfe'), (u'Weill', u'Wei\xdf'), (u'weills', u'wei\xdf'), (u'weillst', u'wei\xdft'), (u'weillt', u'weisst'), (u'weilS', u'wei\xdf'), (u'weilSe', u'wei\xdfe'), (u'WeilSglut', u'Wei\xdfglut'), (u'weilZ>', u'wei\xdf'), (u'weilZ~', u'wei\xdf'), (u'weiss', u'wei\xdf'), (u'weissen', u'wei\xdfen'), (u'weisst', u'wei\xdft'), (u'weiterhiipfen', u'weiterh\xfcpfen'), (u'Weiterpessen', u'Weiterpressen'), (u'weitl\xe9ufige', u'weitl\xe4ufige'), (u'weitweg', u'weit weg'), (u'WelBt', u'Wei\xdft'), (u'well', u'weil'), (u'Well', u'Welt'), (u'Wellit', u'Wei\xdft'), (u'welllt', u'wei\xdft'), (u'welt', u'weit'), (u'WELTBEVOLKERUNG', u'WELTBEV\xd6LKERUNG'), (u'Wel\ufb02t', u'Wei\xdft'), (u'Werdja', u'Werd ja'), (u'Werkst\xe9tten', u'Werkst\xe4tten'), (u'Werkzeugg\ufb02rtel', u'Werkzeugg\xfcrtel'), (u'wertschfitzen', u'wertsch\xe4tzen'), (u'Westflilgel', u'Westfl\xfcgel'), (u'Westkilste', u'Westk\xfcste'), (u'Wettk\xe9mpfe', u'Wettk\xe4mpfe'), (u'Wettk\xe9mpfen', u'Wettk\xe4mpfen'), (u'Wettk\xe9mpfer', u'Wettk\xe4mpfer'), (u'Wfinsche', u'W\xfcnsche'), (u'wfinschen', u'w\xfcnschen'), (u'Wfird', u'W\xfcrd'), (u'wfirde', u'w\xfcrde'), (u'Wfirden', u'W\xfcrden'), (u'wfirdest', u'w\xfcrdest'), (u'wfire', u'w\xe4re'), (u'Wfirme', u'W\xe4rme'), (u'Wfisste', u'W\xfcsste'), (u'wfitete', u'w\xfctete'), (u'wfssen', u'wissen'), (u'Widen/v\xe9rtig', u'Widerw\xe4rtig'), (u"widerf'a'hrt", u'widerf\xe4hrt'), (u'widerspriichliche', u'widerspr\xfcchliche'), (u'Widerw\xe9irtig', u'Widerw\xe4rtig'), (u'wiedergew\xe9ihltl', u'wiedergew\xe4hlt'), (u'wiederhaben', u'wieder-haben'), (u'Wiederh\xe9ren', u'Wiederh\xf6ren'), (u'Wieheifiternoch', u'Wiehei\xdfternoch'), (u'Wieheiliternoch', u'Wiehei\xdfternoch'), (u'wihlerisch', u'w\xe4hlerisch'), (u'wihlerlsch', u'w\xe4hlerisch'), (u'wiihlen', u'w\xfchlen'), (u'wiihlte', u'w\xe4hlte'), (u'wiihrend', u'w\xe4hrend'), (u'wiilrdest', u'w\xfcrdest'), (u'Wiinde', u'W\xe4nde'), (u'wiinsch', u'w\xfcnsch'), (u'Wiinsche', u'W\xfcnsche'), (u'Wiinschen', u'W\xfcnschen'), (u'wiinschst', u'w\xfcnschst'), (u'wiinscht', u'w\xfcnscht'), (u'wiinschte', u'w\xfcnschte'), (u'wiirde', u'w\xfcrde'), (u'Wiirden', u'W\xfcrden'), (u'Wiirdest', u'W\xfcrdest'), (u'wiirdet', u'w\xfcrdet'), (u'wiirdigst', u'w\xfcrdigst'), (u'Wiire', u'W\xe4re'), (u'wiiren', u'w\xe4ren'), (u'Wiirfel', u'W\xfcrfel'), (u'wiirfeln', u'w\xfcrfeln'), (u'Wiirfels', u'W\xfcrfels'), (u'wiirs', u"w\xe4r's"), (u'Wiirstchen', u'W\xfcrstchen'), (u'wiischt', u'w\xe4scht'), (u'Wiisste', u'W\xfcsste'), (u'wiissten', u'w\xfcssten'), (u'wiisstest', u'w\xfcsstest'), (u'Wiiste', u'W\xfcste'), (u'wiitenden', u'w\xfctenden'), (u'wijnsche', u'w\xfcnsche'), (u'wijnschen', u'w\xfcnschen'), (u'wijnschte', u'w\xfcnschte'), (u'wijrd', u'w\xfcrd'), (u'wijrde', u'w\xfcrde'), (u'wijrden', u'w\xfcrden'), (u'wijrdest', u'w\xfcrdest'), (u'wijrdiger', u'w\xfcrdiger'), (u'Wijrg', u'W\xfcrg'), (u'wijsste', u'w\xfcsste'), (u'wijtend', u'w\xfctend'), (u'wildl', u'wild!'), (u'wilnsch', u'w\xfcnsch'), (u'wilnsche', u'w\xfcnsche'), (u'wilnschen', u'w\xfcnschen'), (u'wilnscht', u'w\xfcnscht'), (u'wilnschte', u'w\xfcnschte'), (u'wilrd', u'w\xfcrd'), (u'Wilrde', u'W\xfcrde'), (u'Wilrden', u'W\xfcrden'), (u'Wilrdest', u'W\xfcrdest'), (u'wilrdig', u'w\xfcrdig'), (u'Wilrfel', u'W\xfcrfel'), (u'Wilrfelenergie', u'W\xfcrfelenergie'), (u'wilsste', u'w\xfcsste'), (u'wilssten', u'w\xfcssten'), (u'Wilstling', u'W\xfcstling'), (u'wiltend', u'w\xfctend'), (u'Windelhundl', u'Windelhund!'), (u'Windhundk\xe9rper', u'Windhundk\xf6rper'), (u'winner', u'w\xe4rmer'), (u'Wire', u'W\xe4re'), (u'wires', u'wir es'), (u'Wirfangen', u'Wir fangen'), (u'wirja', u'wir ja'), (u'wirje', u'wir je'), (u'wirjede', u'wir jede'), (u'wirjeden', u'wir jeden'), (u'wirjetzt', u'wir jetzt'), (u'Wirnisse', u'Wirrnisse'), (u'Wirsind', u'Wir sind'), (u'wirtragen', u'wir tragen'), (u'Wirtschaftspriifer', u'Wirtschaftspr\xfcfer'), (u'Wirverfolgen', u'Wir verfolgen'), (u'wirvom', u'wir vom'), (u'Wirwaren', u'Wir waren'), (u'Wirwarten', u'Wir warten'), (u'Wirwerden', u'Wir werden'), (u'Wirwissen', u'Wir wissen'), (u'Wirwollen', u'Wir wollen'), (u'Wirwollten', u'Wir wollten'), (u'Wirzeigten', u'Wir zeigten'), (u'wirzu', u'wir zu'), (u'Witzl', u'Witz!'), (u'WKHRENDDESSEN', u'W\xc4HRENDDESSEN'), (u"wL'lrden", u'w\xfcrden'), (u'wle', u'wie'), (u'Wleso', u'Wieso'), (u'Wlhlen', u'W\xe4hlen'), (u'wllinsch', u'w\xfcnsch'), (u'wllinschst', u'w\xfcnschst'), (u'wllinscht', u'w\xfcnscht'), (u'wllirde', u'w\xfcrde'), (u'wllirden', u'w\xfcrden'), (u'wllirdest', u'w\xfcrdest'), (u'wllirdet', u'w\xfcrdet'), (u'Wllirgegriff', u'W\xfcrgegriff'), (u'wllirgen', u'w\xfcrgen'), (u'wllisste', u'w\xfcsste'), (u'wlr', u'wir'), (u'wlrd', u'wird'), (u'wlrkllch', u'wirklich'), (u'Wlrkllchkelt', u'Wirklichkeit'), (u'wlrst', u'wirst'), (u'Wlrwarten', u'Wir warten'), (u'wlrwollen', u'wir wollen'), (u'Wo/f', u'Wolf'), (u'Wochenf\xe9hre', u'Wochenf\xe4hre'), (u'woffir', u'wof\xfcr'), (u'Wofiir', u'Wof\xfcr'), (u'Wofijr', u'Wof\xfcr'), (u'wofilr', u'wof\xfcr'), (u'Wofur', u'Wof\xfcr'), (u'WoherweiB', u'Woher wei\xdf'), (u'WoherweiBt', u'Woher wei\xdft'), (u'Woherweif$t', u'Woher wei\xdft'), (u'wohlfilhlen', u'wohlf\xfchlen'), (u'Wollkn\xe9uel', u'Wollkn\xe4uel'), (u'womiiglich', u'wom\xf6glich'), (u'wom\xe9glich', u'wom\xf6glich'), (u'wom\xe9iglich', u'wom\xf6glich'), (u'Worfiber', u'Wor\xfcber'), (u'woriiber', u'wor\xfcber'), (u'Worijber', u'Wor\xfcber'), (u'Wortgepl\xe9nkel', u'Wortgepl\xe4nkel'), (u'Woruber', u'Wor\xfcber'), (u"wt/'rden", u'w\xfcrden'), (u'wtinsche', u'w\xfcnsche'), (u'wtinschst', u'w\xfcnschst'), (u'wtirde', u'w\xfcrde'), (u'Wtirdest', u'W\xfcrdest'), (u'Wtirfel', u'W\xfcrfel'), (u'Wtmschen', u'W\xfcnschen'), (u"WUl'd\u20ac", u'w\xfcrde'), (u'WUlfelbecher', u'W\xfcrfelbecher'), (u'wullte', u'wusste'), (u'Wundersch6n', u'Wundersch\xf6n'), (u'wunderschfin', u'wundersch\xf6n'), (u'Wunderschiin', u'Wundersch\xf6n'), (u'wunderschiinen', u'wundersch\xf6nen'), (u'wundersch\xe9n', u'wundersch\xf6n'), (u'wundersch\xe9ne', u'wundersch\xf6ne'), (u'Wundersch\xe9nel', u'Wundersch\xf6ne!'), (u'wundersch\xe9nen', u'wundersch\xf6nen'), (u'wundersch\xe9nes', u'wundersch\xf6nes'), (u'wundersoh\xe9n', u'wundersch\xf6n'), (u'wunsche', u'w\xfcnsche'), (u'Wunschen', u'W\xfcnschen'), (u'wunscht', u'w\xfcnscht'), (u'wunschte', u'w\xfcnschte'), (u'WUNSCHTE', u'W\xdcNSCHTE'), (u'wurcle', u'wurde'), (u'wUrde', u'w\xfcrde'), (u'Wurdige', u'W\xfcrdige'), (u'WURGT', u'W\xdcRGT'), (u'Wurmer', u'W\xfcrmer'), (u'Wursfsfulle', u'Wurststulle'), (u'Wuste', u'W\xfcste'), (u'WUSTEN', u'W\xdcSTEN'), (u'wutend', u'w\xfctend'), (u'wu\xdfte', u'wusste'), (u'wu\xdftest', u'wusstest'), (u"w\xa7r's", u"w\xe4r's"), (u'w\xa7re', u'w\xe4re'), (u"W\xa7ren's", u"W\xe4ren's"), (u"w\xe9'hrend", u'w\xe4hrend'), (u'w\xe9chst', u'w\xe4chst'), (u'W\xe9chter', u'W\xe4chter'), (u'w\xe9fs', u"w\xe4r's"), (u'W\xe9g', u'Weg'), (u'w\xe9hle', u'w\xe4hle'), (u'w\xe9hlejetzt', u'w\xe4hle jetzt'), (u'w\xe9hlen', u'w\xe4hlen'), (u'W\xe9hler', u'W\xe4hler'), (u'W\xe9hlern', u'W\xe4hlern'), (u'w\xe9hlt', u'w\xe4hlt'), (u'w\xe9hlte', u'w\xe4hlte'), (u'w\xe9hrend', u'w\xe4hrend'), (u'W\xe9hrung', u'W\xe4hrung'), (u'W\xe9ichter', u'W\xe4chter'), (u'w\xe9ihlen', u'w\xe4hlen'), (u'w\xe9ihrend', u'w\xe4hrend'), (u'w\xe9ir', u'w\xe4r'), (u"w\xe9ir's", u"w\xe4r's"), (u'w\xe9irde', u'w\xfcrde'), (u'W\xe9ire', u'W\xe4re'), (u'w\xe9iren', u'w\xe4ren'), (u'w\xe9irmen', u'w\xe4rmen'), (u'w\xe9irst', u'w\xe4rst'), (u'W\xe9lder', u'W\xe4lder'), (u'W\xe9ldern', u'W\xe4ldern'), (u'W\xe9lfen', u'W\xf6lfen'), (u'W\xe9lkchen', u'W\xf6lkchen'), (u'W\xe9nde', u'W\xe4nde'), (u'W\xe9nden', u'W\xe4nden'), (u'w\xe9r', u'w\xe4r'), (u"w\xe9r's", u"w\xe4r's"), (u'W\xe9re', u'W\xe4re'), (u'W\xe9ren', u'W\xe4ren'), (u'w\xe9ret', u'w\xe4ret'), (u'w\xe9rja', u'w\xe4r ja'), (u'W\xe9rm', u'W\xe4rm'), (u'W\xe9rme', u'W\xe4rme'), (u'w\xe9rmt', u'w\xe4rmt'), (u'W\xe9rst', u'W\xe4rst'), (u'w\xe9rt', u'w\xe4rt'), (u'W\xe9rter', u'W\xf6rter'), (u'W\xe9rterbuch', u'W\xf6rterbuch'), (u'w\xe9rtliche', u'w\xf6rtliche'), (u'W\xe9sche', u'W\xe4sche'), (u'W\xe9scheklammer', u'W\xe4scheklammer'), (u'W\xe9schst', u'W\xe4schst'), (u'w\xe9scht', u'w\xe4scht'), (u'w\ufb02rde', u'w\xfcrde'), (u'w\ufb02rden', u'w\xfcrden'), (u'W\ufb02rfel', u'W\xfcrfel'), (u"z'a'h", u'z\xe4h'), (u'Z/egf', u'liegt'), (u'Z/yarettenb\xe4ume', u'Zigarettenb\xe4ume'), (u'Z05', u'los'), (u'z6gel1e', u'z\xf6gerte'), (u'z6gern', u'z\xf6gern'), (u'zahlenm\xe9\ufb02ig', u'zahlenm\xe4\xdfig'), (u'zappelnl', u'zappeln!'), (u'Zauberspruchen', u'Zauberspr\xfcchen'), (u'Zaubervoodookr\xe9fte', u'Zaubervoodookr\xe4fte'), (u'Zauherpfippchen', u'Zauberp\xfcppchen'), (u'Zefietzende', u'Zerfetzende'), (u'zeitgem5B', u'zeitgem\xe4\xdf'), (u'Zeitgem\xe9\ufb02e', u'Zeitgem\xe4\xdfe'), (u'Zeitgeniissische', u'Zeitgen\xf6ssische'), (u'zeitgeniissischen', u'zeitgen\xf6ssischen'), (u'Zellenschliissel', u'Zellenschl\xfcssel'), (u'zerbeif$en', u'zerbei\xdfen'), (u'zerbeif$t', u'zerbei\xdft'), (u'zerf\xe9llt', u'zerf\xe4llt'), (u'Zermatschger\xe9usch', u'Zermatschger\xe4usch'), (u'zerm\ufb02rben', u'zerm\xfcrben'), (u'zerreifien', u'zerrei\xdfen'), (u'zerreilit', u'zerrei\xdft'), (u'zersfdren', u'zerst\xf6ren'), (u'zerst6rst', u'zerst\xf6rst'), (u'zerst6rt', u'zerst\xf6rt'), (u'zerstdren', u'zerst\xf6ren'), (u'Zerstfiren', u'Zerst\xf6ren'), (u'Zerstfirer', u'Zerst\xf6rer'), (u'Zerstfirungskraft', u'Zerst\xf6rungskraft'), (u'Zerstiickelung', u'Zerst\xfcckelung'), (u'zerstiire', u'zerst\xf6re'), (u'zerstiiren', u'zerst\xf6ren'), (u'Zerstiirer', u'Zerst\xf6rer'), (u'zerstiirt', u'zerst\xf6rt'), (u'zerstiirten', u'zerst\xf6rten'), (u'zerstiirtl', u'zerst\xf6rt!'), (u'Zerstiirungl', u'Zerst\xf6rung!'), (u'zerstoren', u'zerst\xf6ren'), (u'zerst\xe9re', u'zerst\xf6re'), (u'zerst\xe9ren', u'zerst\xf6ren'), (u'Zerst\xe9rer', u'Zerst\xf6rer'), (u'zerst\xe9rt', u'zerst\xf6rt'), (u'Zerst\xe9rung', u'Zerst\xf6rung'), (u'Zerst\xe9rungsfeldzug', u'Zerst\xf6rungsfeldzug'), (u'zertrlllmmert', u'zertr\xfcmmert'), (u'zfihlt', u'z\xe4hlt'), (u'Ziel160m', u'Ziel 160 m'), (u'Zihnelt', u'\xe4hnelt'), (u'ziichtiger', u'z\xfcchtiger'), (u'Ziige', u'Z\xfcge'), (u'Ziindkapseln', u'Z\xfcndkapseln'), (u'Zilnd', u'Z\xfcnd'), (u'Zilnden', u'Z\xfcnden'), (u'Zilndungsenergie', u'Z\xfcndungsenergie'), (u'Zilrich', u'Z\xfcrich'), (u'Zindern', u'\xe4ndern'), (u'Zingstlich', u'\xe4ngstlich'), (u'Ziufierst', u'\xe4u\xdferst'), (u'zleht', u'zieht'), (u'ZLIFUCK', u'zur\xfcck'), (u'Zooschlieliung', u'Zooschlie\xdfung'), (u'Zuckerschn\ufb02tchen', u'Zuckerschn\xfctchen'), (u'zuerstvor', u'zuerst vor'), (u'zuffillig', u'zuf\xe4llig'), (u'zuflligen', u'zuf\xfcgen'), (u'ZUFUCK', u'zur\xfcck'), (u'Zuf\xe9illig', u'Zuf\xe4llig'), (u'Zuf\xe9illigerweise', u'Zuf\xe4lligerweise'), (u'zuf\xe9llig', u'zuf\xe4llig'), (u'Zuf\xe9lligerweise', u'Zuf\xe4lligerweise'), (u"zug'a'nglichen", u'zug\xe4nglichen'), (u'ZUGANGSPRIORITKT', u'ZUGANGSPRIORIT\xc4T'), (u'zugehdrt', u'zugeh\xf6rt'), (u'zugeh\xe9rt', u'zugeh\xf6rt'), (u'zugestofien', u'zugesto\xdfen'), (u'Zugest\xe9ndnis', u'Zugest\xe4ndnis'), (u'Zugest\xe9ndnisse', u'Zugest\xe4ndnisse'), (u'Zugiinge', u'Zug\xe4nge'), (u'zuh6ren', u'zuh\xf6ren'), (u'zuh6rt', u'zuh\xf6rt'), (u'zuhiiren', u'zuh\xf6ren'), (u'zuhiirt', u'zuh\xf6rt'), (u'Zuh\xe9lter', u'Zuh\xe4lter'), (u'Zuh\xe9ren', u'Zuh\xf6ren'), (u'Zuh\xe9rer', u'Zuh\xf6rer'), (u'zukilnftiges', u'zuk\xfcnftiges'), (u'zul', u'zu!'), (u'zundete', u'z\xfcndete'), (u'Zundverteilerkappe', u'Z\xfcndverteilerkappe'), (u'zunjick', u'zur\xfcck'), (u'zun\xe9chst', u'zun\xe4chst'), (u'zun\xe9hen', u'zun\xe4hen'), (u'zun\xe9ihen', u'zun\xe4hen'), (u'Zuokerschntltchen', u'Zuckerschn\xfctchen'), (u'zurfick', u'zur\xfcck'), (u'zurfickblicken', u'zur\xfcckblicken'), (u'zurfickgekommen', u'zur\xfcckgekommen'), (u'zurfickgezogen', u'zur\xfcckgezogen'), (u'zurfickkehren', u'zur\xfcckkehren'), (u'zurfickzufuhren', u'zur\xfcckzuf\xfchren'), (u'zuriick', u'zur\xfcck'), (u'zuriickbleiben', u'zur\xfcckbleiben'), (u'zuriickgeben', u'zur\xfcckgeben'), (u'zuriickgehen', u'zur\xfcckgehen'), (u'zuriickgekommen', u'zur\xfcckgekommen'), (u'zuriickgezogen', u'zur\xfcckgezogen'), (u'zuriickhaben', u'zur\xfcckhaben'), (u'zuriickkehre', u'zur\xfcckkehre'), (u'zuriickkehren', u'zur\xfcckkehren'), (u'zuriickkehrst', u'zur\xfcckkehrst'), (u'zuriickziehen', u'zur\xfcckziehen'), (u'Zurijck', u'Zur\xfcck'), (u'zurijckbringen', u'zur\xfcckbringen'), (u'zurijckfordem', u'zur\xfcckfordern'), (u'zurijckgeholt', u'zur\xfcckgeholt'), (u'zurijckgekehrt', u'zur\xfcckgekehrt'), (u'zurijckgekommen', u'zur\xfcckgekommen'), (u'zurijckgelassen', u'zur\xfcckgelassen'), (u'zurijckgerufen', u'zur\xfcckgerufen'), (u'zurijckkehren', u'zur\xfcckkehren'), (u'zurijcknehmen', u'zur\xfccknehmen'), (u'zurijckstolpern', u'zur\xfcckstolpern'), (u'Zurilck', u'Zur\xfcck'), (u'Zurilckf', u'Zur\xfcck!'), (u'zurilckgeblieben', u'zur\xfcckgeblieben'), (u'zurilckgeholt', u'zur\xfcckgeholt'), (u'zurilckgekehrt', u'zur\xfcckgekehrt'), (u'zurilckhalten', u'zur\xfcckhalten'), (u'zurilckholen', u'zur\xfcckholen'), (u'zurilckkehre', u'zur\xfcckkehre'), (u'zurilckkehren', u'zur\xfcckkehren'), (u'zurilckkehrt', u'zur\xfcckkehrt'), (u'zurilckkommen', u'zur\xfcckkommen'), (u'zurilckkommt', u'zur\xfcckkommt'), (u'zurilcklassen', u'zur\xfccklassen'), (u'zurilckziehen', u'zur\xfcckziehen'), (u'Zurilckziehenl', u'Zur\xfcckziehen!'), (u'zurilckzugeben', u'zur\xfcckzugeben'), (u"zurl'Jck", u'zur\xfcck!'), (u"zurL'lck", u'zur\xfcck'), (u'zurLick', u'zur\xfcck'), (u'zurljckgeben', u'zur\xfcckgeben'), (u'zurllickfallen', u'zur\xfcckfallen'), (u'zurllickgekehrt', u'zur\xfcckgekehrt'), (u'zurllickkehrt', u'zur\xfcckkehrt'), (u'zurllickzukehren', u'zur\xfcckzukehren'), (u'zurlllckgehen', u'zur\xfcckgehen'), (u'zurlllckkomme', u'zur\xfcckkomme'), (u'zurtick', u'zur\xfcck'), (u'zurtickbringe', u'zur\xfcckbringe'), (u'zurtickgezogen', u'zur\xfcckgezogen'), (u'zurtlckgekommen', u'zur\xfcckgekommen'), (u'zurtlckvervvandeln', u'zur\xfcckverwandeln'), (u'Zuruck', u'Zur\xfcck'), (u'ZURUCK', u'ZUR\xdcCK'), (u'zuruckbleiben', u'zur\xfcckbleiben'), (u'zuruckblicken', u'zur\xfcckblicken'), (u'zuruckdenke', u'zur\xfcckdenke'), (u'zuruckfeuern', u'zur\xfcckfeuern'), (u'zuruckgehen', u'zur\xfcckgehen'), (u'zuruckgelegt', u'zur\xfcckgelegt'), (u'zuruckgewiesen', u'zur\xfcckgewiesen'), (u'zuruckgreifen', u'zur\xfcckgreifen'), (u'zuruckhaben', u'zur\xfcckhaben'), (u'zuruckkehren', u'zur\xfcckkehren'), (u'zuruckkehrten', u'zur\xfcckkehrten'), (u'zuruckkomme', u'zur\xfcckkomme'), (u'zuruckkommen', u'zur\xfcckkommen'), (u'zuruckk\xe9mst', u'zur\xfcckk\xe4mst'), (u'zuruckl', u'zur\xfcck!'), (u'zurucklassen', u'zur\xfccklassen'), (u'zurUcklieB', u'zur\xfccklie\xdf'), (u'zuruckl\xe9cheln', u'zur\xfcckl\xe4cheln'), (u'zurucknehmen', u'zur\xfccknehmen'), (u'zuruckverwandeln', u'zur\xfcckverwandeln'), (u'zuruckverwandelt', u'zur\xfcckverwandelt'), (u'zuruckziehen', u'zur\xfcckziehen'), (u'zuruckzukommen', u'zur\xfcckzukommen'), (u'zurverfilgung', u'zur Verf\xfcgung'), (u'zur\xe9ickrufen', u'zur\xfcckrufen'), (u'zur\ufb02ck', u'zur\xfcck'), (u'Zur\ufb02ckbleiben', u'Zur\xfcckbleiben'), (u'zur\ufb02ckfliegen', u'zur\xfcckfliegen'), (u'zur\ufb02ckgeschickt', u'zur\xfcckgeschickt'), (u'zur\ufb02ckgibst', u'zur\xfcckgibst'), (u"zus'a'tzliche", u'zus\xe4tzliche'), (u'zusammenbeilien', u'zusammenbei\xdfen'), (u'zusammenffigen', u'zusammenf\xfcgen'), (u'zusammenfugen', u'zusammenf\xfcgen'), (u'zusammenfuhren', u'zusammenf\xfchren'), (u'zusammenf\xe9illt', u'zusammenf\xe4llt'), (u'zusammenh\xe9ilt', u'zusammenh\xe4lt'), (u'zusammenh\xe9lt', u'zusammenh\xe4lt'), (u'zusammenh\xe9ngen', u'zusammenh\xe4ngen'), (u'zusammenreifien', u'zusammenrei\xdfen'), (u'zusammenzuschweifien', u'zusammenzuschwei\xdfen'), (u'zuschl\xe9gst', u'zuschl\xe4gst'), (u'zust6Bt', u'zust\xf6\xdft'), (u'zustofken', u'zusto\xdfen'), (u'zust\xe9indig', u'zust\xe4ndig'), (u'zust\xe9ncligen', u'zust\xe4ndigen'), (u'zust\xe9ndig', u'zust\xe4ndig'), (u'zust\xe9ndigen', u'zust\xe4ndigen'), (u'zus\xe9tzlich', u'zus\xe4tzlich'), (u'zus\xe9tzliche', u'zus\xe4tzliche'), (u'zuverlfissig', u'zuverl\xe4ssig'), (u'zuverllssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssig', u'zuverl\xe4ssig'), (u'zuverl\xe9ssiger', u'zuverl\xe4ssiger'), (u'zuviel', u'zu viel'), (u'zuviele', u'zu viele'), (u'zuzuflligen', u'zuzuf\xfcgen'), (u'Zu\ufb02ucht', u'Zuflucht'), (u'zvvei', u'zwei'), (u'Zw6If', u'Zw\xf6lf'), (u'zw6lfmal', u'zw\xf6lfmal'), (u'Zwel', u'Zwei'), (u'Zwickmfihle', u'Zwickm\xfchle'), (u'Zwillingstiichter', u'Zwillingst\xf6chter'), (u'Zwischenf\xe9lle', u'Zwischenf\xe4lle'), (u'zwnlf', u'zw\xf6lf'), (u'Zw\xe9ilften', u'Zw\xf6lften'), (u'zw\xe9lf', u'zw\xf6lf'), (u'z\xe9gerlich', u'z\xf6gerlich'), (u'z\xe9gern', u'z\xf6gern'), (u'Z\xe9gerns', u'Z\xf6gerns'), (u'z\xe9h', u'z\xe4h'), (u'z\xe9he', u'z\xe4he'), (u'z\xe9her', u'z\xe4her'), (u'z\xe9hl', u'z\xe4hl'), (u'z\xe9hle', u'z\xe4hle'), (u'z\xe9hlen', u'z\xe4hlen'), (u'Z\xe9hlerei', u'Z\xe4hlerei'), (u'z\xe9hlt', u'z\xe4hlt'), (u'z\xe9hltl', u'z\xe4hlt!'), (u'Z\xe9hlung', u'Z\xe4hlung'), (u'Z\xe9hne', u'Z\xe4hne'), (u'Z\xe9hnen', u'Z\xe4hnen'), (u'Z\xe9hneputzen', u'Z\xe4hneputzen'), (u'z\xe9ihle', u'z\xe4hle'), (u'z\xe9ihlen', u'z\xe4hlen'), (u'z\xe9ihlt', u'z\xe4hlt'), (u'Z\xe9ihlungen', u'Z\xe4hlungen'), (u'Z\xe9ihne', u'Z\xe4hne'), (u'Z\xe9libat', u'Z\xf6libat'), (u'\\/GFQHUQGH', u'Vergn\xfcgen'), (u'\\/OFVVUFf\u20ac', u'Vorw\xfcrfe'), (u'\\/Vahrheit', u'Wahrheit'), (u'\\/Vir', u'Wir'), (u"\\/\\/i6fUl'1l\u20acfi", u'Wie f\xfchlen'), (u"\\/\\/il'fUl'1I'\u20acl'1", u'Wir f\xfchren'), (u'\\Nynn', u'Wynn'), (u'_', u'-'), (u'\xc4u', u'Au'), (u'\xe9', u'\xe0'), (u'\xe9chzt', u'\xe4chzt'), (u'\xe9ffentlich', u'\xf6ffentlich'), (u'\xe9ffne', u'\xf6ffne'), (u'\xe9ffnen', u'\xf6ffnen'), (u'\xe9ffnet', u'\xf6ffnet'), (u'\xe9fft', u'\xe4fft'), (u'\xe9fter', u'\xf6fter'), (u'\xe9fters', u'\xf6fters'), (u'\xe9h', u'\xe4h'), (u'\xe9hnlich', u'\xe4hnlich'), (u'\xe9hnliche', u'\xe4hnliche'), (u'\xe9hnlicher', u'\xe4hnlicher'), (u'\xe9ih', u'\xe4h'), (u'\xe9ihnlich', u'\xe4hnlich'), (u'\xe9indern', u'\xe4ndern'), (u'\xe9itzend', u'\xe4tzend'), (u'\xe9lter', u'\xe4lter'), (u'\xe9lteste', u'\xe4lteste'), (u'\xe9ltesten', u'\xe4ltesten'), (u'\xe9ndere', u'\xe4ndere'), (u'\xe9ndern', u'\xe4ndern'), (u'\xe9ndert', u'\xe4ndert'), (u'\xe9nderte', u'\xe4nderte'), (u'\xe9nderten', u'\xe4nderten'), (u'\xe9ngstlich', u'\xe4ngstlich'), (u'\xe9rgere', u'\xe4rgere'), (u'\xe9rgern', u'\xe4rgern'), (u'\xe9rztliche', u'\xe4rztliche'), (u'\xe9rztlichen', u'\xe4rztlichen'), (u'\xe9rztlicher', u'\xe4rztlicher'), (u'\xe9sthetisch', u'\xe4sthetisch'), (u'\xe9tzend', u'\xe4tzend'), (u'\xe9ufierst', u'\xe4u\xdferst'), (u'\xe9ufiersten', u'\xe4u\xdfersten'), (u'\xe9uflserst', u'\xe4u\xdferst'), (u'\ufb02atterndem', u'flatterndem'), (u'\ufb02el', u'fiel'), (u'\ufb02iehen', u'fliehen'), (u'\ufb02jr', u'f\xfcr'), (u'\ufb02lhlen', u'f\xfchlen'), (u'\ufb02lllen', u'f\xfcllen'), (u'\ufb02lr', u'f\xfcr'), (u'\ufb02lrchterlich', u'f\xfcrchterlich'), (u'\ufb02ndet', u'findet'), (u'AIle', u'Alle'), (u'AIter', u'Alter'), (u'GI\xfcck', u'Gl\xfcck'), (u'PIaystation', u'Playstation'), (u'AIIes', u'Alles'), (u'AIso', u'Also'), (u'Ouatsch', u'Quatsch'), (u'AIles', u'Alles'), (u'BIeib', u'Bleib'), (u'KIaut', u'Klaut'), (u'AIlah', u'Allah'), (u'PIan', u'Plan'), (u'oderjemand', u'oder jemand'), (u'liestjetzt', u'liest jetzt')]),
+                        'pattern': u"(?um)(\\b|^)(?:\\/a|\\/ch|\\/d\\/of|\\/ebte|\\/eid|\\/hn|\\/hnen|\\/hr|\\/hre|\\/hren|\\/m|\\/mmer|\\/n|\\/ndividuen|\\/nn|\\/oe|\\/sf|\\/sf\\/0\\/1n|\\/ungs|\\/Vfinuten|\\/\\\xe9nger|\\/\\\xe9uft|0\\/1|0\\/me|0\\/vne|00om|100m|120m|13Oj\\\xa7hrie|145m|150m|160m|165m|19m|20m|27m|30m|37m|38m|3km|5\\/ch|5\\/cher|5\\/cherer|5\\/e|5\\/nd|500m|5ulSere|60m|6de|6dere|6ffne|6ffnen|6ffnet|6fter|750m|85m|90m|a\\/\\/em|A\\/\\/es|abbeif\\$en|abdrficken|aBen|abergl\\\xe9iubischen|aberja|aberjemand|Aberjetzt|abf\\\xe9hrt|abf\\\xe9illt|abgef\\\xe9rbt|abgeh\\\xe9ngt|abgeh\\\xe9rt|abgelost|abgesprengli|abgestfirztl|abgestilrzt|abgestofien|abgew\\\xe9hlt|abgew\\\xe9hnen|abgew\\\xe9hnt|abge\\\xe9nderten|abh\\\xe9ingt|abh\\\xe9ngen|abh\\\xe9ngig|abh\\\xe9ngiges|Abh\\\xe9rstationen|Abjetzt|abkfihlen|Abkfirzung|abkommlich|Ablegenl|ablfisen|ablosen|Ablosung|abreif\\$en|Abrijcken|abr\\\xe9umen|Absch\\/ed|abschiefien|abschlief\\$en|abschliefien|abschwiiren|abstoflsend|Abtrijnnige|abwiirgt|abw\\\xe9gen|abzuh\\\xe9ren|abzuschwiiren|abzusfofien|ACh|Achtungl|Achzen|ACHZT|Acic|ADDRESSDATEI|Adi\\\xf6s|Admiralitat|Admiralit\\\xe9it|Admiralit\\\xe9t|Aff\\\xe9re|Aff\\\xe9ren|AFl|aggresivem|Agypten|aher|AI\\/en\\/vichtigste|Ain\\/vays|AIs|Aktivit\\\xe9iten|Aktivit\\\xe9ten|AKTMERT|Alarmsfufe|albem|Albtriiume|ale|alleinl|allejubeln|allern\\\xe9chsten|Allmiichtigerl|Allm\\\xe9chtige|Allm\\\xe9chtiger|allm\\\xe9hlich|Allm\\\xe9ichtiger|Allsparkl|allt\\\xe9iglichen|ALTESTE|Altester|Alzte|Amerx\\'kaner|amfisierst|Amiilsierst|amiisieren|amiisierenl|amiisierte|Amijsant|amlllsant|amlllsiert|amtlsant|Amusanf|amusant|Amusiert|Anderst|Anderung|Anderungen|anfa\\'ngt|Anffihrer|Anffingerl|Anfiihrer|anfijhlt|Anfingerl|Anfuhrer|Anfuhrern|Anf\\\xe9inger|Anf\\\xe9ingergliick|Anf\\\xe9nge|anf\\\xe9ngst|anf\\\xe9ngt|angebrfillt|angebrullt|angefiihrt|ANGEHCHDRIGE|angehfirt|Angehtirigen|angeh\\\xe9ren|angeh\\\xe9rt|angel\\\xe9chelt|angerilhrt|anger\\\ufb02hrt|angeschweifit|angespruht|angetiltert|Angriffspl\\\xe9nen|Angstschweili|anhiiren|Anh\\\xe9inger|anh\\\xe9lt|anh\\\xe9ngen|anh\\\xe9ren|ankijndigen|anliigen|anlugen|anmal3ende|ann\\\xe9hern|anriihrst|anrijuhren|anst\\\xe9indig|anst\\\xe9indiger|anst\\\xe9indiges|anst\\\xe9ndig|anst\\\xe9ndige|anst\\\xe9ndigen|Anst\\\xe9ndiges|Antik\\\xe9rper|Antiquit\\\xe9t|Antistrahlenger\\\xe9t|antwortenl|Anwe\\/sung|Anwe\\/sungen|Anw\\\xe9iltin|Anw\\\xe9lte|Anw\\\xe9ltin|Anzilge|Anztinden|Anzuge|Anzugen|anzuhiiren|anzuhoren|anzundenl|anzupiibeln|An\\\xe9sthesie|An\\\xe9sthesieprofessor|An\\\xe9sthesieteam|An\\\xe9sthesist|An\\\xe9sthesisten|An\\\xe9sthetikum|ARBEITERI|Arbeitsfl\\\ufb02gel|Armeefunkger\\\xe9t|Armel|Arschkichern|Arschliicher|Arschliichern|Arschl\\\xe9cher|Arschl\\\xe9chern|Arzte|Arzten|Arztin|Atemger\\\xe9usche|Atlantikkiiste|Atlantikkuste|ATMOSPHARE|Atmosph\\\xe9re|Atmosph\\\xe9renbereich|Atmosph\\\xe9reneinflugsequenz|Atmosph\\\xe9reneintritt|Attenfaiter|Attent\\\xe9iter|Attent\\\xe9ter|Attent\\\xe9ters|Attraktivit\\\xe9t|auBen|Aubenblick|AuBenbord|AuBenwelt|auBer|AuBerdem|auBerhalb|auc\\/1|auchl|Auf\\$erdem|auf3er|aufAugenh6he|aufblilhende|auff\\'a\\'ngt|Auff\\\xe9lliges|aufgebltiht|aufgeftlhrt|aufgeh\\\xe9ingt|aufgeh\\\xe9rt|aufgekl\\\xe9rt|aufger\\\xe9umt|aufgespiefit|aufgewiihlter|aufgez\\\xe9hlt|Aufh6ren|aufhbren|aufhdrf|aufhfiren|aufhiiren|Aufhoren|Aufh\\\xe9iren|aufh\\\xe9ngen|Aufh\\\xe9ren|aufh\\\xe9renl|aufi|Aufienministerium|aufier|Aufierdem|aufiergew\\\xe9hnliche|aufierhalb|Aufierirdischer|Aufierlich|aufierordentlich|Aufkenposten|aufkisen|aufkl\\\xe9ren|Aufkl\\\xe9rung|aufl|Aufl6sung|aufliisen|auflser|aufl\\\xe9sen|aufmiibeln|aufraumte|aufr\\\xe9umen|aufschlief\\$en|Aufschlull|aufSer|aufSIJBigkeiten|aufspturen|aufstellenl|Aufst\\\xe9ndige|aufTanis|Auftr\\\xe9ge|aufvv\\\xe9ndigen|aufw\\\xe9ichst|aufw\\\xe9rmen|aufZ\\>er|Aufztlge|aufzuhiivren|aufzukl\\\xe9ren|aufzuldsen|aufzur\\\xe9umen|aufz\\\xe9hlen|auf\\\xe9er|auf\\\ufb02iegen|Augenm\\\xe9igen|aul\\'5er|aul3er|Aul3erdem|aul5er|aulier|Aulierdem|auliergewfihnlich|aulierhalb|Aulierirdischen|auller|aullerhalb|AulSer|AulSerdem|ausdriicken|ausdriickt|ausdrijcken|ausdrucklicher|Ausdr\\\ufb02cken|Ausen\\/v\\\xe9hlte|Ausen\\/v\\\xe9hlter|auserw\\\xe9hlt|Ausffillen|ausfijhren|ausfijhrt|ausfuhren|ausfullt|ausgef\\\ufb02llt|ausgeliischt|ausgeliist|ausgel\\\xe9ist|ausgel\\\xe9scht|ausgel\\\xe9st|ausgeriickt|ausgerijstet|AUSGEWAHLT|ausgew\\\xe9hlt|Ausg\\\xe9ngen|aush6hlen|aushiilt|Aushilfspunkerl|aush\\\xe9lt|ausilben|Auskunfte|ausl|Ausl\\\xe9nder|Ausl\\\xe9nderl|ausl\\\xe9schen|ausl\\\xe9sen|Ausl\\\xe9ser|AusmaB|ausprobie\\\ufb02|Ausriistung|ausrusten|Ausrustung|Ausschullware|ausschwinnenl|auszudriicken|auszuschliefien|auszuw\\\xe9hlen|Autorit\\\xe9t|Autoschlilssel|Autoschl\\\ufb02ssel|au\\\ufb02\\/viihlt|Au\\\ufb02ergewiihnlich|Azevedol|A\\\ufb02es|B\\/ick|b\\/olog\\/sch|b\\/sschen|B6se|B6sem|B6ser|Babym\\\xe9dchen|Ballastst\\\xe9ffchen|Ballm\\\xe9dchen|Ballm\\\xe9idchen|Ballonverk\\\xe9ufer|Balzenl|Bankijberfall|Barbarenilberfall|Barenk\\\xe9nig|basfeln|Bastianol|Bastlano|Bauchfellentztmdung|Bauchkr\\\xe9mpfe|bauf\\\xe9llig|bauf\\\xe9llige|Baumst\\\xe9mme|Baupl\\\xe9ne|Bbses|be\\/de|bedecktl|Bedilrfnisse|Bedilrfnissen|Bedllirfnisse|bedrijckt|bedr\\\xe9ngen|bedr\\\xe9ngt|bedr\\\xe9ngten|Beeilungf|Beeilungl|Beerdingungsinsiiiui|Beerdingungsinstitut|Befehll|beffirdert|Beffirderung|befiirchte|befiirchteten|befiirdert|befiirderte|Befiirderung|befilrchtete|befllirchte|befurworte|befurwortet|bef\\\xe9rdere|bef\\\xe9rdert|Bef\\\xe9rderung|beg\\/ng|begl\\\ufb02ckt|begniigt|begrfindetes|Begriiliungsruf|begrijfien|Begrilfiung|Begrilfkung|begrL\\'llZ\\>en|BegrUBungsruf|begrUf\\$t|begrufie|begrufit|Begrundung|Beh6rden|beh\\\xe9lt|Beh\\\xe9lter|beh\\\xe9mmert|beiB|beiBen|beiBt|beif\\$t|beif2\\>en|beifken|beiflsen|beijenen|Beiliring|BEKAMPFEN|bekannf|bekanntermafken|bek\\\xe9me|bek\\\xe9mpfen|Bek\\\xe9mpfung|bel|belde|beliellsen|belm|Beltlftungstunnels|Beluftungstunnel|Beluftungstunnell|bel\\\xe9stigen|Bemiihe|Bemiihen|bemL\\'lhe|bemtuht|bemuhen|bemuhten|Ben\\\xe9tigen|ben\\\xe9tigt|ben\\\xe9tigten|Beobachtar|bereft|bereitf\\\xe9ndet|beriichtigtsten|beriichtlgten|beriihmt|Beriihmtheiten|beriihren|Beriihrend|beriihrt|Beriihrtl|berijhrt|berilhmter|berilhrt|Berilhrung|Berks\\/1\\/re|BerL\\'lhre|berllichtigter|berllihren|berllihrt|berlllhmten|Bern\\/e|beruhrt|beruhrte|ber\\\ufb02hmter|besafi|Besch\\'a\\'ftigt|bescheifien|beschiftigt|beschiiftigt|beschiitzen|beschiitzt|beschiltze|beschiltzen|beschleun\\/gt|beschliefkt|beschlie\\\ufb02tloszuziehen|beschllitzet|beschllitzt|beschr\\\xe9nkt|Beschr\\\xe9nkungen|beschtitze|beschutzen|besch\\\xe9digt|besch\\\xe9ftigen|besch\\\xe9ftigt|besch\\\xe9ftigte|besch\\\xe9ftigten|besch\\\xe9iftige|besch\\\xe9iftigt|Besch\\\xe9imen|besch\\\xe9mendste|besch\\\xe9oligen|besch\\\ufb02tzen|Besch\\\ufb02tzer|Besf\\\xe9f\\/gen|Besitztijmer|BESTATIGE|BESTATIGT|bestenl|bestiirzt|bestiitigen|bestltigt|bestx\\'mmt|best\\\xe9indige|best\\\xe9itigt|Best\\\xe9itigung|Best\\\xe9itigungen|Best\\\xe9tige|Best\\\xe9tigen|best\\\xe9tigt|Best\\\xe9tigung|bes\\\xe9inftigen|bes\\\xe9inftigt|bes\\\xe9nftigen|Betiiubt|betriibt|betriigen|Betriiger|betriigt|betrijgen|Betrijgerl|betrilgen|betrtlgerischer|betr\\\xe9chtliches|Betr\\\xe9ge|betr\\\xe9gt|Bettw\\\xe9ische|Beviilkerung|bevorwir|bev\\\xe9lkern|bewegf|Bew\\\xe9hrungsauflage|bew\\\xe9ihrte|bew\\\xe9iltigen|bew\\\xe9issern|bew\\\xe9lkten|bew\\\xe9ltigen|Bew\\\xe9ltigung|bew\\\xe9ssern|Bew\\\xe9sserungssysteme|Bezirksgelinde|bezuglich|be\\\xe9ingstigende|be\\\xe9ngstigend|be\\\xe9ngstigender|bffnen|Bficher|Bfiro|bfirsten|bfise|bfisen|bfiser|bfises|bfiseste|bfisesten|bgsonderen|BI6de|Bierbfichse|Biicher|Biicherei|Biick|Biiffel|BIiHlt|Biihne|Biilcherei|BIind|Biirger|Biirgerrechte|Biiro|Biiros|Biirotiir|biirsten|Biise|Biisen|biises|Bijchern|Bijhne|Bijndnis|Bijrger|Bijrgermeister|Bijro|Bijrokraten|Bijrzel|Bilchern|Bildseitenverh\\\xe9ltnis|Bilndel|Bilro|BIood|BIQIS|Bischiife|Bischiifen|Bisch\\\xe9fe|bistja|bistjetzt|Bittejetzt|bittersiJl3es|Bittesch\\\xe9n|BIue|bi\\\xdfchen|BL1hne|Bl6cke|bl6d|bl6de|bl6den|bl6der|bl6des|Bl6dian|Bl6dmann|Bl6dsinn|Blauaugel|Blddes|Ble\\/bf|bleibenl|blelbenl|Blfidmann|Blfidsinn|Blfimchen|BLicher|BLihne|Bliid|bliide|bliiden|bliidere|bliides|Bliidmann|Bliidsinn|bliiht|bliirgerlichen|Blijmchen|Bllck|Bllindel|Blllroklammer|bln|bloB|bloBen|bloBstellen|blockiertl|BLODE|blof\\$|blofl|Blol2\\>|blol3|blol3\\>|blol3stellen|bloli|blolistellen|blolls|bls|Blst|bltte|Blumenstr\\\xe9iulichen|Blument\\\xe9pfen|Blutgetr\\\xe4nkte|Blutgetr\\\xe9nkte|blutjungl|blutriinstig|Blutvergiefien|bl\\\xe9d|Bl\\\xe9de|bl\\\xe9den|bl\\\xe9der|Bl\\\xe9des|Bl\\\xe9dheit|Bl\\\xe9dmann|Bl\\\xe9dsinn|Bl\\\xe9iser|Bl\\\xe9ser|bl\\\xe9st|Bnjicke|Bodensch\\\xe9tze|Bogenschiefien|Bogenschiefienl|Bogenschiefiens|Bogenschiitze|Bogenschiitzen|Bogenschijtze|Bogenschijtzen|Bogenschutzen|Bogenschutzenl|BOnjour|bosartige|Bracken|Briicke|Briicken|Briider|Briihe|Briillen|briillt|Brijcke|Brijderlichkeit|brijllen|Brilcke|Brilder|Brilllen|brillltjeden|Brilnette|Brilsten|brilten|BrL\\'lcke|brL\\'lllen|brlliderliche|Brllidern|Brlliste|Broschijre|Broschilren|Broschuren|Brucke|Brucken|Brudern|Bruhe|brullen|brullt|Brutalitiit|Brutzelhtihnchen|Br\\\xe9chtet|Br\\\xe9iutigam|Br\\\xe9sel|Br\\\xe9tchen|br\\\xe9uchte|br\\\xe9uchten|br\\\xe9unen|Br\\\xe9ute|Br\\\ufb02cke|Br\\\ufb02der|Btiro|Btiser|Bucher|Buchern|Budgetkiirzung|BUFO|Bugschutzgerate|Buhnenbild|Bullel|Buml|Bundnis|Burger|Burgerrechtlerin|Buro|BURO|Burol|Burottlr|Busche|B\\\xe9ickchen|B\\\xe9ickerei|B\\\xe9ille|B\\\xe9inder|B\\\xe9ir|B\\\xe9irgermeister|B\\\xe9iro|b\\\xe9ise|B\\\xe9iume|B\\\xe9nder|B\\\xe9r|B\\\xe9ren|B\\\xe9renhasser|B\\\xe9renhunger|B\\\xe9renj\\\xe9ger|B\\\xe9renk\\\xe9nig|B\\\xe9renlaute|B\\\xe9renrolle|B\\\xe9renschnitzereien|B\\\xe9renstimmen|B\\\xe9rin|B\\\xe9risch|B\\\xe9rs|B\\\xe9rte|b\\\xe9s|b\\\xe9se|b\\\xe9sen|B\\\xe9ses|B\\\xe9ume|B\\\xe9umen|B\\\ufb02chern|B\\\ufb02ste|Cafe|Caf\\\xe4|CASAREN|Charakterm\\\xe9ngel|Charakterst\\\xe9rke|Chrlntlna|Ciden|Ciffnet|Cihrchen|Citro\\\xe9n|clamit|class|Clbernimmt|cler|Coimbrasl|CommanderWill|Corenillal|Cowboyscheifi|C\\\xe9sar|D\\/e|d\\/ese|d\\/esem|d\\/esen|D\\/eser|D\\/eses|D\\/sko|dabel|dachfen|daffir|dafiir|Dafijr|Dafijur|Dafilr|dafL\\'lr|dafLir|dafljr|dafllir|Daflllrwar|daftir|dafUr|dafzjir|dajemand|dal|Damenh\\\xe9nde|damitl|damlt|DANEMARK|darfiber|Dariiber|darijber|Darilber|dart\\/\\'ber|dartlber|DARUBER|DarUber|dasjetzt|dasl|Dateniibermittlung|dauem|dauerf|dazugeh\\\xe9ren|Da\\\xdf|Da\\\ufb02lr|Ddrfern|def|Defekf\\/v|deinerZelle|deln|delne|demfiltigen|Demijtigung|demllitige|demllitigen|denkwurdiger|denkw\\\ufb02rdiger|derAbgeordnete|derAusgabe|derAusl6ser|DerjL\\'lngste|derjunge|dermaben|derTyp|derWeg|derWelle|DerWL1rfel|DerZauberer|de\\_\\_n|dfeserr|dffentlichen|dffnen|Dfimonen|dfinn|dichl|diej\\\xfcngste|dienstunfahig|Dieselkapit\\\xe9in|Dieselkapit\\\xe9n|Dieselmotorenl|dieserAufnahme|Dieserjunge|Diiit|diirfe|Diirfen|diirft|diirfte|dijfien|dijnn|dijrfen|Dijrfte|dijstere|dilmmer|dilrfen|dilrft|dilrften|dilrftig|Dine|dirja|dirjemand|dirjetzt|dirJulie|dirl|dirwehzutun|Di\\\xe9t|Di\\\xe9tberaterin|Di\\\xe9tbier|dlch|Dle|dles|Dlese|Dlfit|Dlitplan|dllirfen|dllirft|dllirstet|dlr|doc\\/1|dochl|dolthin|Doppelgfiner|Doppelgfinger|Doppelg\\\xe9inger|Doppelg\\\xe9nger|Doppelzijngig|doppelztmgiger|dor|Dr\\'a\\'ngt|drachengriinen|Drahte|dranl|drau\\/3en|drau\\/Sen|drauBen|drauf\\$en|draufdrilcken|draufgestllirzt|draufg\\\xe9ngerisch|draufien|draufken|drauflsenl|drauf\\\xe9en|drauilen|draul3en|draul5en|draulien|draullen|draulSen|Dreckl\\\xe9chern|Drecksmiihle|Drecks\\\xe9cke|drfiben|Drfick|Drfingeln|drih|driiben|driicken|driickt|drijben|drijber|drijck|drijckt|drilben|drilber|drilcken|drLiber|drlliben|drlllben|Drogenabh\\\xe9ngige|Drticken|druben|drubenl|druber|Druckkn\\\xe9pfe|drunterliegt|Dr\\\xe9nage|dr\\\xe9ngeln|dr\\\xe9ngen|dr\\\xe9ngt|dr\\\ufb02ben|dtirft|dtlrfen|Dudels\\\xe9cken|dUFf\\\u20acl\\'1|dul|dull|Dummk6pfe|Dummkiipfe|Dunnschiss|durchdrficken|durchdr\\\xe9ngen|Durchfiihrung|durchfuhren|durchgefiihlt|durchgefijhrt|durchgefuhrt|durchgef\\\ufb02hrt|Durchg\\\xe9nge|Durchladenl|durchlfichere|durchsetzungsf\\\xe9higer|durchst\\\xe9bern|durchwilhlt|durchzufilhren|durchzufuhren|Durfen|durft|dusterer|D\\\xe9cher|D\\\xe9imon|D\\\xe9imonen|D\\\xe9inemark|D\\\xe9inemarks|D\\\xe9inen|d\\\xe9inisches|d\\\xe9mlich|D\\\xe9mliche|d\\\xe9mlichen|d\\\xe9mlicher|d\\\xe9mlichl|d\\\xe9mmert|D\\\xe9monenb\\\xe9ren|d\\\xe9monischen|D\\\xe9rme|D\\\xe9rrfleisch|D\\\xe9umchen|d\\\ufb02rfen|E\\/\\/e|e\\/n|e\\/ne|e\\/nem|e\\/nen|e\\/ner|e\\/nes|e\\/ns|e\\/nsf|E9YPt|Ea\\/vtes|ebenbfirtig|ebenburtige|Ec\\/vte|echfen|edelm\\\ufb02tig|efn|efwas|Eheminner|Ehem\\\xe9nnern|Ehezerstfirerin|Ehrenbijrger|EHRENBURGERSCHAFT|Ehreng\\\xe9iste|Eichhfirnchen|Eichhiirnchen|Eichh\\\xe9rnchens|eifersfichtig|eifersiichtig|eifers\\\ufb02chtig|eigenh\\\xe9ndig|eigenmlchtig|eigenntltziges|Eihnlich|Eimen\\/veise|Einbruche|eindriicken|Eindring\\/Inge|eindrucken|einejunge|einerfr\\\ufb02hen|einervorfuhrung|einfiihren|Einfiihrung|einfilgen|einfilhlsamsten|einflllgen|Einflusse|einfugen|einfuhrten|Einfuhrung|Einf\\\xe9ltige|eingefiigt|eingef\\\ufb02gt|eingehiillt|eingepr\\\xe9gt|einger\\\xe9iumt|einger\\\xe9umt|eingeschl\\\xe9fert|eingeschr\\\xe9nkt|eingesch\\\xe9itzt|eingesch\\\xe9tzt|eingesturzt|eingieBt|eingschaltet|Einh\\\xe9rnern|einlegenl|einl\\\xe9dt|einl\\\xe9sen|Einsatzfahigkeit|Einschiichterung|Einschliefklich|Einschlielilich|einstellenl|Eins\\\xe9tze|eint\\\xe9nig|Einzelg\\\xe9ngerin|einzusch\\\xe9tzen|Eisstiirme|Elektrizit\\\xe9t|elfenbeingetfinte|elit\\\xe9rer|Eln|Elne|elnem|Elnen|elner|Elnes|empfindungsf\\\xe9higen|Empf\\\xe9inger|empf\\\xe9ngt|Empiirend|Empiirendste|empiirt|emst|en\\/varten|En\\/vartungen|en\\/v\\\xe9hnt|Enchant\\\xe4|endgiiltig|endgultig|endgultigen|endg\\\ufb02ltig|endlichl|ENERIGE|enfternt|Engl\\\xe9nder|Engl\\\xe9nderin|eniillen|entbl6Bte|entbl6f\\$en|entfiihre|entfiihrt|entfiihrte|Entfiihrung|Entftihrung|ENTFUHRUNGSVERDACHTIGER|enthllt|enthUllt|enth\\\xe9lt|entliiften|Entliiftungen|Entlijlftungen|entluften|entl\\\xe9sst|Entreilit|entriistet|entr\\\xe9itseln|Entschlrfen|Entschlull|ENTSCHLUSSELN|Entschlussen|entsch\\\xe9rfen|enttausche|enttiiuscht|Enttluscht|Enttluschungen|entt\\\xe9iuschen|entt\\\xe9uschen|entt\\\xe9uschst|entt\\\xe9uscht|Entv\\\\\\/Urfe|Entwicklungsl\\\xe9ndern|entzllickt|entzllindet|entzuckend|entzundet|enzv\\\xe9rmt|Er6ffnen|erb\\\xe9rml\\/ch|erb\\\xe9rmlich|Erb\\\xe9rmliches|Erdnijsse|erdriickt|erd\\\xe9ihnliche|erfebst|erffillen|erfiffnet|erfiille|erfiillen|erfiillt|erfijllt|erfillle|erfilllen|erfilllt|erfllille|erfllillt|erflllllen|Erfolgl|erfullen|erfullt|erf\\\xe9hrst|erf\\\xe9hrt|erf\\\ufb02llen|ergrllindet|erhalfen|Erhdhe|erhiihter|erhiiren|ERHKLT|erhllt|erh\\\xe9hen|erh\\\xe9ht|erh\\\xe9ilt|erh\\\xe9lt|erh\\\xe9rt|erh\\\xe9rte|eriiffnet|erja|erjetzt|erjung|erkl\\'a\\'ren|erkl\\'air\\'s|erklaren|erklfire|Erklfirung|erklirt|erkllre|erkllrt|erkllrte|erkllrten|Erkllrung|erkl\\\xe9ir|erkl\\\xe9ire|erkl\\\xe9iren|erkl\\\xe9r|erkl\\\xe9r\\'s|erkl\\\xe9rbar|Erkl\\\xe9re|erkl\\\xe9ren|erkl\\\xe9rt|Erkl\\\xe9rung|erk\\\xe9ltest|erlC\\'\\>st|erldse|Erled\\/gen|erlieB|erlnnem|erl\\\xe9scht|erl\\\xe9sen|erl\\\xe9st|Erl\\\xe9sung|ermbglichen|Erm\\\xe9chtige|erm\\\xe9glicht|erm\\\xe9glichte|ernlllchtert|ern\\\xe9hren|Ern\\\xe9hrung|eroffnet|Erpressungsscheilie|err\\\xe9tst|erschieB|erschieBen|erschiefien|erschiefit|erschiefke|erschielie|Erschielit|erschiipft|erschiittert|erschilttert|erschl\\\xe9gt|ERTCHDNT|ERTCNT|ERTGNT|ertiffnen|ertr\\\xe9gst|ertr\\\xe9inken|ert\\\xe9nt|ervvartez|ervvilrgen|ervv\\\xe9hnen|ervv\\\xe9ihnen|ervv\\\xe9ihnt|ervv\\\xe9ihnte|Erv\\\\\\/an|Erv\\\\\\/an\\'s|erw\\'a\\'hnt|Erwar|erwe\\/sen|Erwfirmung|Erwird|Erwtirde|erw\\\xe9gt|Erw\\\xe9gung|Erw\\\xe9hne|erw\\\xe9hnen|erw\\\xe9hnt|erw\\\xe9hnte|Erw\\\xe9hnung|erw\\\xe9ihlt|erw\\\xe9ihnt|erw\\\xe9rmt|erz\\'a\\'hlt|Erzdiiizese|erzfihlen|Erzfihler|erzihlenl|erziihlen|erziihlt|erziirnt|erzilrnt|erzllirnt|erzurnen|erz\\\xe9hl|erz\\\xe9hle|Erz\\\xe9hlen|erz\\\xe9hlerische|erz\\\xe9hlerischen|erz\\\xe9hlerischer|Erz\\\xe9hlkunste|erz\\\xe9hlst|erz\\\xe9hlt|erz\\\xe9hlte|Erz\\\xe9hlung|Erz\\\xe9ihl|Erz\\\xe9ihle|erz\\\xe9ihlen|erz\\\xe9ihlst|erz\\\xe9ihlt|erz\\\xe9ihlte|er\\\xe9ffnen|er\\\xe9ffnet|er\\\xe9ffnete|Er\\\xe9ffnungsaufnahme|Er\\\xe9ffnungssequenz|Er\\\xe9ffnungsszene|Er\\\ufb02lllen|etemity|etvva|euc\\/1|Europ\\\xe9er|europ\\\xe9ische|ex\\'nfac\\'\\/7|Examenspriifungen|Exekutivzust\\\xe9noligkeit|Explosionenl|Extrablattl|F\\/nden|F\\/ugba\\/I|Fahnrich|fahrlissiges|Fairbankverlieh|Fallef|fallengelassen|Fallschirmj\\\xe9gereinheiten|Fam\\/Z\\/e|Fa\\\xdf|FBl|Fe\\/nd|fehlschl\\\xe9gt|Feindberllihrung|Feind\\\xfcbewvachung|feltig|femen|fernh\\\xe9ilt|Festhaltenl|Fettw\\\xe9nste|Feuen\\/vehr|Feuerliischer|Feuervvehrrnann|Feuerwehrl|Feuerwfirmen|Feue\\\ufb02|ff\\'Ul\\'1\\\u20acf\\'\\\u20acl\\'1|Ffiegen|ffihft|ffihren|ffinf|ffir|ffirchte|ffirs|ffittere|FI6he|Fiasenm\\\xe9iher|fibel|fiber|fiberdressierter|fibergezogen|fiberhaupt|fiberholt|fiberlegt|fibernachtet|fiberspannt|fibertreiben|fiberzfichtete|fibrig|Fieferenz|Fieifi|fiffentlichkeit|fiffnen|fiffnest|fifter|Fihigkeit|fihneln|Fihrt|fiihl|fiihle|fiihlen|fiihlst|fiihlt|Fiihlte|Fiihre|Fiihren|Fiihrerin|Fiihrerschein|fiihrfe|fiihrt|fiihrte|Fiihrungsf\\\xe9ihigkeiten|Fiihrungsprogramm|Fiihrungsstil|Fiilcksicht|fiillen|fiinden|fiinf|fiinfhundert|fiinfzehn|fiir|fiirchte|fiirchten|fiirchterlich|fiirchterlichl|fiirchterllches|fiirchtet|fiirchteten|fiirjeden|Fiirmchen|fiirs|Fijgen|fijhl|fijhle|fijhlen|fijhlst|fijhlt|fijhren|Fijhrer|fijhrt|Fijhrungsqualit\\\xe9iten|FiJl3en|Fijlie|fijlr|Fijnf|Fijnfziger|fijr|fijrchte|fijrchten|Fijrjedenl|fijrs|fiJrVorteile|fijttern|fijur|filhl|filhle|filhlen|filhlte|filhre|filhren|Filhrern|Filhrerschein|filhrst|filhrt|filhrte|filhrten|Filhrung|Fillle|Filll\\\xe9en|Filmemachen|Filml|filnf|Filn\\\ufb02|Filr|filr\\'ne|filrchten|filrchterlich|filrs|filter|findem|findenlassen|Fingerabdrijcke|Fingerabdrilcke|Fingerniigeln|Fingern\\\xe9gel|Fingern\\\xe9geln|fingstlich|Fiothaarige|Firmen\\\xe9rzte|Fischk\\\xe9pfe|FIUssigkeitsgleichgewicht|Fiusten|FIynn|fjffnen|fL\\'1\\'r|fL\\'1hle|FL\\'1r|fL\\'ir|fL\\'lr|fL1r|Fl6he|Flclse|fleifkige|fleifkiges|fleil3ig|Fleischb\\\xe9llchen|Fleischkl6l\\'Sen|Flfige|Flfigell|flfistert|Flhigkeiten|Flhnrich|Flhnriche|flieBen|Fliefiband|Fliefiheck|Flieflsb\\\xe9nder|flielit|flielSt|FLif\\$e|fLihlt|fliichtige|Fliigel|flijchtig|Flijgel|Flijgelfedernl|Flilssige|flilstert|fLir|fljhrt|Fljr|flJr\\'n|fllihrst|Fllihrt|fllinf|fllinften|Fllinkchen|Fllir|fllirchte|fllirchten|fllirchterlichen|fllirchtet|Fllirsten|Fllitterungszeitenl|flllgte|flllgten|flllhrten|Flllhrung|Fllligel|flllistern|fllllstert|flllrchte|flllrchten|flllrjede|Flohtransporterl|Floli|Flottenalzt|Flottenstiitzpunkt|Flottenstutzpunkt|Flrma|fltlsterte|Fluchtig|Flughdhe|Flughiihe|Flugh\\\xe9ifen|Flugunf\\\xe9ihig|flugunf\\\xe9ihigen|Flugunf\\\xe9ihigl|Flugzeugl|FLUSSIGER|Flustereffekt|Flustern|FLUSTERT|fl\\\ufb02stern|fl\\\ufb02sterten|Folgendesz|fortgespiilt|fortspiilen|fortw\\\xe9hrend|Fr\\/ed\\/10\\/|Fr5ulein|Fr6hliche|Frachfmodule|Frafi|fragfe|Fral\\'S|fralken|Franzfisisch|Franziisin|franziisische|franziisischen|franziisischer|franziisisches|Franz\\\xe9sisch|franz\\\xe9sische|franz\\\xe9sischen|franz\\\xe9sischer|Franz\\\xe9sisches|FRAULEIN|fre\\/em|freffen|freilieB|freimiitigen|Fressger\\\xe9usche|Frfichtekuchen|frfih|frfiher|Friedh\\\xe9fe|Friichtchen|friih|friihen|friiher|friihere|friihliche|friihlichen|Friihstiick|friilher|friilhesten|Frijchte|frijh|frijher|frijherer|frilh|frilhen|Frilher|frilhere|Frilhst\\\ufb02ck|Fris6r|frL\\'lher|Frljihling|Frllichte|frllih|frlliher|Frllihstiickskiiche|fro\\/1|FROHLICHE|frtih|Frtiher|Frtihliche|Frtihstticksei|Frtlh|FrUh|FRUHE|fruhe|fruhen|Fruher|fruheren|Fruhling|Fruhlingsrolle|FrUhstUck|Fruhstuck|frUhstUcken|fr\\\xe9hliches|fr\\\xe9ihfiches|fr\\\xe9ihlich|Fr\\\xe9iulein|fr\\\xe9nen|Fr\\\xe9sche|Fr\\\xe9ulein|ftihlen|Ftillhorn|Ftir|Ftirs|Ftlhrung|ftlrchte|ftmf|Fu\\/3|FuB|FuBballspieler|FUBen|Fuf\\$|Fufi|Fufiabdrucke|Fufiballtraining|FufL|Fuflsball|Fuflsballszene|fUhl\\'t|fuhle|fuhlst|fUhlt|fUhre|fUhrt|fuhrte|fuhrten|Fuhrung|Fuhrungsf\\\xe9higkeiten|Fuhrungsoffizier|Fuhrungsqualit\\\xe9t|FUI3en|Fuli|Fuliball|Fulisohlen|FUller|fUllten|fumt|Fundbiiro|FUnf|Funftbeste|Funkchen|Funkger\\\xe9it|Funkger\\\xe9ite|Funkger\\\xe9t|funktionstilchtig|FUR|Fur|fUrAusweichmanc\\'\\\xa7ver|furchteinfl6Bend|furchteinfl6Bende|furchten|Furchtest|furchtet|furchteten|fureinander|furjeden|furjemanden|furjudische|furs|FUrWalter|fut|Fu\\\ufb02ballspiel|F\\\xa7hnlein|f\\\xe9\\/\\/t|f\\\xe9hig|F\\\xe9higkeit|F\\\xe9higkeiten|f\\\xe9hnen|F\\\xe9hnens|F\\\xe9hnerei|F\\\xe9hnleinmiitter|F\\\xe9hre|f\\\xe9hrst|f\\\xe9hrt|F\\\xe9ihigkeit|F\\\xe9ihigkeiten|f\\\xe9ihrt|f\\\xe9illst|f\\\xe9illt|F\\\xe9ilschung|F\\\xe9ingt|f\\\xe9ir|F\\\xe9lle|F\\\xe9llen|f\\\xe9lligl|F\\\xe9llt|f\\\xe9llt\\'s|F\\\xe9lschen|F\\\xe9lschung|f\\\xe9nde|F\\\xe9ngst|F\\\xe9ngt|f\\\xe9rben|f\\\xe9rbt|f\\\xe9rdern|f\\\xe9rmlich|F\\\xe9ustlinge|f\\\xfcr\\'ne|f\\\xfcrchlerlichen|f\\\xfcrjede|f\\\xfcrjeden|F\\\ufb02hrungsprogramm|F\\\ufb02hrungsstil|f\\\ufb02llen|f\\\ufb02llt|f\\\ufb02nf|F\\\ufb02r|f\\\ufb02rchte|f\\\ufb02rjeden|g\\/bf|g\\/bsf|G5ste|G6nn|G6t\\'lllche|G6tter|G6ttern|Gamilonl|ganzlich|gardel|Gasbrfiter|gauze|GCJKTEN|ge6lt|gebauf|Gebiez|Gebi\\\xe9ude|gebliebenl|GEBRAUCHTWAGENIPOLIZEIITAXI|Gebr\\\xe9u|gebs|gebuhrend|Geb\\\xe9ick|Geb\\\xe9iude|geb\\\xe9rdet|Geb\\\xe9rmutter|Geb\\\xe9rmutterhals|Geb\\\xe9ude|Geb\\\xe9udedach|Geb\\\xe9uden|Geb\\\xe9udes|gedemiitigt|gedemijtigt|gedemllitigt|gedrtickt|gedr\\\xe9ngt|Ged\\\xe9chtnisverlustes|Ged\\\xe9ichtnis|ged\\\xe9mpft|gef\\'a\\'hrlich|gef\\'a\\'llt|gef5IIt|gefahrdet|gefahrlich|gefallsllichtige|GEFANGNISTECHNOLOGIE|Gefechtsausrustung|Geffihl|geffihrt|geffillt|Gefihrliche|Gefiihl|Gefiihle|Gefiihlen|Gefiihlslebens|gefiihlsmiliigen|gefiihrt|gefiillst|gefiillt|gefiirchtet|Gefijhl|Gefijhle|gefijhlt|gefijllte|Gefilhl|Gefilhle|gefillt|Gefingnis|gefL\\'lllten|Geflilster|gefllihllos|Geflllhlsduselige|GEFLUSTERT|Geftuhle|Gefuhl|Gefuhle|Gefuhlen|gefuhlt|gefuhlvolle|gefurchtet|Gef\\\xe9hrde|gef\\\xe9hrden|gef\\\xe9hrdet|Gef\\\xe9hrdung|gef\\\xe9hrlich|gef\\\xe9hrliche|gef\\\xe9hrlicher|gef\\\xe9hrlicheren|Gef\\\xe9hrliches|Gef\\\xe9hrt|gef\\\xe9ihrden|gef\\\xe9ihrdet|gef\\\xe9ihrlich|Gef\\\xe9ihrte|Gef\\\xe9ihrten|gef\\\xe9illt|Gef\\\xe9illt\\'s|gef\\\xe9llf|gef\\\xe9llfs|gef\\\xe9llig|gef\\\xe9lligst|gef\\\xe9llst|Gef\\\xe9llt|Gef\\\xe9llt\\'s|gef\\\xe9lscht|Gef\\\xe9ngnis|Gef\\\xe9ngnisregeln|Gef\\\xe9ngnisse|Gef\\\xe9ngnissen|Gef\\\xe9ngnisses|Gef\\\xe9ngniswagen|gef\\\ufb02gig|gegenfiber|gegeniiber|gegeniibertritt|gegeniiberzusfehen|gegenijber|gegenlliber|gegenlliberstehen|Gegenstrfimung|Gegenstr\\\xe9mung|Gegensttlck|Gegenst\\\xe9nde|gegenuber|Gegenverschwiirung|gegenw\\\xe9rtigen|gegriindet|gegrijfit|gegrilfit|GegrUl3t|gegrundet|geh6ren|geh6rt|gehdrt|GeheilS|geheilSen|gehejetzt|gehf|gehfiirt|gehfire|gehfiren|gehfirt|gehiipft|Gehiir|gehiire|gehiiren|gehiirst|gehiirt|Gehim|Gehirnsch\\\xe9den|gehlngt|gehore|gehoren|gehort|geht\\'sl|Gehtirt|gehtjetzt|geh\\\xe9irt|Geh\\\xe9iuteten|geh\\\xe9r|geh\\\xe9re|geh\\\xe9ren|geh\\\xe9rst|Geh\\\xe9rt|geh\\\xe9rten|geh\\\xe9rtf|geiiffnet|geilbt|geistesgestort|Gei\\\ufb02blatt|Gei\\\ufb02blattstaude|gekiisst|gekiisstl|gekijndigt|gekijsst|gekilsst|gekimpfl|gekimpft|geklautl|gekliirt|gekllrt|gekl\\\xe9rt|gekriint|gekrijmmt|GEKUHLTER|gekurzt|gek\\\xe9mpft|gelaufenl|gelegf|gelegtwurde|geliist|gelilftet|gelndert|Gelst|Geltungsbedurfnis|GELUBDE|Gel\\\xe9chter|gel\\\xe9hmt|gel\\\xe9ischt|Gel\\\xe9nde|gel\\\xe9nge|gel\\\xe9st|gem|gemafiregelt|Geme|gemfitliches|Gemiise|gemiitlich|Gemijlse|Gemilt|gemiltlicher|GemLise|Gemut|gem\\\xe9fi|Gem\\\xe9fk|gem\\\xe9ht|Gem\\\xe9ili|Gem\\\xe9lde|Gem\\\xe9lden|Genaul|genieBt|genief\\$en|Geniefien|geniefk|genielien|genielken|genie\\\ufb02en|genligen|genlligend|genlligt|genlllgend|genugt|genugte|georfef|gepfluckt|gepriifter|gepruft|Gep\\\xe9ck|gerfit|Geriichte|Geriite|Gerijcht|Gerllicht|gerllistet|gernhaben|gernntgt|ger\\\xe9it|Ger\\\xe9iusch|Ger\\\xe9t|Ger\\\xe9te|Ger\\\xe9tschaften|ger\\\xe9umt|Ger\\\xe9usch|Ger\\\xe9usche|ger\\\xe9uschvoll|geschafff|GESCHAFTSFUHRER|gescha\\\ufb02i|Geschfift|geschfimt|Geschift|Geschifte|Geschiftsleute|Geschiftswelt|geschiidigt|Geschiift|Geschiiftsleben|geschijtzten|Geschiltz|Geschiltze|Geschiltzrohre|Geschiltzturm|geschlijpftl|Geschllitzstellungen|geschnfiffelt|Geschtitz|Geschtltz|Geschutz|Geschutze|Geschwiir|Geschwllir|Geschwur|geschw\\\xe9cht|geschw\\\xe9ingert|Geschw\\\xe9tz|Gesch\\\xe9ft|Gesch\\\xe9fte|Gesch\\\xe9ftige|gesch\\\xe9ftlich|Gesch\\\xe9fts|Gesch\\\xe9ftsleben|Gesch\\\xe9ift|Gesch\\\xe9ifte|gesch\\\xe9iftsm\\\xe9ifiig|gesch\\\xe9itzt|gesch\\\xe9nolet|Gesch\\\ufb02tze|Gesetzeshiiter|Gesichtl|Gesichtsausdrijcke|Gesiiff|gesiindigt|gespiirt|Gesprach|GESPRACH|GESPRACHE|Gespr\\\xe9ch|Gespr\\\xe9che|Gespr\\\xe9iche|Gespr\\\xe9ichsthema|Gespur|gestiirt|gestijrzt|gestijtzte|gestof\\$en|gestolken|Gestriipp|Gestrijpp|GESTURZT|gest\\\xe9irt|Gest\\\xe9ndnis|gest\\\xe9rt|gest\\\ufb02rzt|Gesundheitsbehijrde|Gesundheitsftlrsorge|Ges\\\xe9fitaschel|Ges\\\xe9iffstaschenl|get6tet|Getiise|getiitet|getr\\'a\\'umt|getr\\\xe9umt|get\\\xe9tet|get\\\xe9tetf|get\\\xe9uscht|gev\\\xe9gelt|gew6hnt|GEWACHSHAUS|gewaltt\\\xe9tig|gewarnf|Gewerkschaftsfunktion\\\xe9ren|gewfinscht|Gewiasenskon\\\ufb02ikte|gewiihlt|gewiihnen|gewiihnlich|gewiihnlicher|gewiihnliches|gewiihnt|gewiinscht|gewijhnlichen|gewijnscht|gewissermafien|gewissermallsen|gewlllnscht|Gewohnheitstiter|gewtinscht|gewunscht|gewunschten|Gew\\\xe9chshaus|gew\\\xe9hlt|gew\\\xe9hnen|gew\\\xe9hnlicher|gew\\\xe9hnst|gew\\\xe9hnt|Gew\\\xe9hren|gew\\\xe9hrt|Gew\\\xe9isser|Gew\\\xe9ssern|gezfichtet|gezilndet|gez\\\xe9hlt|gez\\\xe9ihlt|gez\\\xe9ihmt|ge\\\xe9ndert|GF6l\\'1Z6fUf|Gfirtel|Gfirtner|Gfiste|Gfitter|Ghrchen|gibtjede|gibtk|gibts|gieBen|GieBkanne|gief\\$t|giefit|gielit|gignalton|giinstiger|Giire|Giite|giitiger|Giitter|Giittliche|giittlichen|Gijte|Gijtel|Gilrtel|Gilte|Giltiger|Gitarrenkl\\\xe9nge|Gite|GIUck|GIUCKliCl\\'1|GL\\'lte|Glaubwurdigkeit|Glaubwurdigkeitl|glaubw\\\ufb02rdig|glb|glbt|Gle\\/ch|gleichgiiltig|gleichm\\\xe9mig|Glfick|glficklich|Glfickspilz|Gliick|Gliickchen|gliicklich|gliicklicher|Gliicksbringer|Gliickssfr\\\xe9hne|Gliickwunsch|gliilcklich|Glijck|glijcklich|Glilck|glilcklich|Glilckwunsch|Glillck|gllinstig|gllinstigem|gllinstigen|glljcklich|glllicklich|glllickliche|Glllte|Glorifiziertl|glticklich|Gltickszahlen|gltlckliohes|Gluck|glucklich|gluckliche|GLUCKSELIGKEIT|Gluckwunsch|Gluok|gluoklich|Glupsch\\\xe9ugige|glutheilie|gl\\\xe9inzende|gl\\\xe9nzende|gl\\\xe9nzte|Gl\\\xe9ser|gl\\\xe9ubige|Gl\\\xe9ubigen|Gl\\\ufb02ck|Gl\\\ufb02cklich|Gl\\\ufb02ckstag|Gl\\\ufb02ckwilnsche|gnidig|Gnllnden|gn\\\xe9dig|gn\\\xe9dige|gn\\\xe9digen|Gn\\\xe9digste|gn\\\xe9idig|Goff|Golfballweili|gonnst|gottesfllirchtiger|Gottverdammt|Go\\\ufb02|Gr6Be|gr6Ber|gr6Bere|gr6Beren|Gr6Bte|Gr6Bten|gr6Bter|gr6Btes|gr6f\\$te|gr6f\\$ten|gr6f5ten|gr6I3ter|gr6ISten|Gr6l3e|gr6l3ter|Grabst\\\xe9tte|gratulierel|grClf\\$en|grfilieren|Grfiner|griil3e|griiliere|griiliten|griin|Griinde|Griinden|griindlich|Griine|griinen|Griiner|griin\\\xe9iugige|griin\\\xe9iugiges|grii\\\ufb02te|Grijbeln|griJBen|grijn|Grijnde|grijnden|grijndlich|grijnes|Grijnfutter|Grilbelt|grilfken|Grillh\\\xe9hnchen|Grilnde|Grilnden|grilndet|grilndlich|grilndlicherf|grilndlichl|grilne|Grilnschn\\\xe9bel|grim|Grime|grinco|Grllinde|grllinden|grllindlich|grlllnes|Gro\\/3artig|gro\\/3es|gro\\/3zUgig|Gro\\/Bstadt|gro\\/Ken|groB|groBartig|GroBe|GroBes|GroBmutter|GroBteil|groBziJgiger|grof\\$|grof\\$artig|grof\\$artigen|grof\\$e|grof\\$er|grof\\$es|grof3|grof3\\>artige|Grof3e|grof3en|grof3erAlien|grof5es|Grofbvaters|grofi|Grofiangriffs|Grofiartig|grofiartige|grofiartigen|grofiartiger|Grofiartiges|Grofibritannien|Grofidiebstahl|Grofie|grofier|grofies|grofiten|grofk|Grofkartig|grofke|Grofken|Grofker|Grofkvater|grofLe|grofler|groflsartig|groflsartige|Groflse|groflsen|Grofser|grol|grol\\'3\\>en|grol2\\>|grol2\\>en|grol3\\>es|grol3e|grol3er|Grol3raum|groli|Groliartig|groliartige|groliartigen|grolie|grolien|groliherzig|Grolimutter|Grolisegel|Grolkvater|groller|Grollser|grollzugig|grolS|grolSe|GrolSeltern|grolSer|GrolSvater|grolZ\\~|gror\\$er|grorker|grosses|GROSSTE|gro\\\ufb02|gro\\\ufb02e|Gro\\\ufb02stadtkind|Gro\\\ufb02vater|Grtin|Grtmde|GruB|Grubenausg\\\xe9nge|Gruf\\$|grUf\\$en|grufit|Gruli|Grulikarte|Grulikarten|Grun|grundlich|Grundstiick|grunds\\\xe9tzlich|grune|grunen|Gr\\\xe9ben|gr\\\xe9bst|gr\\\xe9fier|gr\\\xe9fkte|gr\\\xe9flserer|Gr\\\xe9ifite|gr\\\xe9illten|gr\\\xe9sslich|Gr\\\xe9uel|gr\\\ufb02ndlich|gr\\\ufb02ne|gull|Gummist\\\xe9psel|Gumml|GUNSTIGSTEN|Gurtell|gutaussehend|gutaussehender|GUte|gutgebaut|gutgehen|Gutmijtigkeit|g\\\xe9be|g\\\xe9ben|g\\\xe9ibe|G\\\xe9ittern|G\\\xe9lisch|G\\\xe9lische|g\\\xe9lisches|G\\\xe9nsehaut|G\\\xe9nsen|G\\\xe9nze|G\\\xe9rfen|G\\\xe9rtnern|G\\\xe9ste|G\\\xe9stezimmer|G\\\xe9tter|G\\\xe9tterspeise|G\\\xe9ttin|G\\\xe9ttliche|g\\\xe9ttlichen|G\\\xe9tze|G\\\u20acfUhl6|G\\\u20acStFUpp|h\\<\\'\\>\\'r\\'t|h\\<\\'5r|h\\'a\\'lt|H\\'a\\'nde|H\\'a\\'nden|H\\'a\\'ttest|H\\/|H\\/er|h\\/nfer|h5tte|H6fe|h6flich|H6fling|H6hen|h6her|h6here|H6HERER|H6hle|H6l1e|H6lle|H6llen|h6lte|H6r|h6re|h6ren|H6rer|H6rner|h6rst|h6rt|h6rte|Ha\\/s|Haarbijrstel|Haarhfirste|Haarl|Haarstr\\\xe9hne|hab\\'jemanden|Hah|halbstlllndiges|halbvervvandelt|halfef|Hallfjchen|hallol|Halsb\\\xe9nder|Halsl|haltenl|Haltjohnny|Hammersch\\\xe9del|Handfl\\\xe9che|Handlungsstr\\\xe9nge|harfe|hartn\\\xe9ickig|Hasenful|Hasenfull|hassq|Hastja|hatjetzt|hatta|Haupfbus|Hauptaktion\\\xe9ire|Hauptaktion\\\xe9irinnen|Hauptkabell|haupts\\\xe9chlich|haupts\\\xe9ichlich|Haupttrib\\\ufb02ne|Hauptverschwiirer|Hauptwasserrohrwar|Hausfirzte|Haush\\\xe9lterin|Hausschlilssel|Haustilr|Hausubervvachung|ha\\\xdft|Hbr|hc\\'5ren|hc\\'\\\xa7r|hdchsfens|Hdchstleistung|hdher|Hdlle|Hdllenfeuer|hdre|hdren|hdrsf|hdrten|He\\/nr\\/ch|hedeutest|hegrfille|heiB|heiBe|heiBen|HeiBer|heiBes|heiBt|heif\\$|heif\\$e|heif\\$es|Heif\\$t|heif3\\>en|heif3t|heif5en|heifie|heifiem|heifien|heifit|heifkt|heifLt|heifZ\\>e|heil\\'\\$|heil\\'\\$en|heil\\'\\$t|heil\\'Se|heil2\\>en|heil2\\>t|heil3en|heil3t|heil5e|heil5t|heili|heilies|heilit|heillst|heilZ\\~|heir\\$|heisst|Helllger|Helzlichen|Hen\\'je|herabstofien|heransttlrmtet|heraush\\\xe9ngendem|herhfiren|herh\\\xe9ren|heriiber|HerrSchmidt|herumf\\\xe9hrt|herumkehren|herumlluft|herumzuwijhlen|Herzrhythmusst\\\xe9rungen|Herzschlielierei|Herzstlllck|Heuta|Hexenhtltte|HeY\\\xb7|Hfibscheste|hfiherer|hfihsch|Hfilfte|Hfille|hfilt|hfiltst|Hfin|hfipft|Hfir|hfiren|hfirst|hfirt|hfitte|hfitten|hie\\/3|hieB|hiefL|hiel3|hiells|hierhergereist|hierherzuriick|hierijber|hierjede|hierjeder|hierl|hierL|hierwar|hierzum|hie\\\ufb02|Hiibsch|Hiibsche|Hiibscher|hiibschl|hiichst|hiichstens|hiichster|hiichstpersiinlich|Hiifen|hiifischen|Hiifling|Hiigel|Hiihe|Hiihepunkt|hiiher|hiihere|Hiihlen|Hiihnchen|Hiihner|Hiihnerkl\\\xe9fkchen|Hiilfte|Hiille|Hiillenstreitmacht|hiillischen|hiipfen|Hiir|hiire|Hiiren|Hiirer|Hiiret|Hiirjetzt|Hiirt|hiirte|hiirtest|Hiissliches|Hiite|Hiiten|hiitet|Hiitte|hiitten|Hiitten|hijbsch|hijbschen|hijbsches|Hijfte|Hijften|Hijgel|Hijgels|Hijpfburgl|hijpfe|hijpfen|hijre|Hijren|Hijrer|hilbsch|hilbsche|hilbschen|hilbscher|Hilfel|HILFSPERSONALI|Hilgel|hillig|Hilt|hil\\\ufb02|Him|Himmell|hineintr\\\xe9umen|hinfijhrt|hingefiihrt|hingehdren|hingehiiren|hinilber|hinreiliend|hinschmeifit|HintenN\\\xe4ldler|Hintergrundl\\\xe9rm|hinterhfiltig|hinterh\\\xe9iltiger|Hinterh\\\xe9iltigl|hinterh\\\xe9ltige|hinterh\\\xe9ltiger|Hinterk\\\xe9pfen|hinterlieBe|hinterl\\\xe9sst|Hintersttlbchen|Hintertur|hinwollen|hinzufuhren|hinzuf\\\ufb02gten|Hirnrnel|hirteste|hisslich|Hi\\\xe9tte|Hler|hler|hllf|hllibsch|Hllindinnen|Hlllpf|hln|Hlnbllck|hltte|Hltten|Hochfrequenzst\\\xe9rungenl|hochl|Hochsicherheitsgef\\\xe9ngnis|Hochstens|Hochzeitskostiime|Hohek|Hohepunkt|hohere|HoHo|Holle|Holzsttlck|hor|Horen|Hosenscheifker|Hosenscheiiker|Hosenschei\\\ufb02er|Hotelg\\\xe9ste|HQHE|htibscher|Htihnchen|Htipfen|Htipfenl|htiren|hubsch|hubsche|hubschen|Hubscher|hubscheres|Hubsches|Huhner|humon\\/oll|Hundchen|Hundebullel|Hunden\\\xe9pfe|Hundescheilie|Hundl|HUNG|hunte|Hurensiihne|Hurensohnl|Huterin|HUtte|Hypoglyk\\\xe9mie|h\\\xe9|H\\\xe9chste|h\\\xe9chsten|H\\\xe9chstens|H\\\xe9chstpers\\\xe9nlich|H\\\xe9fen|h\\\xe9flich|H\\\xe9ftling|H\\\xe9ftlinge|H\\\xe9ftlingsr\\\xe9te|H\\\xe9hef|H\\\xe9hepunkt|h\\\xe9her|h\\\xe9heren|H\\\xe9i|H\\\xe9ifen|H\\\xe9ilften|h\\\xe9iltst|H\\\xe9inde|h\\\xe9ing|h\\\xe9ingen|h\\\xe9ingt|h\\\xe9ir|h\\\xe9irter|h\\\xe9itt|H\\\xe9itte|h\\\xe9itten|h\\\xe9ittest|h\\\xe9iufig|H\\\xe9lfte|H\\\xe9lle|H\\\xe9llen|H\\\xe9llenloch|h\\\xe9llisch|h\\\xe9llische|h\\\xe9lt|H\\\xe9ltst|h\\\xe9lzernes|h\\\xe9misch|H\\\xe9mmer|h\\\xe9mmernde|H\\\xe9moglobin|H\\\xe9morrhoiden|H\\\xe9ndchen|H\\\xe9nde|H\\\xe9ndedruck|H\\\xe9nden|H\\\xe9ndlerin|h\\\xe9ng|h\\\xe9ngen|h\\\xe9ngend|h\\\xe9ngst|h\\\xe9ngt|H\\\xe9r|h\\\xe9re|h\\\xe9ren|H\\\xe9rgesch\\\xe9idigte|h\\\xe9rst|h\\\xe9rt|h\\\xe9rte|h\\\xe9rten|h\\\xe9rter|H\\\xe9rzu|H\\\xe9schen|h\\\xe9sslich|h\\\xe9sslicher|h\\\xe9sslichl|h\\\xe9sslichste|h\\\xe9tt|H\\\xe9tte|h\\\xe9tten|h\\\xe9tten\\'s|h\\\xe9ttest|H\\\xe9ttet|H\\\xe9ufi|h\\\xe9ufig|h\\\xe9ufiger|H\\\xe9ufigkeit|h\\\xe9ufigsten|H\\\xe9user|H\\\xe9usern|h\\\xe9ute|H\\\u20acY|H\\\ufb02geln|i\\'\\\xa7ffne|I\\/egen|I5sst|I5stern|I6sen|Ia\\\xdf|Ia\\\xdft|Icll|identifizieet|IDENTITAT|IE|Iebendigl|Iebenslinglich|Iebtjetzt|Ieck|Iehn|Ieid\\\u201a|Ieinenlose|Ienistische|Ietztendlich|Ifigt|Ihrdllirft|ihrja|ihrjemals|ihrjetzt|ihrjeweiliges|ihrVater|ihrvorstrafenregister|ihrwahres|Ihrwerdet|ihrzwei|iibel|iibemehmen|iiber|iiberall|iiberallhin|iiberdauern|iiberdauerte|iibereinstimmte|iiberfallen|iiberfiel|iibergeben|iiberhaupt|iiberhiirt|iiberholt|iiberholter|iiberkam|iiberlassen|iiberleben|iiberlebt|iiberlegen|iiberlegten|iibernahmen|iibernehme|iibernehmen|iibernimmt|iibernommen|iiberpriife|iiberpriifen|iiberpriift|iiberpriiften|iiberqueren|iiberragen|iiberrascht|iiberraschte|iiberreden|iiberschritten|iibersetzen|iibersetzt|iibersteigt|iibertragen|iibertreffen|iibertreib|iibertreiben|iibertrieben|iiberzeugen|iiberzeugt|iiblich|iibliche|iibrig|IieB|Iiebte|Iief\\'s|Iiehe|Iie\\\ufb02est|iiffentlichen|iiffentliches|iiffnest|iifter|iihnllchkelt|Iisst|ijbel|ijben|ijberall|ijberhaupt|ijberlegene|ijbernehme|ijbernimmst|ijberprijfen|ijberreden|ijbertrage|ijberwunden|ijberzeugen|ijberzogen|Il6her|IleiB|Ill|Illfie|Ilrger|Ilufierste|immerja|immerjung|immerweinen|immerw\\\xe4hrende|immerw\\\xe9hrende|Improvisiation|Impulswellengeschutz|INBRUNSTIGE|instfindig|intramuskul\\\xe9r|INVASIONSFLOTFE|Iosgeliist|Iosgel\\\xe9st|Ioszuliisen|ip|irn|irrefuhren|irrefuhrende|istja|istjedoch|istjemand|istjetzt|istJohnny|istjung|istweg|ITIUSSEFI|ITIUSSGI7|ITTITTRZ|Ivl\\\xe9gliche|I\\\xe9cheln|I\\\xe9cherlich|I\\\xe9cherlichen|I\\\xe9hmt|I\\\xe9iuft|I\\\xe9nger|I\\\xe9sst|I\\\xe9sste|I\\\xe9uft|J0Shua|Jackettkaufen|jahr|jahre|jahren|JAHRIGE|jal|jemandenl|jetztl|jiidisch|Jiingem|jiingerwar|Jiingste|jilnger|Jlllngling|job|Jogglng|john|johnny|journalisten|Jullo|JUNGFRAULICHE|jungfr\\\xe9uliche|jungfr\\\xe9ulichen|jungfr\\\xe9ulicher|Jungfr\\\xe9ulichkeit|Jungsl|Jungste|Jurlgs|Justitzministeriums|J\\\xe9ger|J\\\xe9hrige|j\\\xe9hrigen|j\\\xe9hriger|j\\\xe9hrlich|J\\\xe9iger|j\\\xe9ihrigen|j\\\xe9mmerlich|k\\'a\\'mpfen|K\\/no|K\\/Varte|K\\/Velle|K5NIGIN|K6der|K6ln|K6nig|K6nige|K6nigin|k6nnen|k6nnen\\'s|k6nnest|k6nnt|K6nnte|k6nnte\\'s|k6nnten|k6nntest|K6pfe|K6rper|K6rpers|K6stlich|Kabelm\\\xe9nner|kalf|kaltblijtig|kampfen|Kampfj\\\xe9ger|Kanarienviigeln|kann\\'sja|kannstja|Kan\\\xe9len|Kapitan|Kapitln|Kapitlnen|Kapitlns|Kapit\\\xe9in|Kapit\\\xe9inleutnant|Kapit\\\xe9ins|Kapit\\\xe9n|Kapit\\\xe9nleutnant|Kapit\\\xe9ns|Kapt\\'n|kaputthaust|Kartoffelsch\\\xe9len|Kassettenger\\\xe9it|kbnnen|kbnnten|kdnnen|kdnnfe|kdnnte|ke\\/ne|Kefn|Keh\\/1|Keithl|keln|kelne|Keri|kfime|Kfimmer|kfimmere|kfimmern|kfimmert|kfimpft|kfimpften|Kfinig|Kfinnen|kfinnte|Kfinnten|Kfinntest|Kfiss|Kfisschen|Kfissen|Kfjnnte|Khnlichkeit|KIar|Kifig|Kiiche|Kiichenhelfer|Kiichln|Kiihe|Kiihlbox|kiihler|Kiihlschrank|kiimmem|kiimmer|kiimmere|Kiimmern|kiindigen|Kiinig|Kiinige|Kiinigen|Kiinigin|Kiiniginnen|kiinigliche|kiiniglichen|kiiniglicher|Kiinigreichs|Kiinigs|Kiinigtum|kiinne|kiinnen|kiinnt|Kiinnte|kiinnten|kiinntest|kiinntet|Kiinstler|kiinstlerischen|kiipfen|Kiirper|Kiirperfunktionen|Kiirperhaltung|kiirperliche|Kiirperliches|Kiirpersprache|Kiirperverletzung|kiirzen|kiirzerzutreten|kiirzeste|Kiisschen|Kiissen|Kiisst|Kiiste|kiistlich|Kijche|Kijhlschrank|Kijmmere|kijmmern|kijmmernl|kijmmerst|kijmmerten|kijndigt|kijnnen|kijnnt|kijnnte|kijnnten|Kijnstler|Kijrbis|kijrzlich|kijrzliche|Kijrzungen|kijsst|Kijste|Kilche|Kilchlein|kilhlen|kilhler|Kilhlkreislauf|Kilhlschrank|Kilmmern|Kilmmert|kilndigen|kilnstliche|kilss|kilsse|kilssen|Kinderm\\\xe9dchen|Kinderspiell|Kindsk\\\xe9pfe|kiokflip|KIotz|KL\\'lr|KL\\'lste|Klapsmiihle|Klassem\\\xe9dchen|kle\\/ne|Kleidergr6Be|Kleidergrfilie|Kleinerl|kleinwiichsige|kleinwilchsiges|klijger|klijgsten|klilger|kLinft\\'gen|klirst|kljmmere|Kllirze|kllissen|Klliste|Klllche|klllhnsten|kllllger|Klobtlrsten|klop\\\ufb02l|Klpt\\'n|Klpt\\'nl|Klpt\\'ns|Klse|Klseschnuffelei|Kltigste|Klugschei\\\ufb02er|kl\\\xe9ffen|Kl\\\xe9iren|Kl\\\xe9ranlage|Kl\\\xe9re|kl\\\xe9ren|Kn6pf|Knallttite|Knastwill|Knderung|Knochengrfinde|Knofen|Knuller|Knupf|Knupfe|knupfen|knzjipfe|Kn\\\xe9dell|kn\\\xe9pf|Kn\\\xe9pfe|Kn\\\xe9sten|Kofferraumschliissel|Kohlens\\\xe9ure|Komaf\\\xe9lle|Komaf\\\xe9llen|Kombiise|Kombuse|Komiidie|kommerz\\/ellen|kommjetzt|Kompatibilitfits|Kompatibilit\\\xe9its|Kompatiblit5ts|Kom\\\xe9die|KONIGIN|konne|konnen|konnt|konsen\\/ativ|Kopfabreifimann|Kopfgeldj\\\xe9ger|Kopfgeldj\\\xe9gern|Kopfm\\\xe9fiig|Kopfnijsse|kostengtlnstige|Kostiim|Kostiimdesigner|Kostiimdesignerin|Kostiimdrama|Kostiime|Kostiims|Kostume|Kost\\\ufb02m|kr\\/egen|kr6ne|kr6nen|Kr6ten|Krafte|Kraftwfirfel|Kranf\\\ufb02hrer|Kreativit\\\xe9t|Kreuzverhor|krfiftiger|Krfiutertee|Kriegserkl\\\xe9rungen|Kriegsfuhrung|Kriegsschauplatze|Kriifte|Kriinung|Kriinungsfeier|Krijppel|Krijte|Kronjuwell|KROTE|Krsche|Kr\\\xe9fte|Kr\\\xe9ften|Kr\\\xe9ftigsten|Kr\\\xe9he|kr\\\xe9ht|kr\\\xe9ichzt|Kr\\\xe9ifte|Kr\\\xe9iutertee|Kr\\\xe9mpfe|kr\\\xe9nte|Kr\\\xe9te|Kr\\\xe9tes|Kr\\\xe9utern|Kr\\\xe9utersenf|Ktiche|Ktinige|ktinntest|Ktisschen|ktlmmere|ktznnen|Kuche|KUCHE|Kuckucksger\\\xe9usch|KUl\\'ZSCl\\'1lUSS9|kulz|kummer|Kummere|kummern|kummert|Kumpell|Kunststficke|Kunststticke|Kuriosit\\\xe9ten|kurzeste|kurzte|Kurzwellenfunkger\\\xe9te|Kurzzeitgediichtnis|Kurzzeitged\\\xe9chtnis|KUS1I\\\u20ac|Kuschelhengstl|KUSSE|KUSSGH|kusste|KUSTE|Kuste|K\\\xe9fer|K\\\xe9fig|k\\\xe9ime|k\\\xe9impfen|k\\\xe9impfend|k\\\xe9impft|k\\\xe9impfte|k\\\xe9impften|k\\\xe9impftest|k\\\xe9impfwie|K\\\xe9inguru|k\\\xe9innen|k\\\xe9innte|K\\\xe9irper|K\\\xe9ise|K\\\xe9isebrunnen|K\\\xe9lte|k\\\xe9lter|k\\\xe9lteste|k\\\xe9me|k\\\xe9men|k\\\xe9mpfe|K\\\xe9mpfen|K\\\xe9mpfer|k\\\xe9mpferische|k\\\xe9mpfst|k\\\xe9mpft|k\\\xe9mpfte|k\\\xe9mpften|k\\\xe9mt|K\\\xe9nig|K\\\xe9nige|K\\\xe9nigin|K\\\xe9niginl|K\\\xe9niginnen|k\\\xe9niglich|k\\\xe9nigliche|k\\\xe9niglichen|k\\\xe9nigliches|K\\\xe9nigreich|K\\\xe9nigreichs|K\\\xe9nigs|K\\\xe9nigsfamilie|k\\\xe9nne|k\\\xe9nnen|k\\\xe9nnt|k\\\xe9nnte|K\\\xe9nnten|K\\\xe9nntest|K\\\xe9nntet|K\\\xe9pfchen|K\\\xe9pfe|K\\\xe9pfen|k\\\xe9pft|K\\\xe9pt\\'n|K\\\xe9rbchen|K\\\xe9rbchengr\\\xe9fie|K\\\xe9rben|K\\\xe9rper|K\\\xe9rperfunktionen|k\\\xe9rperlich|k\\\xe9rperliche|K\\\xe9rperproportionen|K\\\xe9rpersprache|K\\\xe9rpertyp|K\\\xe9rperverletzung|K\\\xe9rper\\\xe9ffnungen|K\\\xe9se|K\\\xe9sebrett|K\\\xe9secracker|k\\\xe9stlich|K\\\xe9ter|K\\\xe9tern|K\\\ufb02mmere|k\\\ufb02mmern|L\\'a\\'cherlich|L\\'a\\'ndern|l\\'a\\'sst|l\\'a\\'uft|l\\/chtes|l\\/Vings|L5cheln|L6ffel|L6schen|L6se|l6sen|L6wen|L6win|LADIESMANZ17|Landh\\\xe9user|Landstra\\\ufb02e|Lands\\\xe9iugetier|langl|langweiligl|Lasergestutzte|Laserzielger\\\xe9t|Lattenzaunwei\\\ufb02|Laudal|laufl|Lau\\\ufb02|La\\\xdf|lch|ldee|ldeen|ldelia|ldentifikation|ldentifikationsnummer|ldentifikationssignal|ldentifizierung|ldentit\\'a\\'tsscheibe|ldioten|ldloten|Le\\/d|Lebenl|lebensf\\\xe9hig|lebensl\\\xe9nglich|lebensmijlde|Lebersch\\\xe9den|leergegessen|legend\\\xe9re|legend\\\xe9ren|Legion\\\xe9r|Legion\\\xe9re|Lehe|Leichensch\\\xe9ndung|leichtjemanden|leidl|Leistuljg|Lelbwfichter|Leld|lemen|Lenks\\\xe9ule|lfidt|lfigt|lfinger|lfiuft|Lfiuterung|lgitt|lgnorier|lhm|lhn|lhnen|lhnenl|lhr|lhre|lhrem|lhren|lhrer|lhrerverffigung|lhres|lhrfehlt|lhrjemalsjemanden|lhrVerteidiger|Libel|Libelwollen|Liben|Liber|Liberall|Liberdenken|Liberdrllissig|Liberfallen|Libergebrannt|Liberhaupt|Liberlasst|Liberleben|Liberlegen|Liberlegt|Libernimmt|Liberpriift|Liberreden|Libersteht|Liberstllirzen|Liberwachen|Liberwacht|Liberwinden|Liberw\\\xe9ltigen|Liberw\\\xe9ltigt|Liberzeugt|Lible|Liblich|Libliche|Librig|lie\\/3|lie\\/Se|lieB|lieBe|liebenswilrdig|liebenswurdiger|Liebesgestiindnis|Lieblingsbesch\\\xe9ftigung|Lieblingsrockerl|Lieblingss\\\xe9tze|lief2\\>en|Liefergebiihren|lieflsen|liegenlassen|Liehe|lieli|lielien|Liellen|liells|lien|Liicher|Liige|Liigner|liinger|liischen|liischt|Liisst|liist|Liisung|Liisungen|Liiwen|Lii\\\ufb02ung|lijgen|Lijgner|Lilgner|lilgst|lilgt|Lilterer|LIMOUSINENSERVICE10I06|linger|lke\\'s|lkone|lL\\'lgt|Llberstehen|Llebe|llebt|lllfie|lllfillensstark|lllfillie\\'s|lllfir|Lllignerl|llligtl|lllusionen|llngst|llztlicher|lm|lmbiss|lmmer|lmmigranten|lmpuls|lmpulsantrieb|lndianer|lndianerin|lndianerm\\\xe9dchen|lndianertanz|lndikation|lndividualit\\\xe9t|lndividuen|lndividuum|lnduktion|lneffizienz|lnformationen|lnfos|lngenieur|lngenieure|lnhalt|lnhalte|lnnenraum|lnnenr\\\xe9ume|lnsekt|lnsekten|lnsel|lnserat|lnspektion|lnstinkt|lnstinkte|lnstitut|lnstrumente|lnstrumentenwagen|lnsubordination|lntellektuellste|lntelligenz|lntensivstation|lnteraktion|lnteresse|lnteressen|lnternat|lntrigantin|lntrigantl|lntrigen|lnverness|lnvestition|lnvestoren|lnzucht|lo|Lordk\\\xe9mmerer|losf|losl|losw\\\ufb02rde|Lou\\/e|Loyalit\\\xe9t|lrak|lraner|lren|Lrgendetvvas|lrland|lronhide|lronie|lrre|lrren|lrrenanstalt|lrrenhaus|lrrer|lrrgarten|lrrlicht|lrrlichter|lrrsinn|lrrsinns|lrrtum|lscandar|lscandars|lsolierband|lss|lstja|ltaker|ltakerflossen|ltalo|Ltiffel|ltlgen|Lufijagen|Luftballonsl|Luftjagen|Luftunterst\\\ufb02tzung|LUgen|lvl\\\xe9idchen|lwan|l\\\xa7uft\\'s|L\\\xe9chelmfinderl|l\\\xe9cheln|l\\\xe9chelt|L\\\xe9cher|L\\\xe9cherlich|l\\\xe9cherliches|L\\\xe9chle|l\\\xe9dt|L\\\xe9ffel|l\\\xe9ge|L\\\xe9icheln|L\\\xe9icherlich|l\\\xe9ichle|L\\\xe9indchen|l\\\xe9ingst|l\\\xe9isen|l\\\xe9issig|l\\\xe9isst|L\\\xe9iuft|L\\\xe9jsung|L\\\xe9mmchen|L\\\xe9mmer|L\\\xe9nder|L\\\xe9ndern|L\\\xe9nge|L\\\xe9ngen|l\\\xe9nger|l\\\xe9ngst|l\\\xe9ngste|L\\\xe9rm|L\\\xe9rmbeschwerden|l\\\xe9schen|L\\\xe9se|L\\\xe9segeld|l\\\xe9sst|l\\\xe9st|l\\\xe9ste|l\\\xe9sten|l\\\xe9stig|L\\\xe9sung|l\\\xe9ufig|l\\\xe9ufst|L\\\xe9uft|l\\\xe9uten|l\\\xe9utet|L\\\xe9we|L\\\ufb02gner|M\\'a\\'dchen|m\\/ese|M\\/ffsommernachfsfraum|M\\/r|M0I8KUI|m6belt|m6chte|m6chtest|m6gen|m6glich|m6glichen|m6glicher|m6gt|M6rder|MaB|MaBgabe|mac\\/1e|mac\\/7|machs|Machtiibernahme|madenschw\\\xe9inziger|Mafinahme|Magengeschwiire|Magengeschwilr|Magengeschwtir|Magnolienbliiten|Majesfait|Majest\\\xe9it|Majest\\\xe9t|Majest\\\xe9ten|Mal2\\>en|Mal3en|malf|Malinahme|mall|Mallregelten|Mandverstation|Manfiver|Maniiver|Manikfire|Mannscha\\\ufb02|Mansclle\\\ufb02\\'enkm\\'5pfe|Man\\\xe9iver|Man\\\xe9ver|man\\\xe9vrieren|man\\\xe9vrierf\\\xe9hig|Man\\\xe9vriermodus|Margoliserklfirung|Margoliserkl\\\xe9rung|marsch\\\xe9hnliche|Massagestllihlen|Massenzerst\\\xe9rung|Massenzerst\\\xe9rungswaffen|Mater\\/al|Maxiriicke|Mayonaise|mbglichst|Mdge|mdglichen\\/veise|mdglicherweise|Mdglichkeit|me\\/n|mehrZeit|mein\\'ja|meinerjetzigen|Meinungs\\\xe9ufierung|Meisterbr\\\xe9u|Meisterstijck|meistgehasste|meln|melne|Mend|Menschenh\\\xe9indler|Menstruationsst\\\xe9rungen|Merkwiirdig|Merkwiirdige|merkwiirdiger|merkwilrdig|merkwlllrdige|merkwurdig|merkwurolig|merkw\\\ufb02rdig|Messger\\\xe9t|mfichte|Mfichten|Mfidchen|Mfidchenl|Mfidels|mfigen|Mfigliche|mfiglichen|mfiglicherweise|Mfill|Mfillhalde|Mfinchen|Mfinder|Mfinnern|Mfissen|mfisst|mfisste|Mfjrder|Midchen|Migrane|Migr\\\xe9ne|Migr\\\ufb02ne|miichte|Miichtegern|Miichten|miichtest|miide|Miidels|miides|miige|miigen|miiglich|miigliche|miiglichen|miigliches|Miiglichkeit|Miiglichkeiten|miigt|Miill|Miillhalde|Miilltonnen|miilssen|miirderisch|miisse|Miissen|miisst|miisste|Miiuse|mijchte|Mijcken|Mijhe|Mijnzen|mijssen|mijsst|mijsste|mijsstest|Milchstrafie|Milhe|Milhle|MILITAR|Militiirprogramme|Militir|militlrische|Milit\\\xe9irkodex|Milit\\\xe9r|Milit\\\xe9rakademie|Milit\\\xe9rdienst|milit\\\xe9rischen|Milit\\\xe9rkodex|Milit\\\xe9rluftraum|Milit\\\xe9rnetzwerk|Milit\\\xe9rs|Milit\\\xe9rsystem|Millbilligung|Millefs|Millgeburt|Milliard\\\xe9iren|Million\\\xe9rssohn|Milli\\\xe9quivalent|Millltonne|millverstanden|milssen|milsst|milsste|milssten|Miltter|Minenraumen|Miniriicke|mirglauben|mirja|mirje|mirjeglichen|mirjemals|mirjemand|mirjetzt|mirso|mirvon|mirzu|Miserabell|missf\\\xe9llt|Missverstfindnisl|Missverstiindnis|Missverst\\\xe9ndnis|Missverst\\\xe9ndnissen|Mistkerlel|Mistkiiter|Miststiick|Mistst\\\ufb02cke|Mitbijrger|Mitbilrger|mitfiihlend|mitfiihlender|mitfuhlend|Mitgefiihl|Mitgefuhl|mitgehiirt|mitgez\\\xe9hlt|mitjedem|mitjemandem|mittlen\\/veile|ML\\'1nze|mlch|Mldchen|mLissen|Mljnder|Mllillschlucker|Mllindel|Mllindung|mllissen|mllisst|Mlllhe|Mllllon|Mllllonen|mlllsst|Mllltterjedoch|Mlnnern|mlr|mlrl|mlt|moglich|Moglichkeit|Moglichkeiten|Molekijle|MolekL\\'lle|Mondeinhiirner|Mondeinhiirnerl|Mondeinh\\\xe9irner|Mondk\\\xe9ilber|Monl|MONTONEI|Mordsiiberraschung|Mordverd\\\xe9chtiger|Morsealphabetl|Motorger\\\xe9usch|Motorger\\\xe9usche|Mousset\\\ufb02e\\'s|Mowen|Mtihe|Mtillschlucker|mtissen|mtissenl|Mtitzel|mtlde|mtlsste|muBt|Mucken|mucksm\\\xe9uschenstill|mude|Muhe|MUII|mull|MULL|mullte|Mundl|Mundung|Munzfernsprecher|Muskatnijsse|Muskelkumpelsl|muskul\\\xe9ren|mussen|MUSSEN|mUssen\\'s|muss\\_\\'\\\xa7e|Musterschuler|Mutterja|mutterlich|Mutze|mu\\\xdf|mu\\\xdft|mu\\\xdfte|mx\\'t|Mzlinnern|M\\\xe9bel|m\\\xe9cht|M\\\xe9chte|m\\\xe9chte|M\\\xe9chtegern|m\\\xe9chten|m\\\xe9chtest|m\\\xe9chtet|m\\\xe9chtig|m\\\xe9chtige|m\\\xe9chtigen|m\\\xe9chtiger|m\\\xe9chtiges|m\\\xe9chtigste|m\\\xe9chtigsten|M\\\xe9dchen|M\\\xe9dchenh\\\xe9nden|M\\\xe9dchens|M\\\xe9del|M\\\xe9dels|M\\\xe9delsl|M\\\xe9fiigung|m\\\xe9ge|M\\\xe9gen|M\\\xe9glich|m\\\xe9gliche|M\\\xe9glichen|M\\\xe9gliches|M\\\xe9glichkeit|M\\\xe9glichkeiten|m\\\xe9glichst|m\\\xe9gt|m\\\xe9ichtig|m\\\xe9ichtige|m\\\xe9ichtigen|m\\\xe9ichtiger|M\\\xe9idchen|M\\\xe9idel|M\\\xe9inner|M\\\xe9innl|m\\\xe9innlicher|M\\\xe9irder|M\\\xe9irz|M\\\xe9nnchen|M\\\xe9nnchens|M\\\xe9nner|M\\\xe9nnerfreundschaft|M\\\xe9nnern|M\\\xe9nnersache|m\\\xe9nnlich|m\\\xe9nnliche|M\\\xe9ntel|M\\\xe9olel|M\\\xe9olels|M\\\xe9rchen|M\\\xe9rchenl|M\\\xe9rchenprinzen|M\\\xe9rder|M\\\xe9rtyrer|M\\\xe9rz|M\\\xe9tresse|M\\\xe9uschen|M\\\xe9use|M\\\xe9usehtipfer|M\\\xe9usen|M\\\xe9userennen|m\\\xfc\\\xdft|m\\\ufb02de|m\\\ufb02ssen|n\\'a\\'chste|n\\'a\\'hert|n\\/chfs|n\\/chi|N\\/ck|n\\/e|N6|n6tig|nac\\/1|Nachf|nachllssig|nachl\\\xe9ssig|nachl\\\xe9sst|nachprufen|Nachschlussel|Nachste|NAHERT|NAHERTE|Nat\\/on|natfirlich|Natiilrlich|Natiirlich|Natiirllch|natijrlich|natijrlichen|natilrlich|natilrliche|natL\\'lrlich|Natllirlich|Nattirlich|Nattlrlich|Nattlrliohl|Naturlich|naturlich|naturlichen|naturlichsten|Navajoweifi|ndtige|ne\\/n|Nebengeb\\\xe9ude|Nebengesch\\\xe9ift|neffes|Nehmf|neinl|Neln|nerv6s|Nervens\\\xe9ge|Nervens\\\xe9ige|nerviis|Nerv\\\xe9s|ner\\\\\\/t|Neuankiimmlinge|neuromuskul\\\xe9ren|Neuzug\\\xe9inge|Nfichster|NIANN|nichsten|nichtim|nichtjemand|Nichtjetzt|Nichtsl|nichtzurilckgelassen|nic\\_l\\_1t|niederk\\\xe9mpfen|niederliells|niedlichl|niher|niichsten|niichstes|niirgeln|niitig|niitige|Nijssen|Nijsternl|nijtzlich|nilchtern|niltzen|Nlagnaten|Nlannern|nlchste|nlchsthoheren|nlcht|nle|Nlemalsl|Nlhe|nlir|nllitzen|Nl\\\xe9inner|noc\\/1|Not\\/\\'all|Notfalll|notig|notigen|Notliige|Notziindung|NUFI|Nunja|Nurdich|nureins|nurflustern|Nurjetzt|nurl|nurwunscht|Nurzu|nus|NUSSS|nutzlich|Nx\\'emand|N\\\xe9chste|n\\\xe9chsten|N\\\xe9chster|n\\\xe9chstes|N\\\xe9chte|N\\\xe9chten|n\\\xe9chtlichen|N\\\xe9gel|N\\\xe9h|N\\\xe9he|n\\\xe9henf|n\\\xe9her|n\\\xe9here|N\\\xe9hern|n\\\xe9hernde|n\\\xe9hert|n\\\xe9herte|n\\\xe9hren|n\\\xe9ht|N\\\xe9hten|N\\\xe9ichste|n\\\xe9ichsten|N\\\xe9ichstes|N\\\xe9ihe|n\\\xe9iher|n\\\xe9ihern|n\\\xe9ihert|N\\\xe9ihten|n\\\xe9imlich|n\\\xe9mlich|N\\\xe9pfe|n\\\xe9rdlich|n\\\xe9rgelnde|N\\\xe9rrin|N\\\xe9schen|n\\\xe9tig|n\\\xe9tige|n\\\xe9tiges|O8|obdachlosl|Obefil\\\xe9iche|OBERFLACHENSCHWERKRAFT|Oberfl\\\xe9che|Oberfl\\\xe9chen|oberfl\\\xe9chlich|oberfl\\\xe9chliche|Oberm\\\xe9inner|Ober\\\ufb02fiche|of\\/\\'en|Offenslchtllch|Offentliches|Offentlichkeit|Offne|Offnen|Offnet|ofi|Ofiiziere|Ofiiziers|Oftweg|Of\\\ufb02cer|Ohnejede|ohnm\\\xe9chtig|ohnm\\\xe9ichtig|OI|olas|oles|Oltanks|OO|Orgelt\\\xe9ne|ORTI|Ortl|Ostfltlgel|Paliontologie|pallt|Pal\\\xe9sten|Panfike\\/chen|Papierbl\\\xe9tter|Papiertiite|Papiertilcher|Parfyknaller|Partyhiite|Partyhijte|Passendervveise|Paulgenauso|pa\\\xdf|pa\\\xdft|peinliohl|persdnlich|persfinlich|persiinlich|persiinliche|persiinlicher|Persiinllchkeltsspaltun|persijnliche|personlich|Personlichkeit|pers\\\xe9nlich|pers\\\xe9nliche|pers\\\xe9nlicher|Pers\\\xe9nliches|Pers\\\xe9nlichkeit|pe\\\ufb02g|Pfadfindervvappen|Pfad\\\ufb02ndeml|Pffitzen|Pfiitchen|Pfippchen|pflL\\'lgen|Pfllitze|pflugte|Pfundbijro|ph\\\xe9nomenal|PIatz|Piimpel|Piinlttchenltrawatte|Pijppchen|Pijppchenl|Planetenf|planm\\\xe9fiigen|Plastikfr\\\xe9iuleinl|plattmachen|Plfitzchen|plfitzlich|pliitzlich|pliitzllch|Pllllnderer|plotzlich|pl\\\xe9dieren|Pl\\\xe9ine|Pl\\\xe9inen|Pl\\\xe9itzchen|Pl\\\xe9itze|Pl\\\xe9ne|Pl\\\xe9tzchen|Pl\\\xe9tze|Pl\\\xe9tzel|pl\\\xe9tzlich|pl\\\xe9tzliche|Pofkawoche|Polizistl|pompiise|popul\\\xe9r|potth\\\xe9sslich|prasentleren|prfignant|Prfisentation|Prfisi|priide|Priife|priifen|prijfen|Priorit2a\\'t|PRIORITKT|PRIORITKTSZUGANG|Priorit\\\xe9itszugang|Priorit\\\xe9t|Prisident|Privatgem\\\xe9chern|Privatsph\\\xe9re|Probfeme|Profitinzerinnen|Protege|prude|Pruf|prufen|Prugelei|prugeln|pr\\\xe9chtig|Pr\\\xe9fekt|pr\\\xe9historischer|pr\\\xe9ichtiger|pr\\\xe9ichtiges|Pr\\\xe9imie|pr\\\xe9ipotente|pr\\\xe9isentiert|Pr\\\xe9isidenten|Pr\\\xe9itorianer|Pr\\\xe9mie|Pr\\\xe9operative|pr\\\xe9sentiere|pr\\\xe9sentieren|Pr\\\xe9sentiert|Pr\\\xe9senz|Pr\\\xe9sident|Pr\\\xe9sidenten|Pr\\\xe9sidentin|Pr\\\xe9sidentschaft|Pr\\\xe9torianer|pr\\\xe9zise|pr\\\xe9ziser|Pr\\\ufb02fungen|Pubert\\\xe9it|Publlkuml|PUPPCHEN|PUpst|Purzelb\\\xe9ume|P\\\xe9ckchen|p\\\xe9idagogisch|P\\\xe9irchen|P\\\xe9rchen|p\\\ufb02egen|P\\\ufb02icht|p\\\ufb02ichtbewullt|Qas|Qualit\\\xe9tskontrolle|Quten|qu\\\xe9ilen|qu\\\xe9ilt|Qu\\\xe9l|Qu\\\xe9lt|R\\'a\\'che|R\\/ck|R\\/nge|R6mer|rachsiichtiger|ranghfiheren|rangh\\\xe9heren|ranzukommen|Rasenm\\\xe9herunfall|Rasterllibertragung|Rasterubertragung|Ratschl\\\xe9ige|Rattenf\\\xe9nger|Rauc\\/7|Rauc\\/vender|rauhen|RAUMFAHRE|Raumf\\\xe9hre|Raumsschiff|rausf\\\xe9hrt|rausgeprtigeltl|rausliefien|rauszuschmeifien|rau\\\ufb02|Re\\/se|Realit\\\xe9it|Realit\\\xe9t|Rechtgl\\\xe9ubige|rechtm\\\xe9fkigen|RECHTSANWALTE|rechtsl|Reffer|regelm\\\xe9fiige|Regenh\\\xe9igen|Regenm\\\xe9ntel|Regierungsgehirnw\\\xe9ischesignal|regul\\\xe9re|reiB|reiBt|Reichtfimer|Reichtllimern|reif\\$|reif\\$en|Reifiverschluss|Reil3t|reil5|Reili|reilien|Reilin\\\xe9gel|Reillt|reilZ\\>|reingeh\\\xe9ngt|Reingelegtl|reinhupft|reinl|reinstilrmen|reiohen|REISSVERSCHLUSSGERAUSCH|rei\\\ufb02|rei\\\ufb02en|relch|religi6s|religiiiser|religi\\\xe9s|Rels|Rentenbezuge|Repr\\\xe9sentantin|Rettungsflofi|Rev\\/er|rfiber|rfiberwachsen|Rfickseite|rfihrselige|rfilpse|Rfissel|RGMISCHE|Richer|Riesenhfipfer|Riesenspafi|Riesentijr|riiber|Riicheln|riichelt|Riick|Riickblickend|Riicken|Riickenlage|Riickenwind|riicksichtslos|Riicksichtslosigkeit|Riicksitz|Riickw\\\xe9irts|Riickzug|Riick\\\ufb02ug|riihrt|Riilpsen|riilpst|Riimischen|Riistung|Riiumlichkeiten|Rijbe|rijber|rijckgfingig|rijckw\\\xe9irts|Rijsseltierl|Rilbe|rilber|rilberkommen|Rilckkehr|rilcksichtsloses|rilckw\\\xe9rts|Rillpsen|Riol|Rivalit\\\xe9t|rL\\'lber|RL\\'lhr|rllicken|rllickt|Rlllckgrat|Rlnge|Rlumgerate|ROMISCHE|ROMISCHEN|rosa\\\xe9ugiges|rotiugiger|Rotk\\\xe9ppchen|Rott\\\xe9nen|Routinetlberprijfung|Rticken|rticksichtslos|rtlber|Rtlckseite|ruber|Ruberrutschen|Ruckblende|Ruckblick|Rucken|Ruckenlage|Ruckenwind|Ruckfall|Ruckfrage|Ruckgriff|Ruckkehr|Rucksitz|Ruckzugl|ruhlg|ruhrenl|Ruhrt|Rul3|Rumgebrfillel|rumhingen|rumh\\\xe9ngen|rumh\\\xe9ngst|ruml\\\xe9uft|rumwuhlen|rumzuf\\\ufb02hren|rum\\\xe9rgern|runterffihrt|runtergespillt|runtergesp\\\ufb02lt|Runterl|runterspillen|runterspllllen|runtersp\\\xfclt|runtervverfen|Rupem|Rustung|r\\\xe9che|r\\\xe9chen|R\\\xe9cher|r\\\xe9cht|R\\\xe9der|R\\\xe9dern|R\\\xe9hre|R\\\xe9idern|R\\\xe9itsel|r\\\xe9itseln|r\\\xe9itst|R\\\xe9iume|R\\\xe9mern|r\\\xe9mische|r\\\xe9mischen|r\\\xe9mischer|R\\\xe9nder|R\\\xe9nke|R\\\xe9nken|R\\\xe9ntgenaufnahme|R\\\xe9ntgenbild|R\\\xe9son|r\\\xe9t|R\\\xe9tsel|r\\\xe9tselhaft|R\\\xe9tselhaftes|R\\\xe9ume|R\\\xe9umen|R\\\xe9umlichkeiten|R\\\xe9umt|r\\\xe9uspert|R\\\ufb02be|r\\\ufb02bergeguckt|R\\\ufb02ckkehr|S\\/e|s\\/nd|S5tze|S6hne|saB|Sachverstlndiger|sagf|sagfen|Sammlerstiicken|Sands\\\xe9cke|Sanftmiltigen|Sanierungsbeh\\\xe9rde|Sanit\\\xe9ter|Sargn\\\xe9gel|sari|Satellitenschijssel|Satellitenschusseln|Satellitenuberwachung|Saugf\\\ufb02flsen|sc\\/10\\/1|sc\\/16\\/1|sch\\/cken|Sch\\/ffe|sch6n|Schadeniiberpriifung|Schadenuberprtlfung|Scharfschijtze|schbn|schc\\'\\\xa7n|Schdn|schdnen|Schecksl|ScheiB|ScheiBe|scheiBegal|Scheif\\$e|scheiffsel|Scheifi|Scheifiding|scheifie|Scheifiel|Scheifier|Scheifihelm|Scheifiloch|Scheifipascha|Scheifisofa|Scheifiweiber|Scheifle|Scheiiislangweilig|Scheil\\'\\$e|Scheil3\\>er|Scheil3e|Scheili|Scheilie|scheilien|Scheille|Scheillel|ScheilSe|ScheilZ\\>|Scheir\\$oling|scheissegal|Scheisskarre|Schei\\\ufb02e|scheme|scheuf\\$lich|Scheulilich|schfichtern|schfimen|schfin|Schfine|schfinen|Schfines|schfirfer|Schfissel|Schfitzchen|schfjnes|Schideln|schief\\$en|Schief3\\>en|Schiefien|schiefit|schiefZ\\>t|schiel\\'5|Schiel3t|schiellen|Schielmbung|schie\\\ufb02en|schie\\\ufb02t|Schiffs\\\xe9rzte|Schiffzerstfiren|Schifies|Schiidel|schiilzen|schiin|schiine|Schiinen|Schiiner|schiines|Schiinheit|Schiipfer|Schiipfung|Schiisse|Schiitt|Schiittelfrost|schiitten|schiittet|schiitze|schiitzen|schiitzt|schijn|Schijnes|schijng|Schijssel|schijttelt|Schijtze|schijtzen|Schildkr\\\xe9te|Schilrze|Schilsse|schiltten|schiltzen|schimte|Schizophrenia|Schi\\\xe9tze|Schlachtgetllimmels|Schlachtschifl|schlafenl|Schlafk\\\xe9fern|Schlafmiitzenl|Schlafm\\\ufb02tzel|Schlangeng\\\xe9ttin|Schlappschw\\\xe9nze|Schlaumeierl|schlechf|Schlelistiinde|Schlellen|Schle\\\ufb02t|Schlfilsselparty|Schlfisse|SchlieBe|schlieBen|schlieBIich|schlieBlich|SchlieBt|schlief\\$en|Schlief\\$lich|schlief2\\>lich|schlief3t|Schliefie|schliefien|Schliefilich|schlieflslich|schliel3en|schliel3lich|Schliel5t|schlielie|schlielien|schlielilich|schliellsen|SchlielSt|Schliissel|Schliissell|Schliisselmoment|Schliisseln|Schlijsse|Schlijssel|Schlijsselloch|Schlilssel|Schlilssell|Schlilsselparty|schlimmsterAlbtraum|Schlle\\\ufb02en|Schllisse|schllitze|schllitzen|Schlllissell|Schlull|Schlupfern|Schlusselmoment|Schlusselszenen|Schlusselw\\\xe9rter|Schlussl|Schlu\\\xdf|Schl\\\xe9chter|schl\\\xe9fst|Schl\\\xe9ft|Schl\\\xe9ge|Schl\\\xe9ger|Schl\\\xe9gerei|schl\\\xe9gt|schl\\\xe9ift|schl\\\xe9igst|Schl\\\ufb02ssel|Schmatzger\\\xe9usche|SchmeiBt|Schmeif\\$|Schmeif\\$t|Schmeifien|schmeifit|Schmeilit|Schmei\\\ufb02|Schmier\\\xe9l|schmiicken|schmilztl|schmi\\\ufb02|Schmuckk\\\xe9stchen|Schmuckstiick|Schnappschijsse|Schnauzel|Schneegest\\\xe9ber|Schneidez\\\xe9hnen|Schneidez\\\xe9ihne|schnellf|Schnfiffeln|schnfiffelnl|schnfiffelst|Schnfirsenkel|schniiffele|schnijffelt|Schnilffeln|schnilrt|Schnitzereigesch\\\xe9ft|Schniuzer|Schnuoki|Schn\\\xe9ppchen|SchoB|Schofk|ScholShund|Schones|schonl|schopferische|scho\\\xdf|Schrankw\\\xe9nde|Schraubenschlijssel|schrecklichl|Schriftist|Schriftstijcks|schr\\\xe9ge|Schr\\\xe9ges|Schr\\\xe9nke|Schr\\\xe9nken|schtin|schtine|Schtisse|schuchtern|Schuchterne|Schuhl|Schuldgeftihlen|Schulterl|Schutzen|Schutzr\\\xe9ume|SCHUTZT|Schw6r\\'s|Schwachkop\\\ufb02|Schwanzlutscherl|Schwarzh\\\xe9ndler|Schwarzweills|schwei\\\ufb02durchnisst|schwerh\\\xe9rig|schwiicht|schwiire|schwiiren|Schwimmanziige|schwi\\\xe9rmten|schwnre|Schw\\\xe9che|Schw\\\xe9chen|schw\\\xe9cher|schw\\\xe9cheren|schw\\\xe9chsten|Schw\\\xe9icheanfall|Schw\\\xe9ichen|schw\\\xe9icher|Schw\\\xe9ichling|Schw\\\xe9irmerei|schw\\\xe9irzeste|Schw\\\xe9mme|schw\\\xe9re|schw\\\xe9ren|Schw\\\xe9rme|schw\\\xe9rmt|schw\\\xe9rmte|Schw\\\xe9tzer|sch\\\xe9biger|Sch\\\xe9del|Sch\\\xe9den|Sch\\\xe9inder|sch\\\xe9ine|sch\\\xe9inen|Sch\\\xe9iner|sch\\\xe9irfen|sch\\\xe9le|sch\\\xe9me|Sch\\\xe9n|sch\\\xe9ne|Sch\\\xe9nen|Sch\\\xe9ner|Sch\\\xe9nes|Sch\\\xe9nheit|sch\\\xe9nl|sch\\\xe9nste|sch\\\xe9nsten|sch\\\xe9nstes|Sch\\\xe9tzchen|Sch\\\xe9tze|sch\\\xe9tzen|sch\\\xe9tzt|Sch\\\xe9tzung|Sch\\\xe9umen|sch\\\ufb02chtern|SCl\\'1lUSS6l|Scllrift|scmoss|se\\/n|Se\\/wen|sehenl|Sehenswlllrdigkeiten|Sehnsilchte|sehrangespannt|sehrjung|Sehrwohl|sehrzufrieden|sehtjetzt|Seidenglattl|seidjetzt|Seitwann|SEKRETARIN|Sekretiir|Sekretir|Sekret\\\xe9irin|Sekret\\\xe9rin|sel\\/g|selbstl|selbststiindig|selbstsuchtige|selbstverstindlich|Selbstverstlndlich|Selbstverst\\\xe9indlich|Selbstverst\\\xe9ndlich|seld|selhst|SeligerVater|seln|Selt|sentimalen|seri\\\xe9ser|Sexualit\\\xe9t|Sfe|Sfidamerikas|Sfidwind|Sfifies|Sfihne|Sfildner|Sfilie|Sfilieste|Sfi\\\ufb02igkeiten|sfnd|SICHERHEITSBEHORDE|Sicherheitsgrijnden|Sichtubervvachung|Sichtunterstutzung|Sieja|Sifihnchen|Signalst\\\xe9rke|Siiden|Siidfrankreich|siidliche|siil\\$|siili|Siilie|siilier|SIim\\'s|Siinde|Siinden|Siinder|siindigen|sii\\\ufb02en|siJB|SiJBe|siJchtige|sijlien|sijliesten|Sijsser|Sildtunnel|Silfie|Silfier|Silfies|silfker|Silnden|Silndenbock|sindja|Sirl|Sj\\_r|Skilaufen|skrupelloserAnw\\\xe9lte|sL\\'lf\\$e|sL1B|slch|sle|slebe|sLif\\$|SLif\\$e|SLif\\$er|sLif\\$es|SLilSe|Slliden|Sllinde|sllindigen|Slnd|Slr|Slrs|SoBen|sofortl|soh\\\xe9nen|Solien|sollenl|SONDERMULL|sorgf\\\xe9iltig|sorgf\\\xe9ltig|souver\\\xe9ine|souver\\\xe9inen|souver\\\xe9ner|sp\\'a\\'ter|sp\\/elen|SpaB|Spaf\\$|Spaf2\\>|Spaffs|Spafi|Spafls|SpafS|Spal\\'5|Spal2\\>|Spal3|Spali|Spall|Spass|spat|spektakular|Spell|Spells|Spell\\\xbb|Spezialit\\\xe9t|spfit|SpieB|spief\\$ig|Spielzeuggeschfiftn|spiilte|spiiren|spiirt|spiit|spijre|spijren|spijrt|Spillmeier|spilre|spilren|spit|Spitzenfriihstiick|spLir\\'s|splliren|splter|Sportilbertragung|Sportsfraund|Sprachpijppchen|SPRACHPUPPCHEN|Spriichlein|Sprilht|spr\\\xe9che|spr\\\xe9chen|spr\\\xe9chet|Spr\\\ufb02che|spr\\\ufb02ht|spUl|spUr|spurbare|spUrt|sp\\\xa7ter|Sp\\\xe4\\\xdf|sp\\\xe9it|sp\\\xe9iter|sp\\\xe9t|Sp\\\xe9ter|Sp\\\xe9tzchen|Sp\\\xe9tzchenl|ssh|st6Bt|st6hnt|st6lSt|St6rt|ST\\@HNT|Staatsaff\\\xe9ren|staatsbllirgerliches|Staatsgesch\\\xe9fte|Standardan\\\xe9sthesie|standig|STARSCREAMI|station\\\xe9r|Statusmeldungl|stdrte|stecktjede|Stehenbleiben|Stehvermiigen|Steigbilgeldinger|Steinh\\\xe9user|Sternenkijsse|Steuererkl\\\xe9rung|Steuererkl\\\xe9rungen|Steuerprtifer|Steuerprtifung|Steuersiitzen|stfipseln|stfiren|stfirker|Stfirt|stfirzt|stieB|Stiefbriider|Stiicke|Stiihle|Stiihlen|stiihnt|Stiillen|Stiire|stiiren|Stiirme|stiirmischen|Stiirsignale|stiirt|Stiirung|stiirzen|Stiitzpunkt|Stijck|Stijckchen|Stijcke|stijhle|stijrme|stijrzen|Stilck|Stilcke|Stillckchen|Stillst\\\xe9nde|Stilvolll|stinden|Stldseite|stleg|Stllihle|Stllirmen|stllirzt|stlllrzen|Stl\\\ufb02|sto\\/3en|StoB|stoBe|stof\\$en|Stofi|STOHNT|Stol3zahn|Stol3zeit|stolie|Storung|Str6men|str6mt|StraBe|StraBen|StraBenk6tern|Straf\\$e|Strafiengang|Strafienratten|Strafienschlacht|Straflsenecke|Straflsenmaler|Straflsenschilder|Straft\\\xe9ter|Strahlenschutzger\\\xe9t|Strahlungsintensit\\\xe9t|Stral3en|Stral5e|Stralie|Straliengang|Stralienk\\\xe9ter|Straliensperre|Streitkr\\\xe9fte|Streitkr\\\xe9ften|Streit\\\xe9xte|strfimten|Striimen|Striimungen|Stromschliige|Stromschnellenl|Stromung|Strullerl|Str\\\xe9mung|Str\\\xe9mungen|sturzte|STUTZPUNKT|St\\\xe9be|st\\\xe9hnt|st\\\xe9hnte|St\\\xe9idtchen|St\\\xe9idte|st\\\xe9indig|St\\\xe9irke|st\\\xe9irker|St\\\xe9irkeres|st\\\xe9llst|St\\\xe9ndchen|St\\\xe9nder|St\\\xe9ndig|st\\\xe9pseln|st\\\xe9ren|St\\\xe9rke|St\\\xe9rken|st\\\xe9rker|St\\\xe9rkere|st\\\xe9rkeres|st\\\xe9rkste|st\\\xe9rst|st\\\xe9rt|St\\\xe9rung|St\\\xe9tten|St\\\ufb02ck|St\\\ufb02hlen|sUB|sUBe|Suchfeam|SUden|Sudseite|Sudwest|sUf\\$|SUf\\$e|suMM\\\u2020|Suohet|Superkr\\\xe9fte|superl\\\xe9cherlich|s\\\xa2\\'il3|S\\\xe9cke|S\\\xe9ge|s\\\xe9he|S\\\xe9hne|S\\\xe9hnen|S\\\xe9icke|S\\\xe9inger|S\\\xe9iulen|S\\\xe9ldner|s\\\xe9mfl\\/che|s\\\xe9mtliche|s\\\xe9mtlichen|S\\\xe9nger|S\\\xe9ngerin|s\\\xe9ubern|s\\\xe9uft|s\\\xe9ugen|S\\\xe9ulen|S\\\xe9urewannen|S\\\ufb02dh\\\xe9ingen|T6chter|T6pfchen|T6rn|T6rtchen|t6te|T6ten|t6tet|TANZERINNEN|Tater|tats\\\xe9chlich|tats\\\xe9chliche|tats\\\xe9ichlich|Tatverd\\\xe9ichtigen|Tauchg\\\xe9inge|Tauchg\\\xe9nge|Tauschgesch\\\xe9fte|Tauschgesch\\\xe9\\\ufb02e|Tbrn|tbten|tdten|tdtete|Telefongespr\\\xe9che|Tempelsch\\\xe9nderf|TemPO|TESTGELANDE|Testvorf\\\ufb02hrungen|tfidlich|tfiitet|Tfir|tfirkischen|Tfite|Theaterstfick|Therapiel|Thermalger\\\xe9t|Thronr\\\xe9uber|Thronr\\\xe9uberin|Tiefkilhlung|Tiefktih\\/system|Tiefktihleind\\\xe9mmung|TIEFKUHL|Tiefkuhlstasis|Tiefkuhlung|tiglich|tiichtige|tiint|Tiipfchen|Tiipfchennummer|Tiir|Tiiren|Tiirl|Tiirme|tiite|Tiite|tiiten|tiitet|tiitete|TiJr|Tijrme|Tilr|Tilrglocke|Tilrklingel|Tilr\\\xe9ffner|Tippger\\\xe9usch|Tischlenuerkstatt|TL\\'lr|tlglich|Tllir|Tllirkei|Tlllpfelchen|TOILETTENSPULUNG|Tonl|Toreroabs\\\xe9tze|Tortenb\\\xe9ickerin|Tragfidie|Tragiidie|Trag\\\xe9die|Trainingsijbung|TRAUMKCRPER|treffan|trfiumen|Tribiinen|trif\\'f\\'t|trigt|Triibsal|Triimmem|triistllch|Triistungen|Triiume|Trilmmer|triume|Trockenger\\\xe9ite|Trockenger\\\xe9te|Tropfsteinhiihle|Trottell|Trubsal|tr\\\xe9ge|Tr\\\xe9gerschiff|tr\\\xe9gt|Tr\\\xe9igerschiff|tr\\\xe9igt|tr\\\xe9ium|tr\\\xe9iume|tr\\\xe9iumen|tr\\\xe9iumt|tr\\\xe9llert|Tr\\\xe9ne|Tr\\\xe9nen|Tr\\\xe9um|tr\\\xe9ume|Tr\\\xe9umen|Tr\\\xe9umer|tr\\\xe9umst|Tr\\\xe9umt|Tschiiss|Tschiissl|tschijss|Tschtiss|tsch\\\xfc\\\xdf|Tsch\\\ufb02s|Ttir|ttlckisch|Ttlte|tubul\\\xe9re|Tupperschiissel|TUR|TUr|Turen|TURKEI|Turmwiichter|tutjetzt|typlschl|T\\\xe9chter|t\\\xe9d\\/ichen|t\\\xe9dlich|t\\\xe9dliche|t\\\xe9dlichen|t\\\xe9glich|t\\\xe9glichen|t\\\xe9iglich|t\\\xe9itowieren|t\\\xe9itowierte|T\\\xe9itowierung|t\\\xe9iuschen|T\\\xe9ler|T\\\xe9lpell|T\\\xe9nze|T\\\xe9nzerin|T\\\xe9pfchen|T\\\xe9pfchenquatsch|T\\\xe9pfchensache|t\\\xe9te|T\\\xe9ten|t\\\xe9test|t\\\xe9tet|t\\\xe9tete|t\\\xe9towieren|t\\\xe9towierte|T\\\xe9towierung|T\\\xe9towierungen|t\\\xe9uschen|t\\\xe9uscht|T\\\xe9uschung|T\\\xe9uschungsman\\\xe9ver|Ub6FpFUfl\\'T1al|Ub6l\\'pl\\'Uf\\\u20ac|Ube|Ubel|Ubelkeit|Ubelt\\\xe9ter|Uben|Uben\\/vachen|Uben\\/vacher|Uben\\/vacht|Uben\\/vachungen|Uben\\/vachungsgesetz|Uben\\/vinden|Uber|UBER|Uberall|Uberanstrenge|Uberanstrengung|Uberarbeiten|UberAuf\\$erirdische|Uberaus|Uberbleibsel|Uberblick|Uberbringe|Uberdauern|Uberdecken|Ubereinstimmung|Uberfahren|Uberfall|Uberflilssig|Ubergabe|Ubergaben|Ubergabepunkt|Ubergangen|Ubergangsweise|Ubergeben|Ubergehen|Uberhaupt|Uberholt|Uberholter|Uberh\\\xe9rt|Uberjemanden|Uberlagerungs|Uberlandleitungen|Uberlass|Uberlasse|Uberlassen|Uberlassenl|Uberlasteten|Uberleben|Uberlebende|Uberlebenden|Uberlebenschancen|Uberlebenswichtigen|Uberlebt|Uberleg|Uberlegen|Uberlegenheit|uberlegt|Uberlegten|Uberleiten|Uberleitung|Uberlieferungen|Uberl\\\xe9sst|Uberm|Ubermorgen|Ubernachtungsgast|Ubernahm|Ubernahme|Ubernahmen|Ubernehme|Ubernehmen|Ubernimmst|ubernimmt|Ubernommen|Uberpriifen|Uberprilfen|Uberprliifen|Uberprufe|Uberprufen|Uberpruft|Uberraschend|Uberrascht|Uberraschte|Uberraschter|Uberraschung|Uberraschungen|Uberraschungl|Uberreagiert|Uberreden|Uberredet|Uberreste|Uberrumpeln|Uberrumple|Ubers|Uberschl\\\xe9gt|Uberschreiten|Uberschritten|Uberschwemmung|Ubersehen|Ubersensibilit\\\xe9t|Ubersetzung|Uberspannte|Uberspielt|Uberstehen|Ubersteigerten|Ubersteigt|Uberstunden|Ubertraf|UBERTRAGEN|Ubertragen|UBERTRAGUNG|ubertreibe|Ubertreiben|Ubertrieben|Ubertriebene|ubertriebener|Ubertrifft|Ubervvachen|Ubervvacht|Ubervvachung|Ubervvachungs|Ubervvachungsstaat|Ubervvachungsstaats|Ubervvachungsvideos|Ubervv\\\xe9iltigend|Uberwachen|Uberwacher|Uberwachung|Uberzeuge|Uberzeugen|Uberzeugend|Uberzeugt|Uberzeugung|Uberzeugungen|Uberziehen|Uberzuleiten|ublem|Ubler|Ubles|Ublich|Ubliche|ublichen|Ubrig|Ubrige|Ubrigen|Ubrigens|Ubrlgens|Ubrllccol|Ubung|Ubungsbedingungen|Ubungsschiisse|Ubungsschusse|Ub\\\u20acf\\'pf\\'Uf\\\u20acl\\'1|Uher|ultrakiistlichl|umgeriistet|umg\\\xe9nglich|umhdren|umh\\\xe9ngt|Umschlfigen|umschlieBt|Umst\\\xe9inden|Umst\\\xe9nde|Umst\\\xe9nden|umst\\\xe9ndlich|umweltsch\\\xe9dlich|unabhiingiges|unabh\\\xe9ingig|unabh\\\xe9ngig|unabl\\\xe9ssig|Unauff\\\xe9lligeres|unaufhalfsam|unaufhiirlich|unaufh\\\xe9rlich|unaufi\\\xe9llig|unberijhrbar|unberllihrten|unbesch\\\xe9digt|Uncl|undja|undjeder|undjemand|undjetzt|undlassenihn|undlhnen|undurchfuhrbar|uneingeschr\\\xe9nkten|unergrilndliche|unerhort|unerhorte|unerkl\\\xe9rliche|unerkl\\\xe9rlichen|unertr\\\xe9glich|unf\\'a\\'hig|Unfahigkeit|unfersfellen|unfiirmigen|unf\\\xe9hig|unf\\\xe9higste|unf\\\xe9ihigste|Unf\\\xe9ille|Unf\\\xe9lle|ungef\\\xe9hr|ungef\\\xe9hre|Ungef\\\xe9ihr|ungef\\\xe9ihrlich|ungemutlich|ungenugend|ungestbrt|ungewfihnliche|Ungewfjhnliches|ungewiihnlich|Ungewijhnliches|ungew\\\xe9hnlich|ungew\\\xe9hnliche|ungew\\\xe9hnlichste|ungfinstigen|ungiiltig|ungilnstig|Unglaubliohl|unglaubwurdig|Unglfiubige|Ungliicklicherweise|Unglilck|Ungll\\'Jcklichervveise|Unglllick|unglllicklich|ungllllckliche|unglucklich|Ungl\\\xe9ubiger|ungultig|ungunstigen|unheimlichl|UNHORBARES|unh\\\xe9flich|Universitlt|Universit\\\xe9t|unlfisbare|unm6glich|unmfiglich|Unmiiglich|Unmiigliche|unmijglich|unmissverst\\\xe9ndlich|unmoglich|Unmtioglich|Unm\\\xe9glich|unm\\\xe9glioh|unnatiirliche|unnaturliche|unnfitigen|unniitig|unnllitz|unn\\\xe9tig|unn\\\xe9tigen|unol|unp\\\xe9sslich|UNREGELMASSIG|Unregelm\\\xe9fiigkeiten|unschliissig|unserejungen|unsererAnw\\\xe9lte|unsererjungfr\\\xe9ulichen|unsjede|uns\\\xe9glich|Untenuelt|unterdriickten|Unterdrilckung|unterdrtlckte|Unterdr\\\ufb02ckung|Unterhaltskostenl|Unterhaltungsm\\\xe9fiig|unterhfilt|unterh\\\xe9lt|unterschitzt|untersch\\\xe9tzte|unterstiitzt|Unterstiitzung|unterstijtzt|Unterstiltzung|Unterstllitzung|unterstutzen|unterstutzt|Unterstutzten|Unterstutzung|Untersuchungsausschijsse|Unterw\\\xe9sche|untr\\\xe9stlich|Unt\\\xe9tigkeit|unumg\\\xe9nglich|unverm\\\xe9hlt|Unverschfimtheitl|unversch\\\xe9mte|Unversch\\\xe9mtheitl|UNVERSTANDLICH|UNVERSTANDLICHE|UNVERSTANDLICHER|UNVERSTANDLICHES|Unverst\\\xe9ndliche|unverst\\\xe9ndlichen|unverst\\\xe9ndliches|unverzlliglich|unver\\\xe9ndert|Unzerbrechliohen|unzurechnungsfahig|unzuverlassiger|Unzuverl\\\xe9ssiger|unzuverl\\\xe9ssiges|unz\\\xe9hlige|unz\\\xe9hligen|unz\\\xe9ihlige|Urgrofivaters|Urlaubsuberschreitung|Ursprijnglich|ursprtmglich|Ursprunglich|Ururgrofivater|v\\/el|v\\/er|v\\/erfe|v\\/erfes|V6gel|v6IIig|V6lker|V6llig|v6lllg|vdllig|Ve\\/Teidigungskr\\\xe9fte|Velzeih|Velzeihung|velzichte|Ven\\/vandter|ven\\/v\\\xe9hntl|Ventilationsfiffnung|Ventilatorsch\\\xe9chte|VERACHTLICH|verandert|Verbiindeten|Verbilndeter|verbliidet|Verbliidung|verbllirgen|verbrachfe|Verbrec\\/ver|Verbtmdeter|Verbundeten|Verb\\\ufb02nolete|verdiichtigen|verdiinnt|verdllistern|verdr\\\ufb02ckt|verdunnt|verd\\\xe9chtig|Verd\\\xe9chtigen|verd\\\xe9chtiger|verffilgbares|Verfiigung|verfiihren|verfiihrt|verfiittem|Verfijgung|verfilgst|verfilgte|Verfilgung|Verfilhrungskilnste|verflligen|verfllihrt|Verflllgung|verfolgf|verfolgtl|VERFUGBAR|verfugt|vergafk|Vergniigen|Vergniigens|Vergniigungsausflug|Vergnijgen|Vergnilgen|Vergnlligen|Vergntigen|Vergnugen|vergnugt|vergnugte|Vergnugungsausflug|vergr6Bern|vergr\\\xe9fiern|Vergr\\\xe9fierung|verg\\\xe9nglich|verhiirt|Verhiitung|Verhor|verhort|verhorten|verh\\\xe9ilt|verh\\\xe9lt|Verh\\\xe9ltnis|Verh\\\xe9ltnisse|verh\\\xe9ltst|veriindert|Verinderungen|verkilnden|verkilndet|verkniipft|verknUpf\\'t|verkunde|verkunden|verkundet|VERKUNDIGUNG|Verk\\\xe9ufer|verletztl|verlieB|verlielien|verlorenl|verl\\\xe9ingert|Verl\\\xe9ingerungskabel|verl\\\xe9isst|verl\\\xe9sst|verl\\\xe9uft|verm\\'aihlen|verm\\/ssf|vermiibelt|Vermiigt|Verm\\\xe9gen|verm\\\xe9hle|verm\\\xe9hlen|verm\\\xe9hlt|Verm\\\xe9ihlung|vernachl\\\xe9ssigt|Vernachl\\\xe9ssigung|vernfinftig|vernfinftige|vernilnftig|vernllmftigsten|verntmftige|vernunftig|vernunftigsten|vern\\\ufb02nftig|verpa\\\xdft|verpesfefe|verprilgle|verprugeln|Verp\\\ufb02ichtungen|verrat|verrfickter|verriickt|Verriickte|Verriickten|Verriickter|verriicktes|verrijckt|verrijckte|verrilckt|Verrilckte|Verrilckter|Verrilcktes|verrL\\'lckt|verrljckt|verrllickt|Verrllickte|Verrllickter|verrlllckte|verrtickt|verrUckt|Verruckte|verruckten|Verruckter|Verr\\\xe9iter|verr\\\xe9itst|verr\\\xe9t|Verr\\\xe9ter|Verr\\\xe9terin|verr\\\xe9terisch|verr\\\xe9terischen|verr\\\ufb02ckt|versaumt|Verscheifier|verschiichtert|verschiitten|verschlucktl|VERSCHLUSSELN|VERSCHLUSSELT|Verschlusselung|Verschnauferst|Verschwdrung|verschweilit|Verschwiirer|verschwiirerisch|Verschwiirern|Verschwiirung|Verschwiirungen|Verschw\\\xe9rer|Verschw\\\xe9rung|Verschw\\\xe9rungstheoretiker|versch\\\xe9rft|versfanden|Versfehen|versiihnlich|Versiihnung|verslumte|Verspfitung|verspiire|verspilre|verspiten|versprijht|verst0I3en|verst6Bt|Verst6ISt|verst6l3t|verstehejetzt|Verstiindnis|verstiirkt|Verstiirkung|verstilmmelst|verstoBen|verstofken|verstolien|verstummelt|verstunde|verstundest|verst\\\xe9fkt|verst\\\xe9indlich|Verst\\\xe9irkung|Verst\\\xe9ndigen|Verst\\\xe9ndigt|verst\\\xe9ndlich|Verst\\\xe9ndnis|verst\\\xe9rken|verst\\\xe9rkt|verst\\\xe9rkte|verst\\\xe9rkter|Verst\\\xe9rkung|verst\\\xe9rt|vers\\\xe9hnen|vers\\\xe9hnt|vers\\\xe9umen|vers\\\xe9umt|VERTRAGSLANGE|vertrauenswiirdig|vertrauenswtlrdig|vertrauenswtlrdigen|vertr\\\xe9umte|vervvanzt|verwiistete|verwllisten|verwustet|verw\\\xe9hnten|verw\\\xe9ihnen|verw\\\xe9ssert|verz\\\xe9gere|Verz\\\xe9gerte|Verz\\\xe9gerung|ver\\\xe9ffentliche|ver\\\xe9ffentlichen|ver\\\xe9ffentlicht|ver\\\xe9indert|Ver\\\xe9inderung|ver\\\xe9ndern|ver\\\xe9ndert|ver\\\xe9nderte|ver\\\xe9nderten|Ver\\\xe9nderung|Ver\\\xe9nderungen|ver\\\xe9ngstigtes|ver\\\xe9ppelt|ver\\\xe9rgert|vewvendet|vfillig|VGFKUFZGH|VI\\/illkommen|VI\\/itwicky|vial|Videoiiben\\/vachung|Vie\\/e|Vielfrafi|vielf\\\xe9ltig|Vielleichtja|vielversprechend|Vieraugengespr\\\xe9ch|vieriunge|vierj\\\xe9hriges|vierk\\\xe9pfige|Viigel|viillig|viilliges|Viterchen|Vizepr\\\xe9isident|vlel|Vlellelcht|Vogelscheifke|Vogelscheilie|Volksm\\\xe9rchen|vollerjeder|vollmachen|vollst\\\xe9ndig|vollst\\\xe9ndige|Volltrefferl|vollz\\\xe9hlig|Volumenl|von\\/vagten|von\\/v\\\xe9irts|vonn6ten|Vonn\\\xe9irts|Vordertiir|Vorderturl|vordr\\\xe9ngelnl|vorfibergehend|Vorfuhrungen|vorgef\\\ufb02hrt|Vorgiinge|Vorg\\\xe9nger|Vorg\\\xe9ngern|Vorh\\\xe9nge|vorijbergehend|vorilber|vorilbergehende|vorkniipfen|Vorl\\\xe9ufer|Vorl\\\xe9ufig|Vorraus|Vorschl\\\xe9ge|vorschriftsm\\\xe9fiig|vorschriftsm\\\xe9iliig|Vorsichtsmaflnahme|Vorstellungsgespr\\\xe9ch|Vorstellungsgespr\\\xe9che|Vorstof\\$|Vortlbergehende|vort\\\xe9uschen|vorubergehend|vorvv\\\xe9rts|Vorwfirts|vorw\\\xe9rts|vorzfiglichl|vor\\\ufb02ber|Vor\\\ufb02bergehend|VVACHMANN|Vvaffen|Vvagen|VVarte|VVeif3\\>t|VVeil\\'2\\>t|VVir|VVM|v\\\\\\/as|V\\\\\\/e|V\\\xe9gel|v\\\xe9geln|v\\\xe9gelt|v\\\xe9llig|w\\/\\'r|W\\/e|w\\/eder|W\\/nkel|w\\/r|w\\/rd|w\\/rkl\\/ch|W0|w5r|w5r\\'s|W6lfe|W6lfen|W99|Waffenschr\\\xe9nke|wafs|wahrend|WAHRENDDESSEN|Wahrheitl|wail|Walbl|Walsinghaml|wankelmiltig|ware|WAREST|Warfe|warja|Waschbrettb\\\xe9uche|Waschb\\\xe9ir|Waschb\\\xe9iren|Wasseranschlljssen|Wattekn\\\xe9uel|Wattest\\\xe9bchen|we\\'re|We\\'ro|we\\/B|We\\/Bf|we\\/fere|Wechsell|weggebfirstet|weggespllllt|weggesplllltl|weggesp\\\ufb02lt|wegl|wegreiflsen|wegschieBen|Wegtratan|wegzuwefien|wei\\/3|WeiB|weiBe|weiBen|weiBer|weiBes|WeiBfresse|weiBt|Weif\\$|Weif\\$t|weif2\\>|weif3|weif3\\>|Weif3t|weif5|Weifbe|weifbt|Weifi|Weifie|weifies|Weifist|Weifit|weifk|weifken|Weifker|weifkes|weifkt|weifL|weifLt|weifl\\\xbb|weifS|WeifSt|weifZ\\>|WeifZ\\>t|weif\\\xe9t|Weihnachtseink\\\xe9ufe|Weihnachtsm\\\xe9nner|weil\\'5|weil\\'5t|weil3|Weil3t|weil5|Weil5t|weili|weilit|weilke|Weill|weills|weillst|weillt|weilS|weilSe|WeilSglut|weilZ\\>|weilZ\\~|weiss|weissen|weisst|weiterhiipfen|Weiterpessen|weitl\\\xe9ufige|weitweg|WelBt|well|Well|Wellit|welllt|welt|WELTBEVOLKERUNG|Wel\\\ufb02t|Werdja|Werkst\\\xe9tten|Werkzeugg\\\ufb02rtel|wertschfitzen|Westflilgel|Westkilste|Wettk\\\xe9mpfe|Wettk\\\xe9mpfen|Wettk\\\xe9mpfer|Wfinsche|wfinschen|Wfird|wfirde|Wfirden|wfirdest|wfire|Wfirme|Wfisste|wfitete|wfssen|Widen\\/v\\\xe9rtig|widerf\\'a\\'hrt|widerspriichliche|Widerw\\\xe9irtig|wiedergew\\\xe9ihltl|wiederhaben|Wiederh\\\xe9ren|Wieheifiternoch|Wieheiliternoch|wihlerisch|wihlerlsch|wiihlen|wiihlte|wiihrend|wiilrdest|Wiinde|wiinsch|Wiinsche|Wiinschen|wiinschst|wiinscht|wiinschte|wiirde|Wiirden|Wiirdest|wiirdet|wiirdigst|Wiire|wiiren|Wiirfel|wiirfeln|Wiirfels|wiirs|Wiirstchen|wiischt|Wiisste|wiissten|wiisstest|Wiiste|wiitenden|wijnsche|wijnschen|wijnschte|wijrd|wijrde|wijrden|wijrdest|wijrdiger|Wijrg|wijsste|wijtend|wildl|wilnsch|wilnsche|wilnschen|wilnscht|wilnschte|wilrd|Wilrde|Wilrden|Wilrdest|wilrdig|Wilrfel|Wilrfelenergie|wilsste|wilssten|Wilstling|wiltend|Windelhundl|Windhundk\\\xe9rper|winner|Wire|wires|Wirfangen|wirja|wirje|wirjede|wirjeden|wirjetzt|Wirnisse|Wirsind|wirtragen|Wirtschaftspriifer|Wirverfolgen|wirvom|Wirwaren|Wirwarten|Wirwerden|Wirwissen|Wirwollen|Wirwollten|Wirzeigten|wirzu|Witzl|WKHRENDDESSEN|wL\\'lrden|wle|Wleso|Wlhlen|wllinsch|wllinschst|wllinscht|wllirde|wllirden|wllirdest|wllirdet|Wllirgegriff|wllirgen|wllisste|wlr|wlrd|wlrkllch|Wlrkllchkelt|wlrst|Wlrwarten|wlrwollen|Wo\\/f|Wochenf\\\xe9hre|woffir|Wofiir|Wofijr|wofilr|Wofur|WoherweiB|WoherweiBt|Woherweif\\$t|wohlfilhlen|Wollkn\\\xe9uel|womiiglich|wom\\\xe9glich|wom\\\xe9iglich|Worfiber|woriiber|Worijber|Wortgepl\\\xe9nkel|Woruber|wt\\/\\'rden|wtinsche|wtinschst|wtirde|Wtirdest|Wtirfel|Wtmschen|WUl\\'d\\\u20ac|WUlfelbecher|wullte|Wundersch6n|wunderschfin|Wunderschiin|wunderschiinen|wundersch\\\xe9n|wundersch\\\xe9ne|Wundersch\\\xe9nel|wundersch\\\xe9nen|wundersch\\\xe9nes|wundersoh\\\xe9n|wunsche|Wunschen|wunscht|wunschte|WUNSCHTE|wurcle|wUrde|Wurdige|WURGT|Wurmer|Wursfsfulle|Wuste|WUSTEN|wutend|wu\\\xdfte|wu\\\xdftest|w\\\xa7r\\'s|w\\\xa7re|W\\\xa7ren\\'s|w\\\xe9\\'hrend|w\\\xe9chst|W\\\xe9chter|w\\\xe9fs|W\\\xe9g|w\\\xe9hle|w\\\xe9hlejetzt|w\\\xe9hlen|W\\\xe9hler|W\\\xe9hlern|w\\\xe9hlt|w\\\xe9hlte|w\\\xe9hrend|W\\\xe9hrung|W\\\xe9ichter|w\\\xe9ihlen|w\\\xe9ihrend|w\\\xe9ir|w\\\xe9ir\\'s|w\\\xe9irde|W\\\xe9ire|w\\\xe9iren|w\\\xe9irmen|w\\\xe9irst|W\\\xe9lder|W\\\xe9ldern|W\\\xe9lfen|W\\\xe9lkchen|W\\\xe9nde|W\\\xe9nden|w\\\xe9r|w\\\xe9r\\'s|W\\\xe9re|W\\\xe9ren|w\\\xe9ret|w\\\xe9rja|W\\\xe9rm|W\\\xe9rme|w\\\xe9rmt|W\\\xe9rst|w\\\xe9rt|W\\\xe9rter|W\\\xe9rterbuch|w\\\xe9rtliche|W\\\xe9sche|W\\\xe9scheklammer|W\\\xe9schst|w\\\xe9scht|w\\\ufb02rde|w\\\ufb02rden|W\\\ufb02rfel|z\\'a\\'h|Z\\/egf|Z\\/yarettenb\\\xe4ume|Z05|z6gel1e|z6gern|zahlenm\\\xe9\\\ufb02ig|zappelnl|Zauberspruchen|Zaubervoodookr\\\xe9fte|Zauherpfippchen|Zefietzende|zeitgem5B|Zeitgem\\\xe9\\\ufb02e|Zeitgeniissische|zeitgeniissischen|Zellenschliissel|zerbeif\\$en|zerbeif\\$t|zerf\\\xe9llt|Zermatschger\\\xe9usch|zerm\\\ufb02rben|zerreifien|zerreilit|zersfdren|zerst6rst|zerst6rt|zerstdren|Zerstfiren|Zerstfirer|Zerstfirungskraft|Zerstiickelung|zerstiire|zerstiiren|Zerstiirer|zerstiirt|zerstiirten|zerstiirtl|Zerstiirungl|zerstoren|zerst\\\xe9re|zerst\\\xe9ren|Zerst\\\xe9rer|zerst\\\xe9rt|Zerst\\\xe9rung|Zerst\\\xe9rungsfeldzug|zertrlllmmert|zfihlt|Ziel160m|Zihnelt|ziichtiger|Ziige|Ziindkapseln|Zilnd|Zilnden|Zilndungsenergie|Zilrich|Zindern|Zingstlich|Ziufierst|zleht|ZLIFUCK|Zooschlieliung|Zuckerschn\\\ufb02tchen|zuerstvor|zuffillig|zuflligen|ZUFUCK|Zuf\\\xe9illig|Zuf\\\xe9illigerweise|zuf\\\xe9llig|Zuf\\\xe9lligerweise|zug\\'a\\'nglichen|ZUGANGSPRIORITKT|zugehdrt|zugeh\\\xe9rt|zugestofien|Zugest\\\xe9ndnis|Zugest\\\xe9ndnisse|Zugiinge|zuh6ren|zuh6rt|zuhiiren|zuhiirt|Zuh\\\xe9lter|Zuh\\\xe9ren|Zuh\\\xe9rer|zukilnftiges|zul|zundete|Zundverteilerkappe|zunjick|zun\\\xe9chst|zun\\\xe9hen|zun\\\xe9ihen|Zuokerschntltchen|zurfick|zurfickblicken|zurfickgekommen|zurfickgezogen|zurfickkehren|zurfickzufuhren|zuriick|zuriickbleiben|zuriickgeben|zuriickgehen|zuriickgekommen|zuriickgezogen|zuriickhaben|zuriickkehre|zuriickkehren|zuriickkehrst|zuriickziehen|Zurijck|zurijckbringen|zurijckfordem|zurijckgeholt|zurijckgekehrt|zurijckgekommen|zurijckgelassen|zurijckgerufen|zurijckkehren|zurijcknehmen|zurijckstolpern|Zurilck|Zurilckf|zurilckgeblieben|zurilckgeholt|zurilckgekehrt|zurilckhalten|zurilckholen|zurilckkehre|zurilckkehren|zurilckkehrt|zurilckkommen|zurilckkommt|zurilcklassen|zurilckziehen|Zurilckziehenl|zurilckzugeben|zurl\\'Jck|zurL\\'lck|zurLick|zurljckgeben|zurllickfallen|zurllickgekehrt|zurllickkehrt|zurllickzukehren|zurlllckgehen|zurlllckkomme|zurtick|zurtickbringe|zurtickgezogen|zurtlckgekommen|zurtlckvervvandeln|Zuruck|ZURUCK|zuruckbleiben|zuruckblicken|zuruckdenke|zuruckfeuern|zuruckgehen|zuruckgelegt|zuruckgewiesen|zuruckgreifen|zuruckhaben|zuruckkehren|zuruckkehrten|zuruckkomme|zuruckkommen|zuruckk\\\xe9mst|zuruckl|zurucklassen|zurUcklieB|zuruckl\\\xe9cheln|zurucknehmen|zuruckverwandeln|zuruckverwandelt|zuruckziehen|zuruckzukommen|zurverfilgung|zur\\\xe9ickrufen|zur\\\ufb02ck|Zur\\\ufb02ckbleiben|zur\\\ufb02ckfliegen|zur\\\ufb02ckgeschickt|zur\\\ufb02ckgibst|zus\\'a\\'tzliche|zusammenbeilien|zusammenffigen|zusammenfugen|zusammenfuhren|zusammenf\\\xe9illt|zusammenh\\\xe9ilt|zusammenh\\\xe9lt|zusammenh\\\xe9ngen|zusammenreifien|zusammenzuschweifien|zuschl\\\xe9gst|zust6Bt|zustofken|zust\\\xe9indig|zust\\\xe9ncligen|zust\\\xe9ndig|zust\\\xe9ndigen|zus\\\xe9tzlich|zus\\\xe9tzliche|zuverlfissig|zuverllssig|zuverl\\\xe9ssig|zuverl\\\xe9ssiger|zuviel|zuviele|zuzuflligen|Zu\\\ufb02ucht|zvvei|Zw6If|zw6lfmal|Zwel|Zwickmfihle|Zwillingstiichter|Zwischenf\\\xe9lle|zwnlf|Zw\\\xe9ilften|zw\\\xe9lf|z\\\xe9gerlich|z\\\xe9gern|Z\\\xe9gerns|z\\\xe9h|z\\\xe9he|z\\\xe9her|z\\\xe9hl|z\\\xe9hle|z\\\xe9hlen|Z\\\xe9hlerei|z\\\xe9hlt|z\\\xe9hltl|Z\\\xe9hlung|Z\\\xe9hne|Z\\\xe9hnen|Z\\\xe9hneputzen|z\\\xe9ihle|z\\\xe9ihlen|z\\\xe9ihlt|Z\\\xe9ihlungen|Z\\\xe9ihne|Z\\\xe9libat|\\\\\\/GFQHUQGH|\\\\\\/OFVVUFf\\\u20ac|\\\\\\/Vahrheit|\\\\\\/Vir|\\\\\\/\\\\\\/i6fUl\\'1l\\\u20acfi|\\\\\\/\\\\\\/il\\'fUl\\'1I\\'\\\u20acl\\'1|\\\\Nynn|\\_|\\\xc4u|\\\xe9|\\\xe9chzt|\\\xe9ffentlich|\\\xe9ffne|\\\xe9ffnen|\\\xe9ffnet|\\\xe9fft|\\\xe9fter|\\\xe9fters|\\\xe9h|\\\xe9hnlich|\\\xe9hnliche|\\\xe9hnlicher|\\\xe9ih|\\\xe9ihnlich|\\\xe9indern|\\\xe9itzend|\\\xe9lter|\\\xe9lteste|\\\xe9ltesten|\\\xe9ndere|\\\xe9ndern|\\\xe9ndert|\\\xe9nderte|\\\xe9nderten|\\\xe9ngstlich|\\\xe9rgere|\\\xe9rgern|\\\xe9rztliche|\\\xe9rztlichen|\\\xe9rztlicher|\\\xe9sthetisch|\\\xe9tzend|\\\xe9ufierst|\\\xe9ufiersten|\\\xe9uflserst|\\\ufb02atterndem|\\\ufb02el|\\\ufb02iehen|\\\ufb02jr|\\\ufb02lhlen|\\\ufb02lllen|\\\ufb02lr|\\\ufb02lrchterlich|\\\ufb02ndet|AIle|AIter|GI\\\xfcck|PIaystation|AIIes|AIso|Ouatsch|AIles|BIeib|KIaut|AIlah|PIan|oderjemand|liestjetzt)(\\b|$)"}},
+ 'eng': {'BeginLines': {'data': OrderedDict([(u'lgot it', u'I got it'), (u'Don,t ', u"Don't "), (u'Can,t ', u"Can't "), (u'Let,s ', u"Let's "), (u'He,s ', u"He's "), (u'I,m ', u"I'm "), (u'I,ve ', u"I've "), (u'I,ll ', u"I'll "), (u'You,ll ', u"You'll "), (u'T hey ', u'They '), (u'T here ', u'There '), (u'W here ', u'Where '), (u'M aybe ', u'Maybe '), (u'S hould ', u'Should '), (u'|was', u'I was'), (u'|am ', u'I am'), (u'No w, ', u'Now, '), (u'l... I ', u'I... I '), (u'L... I ', u'I... I '), (u'lrn gonna', u"I'm gonna"), (u"-l don't", u"-I don't"), (u"l don't", u"I don't"), (u'L ', u'I '), (u'-L ', u'-I '), (u'- L ', u'- I '), (u'-l ', u'-I '), (u'- l ', u'- I '), (u'G0', u'Go'), (u'GO get', u'Go get'), (u'GO to', u'Go to'), (u'GO for', u'Go for'), (u'Ifl', u'If I'), (u"lt'll", u"It'll"), (u"Lt'll", u"It'll"), (u'IVIa', u'Ma'), (u'IVIu', u'Mu'), (u'0ne', u'One'), (u'0nly', u'Only'), (u'0n ', u'On '), (u'lt ', u'It '), (u'Lt ', u'It '), (u"lt's ", u"It's "), (u"Lt's ", u"It's "), (u'ln ', u'In '), (u'Ln ', u'In '), (u'l-in ', u'I-in '), (u'l-impossible', u'I-impossible'), (u'l- impossible', u'I-impossible'), (u'L- impossible', u'I-impossible'), (u"l-isn't ", u"I-isn't "), (u"L-isn't ", u"I-isn't "), (u"l- isn't ", u"I-isn't "), (u"L- isn't ", u"I-isn't "), (u'l- l ', u'I-I '), (u'L- l ', u'I-I '), (u'l- it ', u'I-it '), (u'L- it ', u'I-it '), (u'Ls it ', u'Is it '), (u'Ls there ', u'Is there '), (u'Ls he ', u'Is he '), (u'Ls she ', u'Is she '), (u'L can', u'I can'), (u'l can', u'I can'), (u"L'm ", u"I'm "), (u"L' m ", u"I'm "), (u"Lt' s ", u"It's "), (u"I']I ", u"I'll "), (u'...ls ', u'...Is '), (u'- ls ', u'- Is '), (u'...l ', u'...I '), (u'Ill ', u"I'll "), (u'L hope ', u'I hope '), (u"|\u2019E'$ ", u"It's "), (u"The y're ", u"They're "), (u'<i>/ ', u'<i>I '), (u'/ ', u'I '), (u'<i>/n ', u'<i>In '), (u'/n ', u'In '), (u'<i>Ana\u2019 ', u'<i>And '), (u"<i>Ana' ", u'<i>And '), (u'~ ', u'- '), (u"<i>A'|'|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u"A'|'|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID A'|'|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"AT|'EN BOROUGH:", u'ATTENBOROUGH:'), (u"DAVID AT|'EN BOROUGH:", u'DAVID ATTENBOROUGH:'), (u"<i>AT|'EN BOROUGH:", u'<i>ATTENBOROUGH:'), (u'TH REE ', u'THREE '), (u'NARRA TOR', u'NARRATOR'), (u'<i>NARRA TOR', u'<i>NARRATOR'), (u"lt'syour", u"It's your"), (u"It'syour", u"It's your"), (u'Ls ', u'Is '), (u'I ve ', u"I've "), (u'I ii ', u"I'll "), (u'I m ', u"I'm "), (u'Why d ', u"Why'd "), (u'why d ', u"Why'd "), (u'Couldn t ', u"Couldn't "), (u'couldn t ', u"Couldn't "), (u'That s ', u"That's "), (u'that s ', u"That's "), (u'l ', u'I ')]),
+                        'pattern': u"(?um)^(?:lgot\\ it|Don\\,t\\ |Can\\,t\\ |Let\\,s\\ |He\\,s\\ |I\\,m\\ |I\\,ve\\ |I\\,ll\\ |You\\,ll\\ |T\\ hey\\ |T\\ here\\ |W\\ here\\ |M\\ aybe\\ |S\\ hould\\ |\\|was|\\|am\\ |No\\ w\\,\\ |l\\.\\.\\.\\ I\\ |L\\.\\.\\.\\ I\\ |lrn\\ gonna|\\-l\\ don\\'t|l\\ don\\'t|L\\ |\\-L\\ |\\-\\ L\\ |\\-l\\ |\\-\\ l\\ |G0|GO\\ get|GO\\ to|GO\\ for|Ifl|lt\\'ll|Lt\\'ll|IVIa|IVIu|0ne|0nly|0n\\ |lt\\ |Lt\\ |lt\\'s\\ |Lt\\'s\\ |ln\\ |Ln\\ |l\\-in\\ |l\\-impossible|l\\-\\ impossible|L\\-\\ impossible|l\\-isn\\'t\\ |L\\-isn\\'t\\ |l\\-\\ isn\\'t\\ |L\\-\\ isn\\'t\\ |l\\-\\ l\\ |L\\-\\ l\\ |l\\-\\ it\\ |L\\-\\ it\\ |Ls\\ it\\ |Ls\\ there\\ |Ls\\ he\\ |Ls\\ she\\ |L\\ can|l\\ can|L\\'m\\ |L\\'\\ m\\ |Lt\\'\\ s\\ |I\\'\\]I\\ |\\.\\.\\.ls\\ |\\-\\ ls\\ |\\.\\.\\.l\\ |Ill\\ |L\\ hope\\ |\\|\\\u2019E\\'\\$\\ |The\\ y\\'re\\ |\\<i\\>\\/\\ |\\/\\ |\\<i\\>\\/n\\ |\\/n\\ |\\<i\\>Ana\\\u2019\\ |\\<i\\>Ana\\'\\ |\\~\\ |\\<i\\>A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|DAVID\\ A\\'\\|\\'\\|\\'EN\\ BOROUGH\\:|AT\\|\\'EN\\ BOROUGH\\:|DAVID\\ AT\\|\\'EN\\ BOROUGH\\:|\\<i\\>AT\\|\\'EN\\ BOROUGH\\:|TH\\ REE\\ |NARRA\\ TOR|\\<i\\>NARRA\\ TOR|lt\\'syour|It\\'syour|Ls\\ |I\\ ve\\ |I\\ ii\\ |I\\ m\\ |Why\\ d\\ |why\\ d\\ |Couldn\\ t\\ |couldn\\ t\\ |That\\ s\\ |that\\ s\\ |l\\ )"},
+         'EndLines': {'data': OrderedDict([(u', sin', u', sir.'), (u' mothen', u' mother.'), (u" can't_", u" can't."), (u' openiL', u' open it.'), (u' of\ufb02', u' off!'), (u'pshycol', u'psycho!'), (u' i...', u' I...'), (u' L.', u' I.')]),
+                      'pattern': u"(?um)(?:\\,\\ sin|\\ mothen|\\ can\\'t\\_|\\ openiL|\\ of\\\ufb02|pshycol|\\ i\\.\\.\\.|\\ L\\.)$"},
+         'PartialLines': {'data': OrderedDict([(u' /be ', u' I be '), (u" aren '1'", u" aren't"), (u" aren'tyou", u" aren't you"), (u" doesn '1'", u" doesn't"), (u" fr/eno'", u' friend'), (u" fr/eno'.", u' friend.'), (u" haven 'z' ", u" haven't "), (u" haven 'z'.", u" haven't."), (u' I ha ve ', u' I have '), (u" I']I ", u" I'll "), (u' L am', u' I am'), (u' L can', u' I can'), (u" L don't ", u" I don't "), (u' L hate ', u' I hate '), (u' L have ', u' I have '), (u' L like ', u' I like '), (u' L will', u' I will'), (u' L would', u' I would'), (u" L'll ", u" I'll "), (u" L've ", u" I've "), (u' m y family', u' my family'), (u" 's ", u"'s "), (u" shou/dn '1 ", u" shouldn't "), (u" won 'z' ", u" won't "), (u" won 'z'.", u" won't."), (u" wou/c/n 'z' ", u" wouldn't "), (u" wou/c/n 'z'.", u" wouldn't."), (u" wou/dn 'z' ", u" wouldn't "), (u" wou/dn 'z'.", u" wouldn't."), (u'/ did', u'I did'), (u'/ have ', u'I have '), (u'/ just ', u'I just '), (u'/ loved ', u'I loved '), (u'/ need', u'I need'), (u'|was11', u'I was 11'), (u'at Hrst', u'at first'), (u"B ullshiz'", u'Bullshit'), (u'big lunk', u'love you'), (u"can 't", u"can't"), (u"can' t ", u"can't "), (u"can 't ", u"can't "), (u'CHA TTERING', u'CHATTERING'), (u'come 0n', u'come on'), (u'Come 0n', u'Come on'), (u"couldn 't", u"couldn't"), (u"couldn' t ", u"couldn't "), (u"couldn 't ", u"couldn't "), (u"Destin y's", u"Destiny's"), (u"didn 't", u"didn't"), (u"didn' t ", u"didn't "), (u"didn 't ", u"didn't "), (u"Doesn '1'", u"Doesn't"), (u"doesn '1' ", u"doesn't "), (u"doesn '1\u2018 ", u"doesn't "), (u"doesn 't", u"doesn't"), (u"doesn'1' ", u"doesn't "), (u"doesn'1\u2018 ", u"doesn't "), (u"don '1' ", u"don't "), (u"don '1\u2018 ", u"don't "), (u"don '2' ", u"don't "), (u" aren '2'", u" aren't"), (u"aren '2' ", u"aren't "), (u"don '2\u2018 ", u"don't "), (u"don 't", u"don't"), (u"Don' t ", u"Don't "), (u"Don 't ", u"Don't "), (u"don'1' ", u"don't "), (u"don'1\u2018 ", u"don't "), (u"there '5 ", u"there's "), (u'E very', u'Every'), (u'get 0n', u'get on'), (u'go 0n', u'go on'), (u'Go 0n', u'Go on'), (u"H3993' birthday", u'Happy birthday'), (u"hadn 't", u"hadn't"), (u"he 's", u"he's"), (u"He 's", u"He's"), (u'He y', u'Hey'), (u'he)/', u'hey'), (u'He)/', u'Hey'), (u'HEA VY', u'HEAVY'), (u'Henry ll', u'Henry II'), (u'Henry lll', u'Henry III'), (u'Henry Vlll', u'Henry VIII'), (u'Henry Vll', u'Henry VII'), (u'Henry Vl', u'Henry VI'), (u'Hold 0n', u'Hold on'), (u'I am. ls', u'I am. Is'), (u'I d0', u'I do'), (u"I 'm", u"I'm"), (u"I 'rn ", u"I'm "), (u"I 've", u"I've"), (u'I0 ve her', u'love her'), (u'I0 ve you', u'love you'), (u"I02'", u'lot'), (u"I'm sony", u"I'm sorry"), (u"isn' t ", u"isn't "), (u"isn 't ", u"isn't "), (u'K)/le', u'Kyle'), (u'L ook', u'Look'), (u'let me 90', u'let me go'), (u'Let me 90', u'Let me go'), (u"let's 90", u"let's go"), (u"Let's 90", u"Let's go"), (u'lfl had', u'If I had'), (u'lova you', u'love you'), (u'Lova you', u'love you'), (u'lovo you', u'love you'), (u'Lovo you', u'love you'), (u'ls anyone', u'Is anyone'), (u'ls he', u'Is he'), (u'-ls he', u'- Is he'), (u'ls it', u'Is it'), (u'-ls it', u'- Is it'), (u'ls she', u'Is she'), (u'-ls she', u'- Is she'), (u'ls that', u'Is that'), (u'-ls that', u'- Is that'), (u'ls this', u'Is this'), (u'-ls this', u'- Is this'), (u'Maze] tov', u'Mazel tov'), (u"N02' ", u'Not '), (u' of 0ur ', u' of our '), (u' ot mine ', u' of mine '), (u'PLA YING', u'PLAYING'), (u'REPEA TING ', u'REPEATING '), (u'Sa y', u'Say'), (u"she 's", u"she's"), (u"She 's", u"She's"), (u"shouldn 't", u"shouldn't"), (u'sta y', u'stay'), (u'Sta y', u'Stay'), (u'SWO rd', u'Sword'), (u'taka care', u'take care'), (u'Taka care', u'Take care'), (u'the Hrst', u'the first'), (u'toc late', u'too late'), (u'uf me', u'of me'), (u'uf our', u'of our'), (u'wa y', u'way'), (u'Wal-I\\/Iart', u'Wal-Mart'), (u"wasn '1' ", u"wasn't "), (u"Wasn '1' ", u"Wasn't "), (u"wasn '1\u2018 ", u"wasn't "), (u"Wasn '1\u2018 ", u"Wasn't "), (u"wasn 't", u"wasn't"), (u"Wasn 't", u"Wasn't"), (u"we 've", u"we've"), (u"We 've", u"We've"), (u"wem' off", u'went off'), (u"weren 't", u"weren't"), (u"who 's", u"who's"), (u"won 't", u"won't"), (u'would ha ve', u'would have '), (u"wouldn 't", u"wouldn't"), (u"Wouldn 't", u"Wouldn't"), (u'y()u', u'you'), (u'you QUYS', u'you guys'), (u"you' re ", u"you're "), (u"you 're ", u"you're "), (u"you 've", u"you've"), (u"You 've", u"You've"), (u"you' ve ", u"you've "), (u"you 've ", u"you've "), (u'aftera while', u'after a while'), (u'Aftera while', u'After a while'), (u'THUN DERCLAPS', u'THUNDERCLAPS'), (u'(BUZZI N G)', u'(BUZZING)'), (u'[BUZZI N G]', u'[BUZZING]'), (u'(G RU NTING', u'(GRUNTING'), (u'[G RU NTING', u'[GRUNTING'), (u'(G ROWLING', u'(GROWLING'), (u'[G ROWLING', u'[GROWLING'), (u' WAI LS)', u'WAILS)'), (u' WAI LS]', u'WAILS]'), (u'(scu RRYING)', u'(SCURRYING)'), (u'[scu RRYING]', u'[SCURRYING]'), (u'(GRUNT5)', u'(GRUNTS)'), (u'[GRUNT5]', u'[GRUNTS]'), (u'NARRA TOR:', u'NARRATOR:'), (u'(GROAN ING', u'(GROANING'), (u'[GROAN ING', u'[GROANING'), (u'GROAN ING)', u'GROANING)'), (u'GROAN ING]', u'GROANING]'), (u'(LAUGH ING', u'(LAUGHING'), (u'[LAUGH ING', u'[LAUGHING'), (u'LAUGH ING)', u'LAUGHING)'), (u'LAUGH ING]', u'LAUGHING]'), (u'(BU BBLING', u'(BUBBLING'), (u'[BU BBLING', u'[BUBBLING'), (u'BU BBLING)', u'BUBBLING)'), (u'BU BBLING]', u'BUBBLING]'), (u'(SH USHING', u'(SHUSHING'), (u'[SH USHING', u'[SHUSHING'), (u'SH USHING)', u'SHUSHING)'), (u'SH USHING]', u'SHUSHING]'), (u'(CH ILDREN', u'(CHILDREN'), (u'[CH ILDREN', u'[CHILDREN'), (u'CH ILDREN)', u'CHILDREN)'), (u'CH ILDREN]', u'CHILDREN]'), (u'(MURMU RING', u'(MURMURING'), (u'[MURMU RING', u'[MURMURING'), (u'MURMU RING)', u'MURMURING)'), (u'MURMU RING]', u'MURMURING]'), (u'(GU N ', u'(GUN '), (u'[GU N ', u'[GUN '), (u'GU N)', u'GUN)'), (u'GU N]', u'GUN]'), (u'CH ILDREN:', u'CHILDREN:'), (u'STU DENTS:', u'STUDENTS:'), (u'(WH ISTLE', u'(WHISTLE'), (u'[WH ISTLE', u'[WHISTLE'), (u'WH ISTLE)', u'WHISTLE)'), (u'WH ISTLE]', u'WHISTLE]'), (u'U LU LATING', u'ULULATING'), (u'AU DIENCE:', u'AUDIENCE:'), (u'HA WAIIAN', u'HAWAIIAN'), (u'(ARTH UR', u'(ARTHUR'), (u'[ARTH UR', u'[ARTHUR'), (u'ARTH UR)', u'ARTHUR)'), (u'ARTH UR]', u'ARTHUR]'), (u'J EREMY:', u'JEREMY:'), (u'(ELEVA TOR', u'(ELEVATOR'), (u'[ELEVA TOR', u'[ELEVATOR'), (u'ELEVA TOR)', u'ELEVATOR)'), (u'ELEVA TOR]', u'ELEVATOR]'), (u'CONTIN U ES', u'CONTINUES'), (u'WIN D HOWLING', u'WIND HOWLING'), (u'telis me', u'tells me'), (u'Telis me', u'Tells me'), (u'. Ls ', u'. Is '), (u'! Ls ', u'! Is '), (u'? Ls ', u'? Is '), (u'. Lt ', u'. It '), (u'! Lt ', u'! It '), (u'? Lt ', u'? It '), (u'SQMEWH ERE ELSE', u'SOMEWHERE ELSE'), (u' I,m ', u" I'm "), (u' I,ve ', u" I've "), (u' you,re ', u" you're "), (u' you,ll ', u" you'll "), (u' doesn,t ', u" doesn't "), (u' let,s ', u" let's "), (u' he,s ', u" he's "), (u' it,s ', u" it's "), (u' can,t ', u" can't "), (u' Can,t ', u" Can't "), (u' don,t ', u" don't "), (u' Don,t ', u" Don't "), (u"wouldn 'tyou", u"wouldn't you"), (u' lgot it', u' I got it'), (u' you,ve ', u" you've "), (u' I ve ', u" I've "), (u' I ii ', u" I'll "), (u' I m ', u" I'm "), (u' why d ', u" why'd "), (u' couldn t ', u" couldn't "), (u' that s ', u" that's "), (u' i... ', u' I... '), (u"L don't", u"I don't"), (u"L won't", u"I won't"), (u'L should', u'I should'), (u'L had', u'I had'), (u'L happen', u'I happen'), (u"L wasn't", u"I wasnt't"), (u'H i', u'Hi'), (u"L didn't", u"I didn't"), (u'L do', u'I do'), (u'L could', u'I could'), (u'L will', u'I will'), (u'L suggest', u'I suggest'), (u'L reckon', u'I reckon'), (u'L am', u'I am'), (u"L couldn't", u"I couldn't"), (u'L might', u'I might'), (u'L would', u'I would'), (u'L was', u'I was'), (u'L know', u'I know'), (u'L think', u'I think'), (u"L haven't", u"I haven't"), (u'L have ', u'I have'), (u'L want', u'I want'), (u'L can', u'I can'), (u'L love', u'I love'), (u'L like', u'I like')]),
+                          'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ \\/be\\ |\\ aren\\ \\'1\\'|\\ aren\\'tyou|\\ doesn\\ \\'1\\'|\\ fr\\/eno\\'|\\ fr\\/eno\\'\\.|\\ haven\\ \\'z\\'\\ |\\ haven\\ \\'z\\'\\.|\\ I\\ ha\\ ve\\ |\\ I\\'\\]I\\ |\\ L\\ am|\\ L\\ can|\\ L\\ don\\'t\\ |\\ L\\ hate\\ |\\ L\\ have\\ |\\ L\\ like\\ |\\ L\\ will|\\ L\\ would|\\ L\\'ll\\ |\\ L\\'ve\\ |\\ m\\ y\\ family|\\ \\'s\\ |\\ shou\\/dn\\ \\'1\\ |\\ won\\ \\'z\\'\\ |\\ won\\ \\'z\\'\\.|\\ wou\\/c\\/n\\ \\'z\\'\\ |\\ wou\\/c\\/n\\ \\'z\\'\\.|\\ wou\\/dn\\ \\'z\\'\\ |\\ wou\\/dn\\ \\'z\\'\\.|\\/\\ did|\\/\\ have\\ |\\/\\ just\\ |\\/\\ loved\\ |\\/\\ need|\\|was11|at\\ Hrst|B\\ ullshiz\\'|big\\ lunk|can\\ \\'t|can\\'\\ t\\ |can\\ \\'t\\ |CHA\\ TTERING|come\\ 0n|Come\\ 0n|couldn\\ \\'t|couldn\\'\\ t\\ |couldn\\ \\'t\\ |Destin\\ y\\'s|didn\\ \\'t|didn\\'\\ t\\ |didn\\ \\'t\\ |Doesn\\ \\'1\\'|doesn\\ \\'1\\'\\ |doesn\\ \\'1\\\u2018\\ |doesn\\ \\'t|doesn\\'1\\'\\ |doesn\\'1\\\u2018\\ |don\\ \\'1\\'\\ |don\\ \\'1\\\u2018\\ |don\\ \\'2\\'\\ |\\ aren\\ \\'2\\'|aren\\ \\'2\\'\\ |don\\ \\'2\\\u2018\\ |don\\ \\'t|Don\\'\\ t\\ |Don\\ \\'t\\ |don\\'1\\'\\ |don\\'1\\\u2018\\ |there\\ \\'5\\ |E\\ very|get\\ 0n|go\\ 0n|Go\\ 0n|H3993\\'\\ birthday|hadn\\ \\'t|he\\ \\'s|He\\ \\'s|He\\ y|he\\)\\/|He\\)\\/|HEA\\ VY|Henry\\ ll|Henry\\ lll|Henry\\ Vlll|Henry\\ Vll|Henry\\ Vl|Hold\\ 0n|I\\ am\\.\\ ls|I\\ d0|I\\ \\'m|I\\ \\'rn\\ |I\\ \\'ve|I0\\ ve\\ her|I0\\ ve\\ you|I02\\'|I\\'m\\ sony|isn\\'\\ t\\ |isn\\ \\'t\\ |K\\)\\/le|L\\ ook|let\\ me\\ 90|Let\\ me\\ 90|let\\'s\\ 90|Let\\'s\\ 90|lfl\\ had|lova\\ you|Lova\\ you|lovo\\ you|Lovo\\ you|ls\\ anyone|ls\\ he|\\-ls\\ he|ls\\ it|\\-ls\\ it|ls\\ she|\\-ls\\ she|ls\\ that|\\-ls\\ that|ls\\ this|\\-ls\\ this|Maze\\]\\ tov|N02\\'\\ |\\ of\\ 0ur\\ |\\ ot\\ mine\\ |PLA\\ YING|REPEA\\ TING\\ |Sa\\ y|she\\ \\'s|She\\ \\'s|shouldn\\ \\'t|sta\\ y|Sta\\ y|SWO\\ rd|taka\\ care|Taka\\ care|the\\ Hrst|toc\\ late|uf\\ me|uf\\ our|wa\\ y|Wal\\-I\\\\\\/Iart|wasn\\ \\'1\\'\\ |Wasn\\ \\'1\\'\\ |wasn\\ \\'1\\\u2018\\ |Wasn\\ \\'1\\\u2018\\ |wasn\\ \\'t|Wasn\\ \\'t|we\\ \\'ve|We\\ \\'ve|wem\\'\\ off|weren\\ \\'t|who\\ \\'s|won\\ \\'t|would\\ ha\\ ve|wouldn\\ \\'t|Wouldn\\ \\'t|y\\(\\)u|you\\ QUYS|you\\'\\ re\\ |you\\ \\'re\\ |you\\ \\'ve|You\\ \\'ve|you\\'\\ ve\\ |you\\ \\'ve\\ |aftera\\ while|Aftera\\ while|THUN\\ DERCLAPS|\\(BUZZI\\ N\\ G\\)|\\[BUZZI\\ N\\ G\\]|\\(G\\ RU\\ NTING|\\[G\\ RU\\ NTING|\\(G\\ ROWLING|\\[G\\ ROWLING|\\ WAI\\ LS\\)|\\ WAI\\ LS\\]|\\(scu\\ RRYING\\)|\\[scu\\ RRYING\\]|\\(GRUNT5\\)|\\[GRUNT5\\]|NARRA\\ TOR\\:|\\(GROAN\\ ING|\\[GROAN\\ ING|GROAN\\ ING\\)|GROAN\\ ING\\]|\\(LAUGH\\ ING|\\[LAUGH\\ ING|LAUGH\\ ING\\)|LAUGH\\ ING\\]|\\(BU\\ BBLING|\\[BU\\ BBLING|BU\\ BBLING\\)|BU\\ BBLING\\]|\\(SH\\ USHING|\\[SH\\ USHING|SH\\ USHING\\)|SH\\ USHING\\]|\\(CH\\ ILDREN|\\[CH\\ ILDREN|CH\\ ILDREN\\)|CH\\ ILDREN\\]|\\(MURMU\\ RING|\\[MURMU\\ RING|MURMU\\ RING\\)|MURMU\\ RING\\]|\\(GU\\ N\\ |\\[GU\\ N\\ |GU\\ N\\)|GU\\ N\\]|CH\\ ILDREN\\:|STU\\ DENTS\\:|\\(WH\\ ISTLE|\\[WH\\ ISTLE|WH\\ ISTLE\\)|WH\\ ISTLE\\]|U\\ LU\\ LATING|AU\\ DIENCE\\:|HA\\ WAIIAN|\\(ARTH\\ UR|\\[ARTH\\ UR|ARTH\\ UR\\)|ARTH\\ UR\\]|J\\ EREMY\\:|\\(ELEVA\\ TOR|\\[ELEVA\\ TOR|ELEVA\\ TOR\\)|ELEVA\\ TOR\\]|CONTIN\\ U\\ ES|WIN\\ D\\ HOWLING|telis\\ me|Telis\\ me|\\.\\ Ls\\ |\\!\\ Ls\\ |\\?\\ Ls\\ |\\.\\ Lt\\ |\\!\\ Lt\\ |\\?\\ Lt\\ |SQMEWH\\ ERE\\ ELSE|\\ I\\,m\\ |\\ I\\,ve\\ |\\ you\\,re\\ |\\ you\\,ll\\ |\\ doesn\\,t\\ |\\ let\\,s\\ |\\ he\\,s\\ |\\ it\\,s\\ |\\ can\\,t\\ |\\ Can\\,t\\ |\\ don\\,t\\ |\\ Don\\,t\\ |wouldn\\ \\'tyou|\\ lgot\\ it|\\ you\\,ve\\ |\\ I\\ ve\\ |\\ I\\ ii\\ |\\ I\\ m\\ |\\ why\\ d\\ |\\ couldn\\ t\\ |\\ that\\ s\\ |\\ i\\.\\.\\.\\ |L\\ don\\'t|L\\ won\\'t|L\\ should|L\\ had|L\\ happen|L\\ wasn\\'t|H\\ i|L\\ didn\\'t|L\\ do|L\\ could|L\\ will|L\\ suggest|L\\ reckon|L\\ am|L\\ couldn\\'t|L\\ might|L\\ would|L\\ was|L\\ know|L\\ think|L\\ haven\\'t|L\\ have\\ |L\\ want|L\\ can|L\\ love|L\\ like)(?:(?=\\s)|(?=$)|(?=\\b))"},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xa4', u'o'), (u'lVI', u'M'), (u'IVl', u'M'), (u'lVl', u'M'), (u'I\\/I', u'M'), (u'l\\/I', u'M'), (u'I\\/l', u'M'), (u'l\\/l', u'M'), (u'IVIa', u'Ma'), (u'IVIe', u'Me'), (u'IVIi', u'Mi'), (u'IVIo', u'Mo'), (u'IVIu', u'Mu'), (u'IVIy', u'My'), (u' l ', u' I '), (u'l/an', u'lian'), (u'\xb0x\xb0', u'%'), (u'\xc3\xc2s', u"'s"), (u'at/on', u'ation'), (u'lljust', u'll just'), (u"'sjust", u"'s just"), (u'compiete', u'complete'), (u' L ', u' I '), (u'a/ion', u'ation'), (u'\xc2s', u"'s"), (u"'tjust", u"'t just"), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict([(u'H ey.', u'Hey.'), (u'He)\u2019-', u'Hey.'), (u'N0.', u'No.'), (u'-N0.', u'-No.'), (u'Noll', u'No!!'), (u'(G ROANS)', u'(GROANS)'), (u'[G ROANS]', u'[GROANS]'), (u'(M EOWS)', u'(MEOWS)'), (u'[M EOWS]', u'[MEOWS]'), (u'Uaughs]', u'[laughs]'), (u'[chitte rs]', u'[chitters]'), (u'Hil\u2018 it!', u'Hit it!'), (u'<i>Hil\u2018 it!</i>', u'<i>Hit it!</i>'), (u'ISIGHS]', u'[SIGHS]')]),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'$COff$', u'scoffs'), (u'$ergei', u'Sergei'), (u"$'llOp", u'Stop'), (u"/'//", u"I'll"), (u"/'/I", u"I'll"), (u'/ennifer', u'Jennifer'), (u'/got', u'I got'), (u'/have', u'I have'), (u'/hope', u'I hope'), (u'/just', u'I just'), (u'/love', u'I love'), (u"/'m", u"I'm"), (u'/mmerse', u'immerse'), (u'/nsu/ts', u'Insults'), (u'/ong', u'long'), (u'/ook', u'look'), (u"/t's", u"It's"), (u"/'ve", u"I've"), (u"\\/\\/e'd", u"We'd"), (u"\\/\\/e're", u"We're"), (u"\\/\\/e've", u"We've"), (u'\\/\\/hat', u'What'), (u"\\/\\/here'd", u"Where'd"), (u'\\/\\/hoo', u'Whoo'), (u'\\/\\/hy', u'Why'), (u"\\/\\/hy'd", u"Why'd"), (u"\\/\\le're", u"We're"), (u'\\/Ve', u'We'), (u"\\Ne're", u"We're"), (u"\\Nhat's", u"What's"), (u"\\Nhere's", u"Where's"), (u"|'mjust", u"I'm just"), (u'\xa4ff', u'off'), (u'\xa4Id', u'old'), (u'\xa4Ids', u'olds'), (u'\xa4n', u'on'), (u'\xa4ne', u'one'), (u'\xa4nly', u'only'), (u'\xa4pen', u'open'), (u'\xa4r', u'or'), (u'\xa4rder', u'order'), (u'\xa4ther', u'other'), (u'\xa4ur', u'our'), (u'\xa4ut', u'out'), (u'\xa4ver', u'over'), (u'\xa4wn', u'own'), (u"\u20acV\u20acI'y", u'every'), (u"0'clock", u"o'clock"), (u'0f', u'of'), (u'0fEngland', u'of England'), (u'0fft0', u'off to'), (u'0l/er', u'over'), (u'0n', u'on'), (u'0ne', u'one'), (u"0ne's", u"one's"), (u'0r', u'or'), (u'0rders', u'orders'), (u"0thers'", u"others'"), (u'0ut', u'out'), (u"0utlaw's", u"outlaw's"), (u"0utlaws'", u"outlaws'"), (u'0ver', u'over'), (u'13oos', u'1300s'), (u'18oos', u'1800s'), (u'195os', u'1950s'), (u"1et's", u"let's"), (u'1o', u'10'), (u'1oo', u'100'), (u'1ooth', u'100th'), (u'1oth', u'10th'), (u'2E_', u'2E.'), (u"2'IST", u'21ST'), (u"2'Ist_", u"2'1st."), (u'2o', u'20'), (u'2oth', u'20th'), (u'3o', u'30'), (u'3oth', u'30th'), (u'4o', u'40'), (u'4os', u'40s'), (u'4oth', u'40th'), (u'50rry', u'sorry'), (u'5o', u'50'), (u'5oth', u'50th'), (u'6o', u'60'), (u'6os', u'60s'), (u"'6os", u"'60s"), (u'6oth', u'60th'), (u'7o', u'70'), (u"'7os", u"'70s"), (u'7oth', u'70th'), (u'8o', u'80'), (u"'8os", u"'80s"), (u'8oth', u'80th'), (u'9/aim', u'alarm'), (u'9o', u'90'), (u'9oth', u'90th'), (u'9UnShQt', u'gunshot'), (u'a//', u'all'), (u'a/bum', u'album'), (u'a/so', u'also'), (u'A/ways', u'Always'), (u'abcut', u'about'), (u'aboutjoining', u'about joining'), (u'aboutposh', u'about posh'), (u'aboutus', u'about us'), (u'aboutyou', u'about you'), (u'accldent', u'accident'), (u'Acool', u'A cool'), (u'afier', u'after'), (u'affraid', u'afraid'), (u'Afriend', u'A friend'), (u'afterall', u'after all'), (u'afterthe', u'after the'), (u'afulcrum', u'a fulcrum'), (u'Afunny', u'A funny'), (u'aga/nst', u'against'), (u'ahsolutes', u'absolutes'), (u'AI_I_', u'ALL'), (u'AIien', u'Alien'), (u'AIex', u'Alex'), (u'AII', u'All'), (u'AIIan', u'Allan'), (u'AIIow', u'Allow'), (u'AIive', u'Alive'), (u"ain'tgotno", u"ain't got no"), (u"Ain'tgotno", u"Ain't got no"), (u'airstrike', u'air strike'), (u'AIVIBULANCE', u'AMBULANCE'), (u'ajob', u'a job'), (u'ajockey_', u'a jockey.'), (u'ajoke', u'a joke'), (u'Ajoke', u'A joke'), (u'ajoking', u'a joking'), (u'al/', u'all'), (u'al/en', u'alien'), (u'alittle', u'a little'), (u'allgasp', u'all gasp'), (u'alljustforshow', u'all just for show'), (u"aln't", u"ain't"), (u'alot', u'a lot'), (u'Alot', u'A lot'), (u'An5wer', u'Answer'), (u'Andit', u'And it'), (u"Andit's", u"And it's"), (u'andl', u'and I'), (u'andlaughs', u'and laughs'), (u'andleave', u'and leave'), (u'andthe', u'and the'), (u'andyou', u'and you'), (u'Andyou', u'And you'), (u'ANNOUNC/NG', u'ANNOUNCING'), (u'anotherstep', u'another step'), (u'ANSWER/NG', u'ANSWERING'), (u'answerwhat', u'answer what'), (u'antiquejoke', u'antique joke'), (u"anyhcdy's", u"anybody's"), (u'Anyidea', u'Any idea'), (u"anyone's_", u"anyone's."), (u'apejust', u'ape just'), (u'ARABlc', u'ARABIC'), (u"aren't_", u"aren't."), (u"arerl't", u"aren't"), (u"Arnsteln's", u"Arnstein's"), (u'atleast', u'at least'), (u'Atough', u'A tough'), (u'Awhole', u'A whole'), (u'awoman', u'a woman'), (u'Awoman', u'A woman'), (u'barelytalked', u'barely talked'), (u'bcat', u'boat'), (u'Bcllvla', u'Bolivia'), (u'bcmb', u'bomb'), (u'bcmbs', u'bombs'), (u'be//y', u'belly'), (u'becuase', u'because'), (u"Beep/'ng", u'Beeping'), (u'bejumpy', u'be jumpy'), (u'besldes', u'besides'), (u'bestfriend', u'best friend'), (u'bestguy', u'best guy'), (u'bestjob', u'best job'), (u'BIack', u'Black'), (u'BIess', u'Bless'), (u'bigos___', u'bigos...'), (u'BIame', u'Blame'), (u'BIind', u'Blind'), (u'BIood', u'Blood'), (u'BIue', u'Blue'), (u'BLOVVS', u'BLOWS'), (u'blowholel', u'blowhole!'), (u'blt', u'bit'), (u'Bo99', u'Bogg'), (u'bodiedyoung', u'bodied young'), (u'breakf\xe9wtl', u'breakfast!'), (u'bulldozlng', u'bulldozing'), (u'butjust', u'but just'), (u'butl', u'but I'), (u'Butl', u'But I'), (u'butljust', u'but I just'), (u"Butljustcan'tgetenough", u"But I just can't get enough"), (u"Butyou're", u"But you're"), (u'buythem', u'buy them'), (u'buyyou', u'buy you'), (u'byjust', u'by just'), (u'bythe', u'by the'), (u"C/latter/'/7g", u'Chattering'), (u'ca///ng', u'calling'), (u'ca/I', u'call'), (u'call/ng', u'calling'), (u'callyou', u'call you'), (u'can*t', u"can't"), (u"can'i", u"can't"), (u"can'I", u"can't"), (u'canlgetyou', u'canI get you'), (u'cannotchange', u'cannot change'), (u'cannut', u'cannot'), (u"can'T", u"can't"), (u"can't_", u'Crucially'), (u"can'tjust", u"can't just"), (u"can'tletgo", u"can't let go"), (u'Car0l', u'Carol'), (u'Carhorn', u'Car horn'), (u'carrled', u'carried'), (u'Ccug', u'Coug'), (u'Ccugs', u'Cougs'), (u'Ccver', u'Cover'), (u'cellularchange', u'cellular change'), (u'cff', u'off'), (u'cfycu', u'of you'), (u'cfycur', u'of your'), (u'Ch/rping', u'Chirping'), (u'chaletgirl', u'chalet girl'), (u'changejobs', u'change jobs'), (u'Charliejust', u'Charlie just'), (u"Chatter/'rtg", u'Chattering'), (u'CHATTERWG', u'CHATTERING'), (u'Chequeredlove', u'Chequered love'), (u'cHIRPINcs', u'CHIRPING'), (u'chjldishness', u'childishness'), (u'chlldrcn', u'children'), (u'chlldren', u'children'), (u'chocolatte', u'chocolate'), (u'Cho/r', u'Choir'), (u'cHucKl_Es', u'CHUCKLES'), (u'CIark', u'Clark'), (u'CIear', u'Clear'), (u'circumcised_', u'circumcised.'), (u'ckay', u'okay'), (u'cl_osEs', u'CLOSES'), (u'CLATTERWG', u'CLATTERING'), (u'cn', u'on'), (u'cne', u'one'), (u'cnes', u'ones'), (u'Coincidenta//y', u'Coincidentally'), (u'COm\u20ac', u'Come'), (u'comp/etey', u'completely'), (u'complainingabout', u'complaining about'), (u'coms', u'come'), (u'cond/lion', u'condition'), (u'confdence', u'confidence'), (u'conhrmed', u'confirmed'), (u'connrm', u'confirm'), (u'Consecutivelyl', u'Consecutively!'), (u'COUGH5', u'COUGHS'), (u'CouGHING', u'COUGHING'), (u"couIdn't", u"couldn't"), (u'couldjust', u'could just'), (u"couldn'T", u"couldn't"), (u"couldn'tjust", u"couldn't just"), (u'Couldyou', u'Could you'), (u'crappyjob', u'crappy job'), (u'CRAsHING', u'CRASHING'), (u'crder', u'order'), (u'Crowdcheers', u'Crowd cheers'), (u'Cruoially', u'Crucially'), (u'cther', u'other'), (u'cuuld', u'could'), (u'cver', u'over'), (u"d/'dn't", u"didn't"), (u'd/squietude', u'disquietude'), (u"D\xa4esn't", u"Doesn't"), (u"d\xa4n'i", u"don't"), (u"d\xa4n't", u"don't"), (u'd\xb09', u'dog'), (u'd0', u'do'), (u'D0', u'Do'), (u"D0asn't", u"Doesn't"), (u"Dad'//", u"Dad'll"), (u'dairyjust', u'dairy just'), (u'Dar//ng', u'Darling'), (u'dc', u'do'), (u'Dcbby', u'Dobby'), (u"dccsn't", u"doesn't"), (u'dcctcr', u'doctor'), (u'Dces', u'Does'), (u'dcgs', u'dogs'), (u'dcing', u'doing'), (u"dcn'I", u"don't"), (u"dcn't", u"don't"), (u"Dcn't", u"Don't"), (u'dcughnut', u'doughnut'), (u'declslons', u'decisions'), (u'deedhas', u'deed has'), (u'Dehnitely', u'Definitely'), (u'desewes', u'deserves'), (u'desperate/\xbby', u'desperately'), (u'D\ufb02nk', u'Drink'), (u'DIAl_lNcs', u'DIALING'), (u"didn'!", u"didn't"), (u'didnt', u"didn't"), (u"didn'T", u"didn't"), (u"dIdn't", u"didn't"), (u"didn't_", u"didn't."), (u'didrft', u"didn't"), (u"didrl't", u"didn't"), (u'didyou', u'did you'), (u'divorcing_', u'divorcing.'), (u'dld', u'did'), (u"dldn't", u"didn't"), (u'dlfflcull', u'difficult'), (u'dlg', u'dig'), (u'dlsobeyed', u'disobeyed'), (u"doasn't", u"doesn't"), (u"Doasn't", u"Doesn't"), (u'doctoh', u'doctor'), (u'Doctor___tell', u'Doctor... tell'), (u'doesnt', u"doesn't"), (u"doesn'T", u"doesn't"), (u"doesri't", u"doesnt't"), (u'doesrt', u"doesn't"), (u'Doesrt', u"Doesn't"), (u'doit', u'do it'), (u'dojust', u'do just'), (u'don*t', u"don't"), (u'donejobs', u'done jobs'), (u"don'i", u"don't"), (u"don'l", u"don't"), (u"Don'l", u"Don't"), (u'Donllook', u"Don't look"), (u'dont', u"don't"), (u"don'T", u"don't"), (u"don'tcare", u"don't care"), (u"don'tjoke", u"don't joke"), (u"Don'tjudge", u"Don't judge"), (u"don'tjust", u"don't just"), (u"Don'tjust", u"Don't just"), (u"Don'tlet", u"Don't let"), (u"don'tlhink", u"don't think"), (u"don'tpush", u"don't push"), (u"Don'tyou", u"Don't you"), (u'DonWlook', u"Don't look"), (u'Dooropens', u'Door opens'), (u'doorshuts', u'door shuts'), (u'dothat', u'do that'), (u'dothis', u'do this'), (u'Drinkthis', u'Drink this'), (u'dumbass', u'dumb-ass'), (u'dumbto', u'dumb to'), (u"dun't", u"don't"), (u'E//e', u'Elle'), (u'E9YPt', u'Egypt'), (u"ea/'t/7", u'earth'), (u'eart/7', u'earth'), (u"efi'/'c/'ent", u'efficient'), (u'EN<3LlsH', u'ENGLISH'), (u'Enjoythe', u'Enjoy the'), (u'Erv\\/an', u'Erwan'), (u"Erv\\/an's", u"Erwan's"), (u'etemity', u'eternity'), (u'ev/I', u'evil'), (u'eve/yone', u'everyone'), (u"even/body's", u"everybody's"), (u'eversay', u'ever say'), (u'Everymonth', u'Every month'), (u'everythings', u"everything's"), (u"Everythirlg's", u'Everything\u2019s'), (u"Everythlng's", u"Everything's"), (u'Everytime', u'Every time'), (u'Exac\ufb02y', u'Exactly'), (u'ExacUy_', u'Exactly.'), (u'excitedshrieking', u'excited shrieking'), (u'ExcLAllvls', u'EXCLAIMS'), (u'exploatation', u'exploitation'), (u'expreusion', u'expression'), (u'fairthat', u'fair that'), (u'Fathef', u'Father'), (u'fatherfigure', u'father figure'), (u'FBl', u'FBI'), (u'fcrebcdlng', u'foreboding'), (u'fcreverjudges', u'forever judges'), (u'fcund', u'found'), (u'feeleverything', u'feel everything'), (u'feelsweet', u'feel sweet'), (u"fiam/'/y", u'family'), (u'\ufb01ngernail', u'fingernail'), (u'finishedjunior', u'finished junior'), (u'FIynn', u'Flynn'), (u'flll', u'fill'), (u'flra', u'fira'), (u'Flylng', u'Flying'), (u'Fnends', u'Fiends'), (u'fo/low', u'follow'), (u'fonzvard', u'forward'), (u'fora', u'for a'), (u'Fora', u'For a'), (u'forajob', u'for a job'), (u'forAmerica', u'for America'), (u'forNew', u'for New'), (u'forone', u'for one'), (u'forso', u'for so'), (u'Forsuch', u'For such'), (u'forsunburns', u'for sunburns'), (u'forthe', u'for the'), (u'Foryears', u'For years'), (u'foryou', u'for you'), (u'Foudeen', u'Fouteen'), (u'Fou\ufb02een', u'Fourteen'), (u'FourSeasons', u'Four Seasons'), (u'fr/ends', u'friends'), (u'freezerfood', u'freezer food'), (u'F\xfchrerfeels', u'F\xfchrer feels'), (u'furthernotice', u'further notice'), (u'furyou', u'for you'), (u'G0', u'Go'), (u'g0in9', u'going'), (u'gamlenias', u'gardenias'), (u'GAsPING', u'GASPING'), (u'gc', u'go'), (u'gcing', u'going'), (u'gcnna', u'gonna'), (u'Gcnna', u'Gonna'), (u'gct', u'get'), (u'Gct', u'Got'), (u'genercsity', u'generosity'), (u'generosityn', u'generosity"'), (u'getjust', u'get just'), (u'g\ufb02ing', u'going'), (u'gi\ufb02friend', u'girlfriend'), (u'gir/', u'girl'), (u"gir/s'boarding", u"girls' boarding"), (u'giris', u'girls'), (u'gLlyS', u'guys'), (u'glum_', u'glum.'), (u'gnyone', u'anyone'), (u'golng', u'going'), (u'goodboyand', u'good boy and'), (u'goodjob', u'good job'), (u'gOt', u'got'), (u'gotjumped', u'got jumped'), (u'gotmyfirstinterview', u'got my first interview'), (u'grandjury', u'grand jury'), (u'greatjob', u'great job'), (u'Greatjobl', u'Great job!'), (u'grinco', u'gringo'), (u'GRoANING', u'GROANING'), (u'GRUNUNG', u'GRUNTING'), (u'gu', u'go'), (u'gunna', u'gonna'), (u'guyjumped', u'guy jumped'), (u'guyjust', u'guy just'), (u'gUyS', u'guys'), (u'_H6Y-', u'- Hey!'), (u'H\u20acY', u'Hey'), (u'H0we\xb7ver', u'However'), (u'halftheir', u'half their'), (u'hapPY', u'happy'), (u'hasrt', u"hasn't"), (u'Hasrt', u"Hasn't"), (u"haven'tspokerl", u"haven't spoken"), (u'hcle', u'hole'), (u'hcme', u'home'), (u'hcmes', u'homes'), (u'hcpe', u'hope'), (u'hctel', u'hotel'), (u'hcurs', u'hours'), (u'Hcw', u'How'), (u'he/ps', u'helps'), (u'hearjokestonight', u'hear jokes tonight'), (u'hearme', u'hear me'), (u'Hefell', u'He fell'), (u"he'II", u"he'll"), (u"He'II", u"He'll"), (u'HeII0', u'Hello'), (u"He'Il", u"He'll"), (u'Hejust', u'He just'), (u"He'lI", u"He'll"), (u'HelIo', u'Hello'), (u'hellc', u'hello'), (u'HellO', u'Hello'), (u'herboyfr/end', u'her boyfriend'), (u'herflesh', u'her flesh'), (u'herfollov\\/ed', u'her followed'), (u'herjob_', u'her job.'), (u'HerrSchmidt', u'Herr Schmidt'), (u'herwith', u'her with'), (u'HeY\xb7', u'Hey.'), (u'HeyJennifer', u'Hey Jennifer'), (u'hiddsn', u'hidden'), (u'hisjunk', u'his junk'), (u'Hitlershare', u'Hitler share'), (u'Hlneed', u"I'll need"), (u'Hnally', u'finally'), (u'Hnishing', u'finishing'), (u'HOId', u'Hold'), (u'hOIes', u'holes'), (u'HONMNG', u'HONKING'), (u'honorthe', u'honor the'), (u'honoryou', u'honor you'), (u'honoryour', u'honor your'), (u"Hov\\/'s", u"How's"), (u"Hov\\/'S", u"How's"), (u'HovvLING', u'HOWLING'), (u'howit', u'how it'), (u"HoW's", u"How's"), (u'howto', u'how to'), (u"Hs's", u"He's"), (u'hurtyou', u'hurt you'), (u'I/erilj/', u'verify'), (u'I/fe', u'life'), (u'I\\/I', u'M'), (u'I\\/Ian', u'Man'), (u'I\\/Iathies', u'Mathies'), (u'I\\/Ie', u'Me'), (u'I\\/Iommy', u'Mommy'), (u'I\\/Ir', u'Mr'), (u'I\\/Ir.', u'Mr.'), (u'I\\/ly', u'My'), (u'I3EEPING', u'BEEPING'), (u'I3LARING', u'BLARING'), (u'Iacings', u'lacings'), (u'Iaid', u'laid'), (u'Iam', u'I am'), (u'Iand', u'land'), (u'Ianding', u'landing'), (u'Iast', u'last'), (u'Iate', u'late'), (u'Icad', u'load'), (u'Icading', u'loading'), (u'Ican', u'I can'), (u'Iccked', u'locked'), (u'Icng', u'long'), (u'Icsing', u'losing'), (u'Icslng', u'losing'), (u'Idid', u'I did'), (u"Ididn't", u"I didn't"), (u'Ido', u'I do'), (u"Idon'i", u"I don't"), (u"Idon't", u"I don't"), (u"Idon'tthink", u"I don't think"), (u"I'E'$", u"It's"), (u'Ieamed', u'learned'), (u'Ieapt', u'leapt'), (u'Iearned', u'learned'), (u'Ieast', u'least'), (u'Ieave', u'leave'), (u'Ied', u'led'), (u'Ieft', u'left'), (u"Ieg's", u"leg's"), (u'Iess', u'less'), (u'Iet', u'let'), (u"Iet's", u"let's"), (u"Iet'sjust", u"let's just"), (u'if/just', u'if I just'), (u'Ifear', u'I fear'), (u'Ifeared', u'I feared'), (u'Ifeel', u'I feel'), (u"ifI'||", u"if I'll"), (u"ifI'd", u"if I'd"), (u"ifI'II", u"if I'll"), (u"ifI'll", u"if I'll"), (u"ifI'm", u"if I'm"), (u'Ifinally', u'I finally'), (u"ifI've", u"if I've"), (u'ifl', u'if I'), (u'Iforgot', u'I forgot'), (u'Ifound', u'I found'), (u'ifshe', u'if she'), (u"ifthat's", u"if that's"), (u'ifthe', u'if the'), (u'Ifthe', u'If the'), (u"ifthere's", u"if there's"), (u'Ifthey', u'If they'), (u'ifwe', u'if we'), (u'Ifwe', u'If we'), (u'Ifycu', u'If you'), (u'ifyou', u'if you'), (u'Ifyou', u'If you'), (u'ifyuu', u'if you'), (u'Iget', u'I get'), (u'Igot', u'I got'), (u'Igotta', u'I gotta'), (u'Igotyou', u'I got you'), (u'Iguess', u'I guess'), (u'Iguessljust', u'I guess I just'), (u'Ihad', u'I had'), (u"Ihat's", u"that's"), (u'Ihave', u'I have'), (u'Iheard', u'I heard'), (u"ihere's", u"there's"), (u"ihey've", u"they've"), (u'Ihope', u'I hope'), (u'ii/Iary', u'Mary'), (u'ii/Ir', u'Mr'), (u'ii/Ir.', u'Mr.'), (u'ii/love', u'Move'), (u'Iife', u'life'), (u"I'II", u"I'll"), (u'Iike', u'like'), (u"I'Il", u"I'll"), (u'Iine', u'line'), (u'iirst', u'first'), (u"ii's", u"it's"), (u"Ii's", u"It's"), (u'Iiterallyjumped', u'literally jumped'), (u'Ijoined', u'I joined'), (u'Ijust', u'I just'), (u'Iknew', u'I knew'), (u'Iknow', u'I know'), (u'Ile', u'lie'), (u'Ileft', u'I left'), (u"I'lldo", u"I'll do"), (u"I'llmake", u"I'll make"), (u'Ilons', u'lions'), (u'Ilove', u'I love'), (u"I'mjust", u"I'm just"), (u'Inconceivablel', u'Inconceivable!'), (u'infact', u'in fact'), (u'Infact', u'In fact'), (u'in\ufb02uence', u'influence'), (u'infront', u'in front'), (u'injust', u'in just'), (u'insc\ufb01p\ufb01ons', u'inscriptions'), (u'insolencel', u'insolence!'), (u'intc', u'into'), (u'internationaljudges', u'international judges'), (u'inthe', u'in the'), (u'Iockdown', u'lockdown'), (u'Iong', u'long'), (u'Iongships', u'longships'), (u'Iook', u'look'), (u'Iookjust', u'look just'), (u'Iooklng', u'looking'), (u'Iooks', u'looks'), (u'Ioose', u'loose'), (u"Iord's", u"lord's"), (u'Iose', u'lose'), (u'Ioser', u'loser'), (u'Ioss', u'loss'), (u'Iost', u'lost'), (u'Iot', u'lot'), (u"Iot's", u"lot's"), (u'Iousyjob', u'lousy job'), (u'Iove', u'love'), (u'Ioves', u'loves'), (u'Iowlife', u'lowlife'), (u'Ipaid', u'I paid'), (u'Iquit', u'I quit'), (u'Ireallythinkthis', u'I really think this'), (u"I'rn", u"I'm"), (u'Isaw', u'I saw'), (u'Isayt/1e', u'I say the'), (u'isjust', u'is just'), (u"isn'i", u"isn't"), (u"isn't_", u"isn't."), (u'Isthis', u'Is this'), (u'Istill', u'I still'), (u'Istumblod', u'I stumbled'), (u'Itake', u'I take'), (u'itdown', u'it down'), (u'Iteach', u'I teach'), (u'Itfeels', u'It feels'), (u'ithave', u'it have'), (u'Ithink', u'I think'), (u'Ithinkthat', u'I think that'), (u'Ithinkthis', u'I think this'), (u"Ithinkyou're", u"I think you're"), (u'Ithlnk', u'I think'), (u'Ithoguht', u'I thought'), (u'Ithought', u'I thought'), (u'Ithoughtl', u'I thought I'), (u"it'II", u"it'll"), (u"It'II", u"It'll"), (u"it'Il", u"it'll"), (u"It'Il", u"It'll"), (u'itin', u'it in'), (u'itjust', u'it just'), (u'Itjust', u'It just'), (u"it'lI", u"it'll"), (u"It'lI", u"It'll"), (u"It'llhappen", u"It'll happen"), (u"it'lljust", u"it'll just"), (u'Itold', u'I told'), (u'Itook', u'I took'), (u'itout', u'it out'), (u"it'S", u"it's"), (u"it'sjinxed", u"it's jinxed"), (u"it'sjust", u"it's just"), (u"It'sjust", u"It's just"), (u'itso', u'it so'), (u'Ittends', u'It tends'), (u"Itwasn't", u"It wasn't"), (u'Iuckier', u'luckier'), (u'IV|oney', u'Money'), (u"IV|oney's", u"Money's"), (u"I'va", u"I've"), (u"I'Ve", u"I've"), (u'IVIan', u'Man'), (u'IVIAN', u'MAN'), (u'IVIarch', u'March'), (u"IVIarci's", u"Marci's"), (u'IVIarko', u'Marko'), (u'IVIe', u'Me'), (u"IVIine's", u"Mine's"), (u'IVImm', u'Mmm'), (u'IVIoney', u'Money'), (u'IVIr.', u'Mr.'), (u'IVIrs', u'Mrs'), (u'IVIuch', u'Much'), (u'IVIust', u'Must'), (u'IVIy', u'My'), (u'IVlacArthur', u'MacArthur'), (u"IVlacArthur's", u"MacArthur's"), (u'IVlcBride', u'McBride'), (u'IVlore', u'More'), (u'IVlotherfucker_', u'Motherfucker.'), (u'IVlr', u'Mr'), (u'IVlr.', u'Mr.'), (u'IVlr_', u'Mr.'), (u'IVlust', u'Must'), (u'IVly', u'My'), (u'Iwake', u'I wake'), (u'Iwant', u'I want'), (u'Iwanted', u'I wanted'), (u'Iwas', u'I was'), (u'Iwasjust', u'I was just'), (u'Iwasjustu', u'I was just...'), (u'Iwill', u'I will'), (u'Iwish', u'I wish'), (u"Iwon't", u"I won't"), (u'Iworked', u'I worked'), (u'Iwould', u'I would'), (u'jalapeno', u'jalape\xf1o'), (u'Jaokson', u'Jackson'), (u'Jascn', u'Jason'), (u'jcke', u'joke'), (u'jennifer', u'Jennifer'), (u'joseph', u'Joseph'), (u'jsut', u'just'), (u'Jumpthem', u'Jump them'), (u'jusi', u'just'), (u'jusl', u'just'), (u'justjudge', u'just judge'), (u'justleave', u'just leave'), (u'Justletgo', u'Just let go'), (u'kidsjumped', u'kids jumped'), (u'kiokflip', u'kickflip'), (u'knowjust', u'know just'), (u'knowthat', u'know that'), (u'knowthis', u'know this'), (u'knowwhat', u'know what'), (u'knowyet', u'know yet'), (u'knowyourlove', u'know your love'), (u'korean', u'Korean'), (u'L/ght', u'Light'), (u'L/kes', u'Likes'), (u'L\\/Ianuela', u'Manuela'), (u'L\\/Ianuelal', u'Manuela!'), (u'l\\/Iauzard', u'Mauzard'), (u'l\\/I\xe9lanie', u'M\xe9lanie'), (u'L\\/I\xe9lanie', u'M\xe9lanie'), (u'l\\/Iom', u'Mom'), (u'l\\/Iommy', u'Mommy'), (u'l\\/Ir', u'Mr'), (u'l\\/Ir.', u'Mr.'), (u'l\\/Is', u'Ms'), (u'l\\/ly', u'My'), (u'l_AuGHING', u'LAUGHING'), (u'l\u2018m', u"I'm"), (u'Laml6', u'I am l6'), (u'Lcad', u'Load'), (u'lcan', u'I can'), (u"lcan't", u"I can't"), (u"lcarl't_", u"I can't."), (u'Lcve', u'Love'), (u"l'd", u"I'd"), (u"L'd", u"I'd"), (u'ldid', u'I did'), (u'Ldid', u'I did'), (u'ldiot', u'Idiot'), (u"L'djump", u"I'd jump"), (u"ldon't", u"I don't"), (u"Ldon't", u"I don't"), (u'Lefs', u"Let's"), (u"Let'sjust", u"Let's just"), (u'lf', u'if'), (u'Lf', u'If'), (u'lfeelonelung', u'I feel one lung'), (u'lfthey', u'if they'), (u'lfyou', u'If you'), (u'Lfyou', u'If you'), (u"lfyou're", u"If you're"), (u'lget', u'I get'), (u'lgive', u'I give'), (u'Li/0/Academy', u'Lilly Academy'), (u'li/lr.', u'Mr.'), (u'ligature___', u'ligature...'), (u"l'II", u"I'll"), (u"l'Il", u"I'll"), (u'ljust', u'I just'), (u'Ljust', u'I just'), (u"ll/Iommy's", u"Mommy's"), (u'll/lajor', u'Major'), (u'Ll/lajor', u'Major'), (u'll/layans', u'Mayans'), (u"l'lI", u"I'll"), (u"l'll", u"I'll"), (u"L'll", u"I'll"), (u"l'lljust", u"I'll just"), (u"L'lltake", u"I'll take"), (u'llte', u'lite'), (u"l'm", u"I'm"), (u"L'm", u"I'm"), (u'Lmean', u'I mean'), (u"l'mjust", u"I'm just"), (u'ln', u'In'), (u'lN', u'IN'), (u'lNAuDll3LE', u'INAUDIBLE'), (u'LNAuDll3LE', u'INAUDIBLE'), (u'LNDlsTINcT', u'INDISTINCT'), (u'lneed', u'I need'), (u'lostyou', u'lost you'), (u'Loudmusic', u'Loud music'), (u'lraq', u'Iraq'), (u"lRA's", u"IRA's"), (u'Lrenka', u'Irenka'), (u'Lrn', u"I'm"), (u'lRS', u'IRS'), (u'lsabella', u'Isabella'), (u"lsn't", u"isn't"), (u"Lsn't", u"Isn't"), (u"Lst's", u"Let's"), (u'lsuppose', u'I suppose'), (u'lt', u'It'), (u'ltake', u'I take'), (u'ltell', u'I tell'), (u'lthink', u'I think'), (u'Lthink', u'I think'), (u'lthink___', u'I think...'), (u"lt'II", u"It'll"), (u"lt'Il", u"It'll"), (u'ltjammed_', u'It jammed.'), (u"lt'll", u"It'll"), (u'ltold', u'I told'), (u"lt's", u"It's"), (u"lT'S", u"IT'S"), (u"Lt'S", u"It's"), (u"Lt'sjust", u"It's just"), (u"lv\\/asn't", u"I wasn't"), (u"l've", u"I've"), (u"L've", u"I've"), (u'lVIan', u'Man'), (u'lVIcHenry', u'McHenry'), (u'lVIr.', u'Mr.'), (u'lVlacArthur', u'MacArthur'), (u'LVlore', u'More'), (u'lVlr', u'Mr'), (u'lVlr.', u'Mr.'), (u'lvluslc', u'MUSIC'), (u'lVlust', u'Must'), (u'LVly', u'Lily'), (u'lwaited', u'I waited'), (u'lwamoto', u'Iwamoto'), (u'lwant', u'I want'), (u'lwanted', u'I wanted'), (u'lwas', u'I was'), (u'lwill', u'I will'), (u"lwon't", u"I won't"), (u'lworked', u'I worked'), (u'lwould', u'I would'), (u"lwould've", u"I would've"), (u'lx/Iorning', u'Morning'), (u'M/dd/e', u'Middle'), (u'm/g/7ty', u'mighty'), (u'MACH/NE', u'MACHINE'), (u'MacKenz/e', u'MacKenzie'), (u'majorjackpot', u'major jackpot'), (u'majormuscle', u'major muscle'), (u'Manuela_', u'Manuela.'), (u'maste/y', u'mastery'), (u'Masturhate', u'Masturbate'), (u'Mattei_', u'Mattei.'), (u'mayjust', u'may just'), (u'mbecause', u'"because'), (u'McCa/Iister', u'McCallister'), (u'McCallisler', u'McCallister'), (u'Mccallister', u'McCallister'), (u'Mccallisters', u'McCallisters'), (u"mcm's", u"mom's"), (u'mcney', u'money'), (u'mcral', u'moral'), (u'mcre', u'more'), (u'mcve', u'move'), (u'mejust', u'me just'), (u'Mexioo', u'Mexico'), (u'mi//<', u'milk'), (u'misfartune', u'misfortune'), (u'Ml6', u'MI6'), (u'Mlnd', u'Mind'), (u"Mock/'ngbl'rd", u'Mockingbird'), (u"mOI'\u20ac", u'more'), (u'Mom_', u'Mom.'), (u'monkeyback', u'monkey back'), (u'move___l', u'move... I'), (u'moveto', u'move to'), (u'mustknock', u'must knock'), (u'Myheart', u'My heart'), (u'myjch', u'my job'), (u'myjet', u'my jet'), (u'myjob', u'my job'), (u'Myjob', u'My job'), (u"myjob's", u"my job's"), (u'mylife', u'my life'), (u'Mynew', u'My new'), (u'myown', u'my own'), (u'mypants', u'my pants'), (u'myselli', u'myself'), (u'Myshoes', u'My shoes'), (u'mysong', u'my song'), (u'mytemper', u'my temper'), (u'mythumb', u'my thumb'), (u'Myworld', u'My world'), (u'N0', u'No'), (u'narne', u'name'), (u'Natians', u'Nations'), (u'naTve', u'naive'), (u'nc', u'no'), (u'Nc', u'No'), (u'ncne', u'none'), (u'Ncrth', u'North'), (u'ncw', u'new'), (u'Ncw', u'Now'), (u'needyou', u'need you'), (u'neighboun', u'neighbour'), (u'neverfound', u'never found'), (u'neverthere', u'never there'), (u'neverv\\/ill_', u'never will.'), (u'NewJersey', u'New Jersey'), (u'newjob', u'new job'), (u'newjobs', u'new jobs'), (u'nextdoor', u'next door'), (u'Nighw', u'Nighty'), (u'nilios', u'ni\xf1os'), (u'Nlagnificence', u'Magnificence'), (u'Nlakes', u'Makes'), (u'Nlalina', u'Malina'), (u'Nlan', u'Man'), (u'Nlarch', u'March'), (u'Nlarine', u'Marine'), (u'Nlarion', u'Marion'), (u'Nlarry', u'Marry'), (u'Nlars', u'Mars'), (u'Nlarty', u'Marty'), (u'Nle', u'Me'), (u'Nleet', u'Meet'), (u'Nlen', u'Men'), (u'Nlom', u'Mom'), (u'Nlore', u'More'), (u'Nlornin', u'Mornin'), (u'Nlother', u'Mother'), (u'Nlr', u'Mr'), (u'Nlr.', u'Mr.'), (u'Nlrs', u'Mrs'), (u'Nluch', u'Much'), (u'nojurisdiction', u'no jurisdiction'), (u'noone', u'no one'), (u'Noone', u'No one'), (u'not judging', u'not judging'), (u'notgoing', u'not going'), (u'notjunk', u'not junk'), (u'Notjunk', u'Not junk'), (u'notjust', u'not just'), (u'notsure', u'not sure'), (u'novv', u'now'), (u'Nowjust', u'Now just'), (u"Nowthat's", u"Now that's"), (u'Numbertwo', u'Number two'), (u"oan't", u"can't"), (u"oan'tjust", u"can't just"), (u'objecl', u'object'), (u'occultpowerand', u'occult power and'), (u'Ocps', u'Oops'), (u'ofa', u'of a'), (u'ofajudge', u'of a judge'), (u'ofall', u'of all'), (u'Ofall', u'Of all'), (u'ofBedford', u'of Bedford'), (u'ofcourse', u'of course'), (u'Ofcourse', u'Of course'), (u'ofeach', u'of each'), (u'ofeither', u'of either'), (u"Offioer's", u"Officer's"), (u'ofFrance', u'of France'), (u'offreedom', u'of freedom'), (u'offthe', u'off the'), (u'offthis', u'off this'), (u'offto', u'off to'), (u'offun', u'of fun'), (u'ofguy', u'of guy'), (u'Ofhce', u'Office'), (u'ofhis', u'of his'), (u'ofHis', u'of His'), (u'ofhoneybees', u'of honeybees'), (u'ofit', u'of it'), (u'ofjam', u'of jam'), (u'OFJOAN', u'OF JOAN'), (u'ofjoy', u'of joy'), (u'ofjunior', u'of junior'), (u'ofme', u'of me'), (u'ofmead', u'of mead'), (u'ofmicroinjections', u'of microinjections'), (u'ofmy', u'of my'), (u'ofNew', u'of New'), (u"ofNorris'", u"of Norris'"), (u'ofopinions', u'of opinions'), (u'ofour', u'of our'), (u'ofpeopla', u'of people'), (u'ofthat', u'of that'), (u'ofthe', u'of the'), (u'Ofthe', u'Of the'), (u'oftheir', u'of their'), (u'ofthem', u'of them'), (u"ofthem's", u"of them's"), (u'ofthemselves', u'of themselves'), (u'ofthere', u'of there'), (u'ofthese', u'of these'), (u'ofthings', u'of things'), (u'ofthis', u'of this'), (u'ofthlngs', u'of things'), (u'ofthose', u'of those'), (u'ofuse', u'of use'), (u'ofwashington', u'of Washington'), (u'ofyou', u'of you'), (u'ofyour', u'of your'), (u'OId', u'Old'), (u'OIsson', u'Olsson'), (u'Ok3Y', u'Okay'), (u'okaY', u'okay'), (u'OkaY', u'Okay'), (u'OKaY', u'Okay'), (u'OKGY', u'Okay'), (u'Ol<', u'Ole'), (u'oldAdolfon', u'old Adolf on'), (u'onboard', u'on board'), (u'onIy', u'only'), (u'onIything', u'only thing'), (u'onJanuaw', u'on January'), (u'onlyjust', u'only just'), (u'Onyinal', u'Original'), (u'oomprise', u'comprise'), (u'oonstitution', u'constitution'), (u"oouldn't", u"couldn't"), (u"oould've", u"could've"), (u"oousin's", u"cousin's"), (u'opiimistically', u'optimistically'), (u'ora', u'or a'), (u'orfall', u'or fall'), (u'orglory', u'or glory'), (u'orjust', u'or just'), (u'Orjust', u'Or just'), (u'Orthat', u'Or that'), (u'orwould', u'or would'), (u'Orwould', u'Or would'), (u'Othenzvise', u'Otherwise'), (u'our joumey', u'our journey'), (u'ourbrave', u'our brave'), (u'ourfathers', u'our fathers'), (u'ourgirlon', u'our girl on'), (u'Ourgoal', u'Our goal'), (u'Ourguy', u'Our guy'), (u"ourj0b's", u"our job's"), (u"Ourj0b's", u"Our job's"), (u'ourjobs', u'our jobs'), (u"ourjob's", u"our job's"), (u"Ourjob's", u"Our job's"), (u'ourjoumey', u'our journey'), (u'ourphotos', u'our photos'), (u'ourv\\/ay', u'our way'), (u"outlool<'s", u"outlook's"), (u'overme', u'over me'), (u'overthe', u'over the'), (u'overthere', u'over there'), (u'p/ace', u'place'), (u'P/ease', u'Please'), (u'p_m_', u'p.m.'), (u'P\xb0P$', u'Pops'), (u'PANUNG', u'PANTING'), (u'pclnt', u'point'), (u'pclnts', u'points'), (u'pe0pIe', u'people'), (u'Perrut_', u'Perrut.'), (u'Persona/4/', u'Personally'), (u'Persona/y', u'Personally'), (u'persors', u"person's"), (u'PIain', u'Plain'), (u'PIease', u'Please'), (u'PIeasure', u'Pleasure'), (u'PIus', u'Plus'), (u'pleasurlng', u'pleasuring'), (u'POIe', u'Pole'), (u'Polynes/ans', u'Polynesians'), (u'poorshowing', u'poor showing'), (u'popsicle', u'Popsicle'), (u'Presidenfs', u"President's"), (u'probablyjust', u'probably just'), (u'puIIing', u'pulling'), (u'Putyourhand', u'Put your hand'), (u'Qh', u'Oh'), (u'QkaY', u'Okay'), (u'Qpen', u'Open'), (u'QUYS', u'GUYS'), (u'_QW', u'Aw'), (u'r/ght', u'right'), (u'ralnbow', u'rainbow'), (u'ratherjump', u'rather jump'), (u'ratherjust', u'rather just'), (u'Rcque', u'Roque'), (u'rcscucd', u'rescued'), (u'rea/', u'real'), (u'readytolaunchu', u'ready to launch...'), (u'reaHy', u'really'), (u'ReaHy', u'Really'), (u'reallyjust', u'really just'), (u'reallymiss', u'really miss'), (u'reallytalked', u'really talked'), (u'reallythink', u'really think'), (u'reallythinkthis', u'really think this'), (u'rememberthem', u'remember them'), (u'reoalibrated', u'recalibrated'), (u'retum', u'return'), (u'rhfluence', u'influence'), (u'rightdown', u'right down'), (u'roadyou', u'road you'), (u'RUMBUNG', u'RUMBLING'), (u's/uggikh', u'sluggish'), (u'S0', u'So'), (u'S1oW1y', u'Slowly'), (u'saidyou', u'said you'), (u"sayeverything's", u"say everything's"), (u'saynothing', u'say nothing'), (u'saythat', u'say that'), (u'sc', u'so'), (u'scientihc', u'scientific'), (u'SCREAIVHNG', u'SCREAMING'), (u'sCREAlvllNG', u'SCREAMING'), (u'SCREAlvllNG', u'SCREAMING'), (u'scund', u'sound'), (u"S'EOp", u'Stop'), (u'severa/parents', u'several parents'), (u'sfill', u'still'), (u'S\ufb02ence', u'Silence'), (u'shallrise', u'shall rise'), (u'sHATTERING', u'SHATTERING'), (u'shcws', u'shows'), (u'Shdsjust', u"She's just"), (u'She`s', u"She's"), (u'She\u2018II', u"She'll"), (u"she'II", u"she'll"), (u"She'II", u"She'll"), (u"she'Il", u"she'll"), (u'Shejust', u'She just'), (u"she'lI", u"she'll"), (u'Shoofing', u'Shooting'), (u'ShOp', u'shop'), (u'shortyears', u'short years'), (u'shou/dn', u'shouldn\u2019t'), (u'shou\ufb01ng', u'shouting'), (u'Shou\ufb02ng', u'Shouting'), (u'shouldnt', u"shouldn't"), (u'Shouldrt', u"Shouldn't"), (u'shouldrt', u"shouldn't"), (u"Shs's", u"She's"), (u'SHUDDERWG', u'SHUDDERING'), (u'Shutup', u'Shut up'), (u'SIGH$', u'SIGHS'), (u'signifcance', u'significance'), (u'Sincc', u'Since'), (u'sistervvill', u'sister will'), (u'Skarsg\xe9rd', u'Skarsg\xe5rd'), (u'slcsHs', u'SIGHS'), (u'slGHINcs', u'SIGHING'), (u'slGHING', u'SIGHING'), (u'slNGING', u'SINGING'), (u'slzzLING', u'SIZZLING'), (u'smarfest', u'smartest'), (u'Smiih', u'Smith'), (u'so/id', u'solid'), (u'SoBl3lNG', u'SOBBING'), (u'soemtimes', u'sometimes'), (u'Sojust', u'So just'), (u'soldierl', u'soldier!'), (u'somethlng', u'something'), (u"somethlng's", u"something's"), (u"somez'/7/ng", u'something'), (u'somthing', u'something'), (u'sumthing', u'something'), (u'sou/', u'soul'), (u'SoundofMusic', u'Sound of Music'), (u'SP/ash', u'Splash'), (u'SPEAK/NG', u'SPEAKING'), (u'speII', u'spell'), (u"speII's", u"spell's"), (u'Spendourtime', u'Spend our time'), (u'sQUA\\/\\/KING', u'SQUAWKING'), (u'StAnton', u'St Anton'), (u'stealsjeans', u'steals jeans'), (u'StilI', u'Still'), (u'Stilldesperatelyseeking', u'Still desperately seeking'), (u'stlll', u'still'), (u'sToPs', u'STOPS'), (u'storyl', u'story!'), (u'Stubbom', u'Stubborn'), (u'su/faces', u'surfaces'), (u'suffocaiing', u'suffocating'), (u'summerjob', u'summer job'), (u'Summerjust', u'Summer just'), (u'sun/ive', u'survive'), (u'superiorman', u'superior man'), (u'sur\ufb02aces', u'surfaces'), (u't/ying', u'trying'), (u'T0', u'To'), (u'T00', u'Too'), (u'ta/ks', u'talks'), (u'taiked', u'talked'), (u'talkto', u'talk to'), (u'Talkto', u'Talk to'), (u'talktonight', u'talk tonight'), (u'tampax', u'Tampax'), (u'tc', u'to'), (u'tcday', u'today'), (u'tcrturing', u'torturing'), (u'tcuch', u'touch'), (u'te//', u'tell'), (u'tearjust', u'tear just'), (u'tellsjokes', u'tells jokes'), (u'tellyou', u'tell you'), (u'terriers_', u'terriers.'), (u'th/nk', u'think'), (u'THEPASSION', u'THE PASSION'), (u'thafs', u"that's"), (u'Thafs', u"That's"), (u"Thai's", u"That's"), (u"Thal's", u"That's"), (u'thankyou', u'thank you'), (u'Thankyou', u'Thank you'), (u'thatconverts', u'that converts'), (u'thatgoes', u'that goes'), (u"that'II", u"that'll"), (u"That'II", u"That'll"), (u'thatjob', u'that job'), (u'thatjunk', u'that junk'), (u'thatjust', u'that just'), (u'thatleads', u'that leads'), (u"Thatl'm", u"That I'm"), (u"that's just", u"that's just"), (u'Thatsand', u'That sand'), (u"that'sjust", u"that's just"), (u"That'sjust", u"That's just"), (u'Thc', u'The'), (u'theirface', u'their face'), (u'theirfeet', u'their feet'), (u'theirfury', u'their fury'), (u'thejaw', u'the jaw'), (u'thejoint', u'the joint'), (u'thejudge', u'the judge'), (u'thejudges', u'the judges'), (u'Thejudges', u'The judges'), (u'thejury', u'the jury'), (u'Thelook', u'The look'), (u'Therds', u"There's"), (u"There'II", u"There'll"), (u"There'Il", u"There'll"), (u"There'lI", u"There'll"), (u"They'/'e", u"They're"), (u"they/'II", u"they'll"), (u'They/re', u"They're"), (u"They/'re", u"They're"), (u"they'II", u"they'll"), (u"they'Il", u"they'll"), (u'theyjust', u'they just'), (u'Theyjust', u'They just'), (u"they'lI", u"they'll"), (u"They'lI", u"They'll"), (u'theyre', u"they're"), (u'theysay', u'they say'), (u'thinkthat', u'think that'), (u"this'II", u"this'll"), (u'thlngs', u'things'), (u'Thlnkthls', u'Think this'), (u'thls', u'this'), (u"thore's", u"there's"), (u"Thore's", u"There's"), (u'Thorjust', u'Thor just'), (u"thoughtl'dletyou", u"thought I'd let you"), (u'tnatjust', u'that just'), (u"tnat's", u"that's"), (u"Tnat's", u"That's"), (u"Tnere'll", u"There'll"), (u'to//et', u'toilet'), (u'To//S', u'Tolls'), (u"todayl'd", u"today I'd"), (u'togelher', u'together'), (u'togethen', u'together'), (u'tojoin', u'to join'), (u'tojudge', u'to judge'), (u'toldyou', u'told you'), (u'tomorrovv', u'tomorrow'), (u'Tonighfsjust', u"Tonight's just"), (u'totake', u'to take'), (u'totalk', u'to talk'), (u'tothat', u'to that'), (u'tothe', u'to the'), (u'Towef', u'Tower'), (u'Tr/ck/ing', u'Trickling'), (u'Traitur', u'Traitor'), (u'tv\\/o', u'two'), (u'tvvelve', u'twelve'), (u'Tvvelve', u'Twelve'), (u'tvventy', u'tvventy'), (u'Tvventy', u'Tvventy'), (u'tvvo', u'two'), (u'Tvvo', u'Two'), (u'twc', u'two'), (u'unconhrmed', u'unconfirmed'), (u'underthat', u'under that'), (u'underthe', u'under the'), (u'underthese', u'under these'), (u'underyour', u'under your'), (u'unfilyou', u'until you'), (u"Unfon'unate/y", u'Unfortunately'), (u'Uninnabited', u'Uninhabited'), (u'untilApril', u'until April'), (u'untilyou', u'until you'), (u'upthinking', u'up thinking'), (u'upto', u'up to'), (u'V\\/ait___', u'Wait...'), (u'v\\/as', u'was'), (u'V\\/as', u'Was'), (u'V\\/e', u'We'), (u"v\\/eek's", u"week's"), (u'V\\/eird_', u'Weird.'), (u'V\\/ell', u'Well'), (u'V\\/hat', u'what'), (u"V\\/hen'll", u"When'll"), (u'V\\/ho', u'Who'), (u"v\\/ho'll", u"who'll"), (u'v\\/Hoops', u'Whoops'), (u"v\\/ho's", u"who's"), (u"V\\/ho's", u"Who's"), (u'V\\/hy', u'Why'), (u'v\\/ith', u'with'), (u"v\\/on't", u"won't"), (u'V\\fith', u'With'), (u'V\\fithin', u'Within'), (u'valedictolian', u'valedictorian'), (u'vcice', u'voice'), (u've/y', u'very'), (u'veiy', u'very'), (u'V\xe9ry', u'Very'), (u'versioin', u'version'), (u'vi/ay', u'way'), (u'visitjails', u'visit jails'), (u"Viva/di's", u"Vivaldi's"), (u'vlll', u'vill'), (u'Voil\xe1', u'Voil\xe0'), (u'Voil\xe9', u'Voil\xe0'), (u'vvasjust', u'was just'), (u"VVasn't", u"Wasn't"), (u'vvay', u'way'), (u'VVe', u'We'), (u"VVe'II", u"We'll"), (u"VVe'll", u"We'll"), (u'Vvelooked', u'We looked'), (u"VVe're", u"We're"), (u"VVe've", u"We've"), (u'VVhat', u'What'), (u"VVhat's", u"What's"), (u"VVhat'S", u"What's"), (u'VVhen', u'When'), (u"'v'Vhere's", u"Where's"), (u'VVhip', u'Whip'), (u'vvHooPING', u'WHOOPING'), (u'VvHooPING', u'WHOOPING'), (u'VVhy', u'Why'), (u'VVill', u'Will'), (u'VVinters', u'Winters'), (u'vvlND', u'WIND'), (u"w\xa4n't", u"won't"), (u'W9', u'We'), (u'waht', u'want'), (u'waierfall', u'waterfall'), (u'walkjust', u'walk just'), (u'wallplant', u'wall plant'), (u'wannajump', u'wanna jump'), (u'wantyou', u'want you'), (u'Warcontinues', u'War continues'), (u'wasjennifer', u'was Jennifer'), (u'wasjust', u'was just'), (u'wasrt', u"wasn't"), (u'Wasrt', u"Wasn't"), (u'wayl', u'way I'), (u'wayround', u'way round'), (u'wclf', u'wolf'), (u'wcman', u'woman'), (u'wcmen', u'women'), (u"wcn't", u"won't"), (u'wcrse', u'worse'), (u'wculd', u'would'), (u'We//', u'Well'), (u'We/came', u'Welcome'), (u'we/come', u'welcome'), (u'We/come', u'Welcome'), (u'We/I', u'Well'), (u'weekendjust', u'weekend just'), (u'werert', u"weren't"), (u'Werert', u"Weren't"), (u"we'II", u"we'll"), (u"We'II", u"We'll"), (u"we'Il", u"we'll"), (u"We'Il", u"We'll"), (u'wejust', u'we just'), (u"we'lI", u"we'll"), (u"We'rejust", u"We're just"), (u"We'ro", u"We're"), (u"We'Ve", u"We've"), (u'wh/p', u'whip'), (u'Wh\xb0ops', u'Whoops'), (u'Whafs', u"What's"), (u'Whatam', u'What am'), (u'Whatare', u'What are'), (u'Whateverwe', u'Whatever we'), (u"What'II", u"What'll"), (u'Whatis', u'What is'), (u'whatjust', u'what just'), (u'Whatl', u'What I'), (u'whatshe', u'what she'), (u'whatwe', u'what we'), (u"Whc's", u"Who's"), (u'Whcse', u'Whose'), (u'wHlsPERs', u'WHISPERS'), (u'wi//', u'will'), (u'wil/', u'will'), (u'Wil/', u'Will'), (u'wilI', u'will'), (u'willbe', u'will be'), (u'willhire', u'will hire'), (u'willneverknow', u'will never know'), (u'willyou', u'will you'), (u'wlfe', u'wife'), (u"wlfe's", u"wife's"), (u'wlth', u'with'), (u"wnat's", u"what's"), (u'Wno', u'Who'), (u'Wo/f', u'Wolf'), (u'wo\ufb02d', u'world'), (u"WOI'1't", u"won't"), (u'wondernobody', u'wonder nobody'), (u"won'T", u"won't"), (u"won'tanswerme", u"won't answer me"), (u"won'tforget", u"won't forget"), (u"won'tletitbring", u"won't let it bring"), (u"Wo're", u"We're"), (u'worfd', u'world'), (u"won'th", u'worth'), (u"won'thwhile", u'worthwhile'), (u'workyou', u'work you'), (u"wouIdn't", u"wouldn't"), (u"wouldn'!", u"wouldn't"), (u'Wouldrt', u"Wouldn't"), (u"wr/'2'/ng", u'writing'), (u'writign', u'writing'), (u'wrcng', u'wrong'), (u'wuuld', u'would'), (u'_Yay', u'Yay'), (u"Y\xa4u'II", u"You'll"), (u"Y\xa4u'll", u"You'll"), (u"y\xa4u're", u"you're"), (u"Y\xa4u're", u"You're"), (u"y\xa4u've", u"you've"), (u'Y0', u'Yo'), (u'y0LI', u'you'), (u"y0u'II", u"you'll"), (u"Y0u'rc", u"You're"), (u"Y0u're", u"You're"), (u"Y0u've", u"You've"), (u'yaming', u'yarning'), (u'yaurparents', u'your parents'), (u'ycu', u'you'), (u"ycu'd", u"you'd"), (u'ycur', u'your'), (u"Ycu're", u"You're"), (u'Ycursins', u'Your sins'), (u'YEI_I_', u'YELL'), (u'YELL$', u'YELLS'), (u'yigg/mg', u'giggling'), (u'Yigg/mg', u'giggling'), (u'yoLI', u'you'), (u'yOu', u'you'), (u'yOU', u'you'), (u'you`re', u"you're"), (u"you'II", u"you'll"), (u"You'II", u"You'll"), (u"You'Il", u"You'll"), (u'youjack', u'you jack'), (u'youjoin', u'you join'), (u'Youjoin', u'You join'), (u'youjust', u'you just'), (u"You'lI", u"You'll"), (u'youngsterlike', u'youngster like'), (u'youpick', u'you pick'), (u"you'ra", u"you're"), (u'Yourattention', u'Your attention'), (u'yourautomobile', u'your automobile'), (u"You'rejustjealous", u"You're just jealous"), (u'yourextra', u'your extra'), (u'yourfather', u'your father'), (u'yourhand', u'your hand'), (u'yourhusband', u'your husband'), (u'yourjewelry', u'your jewelry'), (u'yourjob', u'your job'), (u'Yourjob', u'Your job'), (u'yourjob_', u'your job.'), (u'yourjockey', u'your jockey'), (u'yourjury', u'your jury'), (u'yourname', u'your name'), (u'Yourpackage', u'Your package'), (u'yourpackage', u'your package'), (u"you'ro", u"you're"), (u'yourpoorleg', u'your poor leg'), (u'yourvveak', u'your weak'), (u"you'va", u"you've"), (u"You'va", u"You've"), (u'youWlneversee', u"you'll never see"), (u'yQu', u'you'), (u'YQu', u'You'), (u"yQu'_7", u'you?'), (u'yummY', u'yummy'), (u'yuu', u'you'), (u'Yuu', u'You'), (u"Yuu've", u"You've"), (u"z'housand", u'thousand'), (u'zlPPING', u'ZIPPING'), (u'Ifslocked', u"It's locked"), (u'nightjust', u'night just'), (u'dayjourney', u'day journey'), (u'Ourjob', u'Our job'), (u'IunCh', u'lunch'), (u'nieCe', u'niece'), (u'giVes', u'gives'), (u'wantto', u'want to'), (u'besttoday', u'best today'), (u'NiCe', u'Nice'), (u'oftravelling', u'of travelling'), (u'oftwo', u'of two'), (u'ALl', u'ALI'), (u'afterparty', u'after-party'), (u'welL', u'well.'), (u'theirjob', u'their job'), (u"lfhe's", u"If he's"), (u'babyjesus', u'baby Jesus'), (u'shithousejohn', u'shithouse John'), (u'jesus', u'Jesus'), (u'withjesus', u'with Jesus'), (u'Gojoin', u'Go join'), (u'Adaughter', u'A daughter'), (u'talkwith', u'talk with'), (u'anyjournals', u'any journals'), (u"L'mjewish", u"I'm Jewish"), (u'arejust', u'are just'), (u'soundjust', u'sound just'), (u"ifl'm", u"if I'm"), (u'askyou', u'ask you'), (u'ordinarywoman', u'ordinary woman'), (u'andjunkies', u'and junkies'), (u'isjack', u'is Jack'), (u'helpyou', u'help you'), (u'thinkyou', u'think you'), (u'Lordjesus', u'Lord Jesus'), (u'injuvy', u'in juvy'), (u'thejets', u'the jets'), (u'ifGod', u'if God'), (u'againstjewish', u'against Jewish'), (u'ajunkie', u'a junkie'), (u'dearjesus', u'dear Jesus'), (u'hearyour', u'hear your'), (u'takeyears', u'take years'), (u'friendjean', u'friend Jean'), (u'Fatherjohn', u'Father John'), (u'youjean', u'you Jean'), (u'hearyou', u'hear you'), (u'Ifshe', u'If she'), (u"didn'tjust", u"didn't just"), (u'IfGod', u'If God'), (u'notjudge', u'not judge'), (u'andjudge', u'and judge'), (u'OKBY', u'Okay'), (u'myjourney', u'my journey'), (u'yourpremium', u'your premium'), (u"we'rejust", u"we're just"), (u'Iittlejokes', u'little jokes'), (u'Iifejust', u'life just'), (u'Andjust', u'And just'), (u'ofThe', u'of The'), (u'lifejust', u'life just'), (u'AIice', u'Alice'), (u'lnternationalAirport', u'International Airport'), (u'yourbody', u'your body'), (u'DollarBaby', u'Dollar Baby'), (u'ofjonesing', u'of jonesing'), (u'yourpanties', u'your panties'), (u'offforme', u'off for me'), (u'pantyparty', u'panty party'), (u'everhit', u'ever hit'), (u'theirhomes', u'their homes'), (u'AirForce', u'Air Force'), (u'yourhead', u'your head'), (u'betterbe', u'better be'), (u'myparty', u'my party'), (u'disasterlockdown', u'disaster lockdown'), (u"Ifpot's", u"If pot's"), (u'ifmy', u'if my'), (u'yourmoney', u'your money'), (u'Potterfan', u'Potter fan'), (u'Hermionejust', u'Hermione just'), (u'ofourshit', u'of our shit'), (u'showyou', u'show you'), (u'answernow', u'answer now'), (u'theirsjust', u'theirs just'), (u'BIackie', u'Blackie'), (u'SIeep', u'Sleep'), (u'foryour', u'for your'), (u'oryour', u'or your'), (u'forArthur', u'for Arthur'), (u'CIamp', u'Clamp'), (u'CIass', u'Class'), (u'CIose', u'Close'), (u'GIove', u'Glove'), (u'EIIen', u'Ellen'), (u'PIay', u'Play'), (u'PIace', u'Place'), (u'EIgyn', u'Elgyn'), (u'AIert', u'Alert'), (u'CIaus', u'Claus'), (u'CIimb', u'Climb'), (u"military'II", u"military'll"), (u'anylonget', u'any longer'), (u'yourlife', u'your life'), (u"Yourbitch'IIgetyou", u"Your bitch'll get you"), (u'yourdick', u'your dick'), (u'Tellyourbitch', u'Tell your bitch'), (u'rememberyou', u'remember you'), (u'newface', u'new face'), (u'Butyou', u'But you'), (u"don'tyou", u"don't you"), (u'yourlives', u'your lives'), (u'Iovedher', u'loved her'), (u'reallydid', u'really did'), (u'firstperson', u'first person'), (u'mybest', u'my best'), (u'Justgive', u'Just give'), (u'AIong', u'Along'), (u'atyourbody', u'at your body'), (u'myhands', u'my hands'), (u'sayhe', u'say he'), (u'mybooty', u'my booty'), (u'yourbooty', u'your booty'), (u'yourgirl', u'your girl'), (u'yourlegs', u'your legs'), (u'betterifthey', u'better if they'), (u'manybeautiful', u'many beautiful'), (u'contactpolice', u'contact police'), (u'numberbelow', u'number below'), (u'biggestproblem', u'biggest problem'), (u'Itgave', u'It gave'), (u'everybodykind', u'everybody kind'), (u'theyhad', u'they had'), (u'knowherlast', u'know her last'), (u'herhearing', u'her hearing'), (u'othermembers', u'other members'), (u'BIing', u'Bling'), (u'CIyde', u'Clyde'), (u'foundguilty', u'found guilty'), (u'fouryears', u'four years'), (u'countyjail', u'county jail'), (u'yearin', u'year in'), (u'theirrole', u'their role'), (u'manybottles', u'many bottles'), (u"can'tpronounce", u"can't pronounce"), (u'manybowls', u'many bowls'), (u'ofthatgreen', u'of that green'), (u'manyjoyrides', u'many joyrides'), (u'Superrich', u'Super rich'), (u'Iprefer', u'I prefer'), (u'Theymust', u'They must'), (u'whatyou', u'what you'), (u"I'IIjump", u"I'll jump"), (u'nobodyknow', u'nobody know'), (u'neverknew', u'never knew'), (u'EIectronica', u'Electronica'), (u'AIarm', u'Alarm'), (u'getyourman', u'get your man'), (u'sayyou', u'say you'), (u'getyour', u'get your'), (u'Fuckyou', u'Fuck you'), (u'Whyyou', u'Why you'), (u'butyoujust', u'but you just'), (u'forgetyourname', u'forget your name'), (u'Whatyou', u'What you'), (u"Co/'ncidenta//y", u'Coincidentally'), (u'GIad', u'Glad'), (u'RachelMarron', u'Rachel Marron'), (u"She'llgive", u"She'll give"), (u'presidentialsuite', u'presidential suite'), (u'andgentlemen', u'and gentlemen'), (u'willnot', u'will not'), (u'ourproducers', u'our producers'), (u"Ifshe's", u"If she's"), (u'CIock', u'Clock'), (u'Ishould', u'I should'), (u"I'llgo", u"I'll go"), (u'maypass', u'may pass'), (u'andprotecting', u'and protecting'), (u'BIessed', u'Blessed'), (u'CIean', u'Clean'), (u'SIave', u'Slave'), (u'AIi', u'Ali'), (u'AIIah', u'Allah'), (u'AIIahu', u'Allahu'), (u'CIick', u'Click'), (u'BIast', u'Blast'), (u'AIlah', u'Allah'), (u'SIow', u'Slow'), (u'theirpolicies', u'their policies'), (u'Orperhaps', u'Or perhaps'), (u'ofsex', u'of sex'), (u'forpleasure', u'for pleasure'), (u'ourpower', u'our power'), (u'Yourpiece', u'Your piece'), (u'Offioers', u'Officers'), (u'oondesoended', u'condescended'), (u'myseif', u'myself'), (u"let'sjust", u'let\u2019s just'), (u'yourway', u'your way'), (u'An9TY', u'Angry'), (u'ourjourney', u'our journey'), (u'LuCY', u'Lucy'), (u"\\'m", u'I\u2019m'), (u'CEDR/C', u'CEDRIC'), (u'lsaac', u'Isaac'), (u'FIy', u'Fly'), (u'Ionger', u'longer'), (u'Iousy', u'lousy'), (u'Iosing', u'losing'), (u"They'II", u"They'll"), (u'yourpaws', u'your paws'), (u'littie', u'little'), (u"It'lljust", u"It'll just"), (u'AIso', u'Also'), (u'Iisten', u'listen'), (u'suPPosed', u'supposed'), (u'somePIace', u'someplace'), (u'exPIain', u'explain'), (u'Iittle', u'little'), (u'StoP', u'Stop'), (u'AIways', u'Always'), (u'Iectures', u'lectures'), (u'Iow', u'low'), (u'Ieaving', u'leaving'), (u'Ietting', u'letting'), (u'Iistening', u'listening'), (u'Iecture', u'lecture'), (u'Iicking', u'licking'), (u'Iosses', u'losses'), (u'PIeased', u'Pleased'), (u'ofburglaries', u'of burglaries'), (u"He'sjust", u"He's just"), (u'mytrucktoo', u'my truck too'), (u'nowwhat', u'now what'), (u'yourfire', u'your fire'), (u"herwhat's", u"her what's"), (u'hearthat', u'hear that'), (u'oryou', u'or you'), (u'preferjournalist', u'prefer journalist'), (u'CIaw', u'Claw'), (u'Ifour', u'If our'), (u'lron', u'Iron'), (u"It'syour", u"It's your"), (u'lfstill', u'If still'), (u'forjoining', u'for joining'), (u'foryears', u'for years'), (u'Ifit', u'If it'), (u'notjump', u'not jump'), (u'ourproblem', u'our problem'), (u'yourprofile', u'your profile'), (u'ifJanine', u'if Janine'), (u'forpreventative', u'for preventative'), (u'whetherprotest', u'whether protest'), (u'Ifnot', u'If not'), (u'ourpeople', u'our people'), (u'offmy', u'off my'), (u'forproviding', u'for providing'), (u'hadjust', u'had just'), (u'nearyou', u'near you'), (u'whateveryou', u'whatever you'), (u'hourputs', u'hour puts'), (u'timejob', u'time job'), (u'overyour', u'over your'), (u'orpermanent', u'or permanent'), (u'createjobs', u'create jobs'), (u"I'vejust", u"I've just"), (u'peoplejobs', u'people jobs'), (u'dinnerpail', u'dinner pail'), (u'hasjumped', u'has jumped'), (u'theirprivacy', u'their privacy'), (u'AIl', u'All'), (u'ofserious', u'of serious'), (u'yourprofessional', u'your professional'), (u'poiitical', u'political'), (u'tojump', u'to jump'), (u'iives', u'lives'), (u'eiections', u'elections'), (u'militaryjuntas', u'military juntas'), (u'nojoke', u'no joke'), (u'yourpresidency', u'your presidency'), (u'ofmilitaryjuntas', u'of military juntas'), (u'Ourproposal', u'Our proposal'), (u'LeBIanc', u'LeBlanc'), (u'KIaus', u'Klaus'), (u'yourpussy', u'your pussy'), (u'lNTERVIEWER', u'INTERVIEWER'), (u'lNAUDIBLE', u'INAUDIBLE'), (u'SImpsons', u'Simpsons'), (u'anotherjob', u'another job'), (u'lfthere', u'If there'), (u'descentinto', u'descent into'), (u'ofthathere', u'of that here'), (u'ofway', u'of way'), (u'yourseat', u'your seat'), (u'allyou', u'all you'), (u'Allyou', u'All you'), (u'yourass', u'your ass'), (u'Yourbutt', u'Your butt'), (u'iustiiggle', u'just jiggle'), (u'iust', u'just'), (u'CSi', u'CSI'), (u'affernoon', u'afternoon'), (u'orpersecution', u'or persecution'), (u'theirpetty', u'their petty'), (u'Fourpercent', u'Four percent'), (u'fourpercent', u'four percent'), (u'willjust', u'will just'), (u"Ifyou're", u"If you're"), (u'ourplanet', u'our planet'), (u'lsolation', u'Isolation'), (u'yourprimitive', u'your primitive'), (u'yourplanet', u'your planet'), (u'matteryour', u'matter your'), (u'Yourplace', u'Your place'), (u'andjustice', u'and justice'), (u'anotherpart', u'another part'), (u'confiict', u'conflict'), (u'growingjeopardy', u'growing jeopardy'), (u'hasjust', u'has just'), (u'havejust', u'have just'), (u'herselfinto', u'herself into'), (u'ifnecessary', u'if necessary'), (u"we'vejust", u"we've just"), (u'tojust', u'to just'), (u'yourjudgment', u'your judgment'), (u'yourjeans', u'your jeans'), (u'Youjust', u'You just'), (u'ajanitor', u'a janitor'), (u'FIattery', u'Flattery'), (u'myjournal', u'my journal'), (u'myjudgment', u'my judgment'), (u'offofmy', u'off of my'), (u'offyour', u'off your'), (u'ofgood', u'of good'), (u'ofguilty', u'of guilty'), (u'ofhaving', u'of having'), (u'ofheart', u'of heart'), (u'ofhonor', u'of honor'), (u'oflove', u'of love'), (u'ofmankind', u'of mankind'), (u'ofmany', u'of many'), (u'ofnormal', u'of normal'), (u'ofpeople', u'of people'), (u'ofpower', u'of power'), (u'ofsuch', u'of such'), (u'peoplejust', u'people just'), (u"They'rejust", u"They're just"), (u'tojeopardize', u'to jeopardize'), (u'Yourplaces', u'Your places'), (u'yourposition', u'your position'), (u'yourselfa', u'yourself a'), (u'yourselfright', u'yourself right'), (u'thejob', u'the job'), (u'thejanitors', u'the janitors'), (u'alljust', u'all just'), (u"forAmerica's", u"for America's"), (u'Forpencils', u'For pencils'), (u'forpondering', u'for pondering'), (u'handwrittenjournals', u'handwritten journals'), (u'herpursuit', u'her pursuit'), (u'ofjust', u'of just'), (u'oflanding', u'of landing'), (u'oflife', u'of life'), (u'outjust', u'out just'), (u'Thejoke', u'The joke'), (u'ourpatient', u'our patient'), (u"oryou're", u"or you're"), (u'ofyourself', u'of yourself'), (u'poweryour', u'power your'), (u'Ofmy', u'Of my'), (u'EIlen', u'Ellen'), (u"Don'tget", u"Don't get"), (u'tellme', u'tell me'), (u'ofdecision', u'of decision'), (u'itgoing', u'it going'), (u'artificialgravity', u'artificial gravity'), (u'shouldknow', u'should know'), (u"Hasn'tgot", u"Hasn't got"), (u'thirdjunction', u'third junction'), (u'somebodypicks', u'somebody picks'), (u'Willyou', u'Will you'), (u"can'tget", u"can't get"), (u'BuZZes', u'Buzzes'), (u"wouldn'tyou", u"wouldn't you"), (u'Wellbelow', u'Well below'), (u"What'dyou", u"What'd you"), (u'decipheredpart', u'deciphered part'), (u"they'llknow", u"they'll know"), (u"ifit's", u"if it's"), (u'ornot', u'or not'), (u'myposition', u'my position'), (u'lndistinct', u'Indistinct'), (u'anybiscuits', u'any biscuits'), (u'Andifyou', u'And if you'), (u'lfwe', u'If we'), (u'yourarm', u'your arm'), (u'lnteresting', u'Interesting'), (u'findit', u'find it'), (u"it'llstart", u"it'll start"), (u'holdit', u'hold it'), (u'ofkilling', u'of killing'), (u'Howyou', u'How you'), (u'lnhales', u'Inhales'), (u'lgot', u'I got'), (u'CIip', u'Clip'), (u"what'II", u"what'll"), (u"road'II", u"road'll"), (u'girI', u'girl'), (u'LIoyd', u'Lloyd'), (u'BIake', u'Blake'), (u'reaI', u'real'), (u'Foryour', u'For your'), (u'yourpublic', u'your public'), (u'LAst', u'Last'), (u'h is', u'his'), (u'He)\u2019', u'Hey'), (u'Ls', u'Is'), (u"al'", u'at'), (u"wail'", u'wait'), (u"III'll", u"I'll"), (u'forthis', u'for this'), (u'Yea h', u'Yeah'), (u'a re', u'are'), (u'He)"', u'Hey'), (u"pan'", u'part'), (u'yea h', u'yeah'), (u'Tun', u'Run'), (u"He)'", u'Hey'), (u"he)'", u'hey'), (u"I'11", u"I'll"), (u'he)"', u'hey'), (u" 're ", u"'re ")]),
+                        'pattern': u'(?um)(\\b|^)(?:\\$COff\\$|\\$ergei|\\$\\\'llOp|\\/\\\'\\/\\/|\\/\\\'\\/I|\\/ennifer|\\/got|\\/have|\\/hope|\\/just|\\/love|\\/\\\'m|\\/mmerse|\\/nsu\\/ts|\\/ong|\\/ook|\\/t\\\'s|\\/\\\'ve|\\\\\\/\\\\\\/e\\\'d|\\\\\\/\\\\\\/e\\\'re|\\\\\\/\\\\\\/e\\\'ve|\\\\\\/\\\\\\/hat|\\\\\\/\\\\\\/here\\\'d|\\\\\\/\\\\\\/hoo|\\\\\\/\\\\\\/hy|\\\\\\/\\\\\\/hy\\\'d|\\\\\\/\\\\le\\\'re|\\\\\\/Ve|\\\\Ne\\\'re|\\\\Nhat\\\'s|\\\\Nhere\\\'s|\\|\\\'mjust|\\\xa4ff|\\\xa4Id|\\\xa4Ids|\\\xa4n|\\\xa4ne|\\\xa4nly|\\\xa4pen|\\\xa4r|\\\xa4rder|\\\xa4ther|\\\xa4ur|\\\xa4ut|\\\xa4ver|\\\xa4wn|\\\u20acV\\\u20acI\\\'y|0\\\'clock|0f|0fEngland|0fft0|0l\\/er|0n|0ne|0ne\\\'s|0r|0rders|0thers\\\'|0ut|0utlaw\\\'s|0utlaws\\\'|0ver|13oos|18oos|195os|1et\\\'s|1o|1oo|1ooth|1oth|2E\\_|2\\\'IST|2\\\'Ist\\_|2o|2oth|3o|3oth|4o|4os|4oth|50rry|5o|5oth|6o|6os|\\\'6os|6oth|7o|\\\'7os|7oth|8o|\\\'8os|8oth|9\\/aim|9o|9oth|9UnShQt|a\\/\\/|a\\/bum|a\\/so|A\\/ways|abcut|aboutjoining|aboutposh|aboutus|aboutyou|accldent|Acool|afier|affraid|Afriend|afterall|afterthe|afulcrum|Afunny|aga\\/nst|ahsolutes|AI\\_I\\_|AIien|AIex|AII|AIIan|AIIow|AIive|ain\\\'tgotno|Ain\\\'tgotno|airstrike|AIVIBULANCE|ajob|ajockey\\_|ajoke|Ajoke|ajoking|al\\/|al\\/en|alittle|allgasp|alljustforshow|aln\\\'t|alot|Alot|An5wer|Andit|Andit\\\'s|andl|andlaughs|andleave|andthe|andyou|Andyou|ANNOUNC\\/NG|anotherstep|ANSWER\\/NG|answerwhat|antiquejoke|anyhcdy\\\'s|Anyidea|anyone\\\'s\\_|apejust|ARABlc|aren\\\'t\\_|arerl\\\'t|Arnsteln\\\'s|atleast|Atough|Awhole|awoman|Awoman|barelytalked|bcat|Bcllvla|bcmb|bcmbs|be\\/\\/y|becuase|Beep\\/\\\'ng|bejumpy|besldes|bestfriend|bestguy|bestjob|BIack|BIess|bigos\\_\\_\\_|BIame|BIind|BIood|BIue|BLOVVS|blowholel|blt|Bo99|bodiedyoung|breakf\\\xe9wtl|bulldozlng|butjust|butl|Butl|butljust|Butljustcan\\\'tgetenough|Butyou\\\'re|buythem|buyyou|byjust|bythe|C\\/latter\\/\\\'\\/7g|ca\\/\\/\\/ng|ca\\/I|call\\/ng|callyou|can\\*t|can\\\'i|can\\\'I|canlgetyou|cannotchange|cannut|can\\\'T|can\\\'t\\_|can\\\'tjust|can\\\'tletgo|Car0l|Carhorn|carrled|Ccug|Ccugs|Ccver|cellularchange|cff|cfycu|cfycur|Ch\\/rping|chaletgirl|changejobs|Charliejust|Chatter\\/\\\'rtg|CHATTERWG|Chequeredlove|cHIRPINcs|chjldishness|chlldrcn|chlldren|chocolatte|Cho\\/r|cHucKl\\_Es|CIark|CIear|circumcised\\_|ckay|cl\\_osEs|CLATTERWG|cn|cne|cnes|Coincidenta\\/\\/y|COm\\\u20ac|comp\\/etey|complainingabout|coms|cond\\/lion|confdence|conhrmed|connrm|Consecutivelyl|COUGH5|CouGHING|couIdn\\\'t|couldjust|couldn\\\'T|couldn\\\'tjust|Couldyou|crappyjob|CRAsHING|crder|Crowdcheers|Cruoially|cther|cuuld|cver|d\\/\\\'dn\\\'t|d\\/squietude|D\\\xa4esn\\\'t|d\\\xa4n\\\'i|d\\\xa4n\\\'t|d\\\xb09|d0|D0|D0asn\\\'t|Dad\\\'\\/\\/|dairyjust|Dar\\/\\/ng|dc|Dcbby|dccsn\\\'t|dcctcr|Dces|dcgs|dcing|dcn\\\'I|dcn\\\'t|Dcn\\\'t|dcughnut|declslons|deedhas|Dehnitely|desewes|desperate\\/\\\xbby|D\\\ufb02nk|DIAl\\_lNcs|didn\\\'\\!|didnt|didn\\\'T|dIdn\\\'t|didn\\\'t\\_|didrft|didrl\\\'t|didyou|divorcing\\_|dld|dldn\\\'t|dlfflcull|dlg|dlsobeyed|doasn\\\'t|Doasn\\\'t|doctoh|Doctor\\_\\_\\_tell|doesnt|doesn\\\'T|doesri\\\'t|doesrt|Doesrt|doit|dojust|don\\*t|donejobs|don\\\'i|don\\\'l|Don\\\'l|Donllook|dont|don\\\'T|don\\\'tcare|don\\\'tjoke|Don\\\'tjudge|don\\\'tjust|Don\\\'tjust|Don\\\'tlet|don\\\'tlhink|don\\\'tpush|Don\\\'tyou|DonWlook|Dooropens|doorshuts|dothat|dothis|Drinkthis|dumbass|dumbto|dun\\\'t|E\\/\\/e|E9YPt|ea\\/\\\'t\\/7|eart\\/7|efi\\\'\\/\\\'c\\/\\\'ent|EN\\<3LlsH|Enjoythe|Erv\\\\\\/an|Erv\\\\\\/an\\\'s|etemity|ev\\/I|eve\\/yone|even\\/body\\\'s|eversay|Everymonth|everythings|Everythirlg\\\'s|Everythlng\\\'s|Everytime|Exac\\\ufb02y|ExacUy\\_|excitedshrieking|ExcLAllvls|exploatation|expreusion|fairthat|Fathef|fatherfigure|FBl|fcrebcdlng|fcreverjudges|fcund|feeleverything|feelsweet|fiam\\/\\\'\\/y|\\\ufb01ngernail|finishedjunior|FIynn|flll|flra|Flylng|Fnends|fo\\/low|fonzvard|fora|Fora|forajob|forAmerica|forNew|forone|forso|Forsuch|forsunburns|forthe|Foryears|foryou|Foudeen|Fou\\\ufb02een|FourSeasons|fr\\/ends|freezerfood|F\\\xfchrerfeels|furthernotice|furyou|G0|g0in9|gamlenias|GAsPING|gc|gcing|gcnna|Gcnna|gct|Gct|genercsity|generosityn|getjust|g\\\ufb02ing|gi\\\ufb02friend|gir\\/|gir\\/s\\\'boarding|giris|gLlyS|glum\\_|gnyone|golng|goodboyand|goodjob|gOt|gotjumped|gotmyfirstinterview|grandjury|greatjob|Greatjobl|grinco|GRoANING|GRUNUNG|gu|gunna|guyjumped|guyjust|gUyS|\\_H6Y\\-|H\\\u20acY|H0we\\\xb7ver|halftheir|hapPY|hasrt|Hasrt|haven\\\'tspokerl|hcle|hcme|hcmes|hcpe|hctel|hcurs|Hcw|he\\/ps|hearjokestonight|hearme|Hefell|he\\\'II|He\\\'II|HeII0|He\\\'Il|Hejust|He\\\'lI|HelIo|hellc|HellO|herboyfr\\/end|herflesh|herfollov\\\\\\/ed|herjob\\_|HerrSchmidt|herwith|HeY\\\xb7|HeyJennifer|hiddsn|hisjunk|Hitlershare|Hlneed|Hnally|Hnishing|HOId|hOIes|HONMNG|honorthe|honoryou|honoryour|Hov\\\\\\/\\\'s|Hov\\\\\\/\\\'S|HovvLING|howit|HoW\\\'s|howto|Hs\\\'s|hurtyou|I\\/erilj\\/|I\\/fe|I\\\\\\/I|I\\\\\\/Ian|I\\\\\\/Iathies|I\\\\\\/Ie|I\\\\\\/Iommy|I\\\\\\/Ir|I\\\\\\/Ir\\.|I\\\\\\/ly|I3EEPING|I3LARING|Iacings|Iaid|Iam|Iand|Ianding|Iast|Iate|Icad|Icading|Ican|Iccked|Icng|Icsing|Icslng|Idid|Ididn\\\'t|Ido|Idon\\\'i|Idon\\\'t|Idon\\\'tthink|I\\\'E\\\'\\$|Ieamed|Ieapt|Iearned|Ieast|Ieave|Ied|Ieft|Ieg\\\'s|Iess|Iet|Iet\\\'s|Iet\\\'sjust|if\\/just|Ifear|Ifeared|Ifeel|ifI\\\'\\|\\||ifI\\\'d|ifI\\\'II|ifI\\\'ll|ifI\\\'m|Ifinally|ifI\\\'ve|ifl|Iforgot|Ifound|ifshe|ifthat\\\'s|ifthe|Ifthe|ifthere\\\'s|Ifthey|ifwe|Ifwe|Ifycu|ifyou|Ifyou|ifyuu|Iget|Igot|Igotta|Igotyou|Iguess|Iguessljust|Ihad|Ihat\\\'s|Ihave|Iheard|ihere\\\'s|ihey\\\'ve|Ihope|ii\\/Iary|ii\\/Ir|ii\\/Ir\\.|ii\\/love|Iife|I\\\'II|Iike|I\\\'Il|Iine|iirst|ii\\\'s|Ii\\\'s|Iiterallyjumped|Ijoined|Ijust|Iknew|Iknow|Ile|Ileft|I\\\'lldo|I\\\'llmake|Ilons|Ilove|I\\\'mjust|Inconceivablel|infact|Infact|in\\\ufb02uence|infront|injust|insc\\\ufb01p\\\ufb01ons|insolencel|intc|internationaljudges|inthe|Iockdown|Iong|Iongships|Iook|Iookjust|Iooklng|Iooks|Ioose|Iord\\\'s|Iose|Ioser|Ioss|Iost|Iot|Iot\\\'s|Iousyjob|Iove|Ioves|Iowlife|Ipaid|Iquit|Ireallythinkthis|I\\\'rn|Isaw|Isayt\\/1e|isjust|isn\\\'i|isn\\\'t\\_|Isthis|Istill|Istumblod|Itake|itdown|Iteach|Itfeels|ithave|Ithink|Ithinkthat|Ithinkthis|Ithinkyou\\\'re|Ithlnk|Ithoguht|Ithought|Ithoughtl|it\\\'II|It\\\'II|it\\\'Il|It\\\'Il|itin|itjust|Itjust|it\\\'lI|It\\\'lI|It\\\'llhappen|it\\\'lljust|Itold|Itook|itout|it\\\'S|it\\\'sjinxed|it\\\'sjust|It\\\'sjust|itso|Ittends|Itwasn\\\'t|Iuckier|IV\\|oney|IV\\|oney\\\'s|I\\\'va|I\\\'Ve|IVIan|IVIAN|IVIarch|IVIarci\\\'s|IVIarko|IVIe|IVIine\\\'s|IVImm|IVIoney|IVIr\\.|IVIrs|IVIuch|IVIust|IVIy|IVlacArthur|IVlacArthur\\\'s|IVlcBride|IVlore|IVlotherfucker\\_|IVlr|IVlr\\.|IVlr\\_|IVlust|IVly|Iwake|Iwant|Iwanted|Iwas|Iwasjust|Iwasjustu|Iwill|Iwish|Iwon\\\'t|Iworked|Iwould|jalapeno|Jaokson|Jascn|jcke|jennifer|joseph|jsut|Jumpthem|jusi|jusl|justjudge|justleave|Justletgo|kidsjumped|kiokflip|knowjust|knowthat|knowthis|knowwhat|knowyet|knowyourlove|korean|L\\/ght|L\\/kes|L\\\\\\/Ianuela|L\\\\\\/Ianuelal|l\\\\\\/Iauzard|l\\\\\\/I\\\xe9lanie|L\\\\\\/I\\\xe9lanie|l\\\\\\/Iom|l\\\\\\/Iommy|l\\\\\\/Ir|l\\\\\\/Ir\\.|l\\\\\\/Is|l\\\\\\/ly|l\\_AuGHING|l\\\u2018m|Laml6|Lcad|lcan|lcan\\\'t|lcarl\\\'t\\_|Lcve|l\\\'d|L\\\'d|ldid|Ldid|ldiot|L\\\'djump|ldon\\\'t|Ldon\\\'t|Lefs|Let\\\'sjust|lf|Lf|lfeelonelung|lfthey|lfyou|Lfyou|lfyou\\\'re|lget|lgive|Li\\/0\\/Academy|li\\/lr\\.|ligature\\_\\_\\_|l\\\'II|l\\\'Il|ljust|Ljust|ll\\/Iommy\\\'s|ll\\/lajor|Ll\\/lajor|ll\\/layans|l\\\'lI|l\\\'ll|L\\\'ll|l\\\'lljust|L\\\'lltake|llte|l\\\'m|L\\\'m|Lmean|l\\\'mjust|ln|lN|lNAuDll3LE|LNAuDll3LE|LNDlsTINcT|lneed|lostyou|Loudmusic|lraq|lRA\\\'s|Lrenka|Lrn|lRS|lsabella|lsn\\\'t|Lsn\\\'t|Lst\\\'s|lsuppose|lt|ltake|ltell|lthink|Lthink|lthink\\_\\_\\_|lt\\\'II|lt\\\'Il|ltjammed\\_|lt\\\'ll|ltold|lt\\\'s|lT\\\'S|Lt\\\'S|Lt\\\'sjust|lv\\\\\\/asn\\\'t|l\\\'ve|L\\\'ve|lVIan|lVIcHenry|lVIr\\.|lVlacArthur|LVlore|lVlr|lVlr\\.|lvluslc|lVlust|LVly|lwaited|lwamoto|lwant|lwanted|lwas|lwill|lwon\\\'t|lworked|lwould|lwould\\\'ve|lx\\/Iorning|M\\/dd\\/e|m\\/g\\/7ty|MACH\\/NE|MacKenz\\/e|majorjackpot|majormuscle|Manuela\\_|maste\\/y|Masturhate|Mattei\\_|mayjust|mbecause|McCa\\/Iister|McCallisler|Mccallister|Mccallisters|mcm\\\'s|mcney|mcral|mcre|mcve|mejust|Mexioo|mi\\/\\/\\<|misfartune|Ml6|Mlnd|Mock\\/\\\'ngbl\\\'rd|mOI\\\'\\\u20ac|Mom\\_|monkeyback|move\\_\\_\\_l|moveto|mustknock|Myheart|myjch|myjet|myjob|Myjob|myjob\\\'s|mylife|Mynew|myown|mypants|myselli|Myshoes|mysong|mytemper|mythumb|Myworld|N0|narne|Natians|naTve|nc|Nc|ncne|Ncrth|ncw|Ncw|needyou|neighboun|neverfound|neverthere|neverv\\\\\\/ill\\_|NewJersey|newjob|newjobs|nextdoor|Nighw|nilios|Nlagnificence|Nlakes|Nlalina|Nlan|Nlarch|Nlarine|Nlarion|Nlarry|Nlars|Nlarty|Nle|Nleet|Nlen|Nlom|Nlore|Nlornin|Nlother|Nlr|Nlr\\.|Nlrs|Nluch|nojurisdiction|noone|Noone|not\\ judging|notgoing|notjunk|Notjunk|notjust|notsure|novv|Nowjust|Nowthat\\\'s|Numbertwo|oan\\\'t|oan\\\'tjust|objecl|occultpowerand|Ocps|ofa|ofajudge|ofall|Ofall|ofBedford|ofcourse|Ofcourse|ofeach|ofeither|Offioer\\\'s|ofFrance|offreedom|offthe|offthis|offto|offun|ofguy|Ofhce|ofhis|ofHis|ofhoneybees|ofit|ofjam|OFJOAN|ofjoy|ofjunior|ofme|ofmead|ofmicroinjections|ofmy|ofNew|ofNorris\\\'|ofopinions|ofour|ofpeopla|ofthat|ofthe|Ofthe|oftheir|ofthem|ofthem\\\'s|ofthemselves|ofthere|ofthese|ofthings|ofthis|ofthlngs|ofthose|ofuse|ofwashington|ofyou|ofyour|OId|OIsson|Ok3Y|okaY|OkaY|OKaY|OKGY|Ol\\<|oldAdolfon|onboard|onIy|onIything|onJanuaw|onlyjust|Onyinal|oomprise|oonstitution|oouldn\\\'t|oould\\\'ve|oousin\\\'s|opiimistically|ora|orfall|orglory|orjust|Orjust|Orthat|orwould|Orwould|Othenzvise|our\\ joumey|ourbrave|ourfathers|ourgirlon|Ourgoal|Ourguy|ourj0b\\\'s|Ourj0b\\\'s|ourjobs|ourjob\\\'s|Ourjob\\\'s|ourjoumey|ourphotos|ourv\\\\\\/ay|outlool\\<\\\'s|overme|overthe|overthere|p\\/ace|P\\/ease|p\\_m\\_|P\\\xb0P\\$|PANUNG|pclnt|pclnts|pe0pIe|Perrut\\_|Persona\\/4\\/|Persona\\/y|persors|PIain|PIease|PIeasure|PIus|pleasurlng|POIe|Polynes\\/ans|poorshowing|popsicle|Presidenfs|probablyjust|puIIing|Putyourhand|Qh|QkaY|Qpen|QUYS|\\_QW|r\\/ght|ralnbow|ratherjump|ratherjust|Rcque|rcscucd|rea\\/|readytolaunchu|reaHy|ReaHy|reallyjust|reallymiss|reallytalked|reallythink|reallythinkthis|rememberthem|reoalibrated|retum|rhfluence|rightdown|roadyou|RUMBUNG|s\\/uggikh|S0|S1oW1y|saidyou|sayeverything\\\'s|saynothing|saythat|sc|scientihc|SCREAIVHNG|sCREAlvllNG|SCREAlvllNG|scund|S\\\'EOp|severa\\/parents|sfill|S\\\ufb02ence|shallrise|sHATTERING|shcws|Shdsjust|She\\`s|She\\\u2018II|she\\\'II|She\\\'II|she\\\'Il|Shejust|she\\\'lI|Shoofing|ShOp|shortyears|shou\\/dn|shou\\\ufb01ng|Shou\\\ufb02ng|shouldnt|Shouldrt|shouldrt|Shs\\\'s|SHUDDERWG|Shutup|SIGH\\$|signifcance|Sincc|sistervvill|Skarsg\\\xe9rd|slcsHs|slGHINcs|slGHING|slNGING|slzzLING|smarfest|Smiih|so\\/id|SoBl3lNG|soemtimes|Sojust|soldierl|somethlng|somethlng\\\'s|somez\\\'\\/7\\/ng|somthing|sumthing|sou\\/|SoundofMusic|SP\\/ash|SPEAK\\/NG|speII|speII\\\'s|Spendourtime|sQUA\\\\\\/\\\\\\/KING|StAnton|stealsjeans|StilI|Stilldesperatelyseeking|stlll|sToPs|storyl|Stubbom|su\\/faces|suffocaiing|summerjob|Summerjust|sun\\/ive|superiorman|sur\\\ufb02aces|t\\/ying|T0|T00|ta\\/ks|taiked|talkto|Talkto|talktonight|tampax|tc|tcday|tcrturing|tcuch|te\\/\\/|tearjust|tellsjokes|tellyou|terriers\\_|th\\/nk|THEPASSION|thafs|Thafs|Thai\\\'s|Thal\\\'s|thankyou|Thankyou|thatconverts|thatgoes|that\\\'II|That\\\'II|thatjob|thatjunk|thatjust|thatleads|Thatl\\\'m|that\\\'s\\ just|Thatsand|that\\\'sjust|That\\\'sjust|Thc|theirface|theirfeet|theirfury|thejaw|thejoint|thejudge|thejudges|Thejudges|thejury|Thelook|Therds|There\\\'II|There\\\'Il|There\\\'lI|They\\\'\\/\\\'e|they\\/\\\'II|They\\/re|They\\/\\\'re|they\\\'II|they\\\'Il|theyjust|Theyjust|they\\\'lI|They\\\'lI|theyre|theysay|thinkthat|this\\\'II|thlngs|Thlnkthls|thls|thore\\\'s|Thore\\\'s|Thorjust|thoughtl\\\'dletyou|tnatjust|tnat\\\'s|Tnat\\\'s|Tnere\\\'ll|to\\/\\/et|To\\/\\/S|todayl\\\'d|togelher|togethen|tojoin|tojudge|toldyou|tomorrovv|Tonighfsjust|totake|totalk|tothat|tothe|Towef|Tr\\/ck\\/ing|Traitur|tv\\\\\\/o|tvvelve|Tvvelve|tvventy|Tvventy|tvvo|Tvvo|twc|unconhrmed|underthat|underthe|underthese|underyour|unfilyou|Unfon\\\'unate\\/y|Uninnabited|untilApril|untilyou|upthinking|upto|V\\\\\\/ait\\_\\_\\_|v\\\\\\/as|V\\\\\\/as|V\\\\\\/e|v\\\\\\/eek\\\'s|V\\\\\\/eird\\_|V\\\\\\/ell|V\\\\\\/hat|V\\\\\\/hen\\\'ll|V\\\\\\/ho|v\\\\\\/ho\\\'ll|v\\\\\\/Hoops|v\\\\\\/ho\\\'s|V\\\\\\/ho\\\'s|V\\\\\\/hy|v\\\\\\/ith|v\\\\\\/on\\\'t|V\\\\fith|V\\\\fithin|valedictolian|vcice|ve\\/y|veiy|V\\\xe9ry|versioin|vi\\/ay|visitjails|Viva\\/di\\\'s|vlll|Voil\\\xe1|Voil\\\xe9|vvasjust|VVasn\\\'t|vvay|VVe|VVe\\\'II|VVe\\\'ll|Vvelooked|VVe\\\'re|VVe\\\'ve|VVhat|VVhat\\\'s|VVhat\\\'S|VVhen|\\\'v\\\'Vhere\\\'s|VVhip|vvHooPING|VvHooPING|VVhy|VVill|VVinters|vvlND|w\\\xa4n\\\'t|W9|waht|waierfall|walkjust|wallplant|wannajump|wantyou|Warcontinues|wasjennifer|wasjust|wasrt|Wasrt|wayl|wayround|wclf|wcman|wcmen|wcn\\\'t|wcrse|wculd|We\\/\\/|We\\/came|we\\/come|We\\/come|We\\/I|weekendjust|werert|Werert|we\\\'II|We\\\'II|we\\\'Il|We\\\'Il|wejust|we\\\'lI|We\\\'rejust|We\\\'ro|We\\\'Ve|wh\\/p|Wh\\\xb0ops|Whafs|Whatam|Whatare|Whateverwe|What\\\'II|Whatis|whatjust|Whatl|whatshe|whatwe|Whc\\\'s|Whcse|wHlsPERs|wi\\/\\/|wil\\/|Wil\\/|wilI|willbe|willhire|willneverknow|willyou|wlfe|wlfe\\\'s|wlth|wnat\\\'s|Wno|Wo\\/f|wo\\\ufb02d|WOI\\\'1\\\'t|wondernobody|won\\\'T|won\\\'tanswerme|won\\\'tforget|won\\\'tletitbring|Wo\\\'re|worfd|won\\\'th|won\\\'thwhile|workyou|wouIdn\\\'t|wouldn\\\'\\!|Wouldrt|wr\\/\\\'2\\\'\\/ng|writign|wrcng|wuuld|\\_Yay|Y\\\xa4u\\\'II|Y\\\xa4u\\\'ll|y\\\xa4u\\\'re|Y\\\xa4u\\\'re|y\\\xa4u\\\'ve|Y0|y0LI|y0u\\\'II|Y0u\\\'rc|Y0u\\\'re|Y0u\\\'ve|yaming|yaurparents|ycu|ycu\\\'d|ycur|Ycu\\\'re|Ycursins|YEI\\_I\\_|YELL\\$|yigg\\/mg|Yigg\\/mg|yoLI|yOu|yOU|you\\`re|you\\\'II|You\\\'II|You\\\'Il|youjack|youjoin|Youjoin|youjust|You\\\'lI|youngsterlike|youpick|you\\\'ra|Yourattention|yourautomobile|You\\\'rejustjealous|yourextra|yourfather|yourhand|yourhusband|yourjewelry|yourjob|Yourjob|yourjob\\_|yourjockey|yourjury|yourname|Yourpackage|yourpackage|you\\\'ro|yourpoorleg|yourvveak|you\\\'va|You\\\'va|youWlneversee|yQu|YQu|yQu\\\'\\_7|yummY|yuu|Yuu|Yuu\\\'ve|z\\\'housand|zlPPING|Ifslocked|nightjust|dayjourney|Ourjob|IunCh|nieCe|giVes|wantto|besttoday|NiCe|oftravelling|oftwo|ALl|afterparty|welL|theirjob|lfhe\\\'s|babyjesus|shithousejohn|jesus|withjesus|Gojoin|Adaughter|talkwith|anyjournals|L\\\'mjewish|arejust|soundjust|ifl\\\'m|askyou|ordinarywoman|andjunkies|isjack|helpyou|thinkyou|Lordjesus|injuvy|thejets|ifGod|againstjewish|ajunkie|dearjesus|hearyour|takeyears|friendjean|Fatherjohn|youjean|hearyou|Ifshe|didn\\\'tjust|IfGod|notjudge|andjudge|OKBY|myjourney|yourpremium|we\\\'rejust|Iittlejokes|Iifejust|Andjust|ofThe|lifejust|AIice|lnternationalAirport|yourbody|DollarBaby|ofjonesing|yourpanties|offforme|pantyparty|everhit|theirhomes|AirForce|yourhead|betterbe|myparty|disasterlockdown|Ifpot\\\'s|ifmy|yourmoney|Potterfan|Hermionejust|ofourshit|showyou|answernow|theirsjust|BIackie|SIeep|foryour|oryour|forArthur|CIamp|CIass|CIose|GIove|EIIen|PIay|PIace|EIgyn|AIert|CIaus|CIimb|military\\\'II|anylonget|yourlife|Yourbitch\\\'IIgetyou|yourdick|Tellyourbitch|rememberyou|newface|Butyou|don\\\'tyou|yourlives|Iovedher|reallydid|firstperson|mybest|Justgive|AIong|atyourbody|myhands|sayhe|mybooty|yourbooty|yourgirl|yourlegs|betterifthey|manybeautiful|contactpolice|numberbelow|biggestproblem|Itgave|everybodykind|theyhad|knowherlast|herhearing|othermembers|BIing|CIyde|foundguilty|fouryears|countyjail|yearin|theirrole|manybottles|can\\\'tpronounce|manybowls|ofthatgreen|manyjoyrides|Superrich|Iprefer|Theymust|whatyou|I\\\'IIjump|nobodyknow|neverknew|EIectronica|AIarm|getyourman|sayyou|getyour|Fuckyou|Whyyou|butyoujust|forgetyourname|Whatyou|Co\\/\\\'ncidenta\\/\\/y|GIad|RachelMarron|She\\\'llgive|presidentialsuite|andgentlemen|willnot|ourproducers|Ifshe\\\'s|CIock|Ishould|I\\\'llgo|maypass|andprotecting|BIessed|CIean|SIave|AIi|AIIah|AIIahu|CIick|BIast|AIlah|SIow|theirpolicies|Orperhaps|ofsex|forpleasure|ourpower|Yourpiece|Offioers|oondesoended|myseif|let\\\'sjust|yourway|An9TY|ourjourney|LuCY|\\\\\\\'m|CEDR\\/C|lsaac|FIy|Ionger|Iousy|Iosing|They\\\'II|yourpaws|littie|It\\\'lljust|AIso|Iisten|suPPosed|somePIace|exPIain|Iittle|StoP|AIways|Iectures|Iow|Ieaving|Ietting|Iistening|Iecture|Iicking|Iosses|PIeased|ofburglaries|He\\\'sjust|mytrucktoo|nowwhat|yourfire|herwhat\\\'s|hearthat|oryou|preferjournalist|CIaw|Ifour|lron|It\\\'syour|lfstill|forjoining|foryears|Ifit|notjump|ourproblem|yourprofile|ifJanine|forpreventative|whetherprotest|Ifnot|ourpeople|offmy|forproviding|hadjust|nearyou|whateveryou|hourputs|timejob|overyour|orpermanent|createjobs|I\\\'vejust|peoplejobs|dinnerpail|hasjumped|theirprivacy|AIl|ofserious|yourprofessional|poiitical|tojump|iives|eiections|militaryjuntas|nojoke|yourpresidency|ofmilitaryjuntas|Ourproposal|LeBIanc|KIaus|yourpussy|lNTERVIEWER|lNAUDIBLE|SImpsons|anotherjob|lfthere|descentinto|ofthathere|ofway|yourseat|allyou|Allyou|yourass|Yourbutt|iustiiggle|iust|CSi|affernoon|orpersecution|theirpetty|Fourpercent|fourpercent|willjust|Ifyou\\\'re|ourplanet|lsolation|yourprimitive|yourplanet|matteryour|Yourplace|andjustice|anotherpart|confiict|growingjeopardy|hasjust|havejust|herselfinto|ifnecessary|we\\\'vejust|tojust|yourjudgment|yourjeans|Youjust|ajanitor|FIattery|myjournal|myjudgment|offofmy|offyour|ofgood|ofguilty|ofhaving|ofheart|ofhonor|oflove|ofmankind|ofmany|ofnormal|ofpeople|ofpower|ofsuch|peoplejust|They\\\'rejust|tojeopardize|Yourplaces|yourposition|yourselfa|yourselfright|thejob|thejanitors|alljust|forAmerica\\\'s|Forpencils|forpondering|handwrittenjournals|herpursuit|ofjust|oflanding|oflife|outjust|Thejoke|ourpatient|oryou\\\'re|ofyourself|poweryour|Ofmy|EIlen|Don\\\'tget|tellme|ofdecision|itgoing|artificialgravity|shouldknow|Hasn\\\'tgot|thirdjunction|somebodypicks|Willyou|can\\\'tget|BuZZes|wouldn\\\'tyou|Wellbelow|What\\\'dyou|decipheredpart|they\\\'llknow|ifit\\\'s|ornot|myposition|lndistinct|anybiscuits|Andifyou|lfwe|yourarm|lnteresting|findit|it\\\'llstart|holdit|ofkilling|Howyou|lnhales|lgot|CIip|what\\\'II|road\\\'II|girI|LIoyd|BIake|reaI|Foryour|yourpublic|LAst|h\\ is|He\\)\\\u2019|Ls|al\\\'|wail\\\'|III\\\'ll|forthis|Yea\\ h|a\\ re|He\\)\\"|pan\\\'|yea\\ h|Tun|He\\)\\\'|he\\)\\\'|I\\\'11|he\\)\\"|\\ \\\'re\\ )(\\b|$)'}},
+ 'fin': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict([(u'Katsokaa pa.', u'Katsokaapa.'), (u'Mik!\r\n""e\u201c9ir\xe4\u0131', u'Mik!\r\n-Hengit\xe4!'), (u'Tu lta!', u'Tulta!'), (u'...0I1...', u'...on...'), (u'Ken g\xe4n nauh oja?', u'Keng\xe4nnauhoja?'), (u'k\xe3mmott\xe3V\xe3ll\xe3 mUiStoll\xe3.', u'kammottavana muistona.'), (u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen ksen asun to o ns\xe4.', u'H\xe4n n\xe4ki naisen menev\xe4n\r\nkellarikerroksen asuntoonsa.'), (u'Min\xe4 etsin k\xe4siini miehen, joka\r\non aurtanutiestradea ja minua:', u'Min\xe4 etsin k\xe4siini miehen, joka\r\non auttanut Lestradea ja minua:'), (u'Huomaa erityisesti\r\npunaisella merkitty "kitoris.', u'Huomaa erityisesti\r\npunaisella merkitty "klitoris".'), (u'Tulkaa, meill\xe4 on\r\nHa va\u0131ji-bileet suihkussa', u'Tulkaa, meill\xe4 on\r\nHavaiji-bileet suihkussa'), (u'Ta rkoitatko ett\xe4\r\nh\xe4net myrkytettiin?', u'Tarkoitatko ett\xe4\r\nh\xe4net myrkytettiin?'), (u'Odotta kaa soittoani\r\nIev\xe4hdyspaikalla.', u'Odottakaa soittoani\r\nlev\xe4hdyspaikalla.'), (u'Nyt kuuntelet, perska rva.', u'Nyt kuuntelet, perskarva.'), (u'Ta patko h\xe4net sitten?', u'Tapatko h\xe4net sitten?'), (u'Seuraa vissa va/oissa.', u'Seuraavissa valoissa.'), (u'A\u0131o\u0131t rapattaa minut.\r\n- En.', u'Aioit tapattaa minut.\r\n- En.'), (u'Todella vaku uttavaa.', u'Todella vakuuttavaa.'), (u'I-le ovat tuolla alhaalla', u'He ovat tuolla alhaalla'), (u'Nainen kuuluu minulle.\r\n- I-I\xe0ivy siit\xe4, ylikasvuinen hyttynen!', u'Nainen kuuluu minulle.\r\n- H\xe4ivy siit\xe4, ylikasvuinen hyttynen!'), (u'I-Ialuatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.', u'Haluatte k\xe4ytt\xe4\xe4 pyh\xe0\xe0 kive\xe4\r\ndynastian aarteen l\xf6yt\xe4miseksi.'), (u'Mit\xe4f?', u'Mit\xe4.. ?'), (u'Kuuluuko Hiru ko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.', u'Kuuluuko Hiruko-klaanista mit\xe4\xe4n?\r\n- Ninjasoturit ovat edell\xe4mme.'), (u'Anteeks\u0131} painoin kai... -', u'Anteeksi, painoin kai... -'), (u'ja Rea! Ho usew\xedves.', u'ja Real Housewives.'), (u'Et halu n n ut Julkkistansseihinkaan.', u'Et halunnut Julkkistansseihinkaan.'), (u'Laard i k\xe4si?', u'Laardik\xe4si?'), (u'Varo kaa!', u'Varokaa!'), (u'N\xe4ytt\xe4v\xe4t k\xf6 tyt\xf6t v\xe4h \xe4n\r\nh uorahtavi m m i lta?', u'N\xe4ytt\xe4v\xe4tk\xf6 tyt\xf6t v\xe4h\xe4n\r\nhuorahtavimmilta?'), (u'Stif... Ier.', u'Stif... ler.'), (u'J u mantsu kka! M it\xe4?', u'Jumantsukka! Mit\xe4?'), (u'Varasin Ch u m bawam ban,', u'Varasin Chumbawamban,'), (u'J u malavita!', u'Jumalavita!'), (u'S', u'Isi...'), (u'Haluan kertoa jotai n', u'Haluan kertoa jotain'), (u'I-Ialuatte', u'Haluatte')]),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'kellojo', u'kello jo'), (u'onjo', u'on jo'), (u'senj\xe4lkeen', u'sen j\xe4lkeen'), (u'Ts\xe4u', u'Tsau'), (u'hydraulinenjousitus', u'hydraulinen jousitus'), (u'Kevyetja', u'Kevyet ja'), (u'Oleijo', u'Olet jo'), (u'viimeinenjuna', u'viimeinen juna'), (u'n\xe4ytt\xe4\xe4jotenkin', u'n\xe4ytt\xe4\xe4 jotenkin'), (u'onjoku', u'on joku'), (u'Iapsuuteen', u'Lapsuuteen'), (u'Ieikitjunill\xe4', u'leikit junilla'), (u'Sfiy', u'Stig'), (u'Iukulasejani', u'Lukulasejani'), (u'Ieikkiminen', u'Leikkiminen'), (u'K\xe4\xe4lik\xe4\xe4rylepizz\xe4', u'Kaalik\xe4\xe4rylepizza'), (u'sukl\xe4\xe4k\xe4stikkeen', u'suklaakastikkeen'), (u'p\xe4istetun', u'paistetun'), (u'b\xe4n\xe4\xe4nin', u'banaanin'), (u'pifi', u'piti'), (u'a\u0131keasfaan', u'oikeastaan'), (u'Stg', u'Stig'), (u'sikain\ufb02uenssatja', u'sikainfluenssat ja'), (u'Hienojuna', u'Hieno juna'), (u'kiinnostuajunista', u'kiinnostua junista'), (u'h\xe4y\u0131yvetu\u0131\xedn', u'h\xf6yryveturin'), (u'pienaismalli', u'pienoismalli'), (u'ena', u'eno'), (u'racfios\xe3hk\xe4ff\xe1j\xe3n\xe3', u'radios\xe4hk\xf6tt\xe4j\xe4n\xe4'), (u'Amenkan', u'Amerikan'), (u'laiva/la', u'laivalla'), (u'0/in', u'Olin'), (u'Junaha\u0131rasfus', u'Junaharrastus'), (u'enasfa', u'enosta'), (u'/V\u0131\xedn', u'Niin'), (u'Oliivarmasii', u'Olit varmasti'), (u'Internetist\xe4juuri', u'Internetist\xe4 juuri'), (u'hu\u0131janj\xe3nniff\xe5v\xe3\xe0l', u'hurjan j\xe4nnitt\xe4v\xe4\xe4.'), (u'Vaikkajunat', u'Vaikka junat'), (u'k\xe4\xe4ntyija', u'k\xe4\xe4ntyi ja'), (u'osaajotain', u'osaa jotain'), (u'Ieikill\xe4mme', u'leikill\xe4mme'), (u'Bellinjuna', u'Beltin juna'), (u't\xe4st\xe4johtolangasta', u't\xe4st\xe4 johtolangasta'), (u'tuntisijonkun', u'tuntisi jonkun'), (u'Olgajotain', u'Olga jotain'), (u'tulokseivuodesia', u'tulokset vuodesta'), (u'tuloksetvuodesta', u'tulokset vuodesta'), (u'Vainjalkapallo', u'Vain jalkapallo'), (u'lloveyou', u'I love you'), (u'po\ufb02\u2039aisi', u'potkaisi'), (u'minufulos', u'minut ulos'), (u'Ieiv\xe4npaahdinl', u'leiv\xe4npaahdin!'), (u'Ieiv\xe4npaahdinta', u'leiv\xe4npaahdinta'), (u'asuajossain', u'asua jossain'), (u'Koiratjuoksentelivat', u'Koirat juoksentelivat'), (u'tiet\xe4\xe4jotain', u'tiet\xe4\xe4 jotain'), (u'osaatjuna', u'osaat juna'), (u'va/as', u'valas'), (u'va/asperhe', u'valasperhe'), (u'koskeejotain', u'koskee jotain'), (u'I\xe4\xe4kkeens\xe4', u'l\xe4\xe4kkeens\xe4'), (u'Iaulavan', u'laulavan'), (u'Kuulitj\xe4\xe4n', u'Kuulit j\xe4\xe4n'), (u'Ievolle', u'levolle'), (u'Va/aa//e', u'Valaalle'), (u'va/aa//a', u'valaalla'), (u'I\xe4hdenkin', u'l\xe4hdenkin'), (u'Iakkiin', u'lakkiin'), (u'Iohik\xe4\xe4rmeell\xe4', u'lohik\xe4\xe4rmeell\xe4'), (u'Mik\u0131', u'Mik!'), (u'Iukossa', u'lukossa'), (u'Va/aan', u'Valaan'), (u's\xe4ve/m\xe4', u's\xe4velm\xe4'), (u'j\xe4//een', u'j\xe4lleen'), (u'P\xf6\xf6\u0131', u'P\xf6\xf6!'), (u'Hnjaa', u'Hiljaa'), (u'Iiftasin', u'liftasin'), (u'Jute//aan', u'Jutellaan'), (u'Iohduttamaan', u'lohduttamaan'), (u"L'lYP\xe4f\xe4\xe4n", u'Hyp\xe4t\xe4\xe4n'), (u'\xc4\u0131r\u0131\u0131', u'\xc4iti!'), (u'F\u0131\u0131\u0131p\u0131', u'Filip!'), (u'Yr\u203ar\u203a\xe4\xe4\u0131', u'Hypp\xe4\xe4!'), (u'Miki', u'Mik!'), (u'Heng\u0131r\xe4\u0131', u'Hengit\xe4!'), (u'Va/as', u'Valas'), (u'Ko///is', u'Koillis'), (u'Audieja', u'Audie ja'), (u'I/man', u'Ilman'), (u'/entotukia/ukse/ta', u'lentotukialukselta'), (u'/aivastosta', u'laivastosta'), (u'/entotukikohtaan', u'lentotukikohtaan'), (u'tu/ee', u'tulee'), (u'akse/iva//at', u'akselivallat'), (u'a\u0131\u0131ek\u0131rjo\u0131rerr\u0131\u0131n', u'allekirjoitettiin'), (u'Iitkua', u'litkua'), (u'0li', u'Oli'), (u'Iaskuvarjojoukkoihin', u'laskuvarjojoukkoihin'), (u'Iaskuvarjojoukoissa', u'laskuvarjojoukoissa'), (u'Tarvitsetjotain', u'Tarvitset jotain'), (u'Ieukaremmi', u'leukaremmi'), (u'Iainaatko', u'lainaatko'), (u'p\xe4\xe4llik\xf6lleja', u'p\xe4\xe4llik\xf6lle ja'), (u'I\xe4hell\xe4ni', u'l\xe4hell\xe4ni'), (u'Soti/aan', u'Sotilaan'), (u'va//attava', u'vallattava'), (u'viho//ise/ta', u'viholliselta'), (u'/iittoutuneet', u'liittoutuneet'), (u'voitjohtaa', u'voit johtaa'), (u'pohditkojotain', u'pohditko jotain'), (u'viho//ista', u'vihollista'), (u'sej\xe4isi', u'se j\xe4isi'), (u'Ient\xe4jill\xe4', u'lent\xe4jill\xe4'), (u'Soltutl', u'Soltut!'), (u'Iaulustamme', u'laulustamme'), (u'Iakkiani', u'lakkiani'), (u'Iiemeen', u'liemeen'), (u'kanadala\u0131\u0161ia', u'kanadalaisia'), (u'si//anp\xe4\xe4asema', u'sillanp\xe4\xe4asema'), (u'vahv\u0131\u0161tettiin', u'vahv\u0131stettiin'), (u'tu/ituki', u'tulituki'), (u'eliitt\u0131joukkoa', u'eliittijoukkoa'), (u'pa\u0131ka\u0131\u0131as\u0131\u0131', u'paikallasi!'), (u'Ieikkinyt', u'leikkinyt'), (u'Iujitettu', u'lujitettu'), (u'Ete/\xe4', u'Etel\xe4'), (u'viho//isranna//e', u'vihollisrannalle'), (u'sivusta/ta', u'sivustalta'), (u'/oppuisi', u'loppuisi'), (u'Iaskuvarjojoukkojen', u'laskuvarjojoukkojen'), (u'p\xe4\xe4tt\xe4nytj\xe4\xe4d\xe4', u'p\xe4\xe4tt\xe4nyt j\xe4\xe4d\xe4'), (u'Iuutnanteille', u'luutnanteille'), (u'I\xe4ht\xf6valmiiksi', u'l\xe4ht\xf6valmiiksi'), (u'Iokoisat', u'lokoisat'), (u'Korjaus/ukemat', u'Korjauslukemat'), (u'tanke///e', u'tankeille'), (u'ky\u0131\u0131\xe4\u0131', u'kyll\xe4!'), (u'Iisti\xe4', u'listi\xe4'), (u'Kunniamita/in', u'Kunniamitalin'), (u'Vemon', u'Vernon'), (u'fied\xe3n', u'Tied\xe4n'), (u'Ei\u0131is', u'Elvis'), (u'Inlem\xe4tion\xe4', u'International'), (u'holelfss\xe4', u'hotellissa'), (u'Han\u0131ey', u'Harvey'), (u'peikk\xe4', u'pelkk\xe4'), (u'Ehisl\xe3', u'Elvist\xe4'), (u'Y\ufb02\xe3ll\xe3v\xe3', u'Yll\xe4tt\xe4v\xe4'), (u'mahdolisuus', u'mahdollisuus'), (u'loisteiaan', u'loisteliaan'), (u'aku', u'alku'), (u'Garonilie', u'Garonille'), (u'Iikainen', u'likainen'), (u'vaiehtelijoita', u'valehtelijoita'), (u'puutari\u0131aasi', u'puutarhaasi'), (u'Garunin', u'Garonin'), (u'oravaietti\xe4', u'oravaletti\xe4'), (u'paijon', u'paljon'), (u'sutja', u'sut ja'), (u'gospeikvartetissa', u'gospelkvartetissa'), (u'Iauiajaksi', u'laulajaksi'), (u'viihdylt\xe4j\xe4', u'viihdytt\xe4j\xe4'), (u'hannaala', u'harmaata'), (u'Iaulajalta', u'laulajalta'), (u'saatjotain', u'saat jotain'), (u'L\xf6yd\xe4njonkun', u'L\xf6yd\xe4n jonkun'), (u'py\xfcr\xedyi', u'py\xf6rtyi'), (u'Cn\u0131dupia', u'Crudupia'), (u'Iiikaa', u'liikaa'), (u'ke\u0131taa', u'kertaa'), (u'Thafs', u"That's"), (u'Kappaietta', u'Kappaletta'), (u'soijoka', u'soi joka'), (u'Levytl\xe4', u'Levyll\xe4'), (u'paiaamista', u'palaamista'), (u'kuonnunn', u'kuormurin'), (u'Tytt\xfcyst\xe4v\xe4t', u'Tytt\xf6yst\xe4v\xe4t'), (u'k\xe3p\xe3l\xf6ifiin', u'k\xe4p\xe4l\xf6itiin'), (u'Oiko', u'Oliko'), (u'tuipalo', u'tulipalo'), (u'hebofiavaa', u'helpottavaa'), (u'ongeina', u'ongelma'), (u'ongeimia', u'ongelmia'), (u'Ajateikaa', u'Ajatelkaa'), (u'ku\u0131ki', u'kurki'), (u'lhailen', u'Ihailen'), (u'L\xe4ht\xfcsi', u'L\xe4ht\xf6si'), (u'yhti\xf6ile', u'yhti\xf6lle'), (u'eitoimi', u'ei toimi'), (u'voij\xe4\xe4d\xe4', u'voi j\xe4\xe4d\xe4'), (u'Pomkat', u'Porukat'), (u'kon\u0131ata', u'korvata'), (u'konsentien', u'konserttien'), (u'Sep\xe3', u'Sep\xe4'), (u'hebolus', u'helpotus'), (u'k\xfcyryss\xe4', u'k\xf6yryss\xe4'), (u'repiat', u'replat'), (u'kuikee', u'kulkee'), (u'pon\u0131koita', u'porukoita'), (u'naisetja', u'naiset ja'), (u'ten\u0131etuileeksi', u'tervetulleeksi'), (u'yl\xe4puolelia', u'yl\xe4puolella'), (u'kuullut180', u'kuullut 180'), (u'Iapsellista', u'lapsellista'), (u'esiinnytja', u'esiinnyt ja'), (u'Iaulat', u'laulat'), (u'Henanjestas', u'Herranjestas'), (u'teilie', u'teille'), (u'IIe', u'lle'), (u't\xe4ilaisia', u't\xe4llaisia'), (u'Varu', u'Varo'), (u'nimeli\xe4\xe4n', u'nimell\xe4\xe4n'), (u'anneijaan', u'armeijaan'), (u'pen\u0131staa', u'perustaa'), (u'minkkitu\u0131kkia', u'minkkiturkkia'), (u'minkkituiiiilla', u'minkkiturkilla'), (u'Ten\u0131etuioa', u'Tervetuloa'), (u'kuitalevy\xe4', u'kultalevy\xe4'), (u'ei\xe4m\xe4ss\xe4', u'el\xe4m\xe4ss\xe4'), (u'jutkaisua', u'julkaisua'), (u'Fo\u0131t', u'Fort'), (u'oien', u'olen'), (u'asioilie', u'asioille'), (u'Eitarvitsekaan', u'Ei tarvitsekaan'), (u'p\xf6kenyin', u'p\xf6kerryin'), (u'yll\xe4iiyy', u'yll\xe4ttyy'), (u'komeaita', u'komealta'), (u'Chadie', u'Charlie'), (u'laulaisilteko', u'laulaisitteko'), (u'Iaittaa', u'laittaa'), (u'iytt\xe4renne', u'tytt\xe4renne'), (u'pikkutytt\xfcn\xe4', u'pikkutytt\xf6n\xe4'), (u'tytt\xfckulta', u'tytt\xf6kulta'), (u'vimuilua', u'virnuilua'), (u'reporitereita', u'reporttereita'), (u'vime', u'virne'), (u'eijohdu', u'ei johdu'), (u'eriiainen', u'erilainen'), (u'Iasketa', u'lasketa'), (u'kem\u0131ttu', u'kerrottu'), (u'Manyja', u'Marty ja'), (u'etteijutusta', u'ettei jutusta'), (u'Katifomiassa', u'Kaliforniassa'), (u'sun\xb0filaudan', u'surffilaudan'), (u'bn\u0131netti', u'brunetti'), (u'vaimiina', u'valmiina'), (u'yiim\xe4\xe4r\xe4iset', u'ylim\xe4\xe4r\xe4iset'), (u'leffatj\xe4\xe4', u'leffat j\xe4\xe4'), (u"koin'lle", u'koirille'), (u'T\xe4ilaisen', u'T\xe4llaisen'), (u'antanutjo', u'antanut jo'), (u'Cha\u0131lien', u'Charlien'), (u'ymp\xe4riliesi', u'ymp\xe4rillesi'), (u'Iy\xfc', u'ly\xf6'), (u"lopan't", u'loparit'), (u'h\u0131isi', u'tulisi'), (u'kuuiuvanijonnekin', u'kuuluvani jonnekin'), (u'juh\u0131n', u'jutun'), (u'miefkseni', u'mielikseni'), (u'Tuisitko', u'Tulisitko'), (u'I\u0131on\xe4ni', u'luonani'), (u'\xe4k\xe4\xe4', u'alkaa'), (u'yi', u'yli'), (u'rupallelemaan', u'rupattelemaan'), (u'Priscilialla', u'Priscillalla'), (u'Hemmoltelet', u'Hemmotelet'), (u'Hearlbreak', u'Heartbreak'), (u'Holelia', u'Hotelia'), (u'Nyton', u'Nyt on'), (u'kiertueeile', u'kiertueelle'), (u'Elvist\xe3', u'Elvist\xe4'), (u'puoleila', u'puolella'), (u'\xc4\u0131\xe4', u'\xc4l\xe4'), (u'lnlemalional', u'International'), (u'Iuottamustanne', u'luottamustanne'), (u'Mycroft\xedsta', u'Mycroftista'), (u'Iopettako', u'lopettako'), (u'Ielukauppa', u'lelukauppa'), (u'Iomamatkalle', u'lomamatkalle'), (u'Iyhyelle', u'lyhyelle'), (u'Alk\xe4\xe4', u'\xc4lk\xe4\xe4'), (u'K_uka', u'Kuka'), (u'IIa', u'lla'), (u'Aitinne', u'\xc4itinne'), (u'V\xe4/ikohtaus', u'V\xe4likohtaus'), (u'kuo//aan', u'kuollaan'), (u'n\xe4/k\xe4\xe4n', u'n\xe4lk\xe4\xe4n'), (u'Su/je', u'Sulje'), (u'I\xe4im\xe4ytit', u'l\xe4im\xe4ytit'), (u'I\xe4hetyst\xf6ss\xe4', u'l\xe4hetyst\xf6ss\xe4'), (u'I\xe4hetyst\xf6\xf6n', u'l\xe4hetyst\xf6\xf6n'), (u'Iaosilainen', u'laosilainen'), (u'Iiiketarjous', u'liiketarjous'), (u'kaappavat', u'kaappaavat'), (u'Ieiviss\xe4\xe4n', u'leiviss\xe4\xe4n'), (u'EriC', u'Eric'), (u'Voi/\xe0', u'Voil\xe0'), (u'Crawley\u0131', u'Crawley!'), (u'Iihaksiaan', u'lihaksiaan'), (u'Iuenkaan', u'luenkaan'), (u'Olemma', u'Olemme'), (u'I\xe4htisitte', u'l\xe4htisitte'), (u'jot\xe2in', u'jotain'), (u'Eversi', u'Eversti'), (u'Ieiriyty\xe4', u'leiriyty\xe4'), (u'Iiikutte', u'liikutte'), (u'I\xe4\xe4ketiedett\xe4', u'l\xe4\xe4ketiedett\xe4'), (u'Iivet\xe4', u'livet\xe4'), (u'Iapsetkin', u'lapsetkin'), (u'I\xe4\xe4keluettelo', u'l\xe4\xe4keluettelo'), (u'Iaatiko', u'laatikko'), (u'hyvih', u'hyvin'), (u'Ieukakuoppa', u'leukakuoppa'), (u'Ient\xe4j\xe4ni', u'lent\xe4j\xe4ni'), (u'Ieikkisi', u'leikkisi'), (u'Iupaamastaan', u'lupaamastaan'), (u'ku/taseni', u'kultaseni'), (u'tu/en', u'tulen'), (u'Iautalle', u'lautalle'), (u'100_vuotiaaksi', u'100 vuotiaaksi'), (u'_', u''), (u'Viilt\xe4j\xe3_Jackin', u'Viilt\xe4j\xe4 Jackin'), (u'keff\xe4rfkerro', u'kellarikerroksen'), (u'tan/itsi', u'tarvitsi'), (u'_Aivan', u'Aivan'), (u'_Valosta', u'Valosta'), (u'_Teemmek\xf6', u'Teemmek\xf6'), (u'Viilt\xe4j\xe4_Jack', u'Viilt\xe4j\xe4 Jack'), (u'_Voi', u'Voi'), (u'_Tied\xe4tte', u'Tied\xe4tte'), (u'kulunutjo', u'kulunut jo'), (u'Vuokra_auto', u'Vuokra-auto'), (u'_Tuokaa', u'Tuokaa'), (u'_Tunnetteko', u'Tunnetteko'), (u'_Tied\xe4mme', u'Tied\xe4mme'), (u'toissay\xf6n', u'toissa y\xf6n'), (u'_Toki', u'Toki'), (u'_Ammuttu', u'Ammuttu'), (u'_Jahtasit', u'Jahtasit'), (u'_Tunnenko', u'Tunnenko'), (u'_Joku', u'Joku'), (u'_Taivahan', u'Taivahan'), (u'Kuorma_auto', u'Kuorma-auto'), (u'_Vain', u'Vain'), (u'Mesmer_klubille', u'Mesmer klubille'), (u"0nslow'IIe", u"Onslow'lle"), (u'Mesmer_klubi', u'Mesmer klubi'), (u'_Anteeksi', u'Anteeksi'), (u'Schrenk_Notzing', u'Schrenk Notzing'), (u'_Tapoin', u'Tapoin'), (u'_AIk\xe4\xe4', u'\xc4lk\xe4\xe4'), (u'0dotan', u'Odotan'), (u'Iuonteenlu', u'luonteenlu'), (u'Iempikaupunkini', u'lempikaupunkini'), (u'Iavasta', u'lavasta'), (u'I\xe4mmittelij\xe4t', u'l\xe4mmittelij\xe4t'), (u'Iaastaria', u'laastaria'), (u'Riiu\xe4\xe4', u'Riitt\xe4\xe4'), (u'K\xe4yu\xe4v\xe4tk\xf6', u'K\xe4ytt\xe4v\xe4tk\xf6'), (u'I\xe4hestyk\xf6', u'l\xe4hestyk\xf6'), (u'Ieikekirja', u'leikekirja'), (u'Ievyj\xe4\xe4n', u'levyj\xe4\xe4n'), (u'Iahjoitamme', u'lahjoitamme'), (u'L\xe4pp\xe4\xe4tuohon', u'L\xe4pp\xe4\xe4 tuohon'), (u'CIawdy', u'Clawdy'), (u'mita', u'mit\xe4'), (u'jalkeen', u'j\xe4lkeen'), (u'Cannabisjaponica', u'Cannabis japonica'), (u'Ieningin', u'leningin'), (u'ki\u0131joitatte', u'kirjoitatte'), (u'ki\u0131joitetuksi', u'kirjoitetuksi'), (u'kuluttuu', u'kuluttaa'), (u'Iuvulta', u'luvulta'), (u'Ieipomiskilpailuun', u'leipomiskilpailuun'), (u'Maclntire', u'MacIntire'), (u'Iehteemme', u'lehteemme'), (u'Al\xe4', u'\xc4l\xe4'), (u'kysesss\xe4', u'kyseess\xe4'), (u'Itsepuolustustal', u'Itsepuolustusta!'), (u'Iiipasimesta', u'liipasimesta'), (u'Iuutani', u'luutani'), (u'Iahjansa', u'lahjansa'), (u'I\xe4himm\xe4isemme', u'l\xe4himm\xe4isemme'), (u'Iuhistuu', u'luhistuu'), (u'\u0131\xf6yhk\xe4', u'l\xf6yhk\xe4'), (u'Iehtileikkeleit\xe4', u'lehtileikkeleit\xe4'), (u'vefieni', u'veljeni'), (u'Iapselleni', u'lapselleni'), (u'ep\xe4normaalinal', u'ep\xe4normaalina!'), (u'Iuurankoja', u'luurankoja'), (u'Iuurangoista', u'luurangoista'), (u'p\xe4\xe4tiellel', u'p\xe4\xe4tielle!'), (u'Valonneitsytta', u'Valonneitsytt\xe4'), (u'Iohik\xe1\xe1rmekuula', u'lohik\xe4\xe4rmekuula'), (u'yhdella', u'yhdell\xe4'), (u'Tasta', u'T\xe4st\xe4'), (u'__', u''), (u'Alk\xe1\xe4', u'\xc4lk\xe4\xe4'), (u'etta', u'ett\xe4'), (u'pitaa', u'pit\xe4\xe4'), (u'n\xe4lk\xe1isi\xe4', u'n\xe4lk\xe4isi\xe4'), (u'Hyva', u'Hyv\xe4'), (u'hyvasta', u'hyv\xe4st\xe4'), (u'ruoastaja', u'ruoasta ja'), (u'K\xe1sivarteni', u'K\xe4sivarteni'), (u'k\xe4ikki', u'kaikki'), (u'Mozukust\xe4', u'Mozukusta'), (u'Etsiv\xe1tk\xf6', u'Etsiv\xe4tk\xf6'), (u'Iohik\xe1\xe1rmekuulaa', u'lohik\xe4\xe4rmekuulaa'), (u'Valonneitsytt\xe1', u'Valonneitsytt\xe4'), (u'taalla', u't\xe4\xe4ll\xe4'), (u'siemeni\xe1\xe1n', u'siemeni\xe4\xe4n'), (u'kunh\xe4n', u'kunhan'), (u'\xe4j\xe4ttelen', u'ajattelen'), (u'pelkuril', u'pelkuri!'), (u'kyla', u'kyl\xe4'), (u'hy\xf6kk\xe1ykselt\xe4', u'hy\xf6kk\xe4ykselt\xe4'), (u'hy\xf6kk\xe1isi', u'hy\xf6kk\xe4isi'), (u'hy\xf6kataan', u'hy\xf6k\xe4t\xe4\xe4n'), (u'Voitjuoda', u'Voit juoda'), (u'Iittaamisesta', u'littaamisesta'), (u'Iahtenyt', u'l\xe4htenyt'), (u'kylasta', u'kyl\xe4st\xe4'), (u'Etjuurik\xe4\xe4n', u'Et juurikaan'), (u's\xe4m\xe4lt\xe4', u'samalta'), (u'k\xe4ikki\xe4ll\xe4', u'kaikkialla'), (u'ehka', u'ehk\xe4'), (u'tiennytkaan', u'tiennytk\xe4\xe4n'), (u'taistelenl', u'taistelen!'), (u'Iiikkeita', u'liikkeit\xe4'), (u'Taistellaanl', u'Taistellaan!'), (u'Odott\xe4m\xe4ttom\xe4t', u'Odottamattomat'), (u'n\xe4utinnot', u'nautinnot'), (u'rikk\xe4\xe4n', u'rikkaan'), (u'Iuotettavalta', u'luotettavalta'), (u'elaa', u'el\xe4\xe4'), (u'pekki\xe3', u'pelkki\xe4'), (u'j\xe3keen', u'j\xe4lkeen'), (u'n\xf6rttej\xe3', u'n\xf6rttej\xe4'), (u'pen\u0131skursseja', u'peruskursseja'), (u'Suorititjo', u'Suoritit jo'), (u'sein\xe4il\xe4', u'sein\xe4ll\xe4'), (u'Iaiteta', u'laiteta'), (u'hennostu', u'hermostu'), (u'Coiumbiassa', u'Columbiassa'), (u'Pen\u0131erssi\xe4', u'Perverssej\xe4'), (u'sukupuoieimisl\xe3', u'sukupuolielimist\xe4'), (u'ep\xe3iooginen', u'ep\xe4looginen'), (u'oisin', u'olisin'), (u'iittoni', u'liittoni'), (u'oisi', u'olisi'), (u'asuntoia', u'asuntola'), (u'p\xe4\xe4sittejatkoseminaariini', u'p\xe4\xe4sitte jatkoseminaariini'), (u'An\u0131atkaapa', u'Arvatkaapa'), (u'Iopussa', u'lopussa'), (u'Oletjo', u'Olet jo'), (u'Haiuan', u'Haluan'), (u'luennoilie', u'luennoille'), (u'Iintsata', u'lintsata'), (u'oletjuuri', u'olet juuri'), (u'Iuuietko', u'luuletko'), (u'kylvyss\xe3', u'kylvyss\xe4'), (u'v\xe3l\xe3hti', u'v\xe4l\xe4hti'), (u'Miettik\xe3\xe3', u'Miettik\xe4\xe4'), (u'insin\xf6\xfcn', u'insin\xf6\xf6ri'), (u'Menithalpaan', u'Menit halpaan'), (u'Tukaa', u'Tulkaa'), (u'Aarun', u'Aaron'), (u'Kieleil\xe4si', u'Kielell\xe4si'), (u'pystytjohonkin', u'pystyt johonkin'), (u'K\xe4mppikseniWilliam', u'K\xe4mppikseni William'), (u'Iuolamies', u'luolamies'), (u'keskian\u0131on', u'keskiarvon'), (u'kananosta', u'kartanosta'), (u'p\xe4iv\xe4lliselie', u'p\xe4iv\xe4lliselle'), (u'Iasagnea', u'lasagnea'), (u'voitehota', u'voi tehota'), (u'0lisit', u'Olisit'), (u'menijuuri', u'meni juuri'), (u'tapasivatjo', u'tapasivat jo'), (u'kn\u0131unukoriiiliiset', u'kruunukorkilliset'), (u'eijuo', u'ei juo'), (u'N\xe4yt\xe4tuupuneeita', u'N\xe4yt\xe4t uupuneelta'), (u'Etan\u0131aakaan', u'Et arvaakaan'), (u'lhanko', u'Ihanko'), (u'y\ufb02t\xe4k\xe4\xe4n', u'yrit\xe4k\xe4\xe4n'), (u'serkkuniWinn', u'serkkuni Winn'), (u'voijatkua', u'voi jatkua'), (u'miehetja', u'miehet ja'), (u'v\xedesfin\xed', u'viestini'), (u'kuull\u0131lsinusla', u'kuullut sinusta'), (u'T\xe3m\xe3', u'T\xe4m\xe4'), (u'kel\xe3\xe3n', u'ket\xe4\xe4n'), (u'vedess\xe3k\xe3veij\xe3', u'vedess\xe4k\xe4velij\xe4'), (u'/abrassa', u'labrassa'), (u'akaa', u'alkaa'), (u'Iiinaa', u'liinaa'), (u'kan\u0131ainen', u'karvainen'), (u'oten', u'olen'), (u'kallaisesi', u'kaltaisesi'), (u'pmffa', u'proffa'), (u'tulitt\xe4nne', u'tulit t\xe4nne'), (u'Alalteko', u'Alatteko'), (u'luuiisit', u'luulisit'), (u'Pys\xe3hdy', u'Pys\xe4hdy'), (u'Paskath\xe4nest\xe4', u'Paskat h\xe4nest\xe4'), (u'Pys\xe3hdyheti', u'Pys\xe4hdy heti'), (u'Heivetti', u'Helvetti'), (u'Pid\xe3l\xe3n', u'Pid\xe4t\xe4n'), (u'V\ufb02ru', u'Varo'), (u'huolissasijostain', u'huolissasi jostain'), (u'hurmaavatpuhelusi', u'hurmaavat puhelusi'), (u'yst\xe4vysiyin', u'yst\xe4vystyin'), (u'Cunya', u'Currya'), (u'cunya', u'currya'), (u'kohdaliani', u'kohdallani'), (u'an\u0131oista', u'arvoista'), (u'Loputn\xe4kev\xe4tn\xe4lk\xe4\xe4', u'Loput n\xe4kev\xe4t n\xe4lk\xe4\xe4'), (u'oletollut', u'olet ollut'), (u'j\xe4ikin\u0131oan', u'j\xe4lkiruoan'), (u'Saath\xe4net', u'Saat h\xe4net'), (u'Kem\u0131n', u'Kerron'), (u'kappaieiksi', u'kappaleiksi'), (u'vuok\u0131anja', u'vuokran ja'), (u'iyperys', u'typerys'), (u'mmanltisella', u'romanttisella'), (u'\u0131akastellut', u'rakastellut'), (u'jutteiimme', u'juttelimme'), (u'vesimittann', u'vesimittarin'), (u'kuikevat', u'kulkevat'), (u'tavaratja', u'tavarat ja'), (u'piiltaal', u'piittaat'), (u'etehk\xe4', u'et ehk\xe4'), (u'Lapsenvahtisituli', u'Lapsenvahtisi tuli'), (u'Ymm\xe4n\xe4lk\xf6', u'Ymm\xe4rr\xe4tk\xf6'), (u'iyii\xe3resi', u'tytt\xe4resi'), (u'my\xf6h\xe3', u'my\xf6h\xe4'), (u'n\xe4hnytAaron', u'n\xe4hnyt Aaron'), (u'haiunnut', u'halunnut'), (u'Olitoikeassa', u'Olit oikeassa'), (u'itseenijuuri', u'itseeni juuri'), (u'lempin\u0131okaani', u'lempiruokaani'), (u'Iupaamaan', u'lupaamaan'), (u'Teetsoimun', u'Teet solmun'), (u'Sen\u0131ice', u'Service'), (u'Iasini', u'lasini'), (u'Ieuassa', u'leuassa'), (u'Iiikekumppaninsa', u'liikekumppaninsa'), (u'Iiikekumppani', u'liikekumppani'), (u'Iausuttiinkaan', u'lausuttiinkaan'), (u'Iastauslaiturille', u'lastauslaiturille'), (u'Oleko', u'Oletko'), (u'tie/t\xe4', u'tielt\xe4'), (u"Mayhew'IIe", u"Mayhew'lle"), (u'Iakiasiaintoimisto', u'lakiasiaintoimisto'), (u'Iakimiest\xe4', u'lakimiest\xe4'), (u'ne//eens\xe4', u'nelleens\xe4'), (u'ha//ituksiin', u'hallituksiin'), (u'soti/aa//isiin', u'sotilaallisiin'), (u'Iahtasit', u'lahtasit'), (u'Tiestik\xf6', u'Tiesitk\xf6'), (u'Iakimiehi\xe4', u'lakimiehi\xe4'), (u'\xc4l\xe4k\xe4\xe4', u'\xc4lk\xe4\xe4'), (u'O/en', u'Olen'), (u'minsta', u'minusta'), (u'Iuennosta', u'luennosta'), (u'Iakimiehest\xe4', u'lakimiehest\xe4'), (u'Iopetatte', u'lopetatte'), (u'0/it', u'0lit'), (u'tu/it', u'tulit'), (u"Mayhew'Ita", u"Mayhew'lta"), (u'I\xe4hiet\xe4isyydell\xe4', u'l\xe4hiet\xe4isyydell\xe4'), (u'ennenkuin', u'ennen kuin'), (u'nukku\xe4', u'nukkua'), (u'ihmisia', u'ihmisi\xe4'), (u'eloss\xe4', u'elossa'), (u'tiedett\xe4v\xe1', u'tiedett\xe4v\xe4'), (u'Etsik\xe1\xe1', u'Etsik\xe4\xe4'), (u'A\u0131ja\u0131', u'Aijai'), (u'V\xe4lonneitsyen', u'Valonneitsyen'), (u'Iup\xe4ust\xe4si', u'lupaustasi'), (u'Y\xe4mikugyo', u'Yamikugyo'), (u'ep\xe4onnistumisi\xe4', u'ep\xe4onnistumisia'), (u'Ymm\xe1rr\xe4tk\xf6', u'Ymm\xe4rr\xe4tk\xf6'), (u'Iohik\xe4\xe4rmekuula', u'lohik\xe4\xe4rmekuula'), (u'tasta', u't\xe4st\xe4'), (u'taynna', u't\xe4ynn\xe4'), (u'mina', u'min\xe4'), (u'tata', u't\xe4t\xe4'), (u'tyhmaa', u'tyhm\xe4\xe4'), (u'enemman', u'enemm\xe4n'), (u'p\xe1tev\xf6ity', u'p\xe4tev\xf6ity'), (u'kylla', u'kyll\xe4'), (u'\xe4rvok\xe4st\xe4', u'arvokasta'), (u'selviytyj\xe1ksi', u'selviytyj\xe4ksi'), (u'myyda', u'myyd\xe4'), (u'hanet', u'h\xe4net'), (u'\xe4pu\xe4si', u'apuasi'), (u'Kuk\xe4', u'Kuka'), (u's\xe4noi', u'sanoi'), (u'\xe4ut\xe4n', u'autan'), (u'\xc4la', u'\xc4l\xe4'), (u'Han', u'H\xe4n'), (u'Mita', u'Mit\xe4'), (u'tama', u't\xe4m\xe4'), (u'Olettiellamme', u'Olet tiell\xe4mme'), (u'Kylani', u'Kyl\xe4ni'), (u'Iahdemme', u'l\xe4hdemme'), (u'viela', u'viel\xe4'), (u'yhdeksan', u'yhdeks\xe4n'), (u'Nasaviisaudet', u'N\xe4s\xe4viisaudet'), (u'L\xe1hemp\xe4n\xe4', u'L\xe4hemp\xe4n\xe4'), (u'tietaa', u'tiet\xe4\xe4'), (u'mentava', u'ment\xe4v\xe4'), (u'onk\xe4\xe4n', u'onkaan'), (u'tekemista', u'tekemist\xe4'), (u'Sina', u'Sin\xe4'), (u'sina', u'sin\xe4'), (u'kiitett\xe4v\xe1', u'kiitett\xe4v\xe4'), (u'edell\xe1mme', u'edell\xe4mme'), (u'eika', u'eik\xe4'), (u'Takanas\ufb02', u'Takanasi!'), (u'Iankaan', u'lankaan'), (u'v\xe4lloillens\xe4', u'valloillensa'), (u'siita', u'siit\xe4'), (u'Iohikaarmekuulan', u'lohik\xe4\xe4rmekuulan'), (u'Keta', u'Ket\xe4'), (u'nama', u'n\xe4m\xe4'), (u'ajateltavaal', u'ajateltavaa!'), (u'oll\xe4kseni', u'ollakseni'), (u'v\xe4rm\xe4', u'varma'), (u'hanta', u'h\xe4nt\xe4'), (u'hanelle', u'h\xe4nelle'), (u'Os\xe4\xe4tko', u'Osaatko'), (u'rajahteita', u'r\xe4j\xe4hteit\xe4'), (u'Jyashil', u'Jyashi!'), (u'Nama', u'N\xe4m\xe4'), (u'sita', u'sit\xe4'), (u'kosk\xe4\xe4n', u'koskaan'), (u'Viek\xe1\xe1', u'Viek\xe4\xe4'), (u'Pid\xe1tt\xe4k\xe4\xe4', u'Pid\xe4tt\xe4k\xe4\xe4'), (u'Oclottakaal', u'Odottakaa!'), (u'pelk\xe1\xe4m\xe1', u'pelk\xe4\xe4m\xe4'), (u'ost\xe4v\xe4nne', u'ostavanne'), (u'rovoill\xe4nne', u'rovoillanne'), (u'Jon\xe4in', u'Jonain'), (u"piit'taa", u'piittaa'), (u'>', u''), (u't\xe1ysikuu', u't\xe4ysikuu'), (u'sinutt\xe4nne', u'sinut t\xe4nne'), (u'Iahtea', u'l\xe4hte\xe4'), (u'Paastaksemme', u'P\xe4\xe4st\xe4ksemme'), (u'P\xe1rj\xe1\xe4mme', u'P\xe4rj\xe4\xe4mme'), (u'h\xe4nsk\xe4ss\xe4', u'hanskassa'), (u'Tama', u'T\xe4m\xe4'), (u'Menkaa', u'Menk\xe4\xe4'), (u'H\xe4ipyk\xe1\xe1', u'H\xe4ipyk\xe4\xe4'), (u'kasin', u'k\xe4sin'), (u'Tata', u'T\xe4t\xe4'), (u'Hylkaatk\xf6', u'Hylk\xe4\xe4tk\xf6'), (u'Paasta', u'P\xe4\xe4st\xe4'), (u'ry\xf6st\xe4\xe1', u'ry\xf6st\xe4\xe4'), (u'Iivist\xe4', u'livist\xe4'), (u'viivyt\xe1t', u'viivyt\xe4t'), (u'Pys\xe4htyk\xe1\xe4', u'Pys\xe4htyk\xe4\xe4'), (u'k\xe4nnoilt\xe4', u'kannoilta'), (u'k\xe1sken', u'k\xe4sken'), (u'Pys\xe4htyk\xe1\xe1', u'Pys\xe4htyk\xe4\xe4'), (u'huonoj\xe1tk\xe4', u'huono j\xe4tk\xe4'), (u'k\xe1tyrini', u'k\xe4tyrini'), (u'mitaan', u'mit\xe4\xe4n'), (u'Missa', u'Miss\xe4'), (u'kynt\xe4v\xe1n', u'kynt\xe4v\xe4n'), (u'p\xe4rj\xe1nneet', u'p\xe4rj\xe4nneet'), (u'ruok\xe4\xe4', u'ruokaa'), (u'm\xe4rjoj\xe4', u'marjoja'), (u'kuink\xe4', u'kuinka'), (u'oll\xe4', u'olla'), (u'missa', u'miss\xe4'), (u'Per\xe1\xe4nny', u'Per\xe4\xe4nny'), (u'Pysyk\xe1\xe4', u'Pysyk\xe4\xe4'), (u'Vetel\xe0t', u'Vetel\xe4t'), (u't\xe4pp\xe4\xe4', u'tappaa'), (u'ketaan', u'ket\xe4\xe4n'), (u'pelkaamaan', u'pelk\xe4\xe4m\xe4\xe4n'), (u'ovatja', u'ovat ja'), (u'ymmarra', u'ymm\xe4rr\xe4'), (u'ystv\xe4ni', u'yst\xe4v\xe4ni'), (u'K\xe4rp\xe1si\xe4k\xf6', u'K\xe4rp\xe4si\xe4k\xf6'), (u'mets\xe1st\xe4t', u'mets\xe4st\xe4t'), (u'Iiittya', u'liitty\xe4'), (u'Al\xe1', u'\xc4l\xe4'), (u'py\xf6rty\xe1', u'py\xf6rty\xe4'), (u'n\xe4l\xe4st\xe1', u'n\xe4l\xe4st\xe4'), (u'hyva', u'hyv\xe4'), (u'sy\xf6maan', u'sy\xf6m\xe4\xe4n'), (u'katyreita', u'k\xe4tyreit\xe4'), (u'Ep\xe1reilua', u'Ep\xe4reilua'), (u'L\xe4utt\xe4', u'Lautta'), (u'ilt\xe4n\xe4', u'iltana'), (u'T\xe4isimme', u'Taisimme'), (u'Voih\xe4n', u'Voihan'), (u'hittol\xe4inen', u'hittolainen'), (u'J\xe4', u'Ja'), (u'Iohik\xe1\xe1rmekivi', u'lohik\xe4\xe4rmekivi'), (u'siina', u'siin\xe4'), (u'Iaake', u'l\xe4\xe4ke'), (u'purrutjokin', u'purrut jokin'), (u'tahan', u't\xe4h\xe4n'), (u'paasseet', u'p\xe4\xe4sseet'), (u'Iaakkeen', u'l\xe4\xe4kkeen'), (u'Ieposija', u'leposija'), (u'Kylla', u'Kyll\xe4'), (u'pitkalta', u'pitk\xe4lt\xe4'), (u'eivat', u'eiv\xe4t'), (u'tanne', u't\xe4nne'), (u'taman', u't\xe4m\xe4n'), (u'Ehka', u'Ehk\xe4'), (u'han', u'h\xe4n'), (u'mista', u'mist\xe4'), (u'pidat', u'pid\xe4t'), (u'Joutuk\xe4\xe4', u'Joutukaa'), (u'Hanen', u'H\xe4nen'), (u'sisallaan', u'sis\xe4ll\xe4\xe4n'), (u'Pysyk\xe1\xe1', u'Pysyk\xe4\xe4'), (u'L\xe4htek\xe4\xe1', u'L\xe4htek\xe4\xe4'), (u'til\xe4\xe4n', u'tilaan'), (u'paatella', u'p\xe4\xe4tell\xe4'), (u'isani', u'is\xe4ni'), (u'paasemme', u'p\xe4\xe4semme'), (u'haipyivat', u'h\xe4ipyiv\xe4t'), (u'Teh\xe1n', u'Teh\xe4n'), (u'Hy\xf6kk\xe1\xe4tte', u'Hy\xf6kk\xe4\xe4tte'), (u'Iiikahdattekaan', u'liikahdattekaan'), (u'j\xe4', u'ja'), (u'v\xe4lmist\xe4uduin', u'valmistauduin'), (u'Hikavvassa', u'Hikawassa'), (u'Kuolel', u'Kuole!'), (u'hanen', u'h\xe4nen'), (u'yhta', u'yht\xe4'), (u'Sisalla', u'Sis\xe4ll\xe4'), (u'ruumiiss\xe4', u'ruumiissa'), (u'minka', u'mink\xe4'), (u'Iih\xe4\xe4', u'lihaa'), (u'Iuut\xe4', u'luuta'), (u'Sis\xe0ll\xe0mme', u'Sis\xe4ll\xe4mme'), (u'Tottelel', u'Tottele!'), (u'\xc4l\xe4j\xe4t\xe4', u'\xc4l\xe4 j\xe4t\xe4'), (u'aitisi', u'\xe4itisi'), (u'Mina', u'Min\xe4'), (u'ymmartamaan', u'ymm\xe4rt\xe4m\xe4\xe4n'), (u'sy\xf6daan', u'sy\xf6d\xe4\xe4n'), (u'p\xe4h\xe4lt\xe4', u'pahalta'), (u'D\xe4ku\xe4n', u'Dakuan'), (u'sirkutahti', u'sirkust\xe4hti'), (u'Iapiota', u'lapiota'), (u'mieltasi', u'mielt\xe4si'), (u'pitaisi', u'pit\xe4isi'), (u'vieda', u'vied\xe4'), (u't\xe1\xe1ll\xe4k\xe4\xe1n', u't\xe4\xe4ll\xe4k\xe4\xe4n'), (u'taytyy', u't\xe4ytyy'), (u'kivesta', u'kivest\xe4'), (u'etsia', u'etsi\xe4'), (u'Poikatyt\xf6st\xe0', u'Poikatyt\xf6st\xe4'), (u'hy\xf6kkasi', u'hy\xf6kk\xe4si'), (u'takaapain', u'takaap\xe4in'), (u'I\xe4skee', u'laskee'), (u'haipya', u'h\xe4ipy\xe4'), (u'tehcl\xe1kseni', u'tehd\xe4kseni'), (u'pi\xe4n', u'pian'), (u'tyrkytt\xe4\xe1', u'tyrkytt\xe4\xe4'), (u'minu\xe4', u'minua'), (u'n\xe1lk\xe1inen', u'n\xe4lk\xe4inen'), (u'Sydamet\xf6n', u'Syd\xe4met\xf6n'), (u'hylata', u'hyl\xe4t\xe4'), (u'yha', u'yh\xe4'), (u'k\xe4uniisti', u'kauniisti'), (u'ihmisverest\xe1', u'ihmisverest\xe4'), (u'Siii\xe4', u'Sin\xe4'), (u'h\xe4lu\xe4t', u'haluat'), (u'Iahemmin', u'l\xe4hemmin'), (u'kayttaa', u'k\xe4ytt\xe4\xe4'), (u'hyvaksi', u'hyv\xe4ksi'), (u'paase', u'p\xe4\xe4se'), (u'siivilla', u'siivill\xe4'), (u'j\xe4lkel\xe4is\xe1', u'j\xe4lkel\xe4isi\xe4'), (u'syista', u'syist\xe4'), (u'pyh\xe1\xe4', u'pyh\xe4\xe4'), (u'Tyhmat', u'Tyhm\xe4t'), (u'pyytavat', u'pyyt\xe4v\xe4t'), (u'H\xf6lynp\xf6ly\xe4l', u'H\xf6lynp\xf6ly\xe4!'), (u'Nakivat', u'N\xe4kiv\xe4t'), (u'kannissa', u'k\xe4nniss\xe4'), (u'kasivarren', u'k\xe4sivarren'), (u'h\xe1nenlaisensa', u'h\xe4nenlaisensa'), (u'sol\xe4\xe4', u'solaa'), (u'Iiioitella', u'liioitella'), (u'Iiioittele', u'liioittele'), (u'Tiedathan', u'Tied\xe4th\xe4n'), (u'pyh\xe1st\xe4', u'pyh\xe4st\xe4'), (u'Iohik\xe1\xe1rmekivest\xe4', u'lohik\xe4\xe4rmekivest\xe4'), (u'Ymm\xe1rr\xe1t', u'Ymm\xe4rr\xe4t'), (u'\xe4rmonne', u'armonne'), (u'n\xe4isten', u'naisten'), (u'Iup\xe4ukseni', u'lupaukseni'), (u'kekseli\xe1isyytesi', u'kekseli\xe4isyytesi'), (u'Iaudalta', u'laudalta'), (u'kest\xe1vyytesi', u'kest\xe4vyytesi'), (u'taiclakaan', u'taidakaan'), (u'tytt\xf6ystava', u'tytt\xf6yst\xe4v\xe4'), (u'sormiss\xe4ni', u'sormissani'), (u'r\xe4ivois\xe4n', u'raivoisan'), (u'k\xe4rhun', u'karhun'), (u'helvetista', u'helvetist\xe4'), (u'v\xe4i', u'vai'), (u'poiss\xe4', u'poissa'), (u'elamani', u'el\xe4m\xe4ni'), (u'pitk\xe1tjalkasi', u'pitk\xe4t jalkasi'), (u'Kadet', u'K\xe4det'), (u'niita', u'niit\xe4'), (u'Kaske', u'K\xe4ske'), (u'paastaa', u'p\xe4\xe4st\xe4\xe4'), (u'Pida', u'Pid\xe4'), (u'Iohikaarmekivi', u'lohik\xe4\xe4rmekivi'), (u'sinust\xe4', u'sinusta'), (u'sy\xf6ksyyjo', u'sy\xf6ksyy jo'), (u'veljeasi', u'velje\xe4si'), (u'Odot\xe4', u'Odota'), (u'Pys\xe1hdy', u'Pys\xe4hdy'), (u'kivea', u'kive\xe4'), (u'Missaan', u'Miss\xe4\xe4n'), (u'tihe\xe1mpi', u'tihe\xe4mpi'), (u'Iuulitkaan', u'luulitkaan'), (u'kaarmekuula', u'k\xe4\xe4rmekuula'), (u'muttaj\xe4t\xe4n', u'mutta j\xe4t\xe4n'), (u'kuoletl', u'kuolet!'), (u'Iohikaarmekuula', u'lohik\xe4\xe4rmekuula'), (u'kieltava', u'kielt\xe4v\xe4'), (u'L\xe1htek\xe1\xe1', u'L\xe4htek\xe4\xe4'), (u'Iohik\xe1\xe4rmekuulaa', u'lohik\xe4\xe4rmekuulaa'), (u'hereilla', u'hereill\xe4'), (u'kaljupaa', u'kaljup\xe4\xe4'), (u'\xe4nt\xe4m\xe4ll\xe4', u'antamalla'), (u'kuul\xe4n', u'kuulan'), (u't\xe4k\xe4isin', u'takaisin'), (u'puolikk\xe4\xe4n', u'puolikkaan'), (u'pohjoisessaja', u'pohjoisessa ja'), (u'metsasta', u'mets\xe4st\xe4'), (u'Iohik\xe4\xe4rmekuul\xe4lle', u'lohik\xe4\xe4rmekuulalle'), (u'teita', u'teit\xe4'), (u'Linnutk\xe4\xe4n', u'Linnutkaan'), (u'Puolikk\xe4\xe4n', u'Puolikkaan'), (u'\xe4nt\xe4nut', u'antanut'), (u'tiedan', u'tied\xe4n'), (u'her\xe1tt\xe1m\xe1ss\xe1', u'her\xe4tt\xe4m\xe4ss\xe4'), (u'I\xe4sin', u'lasin'), (u'h\xe4t\xe1n\xe4', u'h\xe4t\xe4n\xe4'), (u'I\xf6ysitte', u'l\xf6ysitte'), (u"a//\u0131'gaal'tor\u0131h", u'alligaattorin'), (u'Tyttbparka', u'tytt\xf6parka'), (u'b\xe4n\xe3\xe4', u'b\xe4n\xe4\xe4'), (u'Co/en', u'Colen'), (u'Iapsiko\u0131fin', u'lapsikortin'), (u'rauhallisemminl', u'rauhallisemmin!'), (u'Iahjasi', u'lahjasi'), (u'Ruokih\xe4net', u'Ruoki h\xe4net'), (u'I\xf6ystymist\xe4', u'l\xf6ystymist\xe4'), (u'Iapsestaan', u'lapsestaan'), (u'Iaatuaikaa', u'laatuaikaa'), (u'Ioukkaannuit', u'loukkaannuit'), (u'Ioistojuttu', u'loistojuttu'), (u'Ioukkaavaa', u'loukkaavaa'), (u'Ioukkaan', u'loukkaan'), (u"l'\u0131ed\xe4n", u'Tied\xe4n'), (u'Iy\xf6m\xe4st\xe4', u'ly\xf6m\xe4st\xe4'), (u'C/\u0131\xe2teauneuf', u'Ch\xe2teauneuf'), (u'Iikaisten', u'likaisten'), (u'Iapsenlapseton', u'lapsenlapseton'), (u'Ieukani', u'leukani'), (u'Ientokonetta', u'lentokonetta'), (u'Iorrainea', u'lorrainea'), (u'Iastentarhaan', u'lastentarhaan'), (u'Iupaavin', u'lupaavin'), (u'Iastenhoitaja', u'lastenhoitaja'), (u'Kegeleit\xe3', u'Kegeleit\xe4'), (u'helkkaril', u'helkkari!'), (u'Ieukaani', u'leukaani'), (u'Iaihtuneen', u'laihtuneen'), (u'Iahjoittamaan', u'lahjoittamaan'), (u'tref\ufb02t', u'treffit'), (u'I\xf6ysyys', u'l\xf6ysyys'), (u'Diggleri\xe3', u'Diggleri\xe4'), (u'Ku\u0131fi//a', u'Kurtilla'), (u'pys\xe3hdell\xe4', u'pys\xe4hdell\xe4'), (u'Iomaasi', u'lomaasi'), (u'Iastattu', u'lastattu'), (u'Iasinne', u'lasinne'), (u'Iuihin', u'luihin'), (u'Iastensuojelujuttuun', u'lastensuojelujuttuun'), (u'Ieffaan', u'leffaan'), (u'mulkkul', u'mulkku!'), (u'Iapsenvahtia', u'lapsenvahtia'), (u'I\xe4hell\xe4si', u'l\xe4hell\xe4si'), (u'st\xe3', u'st\xe4'), (u'TOSi', u'Tosi'), (u'Ioistoidea', u'loistoidea'), (u'Ty\u0131si\xe4', u'Tylsi\xe4'), (u'lsi', u'Isi'), (u'Iaastarin', u'laastarin'), (u'Viewjatkuu', u'View jatkuu'), (u'lnStylen', u'InStylen'), (u'k\xf6ril\xe4sl', u'k\xf6ril\xe4s!'), (u'Ieffoissa', u'leffoissa'), (u'Ieffaseuraksi', u'leffaseuraksi'), (u'Iueskelemaan', u'lueskelemaan'), (u'Mit\xe4j\xe4tk\xe4', u'Mit\xe4 j\xe4tk\xe4'), (u'Iaukesitkaan', u'laukesitkaan'), (u'Kiit\xe3', u'Kiit\xe4'), (u'\xc4\xe3Ii\xf6', u'\xc4\xe4li\xf6'), (u'Iyhytp\xf6ksy', u'lyhytp\xf6ksy'), (u'Iacrosse', u'lacrosse'), (u'I\xf6yt\xe3m\xe3tt\xe3', u'l\xf6yt\xe4m\xe4tt\xe4'), (u'samojajuttuja', u'samoja juttuja'), (u'J\xe4rvellel', u'J\xe4rvelle!'), (u'Talouspaperitl', u'Talouspaperit!'), (u'\xc4lk\xe4\xe3s', u'\xc4lk\xe4\xe4s'), (u'pillunaamal', u'pillunaama!'), (u'poikayst\xe4v\xe4ns\xe3', u'poikayst\xe4v\xe4ns\xe4'), (u'Iapsenvahti', u'lapsenvahti'), (u'Nykist\xe3', u'Nykist\xe4'), (u'Iaatuaikamme', u'laatuaikamme'), (u'K\xe4\xe3nsin', u'K\xe4\xe4nsin'), (u'Iatinaksi', u'latinaksi'), (u'yleens\xe4juo', u'yleens\xe4 juo'), (u'kreisej\xe3juttuja', u'kreisej\xe4 juttuja'), (u'Iiitostasi', u'liitostasi'), (u'Mit\xe4jos', u'Mit\xe4 jos'), (u'Sinullaja', u'Sinulla ja'), (u'Iempparini', u'lempparini'), (u'Iienetkin', u'lienetkin'), (u'Iuokkajuhla', u'luokkajuhla'), (u'Iuokkakokouksesta', u'luokkakokouksesta'), (u'Iukuteeman', u'lukuteeman'), (u'Menejo', u'Mene jo'), (u'Sin\xe3j\xe4tit', u'Sin\xe4 j\xe4tit'), (u'I\xe4ht\xf6\xe3si', u'l\xe4ht\xf6\xe4si'), (u'I\xe3\xe4kikseen', u'l\xe4\xe4kikseen'), (u'puhuajostain', u'puhua jostain'), (u'tavatajoku', u'tavata joku'), (u'Iookia', u'lookia'), (u'Iapsiyst\xe4v\xe4llisemp\xe3n\xe3', u'lapsiyst\xe4v\xe4llisemp\xe4n\xe4'), (u'is\xe3nn\xe4lle', u'is\xe4nn\xe4lle'), (u't\xe3', u't\xe4'), (u'Ieidi', u'leidi'), (u'K\xe3visik\xf6', u'K\xe4visik\xf6'), (u'maris\xe3tk\xe4', u'maris\xe4tk\xe4'), (u'k\xe4nniss\xe4j\xe4rveen', u'k\xe4nniss\xe4 j\xe4rveen'), (u'sinullajotain', u'sinulla jotain'), (u'Iuntun', u'luntun'), (u'Iunttu', u'lunttu'), (u'Iukitsin', u'lukitsin'), (u'jyyst\xe3\xe4', u'jyyst\xe4\xe4'), (u'Iuokkajuhlaan', u'luokkajuhlaan'), (u'Michellest\xe3', u'Michellest\xe4'), (u'Iuokkakokous', u'luokkakokous'), (u'sin\xe4ja', u'sin\xe4 ja'), (u'Sin\xe3ja', u'Sin\xe4 ja'), (u'Sill\xe3joskus', u'Sill\xe4 joskus'), (u'Iopetimme', u'lopetimme'), (u'Ymm\xe3rr\xe3tk\xf6', u'Ymm\xe4rr\xe4tk\xf6'), (u'kanssajoka', u'kanssa joka'), (u'Iiioitellusti', u'liioitellusti'), (u'Iaihalta', u'laihalta'), (u'Miaja', u'Mia ja'), (u'Mietit\xe3\xe4np\xe3', u'Mietit\xe4\xe4np\xe4'), (u'Ky\u0131\u0131\xe4', u'Kyll\xe4'), (u'Pid\xe3ttelel', u'Pid\xe4ttele!'), (u'ymm\xe4rt\xe3misest\xe4', u'ymm\xe4rt\xe4misest\xe4'), (u'jaj\xe4\xe4n', u'ja j\xe4\xe4n'), (u'Selenaja', u'Selena ja'), (u'Iuokkakokousta', u'luokkakokousta'), (u'\xe1k\xe1pussi', u'\xe4k\xe4pussi'), (u'karkoituksen', u'karkotuksen')]),
+                        'pattern': u"(?um)(\\b|^)(?:kellojo|onjo|senj\\\xe4lkeen|Ts\\\xe4u|hydraulinenjousitus|Kevyetja|Oleijo|viimeinenjuna|n\\\xe4ytt\\\xe4\\\xe4jotenkin|onjoku|Iapsuuteen|Ieikitjunill\\\xe4|Sfiy|Iukulasejani|Ieikkiminen|K\\\xe4\\\xe4lik\\\xe4\\\xe4rylepizz\\\xe4|sukl\\\xe4\\\xe4k\\\xe4stikkeen|p\\\xe4istetun|b\\\xe4n\\\xe4\\\xe4nin|pifi|a\\\u0131keasfaan|Stg|sikain\\\ufb02uenssatja|Hienojuna|kiinnostuajunista|h\\\xe4y\\\u0131yvetu\\\u0131\\\xedn|pienaismalli|ena|racfios\\\xe3hk\\\xe4ff\\\xe1j\\\xe3n\\\xe3|Amenkan|laiva\\/la|0\\/in|Junaha\\\u0131rasfus|enasfa|\\/V\\\u0131\\\xedn|Oliivarmasii|Internetist\\\xe4juuri|hu\\\u0131janj\\\xe3nniff\\\xe5v\\\xe3\\\xe0l|Vaikkajunat|k\\\xe4\\\xe4ntyija|osaajotain|Ieikill\\\xe4mme|Bellinjuna|t\\\xe4st\\\xe4johtolangasta|tuntisijonkun|Olgajotain|tulokseivuodesia|tuloksetvuodesta|Vainjalkapallo|lloveyou|po\\\ufb02\\\u2039aisi|minufulos|Ieiv\\\xe4npaahdinl|Ieiv\\\xe4npaahdinta|asuajossain|Koiratjuoksentelivat|tiet\\\xe4\\\xe4jotain|osaatjuna|va\\/as|va\\/asperhe|koskeejotain|I\\\xe4\\\xe4kkeens\\\xe4|Iaulavan|Kuulitj\\\xe4\\\xe4n|Ievolle|Va\\/aa\\/\\/e|va\\/aa\\/\\/a|I\\\xe4hdenkin|Iakkiin|Iohik\\\xe4\\\xe4rmeell\\\xe4|Mik\\\u0131|Iukossa|Va\\/aan|s\\\xe4ve\\/m\\\xe4|j\\\xe4\\/\\/een|P\\\xf6\\\xf6\\\u0131|Hnjaa|Iiftasin|Jute\\/\\/aan|Iohduttamaan|L\\'lYP\\\xe4f\\\xe4\\\xe4n|\\\xc4\\\u0131r\\\u0131\\\u0131|F\\\u0131\\\u0131\\\u0131p\\\u0131|Yr\\\u203ar\\\u203a\\\xe4\\\xe4\\\u0131|Miki|Heng\\\u0131r\\\xe4\\\u0131|Va\\/as|Ko\\/\\/\\/is|Audieja|I\\/man|\\/entotukia\\/ukse\\/ta|\\/aivastosta|\\/entotukikohtaan|tu\\/ee|akse\\/iva\\/\\/at|a\\\u0131\\\u0131ek\\\u0131rjo\\\u0131rerr\\\u0131\\\u0131n|Iitkua|0li|Iaskuvarjojoukkoihin|Iaskuvarjojoukoissa|Tarvitsetjotain|Ieukaremmi|Iainaatko|p\\\xe4\\\xe4llik\\\xf6lleja|I\\\xe4hell\\\xe4ni|Soti\\/aan|va\\/\\/attava|viho\\/\\/ise\\/ta|\\/iittoutuneet|voitjohtaa|pohditkojotain|viho\\/\\/ista|sej\\\xe4isi|Ient\\\xe4jill\\\xe4|Soltutl|Iaulustamme|Iakkiani|Iiemeen|kanadala\\\u0131\\\u0161ia|si\\/\\/anp\\\xe4\\\xe4asema|vahv\\\u0131\\\u0161tettiin|tu\\/ituki|eliitt\\\u0131joukkoa|pa\\\u0131ka\\\u0131\\\u0131as\\\u0131\\\u0131|Ieikkinyt|Iujitettu|Ete\\/\\\xe4|viho\\/\\/isranna\\/\\/e|sivusta\\/ta|\\/oppuisi|Iaskuvarjojoukkojen|p\\\xe4\\\xe4tt\\\xe4nytj\\\xe4\\\xe4d\\\xe4|Iuutnanteille|I\\\xe4ht\\\xf6valmiiksi|Iokoisat|Korjaus\\/ukemat|tanke\\/\\/\\/e|ky\\\u0131\\\u0131\\\xe4\\\u0131|Iisti\\\xe4|Kunniamita\\/in|Vemon|fied\\\xe3n|Ei\\\u0131is|Inlem\\\xe4tion\\\xe4|holelfss\\\xe4|Han\\\u0131ey|peikk\\\xe4|Ehisl\\\xe3|Y\\\ufb02\\\xe3ll\\\xe3v\\\xe3|mahdolisuus|loisteiaan|aku|Garonilie|Iikainen|vaiehtelijoita|puutari\\\u0131aasi|Garunin|oravaietti\\\xe4|paijon|sutja|gospeikvartetissa|Iauiajaksi|viihdylt\\\xe4j\\\xe4|hannaala|Iaulajalta|saatjotain|L\\\xf6yd\\\xe4njonkun|py\\\xfcr\\\xedyi|Cn\\\u0131dupia|Iiikaa|ke\\\u0131taa|Thafs|Kappaietta|soijoka|Levytl\\\xe4|paiaamista|kuonnunn|Tytt\\\xfcyst\\\xe4v\\\xe4t|k\\\xe3p\\\xe3l\\\xf6ifiin|Oiko|tuipalo|hebofiavaa|ongeina|ongeimia|Ajateikaa|ku\\\u0131ki|lhailen|L\\\xe4ht\\\xfcsi|yhti\\\xf6ile|eitoimi|voij\\\xe4\\\xe4d\\\xe4|Pomkat|kon\\\u0131ata|konsentien|Sep\\\xe3|hebolus|k\\\xfcyryss\\\xe4|repiat|kuikee|pon\\\u0131koita|naisetja|ten\\\u0131etuileeksi|yl\\\xe4puolelia|kuullut180|Iapsellista|esiinnytja|Iaulat|Henanjestas|teilie|IIe|t\\\xe4ilaisia|Varu|nimeli\\\xe4\\\xe4n|anneijaan|pen\\\u0131staa|minkkitu\\\u0131kkia|minkkituiiiilla|Ten\\\u0131etuioa|kuitalevy\\\xe4|ei\\\xe4m\\\xe4ss\\\xe4|jutkaisua|Fo\\\u0131t|oien|asioilie|Eitarvitsekaan|p\\\xf6kenyin|yll\\\xe4iiyy|komeaita|Chadie|laulaisilteko|Iaittaa|iytt\\\xe4renne|pikkutytt\\\xfcn\\\xe4|tytt\\\xfckulta|vimuilua|reporitereita|vime|eijohdu|eriiainen|Iasketa|kem\\\u0131ttu|Manyja|etteijutusta|Katifomiassa|sun\\\xb0filaudan|bn\\\u0131netti|vaimiina|yiim\\\xe4\\\xe4r\\\xe4iset|leffatj\\\xe4\\\xe4|koin\\'lle|T\\\xe4ilaisen|antanutjo|Cha\\\u0131lien|ymp\\\xe4riliesi|Iy\\\xfc|lopan\\'t|h\\\u0131isi|kuuiuvanijonnekin|juh\\\u0131n|miefkseni|Tuisitko|I\\\u0131on\\\xe4ni|\\\xe4k\\\xe4\\\xe4|yi|rupallelemaan|Priscilialla|Hemmoltelet|Hearlbreak|Holelia|Nyton|kiertueeile|Elvist\\\xe3|puoleila|\\\xc4\\\u0131\\\xe4|lnlemalional|Iuottamustanne|Mycroft\\\xedsta|Iopettako|Ielukauppa|Iomamatkalle|Iyhyelle|Alk\\\xe4\\\xe4|K\\_uka|IIa|Aitinne|V\\\xe4\\/ikohtaus|kuo\\/\\/aan|n\\\xe4\\/k\\\xe4\\\xe4n|Su\\/je|I\\\xe4im\\\xe4ytit|I\\\xe4hetyst\\\xf6ss\\\xe4|I\\\xe4hetyst\\\xf6\\\xf6n|Iaosilainen|Iiiketarjous|kaappavat|Ieiviss\\\xe4\\\xe4n|EriC|Voi\\/\\\xe0|Crawley\\\u0131|Iihaksiaan|Iuenkaan|Olemma|I\\\xe4htisitte|jot\\\xe2in|Eversi|Ieiriyty\\\xe4|Iiikutte|I\\\xe4\\\xe4ketiedett\\\xe4|Iivet\\\xe4|Iapsetkin|I\\\xe4\\\xe4keluettelo|Iaatiko|hyvih|Ieukakuoppa|Ient\\\xe4j\\\xe4ni|Ieikkisi|Iupaamastaan|ku\\/taseni|tu\\/en|Iautalle|100\\_vuotiaaksi|\\_|Viilt\\\xe4j\\\xe3\\_Jackin|keff\\\xe4rfkerro|tan\\/itsi|\\_Aivan|\\_Valosta|\\_Teemmek\\\xf6|Viilt\\\xe4j\\\xe4\\_Jack|\\_Voi|\\_Tied\\\xe4tte|kulunutjo|Vuokra\\_auto|\\_Tuokaa|\\_Tunnetteko|\\_Tied\\\xe4mme|toissay\\\xf6n|\\_Toki|\\_Ammuttu|\\_Jahtasit|\\_Tunnenko|\\_Joku|\\_Taivahan|Kuorma\\_auto|\\_Vain|Mesmer\\_klubille|0nslow\\'IIe|Mesmer\\_klubi|\\_Anteeksi|Schrenk\\_Notzing|\\_Tapoin|\\_AIk\\\xe4\\\xe4|0dotan|Iuonteenlu|Iempikaupunkini|Iavasta|I\\\xe4mmittelij\\\xe4t|Iaastaria|Riiu\\\xe4\\\xe4|K\\\xe4yu\\\xe4v\\\xe4tk\\\xf6|I\\\xe4hestyk\\\xf6|Ieikekirja|Ievyj\\\xe4\\\xe4n|Iahjoitamme|L\\\xe4pp\\\xe4\\\xe4tuohon|CIawdy|mita|jalkeen|Cannabisjaponica|Ieningin|ki\\\u0131joitatte|ki\\\u0131joitetuksi|kuluttuu|Iuvulta|Ieipomiskilpailuun|Maclntire|Iehteemme|Al\\\xe4|kysesss\\\xe4|Itsepuolustustal|Iiipasimesta|Iuutani|Iahjansa|I\\\xe4himm\\\xe4isemme|Iuhistuu|\\\u0131\\\xf6yhk\\\xe4|Iehtileikkeleit\\\xe4|vefieni|Iapselleni|ep\\\xe4normaalinal|Iuurankoja|Iuurangoista|p\\\xe4\\\xe4tiellel|Valonneitsytta|Iohik\\\xe1\\\xe1rmekuula|yhdella|Tasta|\\_\\_|Alk\\\xe1\\\xe4|etta|pitaa|n\\\xe4lk\\\xe1isi\\\xe4|Hyva|hyvasta|ruoastaja|K\\\xe1sivarteni|k\\\xe4ikki|Mozukust\\\xe4|Etsiv\\\xe1tk\\\xf6|Iohik\\\xe1\\\xe1rmekuulaa|Valonneitsytt\\\xe1|taalla|siemeni\\\xe1\\\xe1n|kunh\\\xe4n|\\\xe4j\\\xe4ttelen|pelkuril|kyla|hy\\\xf6kk\\\xe1ykselt\\\xe4|hy\\\xf6kk\\\xe1isi|hy\\\xf6kataan|Voitjuoda|Iittaamisesta|Iahtenyt|kylasta|Etjuurik\\\xe4\\\xe4n|s\\\xe4m\\\xe4lt\\\xe4|k\\\xe4ikki\\\xe4ll\\\xe4|ehka|tiennytkaan|taistelenl|Iiikkeita|Taistellaanl|Odott\\\xe4m\\\xe4ttom\\\xe4t|n\\\xe4utinnot|rikk\\\xe4\\\xe4n|Iuotettavalta|elaa|pekki\\\xe3|j\\\xe3keen|n\\\xf6rttej\\\xe3|pen\\\u0131skursseja|Suorititjo|sein\\\xe4il\\\xe4|Iaiteta|hennostu|Coiumbiassa|Pen\\\u0131erssi\\\xe4|sukupuoieimisl\\\xe3|ep\\\xe3iooginen|oisin|iittoni|oisi|asuntoia|p\\\xe4\\\xe4sittejatkoseminaariini|An\\\u0131atkaapa|Iopussa|Oletjo|Haiuan|luennoilie|Iintsata|oletjuuri|Iuuietko|kylvyss\\\xe3|v\\\xe3l\\\xe3hti|Miettik\\\xe3\\\xe3|insin\\\xf6\\\xfcn|Menithalpaan|Tukaa|Aarun|Kieleil\\\xe4si|pystytjohonkin|K\\\xe4mppikseniWilliam|Iuolamies|keskian\\\u0131on|kananosta|p\\\xe4iv\\\xe4lliselie|Iasagnea|voitehota|0lisit|menijuuri|tapasivatjo|kn\\\u0131unukoriiiliiset|eijuo|N\\\xe4yt\\\xe4tuupuneeita|Etan\\\u0131aakaan|lhanko|y\\\ufb02t\\\xe4k\\\xe4\\\xe4n|serkkuniWinn|voijatkua|miehetja|v\\\xedesfin\\\xed|kuull\\\u0131lsinusla|T\\\xe3m\\\xe3|kel\\\xe3\\\xe3n|vedess\\\xe3k\\\xe3veij\\\xe3|\\/abrassa|akaa|Iiinaa|kan\\\u0131ainen|oten|kallaisesi|pmffa|tulitt\\\xe4nne|Alalteko|luuiisit|Pys\\\xe3hdy|Paskath\\\xe4nest\\\xe4|Pys\\\xe3hdyheti|Heivetti|Pid\\\xe3l\\\xe3n|V\\\ufb02ru|huolissasijostain|hurmaavatpuhelusi|yst\\\xe4vysiyin|Cunya|cunya|kohdaliani|an\\\u0131oista|Loputn\\\xe4kev\\\xe4tn\\\xe4lk\\\xe4\\\xe4|oletollut|j\\\xe4ikin\\\u0131oan|Saath\\\xe4net|Kem\\\u0131n|kappaieiksi|vuok\\\u0131anja|iyperys|mmanltisella|\\\u0131akastellut|jutteiimme|vesimittann|kuikevat|tavaratja|piiltaal|etehk\\\xe4|Lapsenvahtisituli|Ymm\\\xe4n\\\xe4lk\\\xf6|iyii\\\xe3resi|my\\\xf6h\\\xe3|n\\\xe4hnytAaron|haiunnut|Olitoikeassa|itseenijuuri|lempin\\\u0131okaani|Iupaamaan|Teetsoimun|Sen\\\u0131ice|Iasini|Ieuassa|Iiikekumppaninsa|Iiikekumppani|Iausuttiinkaan|Iastauslaiturille|Oleko|tie\\/t\\\xe4|Mayhew\\'IIe|Iakiasiaintoimisto|Iakimiest\\\xe4|ne\\/\\/eens\\\xe4|ha\\/\\/ituksiin|soti\\/aa\\/\\/isiin|Iahtasit|Tiestik\\\xf6|Iakimiehi\\\xe4|\\\xc4l\\\xe4k\\\xe4\\\xe4|O\\/en|minsta|Iuennosta|Iakimiehest\\\xe4|Iopetatte|0\\/it|tu\\/it|Mayhew\\'Ita|I\\\xe4hiet\\\xe4isyydell\\\xe4|ennenkuin|nukku\\\xe4|ihmisia|eloss\\\xe4|tiedett\\\xe4v\\\xe1|Etsik\\\xe1\\\xe1|A\\\u0131ja\\\u0131|V\\\xe4lonneitsyen|Iup\\\xe4ust\\\xe4si|Y\\\xe4mikugyo|ep\\\xe4onnistumisi\\\xe4|Ymm\\\xe1rr\\\xe4tk\\\xf6|Iohik\\\xe4\\\xe4rmekuula|tasta|taynna|mina|tata|tyhmaa|enemman|p\\\xe1tev\\\xf6ity|kylla|\\\xe4rvok\\\xe4st\\\xe4|selviytyj\\\xe1ksi|myyda|hanet|\\\xe4pu\\\xe4si|Kuk\\\xe4|s\\\xe4noi|\\\xe4ut\\\xe4n|\\\xc4la|Han|Mita|tama|Olettiellamme|Kylani|Iahdemme|viela|yhdeksan|Nasaviisaudet|L\\\xe1hemp\\\xe4n\\\xe4|tietaa|mentava|onk\\\xe4\\\xe4n|tekemista|Sina|sina|kiitett\\\xe4v\\\xe1|edell\\\xe1mme|eika|Takanas\\\ufb02|Iankaan|v\\\xe4lloillens\\\xe4|siita|Iohikaarmekuulan|Keta|nama|ajateltavaal|oll\\\xe4kseni|v\\\xe4rm\\\xe4|hanta|hanelle|Os\\\xe4\\\xe4tko|rajahteita|Jyashil|Nama|sita|kosk\\\xe4\\\xe4n|Viek\\\xe1\\\xe1|Pid\\\xe1tt\\\xe4k\\\xe4\\\xe4|Oclottakaal|pelk\\\xe1\\\xe4m\\\xe1|ost\\\xe4v\\\xe4nne|rovoill\\\xe4nne|Jon\\\xe4in|piit\\'taa|\\>|t\\\xe1ysikuu|sinutt\\\xe4nne|Iahtea|Paastaksemme|P\\\xe1rj\\\xe1\\\xe4mme|h\\\xe4nsk\\\xe4ss\\\xe4|Tama|Menkaa|H\\\xe4ipyk\\\xe1\\\xe1|kasin|Tata|Hylkaatk\\\xf6|Paasta|ry\\\xf6st\\\xe4\\\xe1|Iivist\\\xe4|viivyt\\\xe1t|Pys\\\xe4htyk\\\xe1\\\xe4|k\\\xe4nnoilt\\\xe4|k\\\xe1sken|Pys\\\xe4htyk\\\xe1\\\xe1|huonoj\\\xe1tk\\\xe4|k\\\xe1tyrini|mitaan|Missa|kynt\\\xe4v\\\xe1n|p\\\xe4rj\\\xe1nneet|ruok\\\xe4\\\xe4|m\\\xe4rjoj\\\xe4|kuink\\\xe4|oll\\\xe4|missa|Per\\\xe1\\\xe4nny|Pysyk\\\xe1\\\xe4|Vetel\\\xe0t|t\\\xe4pp\\\xe4\\\xe4|ketaan|pelkaamaan|ovatja|ymmarra|ystv\\\xe4ni|K\\\xe4rp\\\xe1si\\\xe4k\\\xf6|mets\\\xe1st\\\xe4t|Iiittya|Al\\\xe1|py\\\xf6rty\\\xe1|n\\\xe4l\\\xe4st\\\xe1|hyva|sy\\\xf6maan|katyreita|Ep\\\xe1reilua|L\\\xe4utt\\\xe4|ilt\\\xe4n\\\xe4|T\\\xe4isimme|Voih\\\xe4n|hittol\\\xe4inen|J\\\xe4|Iohik\\\xe1\\\xe1rmekivi|siina|Iaake|purrutjokin|tahan|paasseet|Iaakkeen|Ieposija|Kylla|pitkalta|eivat|tanne|taman|Ehka|han|mista|pidat|Joutuk\\\xe4\\\xe4|Hanen|sisallaan|Pysyk\\\xe1\\\xe1|L\\\xe4htek\\\xe4\\\xe1|til\\\xe4\\\xe4n|paatella|isani|paasemme|haipyivat|Teh\\\xe1n|Hy\\\xf6kk\\\xe1\\\xe4tte|Iiikahdattekaan|j\\\xe4|v\\\xe4lmist\\\xe4uduin|Hikavvassa|Kuolel|hanen|yhta|Sisalla|ruumiiss\\\xe4|minka|Iih\\\xe4\\\xe4|Iuut\\\xe4|Sis\\\xe0ll\\\xe0mme|Tottelel|\\\xc4l\\\xe4j\\\xe4t\\\xe4|aitisi|Mina|ymmartamaan|sy\\\xf6daan|p\\\xe4h\\\xe4lt\\\xe4|D\\\xe4ku\\\xe4n|sirkutahti|Iapiota|mieltasi|pitaisi|vieda|t\\\xe1\\\xe1ll\\\xe4k\\\xe4\\\xe1n|taytyy|kivesta|etsia|Poikatyt\\\xf6st\\\xe0|hy\\\xf6kkasi|takaapain|I\\\xe4skee|haipya|tehcl\\\xe1kseni|pi\\\xe4n|tyrkytt\\\xe4\\\xe1|minu\\\xe4|n\\\xe1lk\\\xe1inen|Sydamet\\\xf6n|hylata|yha|k\\\xe4uniisti|ihmisverest\\\xe1|Siii\\\xe4|h\\\xe4lu\\\xe4t|Iahemmin|kayttaa|hyvaksi|paase|siivilla|j\\\xe4lkel\\\xe4is\\\xe1|syista|pyh\\\xe1\\\xe4|Tyhmat|pyytavat|H\\\xf6lynp\\\xf6ly\\\xe4l|Nakivat|kannissa|kasivarren|h\\\xe1nenlaisensa|sol\\\xe4\\\xe4|Iiioitella|Iiioittele|Tiedathan|pyh\\\xe1st\\\xe4|Iohik\\\xe1\\\xe1rmekivest\\\xe4|Ymm\\\xe1rr\\\xe1t|\\\xe4rmonne|n\\\xe4isten|Iup\\\xe4ukseni|kekseli\\\xe1isyytesi|Iaudalta|kest\\\xe1vyytesi|taiclakaan|tytt\\\xf6ystava|sormiss\\\xe4ni|r\\\xe4ivois\\\xe4n|k\\\xe4rhun|helvetista|v\\\xe4i|poiss\\\xe4|elamani|pitk\\\xe1tjalkasi|Kadet|niita|Kaske|paastaa|Pida|Iohikaarmekivi|sinust\\\xe4|sy\\\xf6ksyyjo|veljeasi|Odot\\\xe4|Pys\\\xe1hdy|kivea|Missaan|tihe\\\xe1mpi|Iuulitkaan|kaarmekuula|muttaj\\\xe4t\\\xe4n|kuoletl|Iohikaarmekuula|kieltava|L\\\xe1htek\\\xe1\\\xe1|Iohik\\\xe1\\\xe4rmekuulaa|hereilla|kaljupaa|\\\xe4nt\\\xe4m\\\xe4ll\\\xe4|kuul\\\xe4n|t\\\xe4k\\\xe4isin|puolikk\\\xe4\\\xe4n|pohjoisessaja|metsasta|Iohik\\\xe4\\\xe4rmekuul\\\xe4lle|teita|Linnutk\\\xe4\\\xe4n|Puolikk\\\xe4\\\xe4n|\\\xe4nt\\\xe4nut|tiedan|her\\\xe1tt\\\xe1m\\\xe1ss\\\xe1|I\\\xe4sin|h\\\xe4t\\\xe1n\\\xe4|I\\\xf6ysitte|a\\/\\/\\\u0131\\'gaal\\'tor\\\u0131h|Tyttbparka|b\\\xe4n\\\xe3\\\xe4|Co\\/en|Iapsiko\\\u0131fin|rauhallisemminl|Iahjasi|Ruokih\\\xe4net|I\\\xf6ystymist\\\xe4|Iapsestaan|Iaatuaikaa|Ioukkaannuit|Ioistojuttu|Ioukkaavaa|Ioukkaan|l\\'\\\u0131ed\\\xe4n|Iy\\\xf6m\\\xe4st\\\xe4|C\\/\\\u0131\\\xe2teauneuf|Iikaisten|Iapsenlapseton|Ieukani|Ientokonetta|Iorrainea|Iastentarhaan|Iupaavin|Iastenhoitaja|Kegeleit\\\xe3|helkkaril|Ieukaani|Iaihtuneen|Iahjoittamaan|tref\\\ufb02t|I\\\xf6ysyys|Diggleri\\\xe3|Ku\\\u0131fi\\/\\/a|pys\\\xe3hdell\\\xe4|Iomaasi|Iastattu|Iasinne|Iuihin|Iastensuojelujuttuun|Ieffaan|mulkkul|Iapsenvahtia|I\\\xe4hell\\\xe4si|st\\\xe3|TOSi|Ioistoidea|Ty\\\u0131si\\\xe4|lsi|Iaastarin|Viewjatkuu|lnStylen|k\\\xf6ril\\\xe4sl|Ieffoissa|Ieffaseuraksi|Iueskelemaan|Mit\\\xe4j\\\xe4tk\\\xe4|Iaukesitkaan|Kiit\\\xe3|\\\xc4\\\xe3Ii\\\xf6|Iyhytp\\\xf6ksy|Iacrosse|I\\\xf6yt\\\xe3m\\\xe3tt\\\xe3|samojajuttuja|J\\\xe4rvellel|Talouspaperitl|\\\xc4lk\\\xe4\\\xe3s|pillunaamal|poikayst\\\xe4v\\\xe4ns\\\xe3|Iapsenvahti|Nykist\\\xe3|Iaatuaikamme|K\\\xe4\\\xe3nsin|Iatinaksi|yleens\\\xe4juo|kreisej\\\xe3juttuja|Iiitostasi|Mit\\\xe4jos|Sinullaja|Iempparini|Iienetkin|Iuokkajuhla|Iuokkakokouksesta|Iukuteeman|Menejo|Sin\\\xe3j\\\xe4tit|I\\\xe4ht\\\xf6\\\xe3si|I\\\xe3\\\xe4kikseen|puhuajostain|tavatajoku|Iookia|Iapsiyst\\\xe4v\\\xe4llisemp\\\xe3n\\\xe3|is\\\xe3nn\\\xe4lle|t\\\xe3|Ieidi|K\\\xe3visik\\\xf6|maris\\\xe3tk\\\xe4|k\\\xe4nniss\\\xe4j\\\xe4rveen|sinullajotain|Iuntun|Iunttu|Iukitsin|jyyst\\\xe3\\\xe4|Iuokkajuhlaan|Michellest\\\xe3|Iuokkakokous|sin\\\xe4ja|Sin\\\xe3ja|Sill\\\xe3joskus|Iopetimme|Ymm\\\xe3rr\\\xe3tk\\\xf6|kanssajoka|Iiioitellusti|Iaihalta|Miaja|Mietit\\\xe3\\\xe4np\\\xe3|Ky\\\u0131\\\u0131\\\xe4|Pid\\\xe3ttelel|ymm\\\xe4rt\\\xe3misest\\\xe4|jaj\\\xe4\\\xe4n|Selenaja|Iuokkakokousta|\\\xe1k\\\xe1pussi|karkoituksen)(\\b|$)"}},
+ 'fra': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict([(u" I'", u" l'"), (u" |'", u" l'")]),
+                          'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:\\ I\\'|\\ \\|\\')(?:(?=\\s)|(?=$)|(?=\\b))"},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict([(u'"D\'ac:c:ord."', u'"D\'accord."'), (u'\u201ci QU\xce gagne, qui perd,', u'ni qui gagne, qui perd,'), (u"L'ac:c:ent est mis \r\n \r\n sur son trajet jusqu'en Suisse.", u"L'accent est mis \r\n \r\n sur son trajet jusqu'en Suisse."), (u"C'est la plus gentille chose \r\n \r\n qu'Hitchc:oc:k m'ait jamais dite.", u"C'est la plus gentille chose \r\n \r\n qu'Hitchcock m'ait jamais dite."), (u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventu re structur\xe9e,", u"Tout le monde, en revanche, qualifie \r\n \r\n Goldfinger d'aventure structur\xe9e,"), (u'et le film Shadow of a man \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.', u'et le film <i>Shadow of a man</i> \r\n \r\n a lanc\xe9 sa carri\xe8re au cin\xe9ma.'), (u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec One night with you.', u'En 1948, Young est pass\xe9 \xe0 la r\xe9alisation \r\n \r\n avec <i>One night with you</i>.'), (u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 C)c:ala, en Floride.', u'Il a construit tous ces v\xe9hicules \r\n \r\n \xe0 Ocala, en Floride.'), (u'Tokyo Pop et A Taxing Woman? Return.', u"Tokyo Pop et A Taxing Woman's Return."), (u'Peter H u nt.', u'Peter Hunt.'), (u'"C\'est bien mieux dans Peau. \r\n \r\n On peut s\ufb02\xe9clabousser, faire du bruit."', u'"C\'est bien mieux dans l\'eau. \r\n \r\n On peut s\'\xe9clabousser, faire du bruit."')]),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'@immatriculation', u"d'immatriculation"), (u'acquer', u'acqu\xe9r'), (u'acteurjoue', u'acteur joue'), (u'aerien', u'a\xe9rien'), (u'agreable', u'agr\xe9able'), (u'aientjamais', u'aient jamais'), (u'AII', u'All'), (u'aitjamais', u'ait jamais'), (u'aitjus', u'ait jus'), (u'alle', u'all\xe9'), (u'alles', u'all\xe9s'), (u'appele', u'appel\xe9'), (u'apres', u'apr\xe8s'), (u'aujourdhui', u"aujourd'hui"), (u'aupres', u'aupr\xe8s'), (u'beaute', u'beaut\xe9'), (u'cabossee', u'caboss\xe9e'), (u"carj'", u"car j'"), (u"Carj'", u"Car j'"), (u'carla', u'car la'), (u'CEdipe', u'\u0152dipe'), (u'Cest', u"C'est"), (u"c'etaient", u"c'\xe9taient"), (u'C\xe9taient', u"C'\xe9taient"), (u"c'etait", u"c'\xe9tait"), (u"C'etait", u"C'\xe9tait"), (u'C\xe9tait', u"C'\xe9tait"), (u'choregraphiee', u'chor\xe9graphi\xe9e'), (u'cinema', u'cin\xe9ma'), (u"cl'AIcatraz", u"d'Alcatraz"), (u'cles', u'cl\xe9s'), (u'c\u0153urjoie', u'c\u0153ur-joie'), (u'completer', u'compl\xe9ter'), (u'costumiere', u'costumi\xe8re'), (u'cree', u'cr\xe9\xe9'), (u'daccord', u"d'accord"), (u"d'AIbert", u"d'Albert"), (u"d'AIdous", u"d'Aldous"), (u"d'AIec", u"d'Alec"), (u'danniversaire', u"d'anniversaire"), (u"d'Arra'bida", u"d'Arrabida"), (u"d'autod\xe9rision", u"d'auto-d\xe9rision"), (u'dautres', u"d'autres"), (u'debattait', u'd\xe9battait'), (u'decor', u'd\xe9cor'), (u'decorateurs', u'd\xe9corateurs'), (u'decors', u'd\xe9cors'), (u'defi', u'd\xe9fi'), (u'dej\xe0', u'd\xe9j\xe0'), (u'd\xe9j\xe0m', u'd\xe9j\xe0...'), (u'dejeunait', u'd\xe9jeunait'), (u'dengager', u"d'engager"), (u'd\xe9quipement', u"d'\xe9quipement"), (u'd\xe9rni\xe8r\xe9', u'derni\xe8re'), (u'Desole', u'D\xe9sol\xe9'), (u'dessayage', u"d'essayage"), (u'dessence', u"d'essence"), (u'd\xe9taient', u"c'\xe9taient"), (u'detail', u'd\xe9tail'), (u'dexcellents', u"d'excellents"), (u'dexp\xe9rience', u"d'exp\xe9rience"), (u'dexp\xe9riences', u"d'exp\xe9riences"), (u"d'h\xe9ro'l'ne", u"d'h\xe9ro\xefne"), (u"d'idees", u"d'id\xe9es"), (u"d'intensite", u"d'intensit\xe9"), (u'dontj', u'dont j'), (u'doublaitAlfo', u'doublait Alfo'), (u'DrNo', u'Dr No'), (u"e'", u'\xe9'), (u'ecrit', u'\xe9crit'), (u'elegant', u'\xe9l\xe9gant'), (u'Ell\xe9', u'Elle'), (u'\xe9n', u'en'), (u'equipe', u'\xe9quipe'), (u'erjus', u'er jus'), (u'estjamais', u'est jamais'), (u'\xe9t', u'et'), (u'etaient', u'\xe9taient'), (u'etait', u'\xe9tait'), (u'ete', u'\xe9t\xe9'), (u'etiez', u'\xe9tiez'), (u"etj'", u"et j'"), (u"Etj'", u"Et j'"), (u'etje', u'et je'), (u'Etje', u'Et je'), (u'EtsouvenL', u'Et souvent'), (u'eviter', u'\xe9viter'), (u'Fabsence', u"l'absence"), (u'fadapter', u"t'adapter"), (u'fadore', u"j'adore"), (u'F\xe2ge', u"l'\xe2ge"), (u'Fagent', u"l'agent"), (u'faiessay\xe9', u"j'ai essay\xe9"), (u'Failure', u"l'alllure"), (u'Fambiance', u"l'ambiance"), (u'Famener', u"l'amener"), (u'Fanniversaire', u"l'anniversaire"), (u'Fapparence', u"l'apparence"), (u'Fapres', u"l'apres"), (u'Fapr\xe8s', u"l'apr\xe8s"), (u'Farm\xe9e', u"l'arm\xe9e"), (u'Farri\xe8re', u"l'arri\xe8re"), (u'Farriv\xe9e', u"l'arriv\xe9e"), (u'Fascenseur', u"l'ascenseur"), (u'Fascension', u"l'ascension"), (u'Fassaut', u"l'assaut"), (u'Fassomme', u"l'assomme"), (u'Fatmosph\xe8re', u"l'atmosph\xe8re"), (u'Fattention', u"l'attention"), (u'Favalanche', u"l'avalanche"), (u'F\xe9clairage', u"l'\xe9clairage"), (u'F\xe9cran', u"l'\xe9cran"), (u'F\xe9motion', u"l'\xe9motion"), (u'Femplacement', u"l'emplacement"), (u'Fendroit', u"l'endroit"), (u'Fenseigne', u"l'enseigne"), (u'Fensemble', u"l'ensemble"), (u'Fentouraient', u"l'entouraient"), (u'Fentr\xe9e', u"l'entr\xe9e"), (u'F\xe9paisseur', u"l'\xe9paisseur"), (u'F\xe9poque', u"l'\xe9poque"), (u'F\xe9quipe', u'\xc9quipe'), (u'Fespace', u"l'espace"), (u'fesp\xe9rais', u"j'esp\xe9rais"), (u'Fesp\xe8re', u"l'esp\xe8re"), (u'Festh\xe9tique', u"l'esth\xe9tique"), (u'Fetranger', u"l'etranger"), (u'F\xe9vasion', u"l'\xe9vasion"), (u'F\xe9voque', u"l'\xe9voque"), (u'Fexp\xe9rience', u"l'exp\xe9rience"), (u'Fexplique', u"l'explique"), (u'Fexplosion', u"l'explosion"), (u'Fext\xe9rieur', u"l'ext\xe9rieur"), (u'Fhabituelle', u"l'habituelle"), (u'Fh\xe9licopt\xe8re', u"l'h\xe9licopt\xe8re"), (u'Fh\xe9liport', u"l'h\xe9liport"), (u'Fh\xe9listation', u"l'h\xe9listation"), (u'Fhonneur', u"l'honneur"), (u'Fhorloge', u"l'horloge"), (u'Fid\xe9e', u"l'id\xe9e"), (u'Fimage', u"l'image"), (u'Fimportance', u"l'importance"), (u'Fimpression', u"l'impression"), (u'Finfluence', u"l'influence"), (u'Finscription', u"l'inscription"), (u'Fint\xe9rieur', u"l'int\xe9rieur"), (u'Fintrigue', u"l'intrigue"), (u'Fobjectif', u"l'objectif"), (u'Foccasion', u"l'occasion"), (u'Fordre', u"l'ordre"), (u'Forigine', u"l'origine"), (u'fr\xeare', u'fr\xe8re'), (u'gaylns', u'gaijins'), (u'general', u'g\xe9n\xe9ral'), (u'hawa\xefennel', u'hawa\xefenne'), (u"hawa'l'en", u'hawa\xefen'), (u'Ia', u'la'), (u'I\xe0', u'l\xe0'), (u'Iaryngotomie', u'laryngotomie'), (u'idee', u'id\xe9e'), (u'idees', u'id\xe9es'), (u'Ie', u'le'), (u'Ies', u'les'), (u'Iester', u'Lester'), (u'II', u'Il'), (u'Iimit', u'limit'), (u'IIs', u'Ils'), (u'immediatement', u'imm\xe9diatement'), (u'insufflee', u'insuffl\xe9e'), (u'integrer', u'int\xe9grer'), (u'interessante', u'int\xe9ressante'), (u'Iogions', u'logions'), (u'Iorsqu', u'lorsqu'), (u'isee', u'is\xe9e'), (u'Iumiere', u'lumiere'), (u'Iynchage', u'lynchage'), (u"J'espere", u"J'esp\xe8re"), (u'Jessaie', u"J'essaie"), (u"j'etais", u"j'\xe9tais"), (u"J'etais", u"J'\xe9tais"), (u'lat\xe9ral\xe9m\xe9nt', u'lat\xe9ralement'), (u'lci', u'Ici'), (u'Lci', u'Ici'), (u'l\xe9-', u'l\xe0-'), (u'lepidopteres', u'l\xe9pidopt\xe8res'), (u'litteraire', u'litt\xe9raire'), (u'll', u'il'), (u'Ll', u'Il'), (u'lls', u'ils'), (u'Lls', u'Ils'), (u'maintenanu', u'maintenant'), (u'maniere', u'mani\xe8re'), (u'mariee', u'mari\xe9e'), (u'Mayer/ing', u'Mayerling'), (u'meilleurjour', u'meilleur jour'), (u'melange', u'm\xe9lange'), (u"n'avai\xe9nt", u"n'avaient"), (u"n'etait", u"n'\xe9tait"), (u'oitjamais', u'oit jamais'), (u'oitjus', u'oit jus'), (u'ontete', u'ont \xe9t\xe9'), (u'operateur', u'op\xe9rateur'), (u'ouv\xe9rt\xe9', u'ouverte'), (u'P\xe9preuve', u"l'\xe9preuve"), (u'pere', u'p\xe8re'), (u'plateforme', u'plate-forme'), (u'pourjouer', u'pour jouer'), (u'precipice', u'pr\xe9cipice'), (u'preferes', u'pr\xe9f\xe9r\xe9s'), (u'premierjour', u'premier jour'), (u'presenter', u'pr\xe9senter'), (u'prevu', u'pr\xe9vu'), (u'prevue', u'pr\xe9vue'), (u'propriete', u'propri\xe9t\xe9'), (u'prot\xe8geraient', u'prot\xe9geraient'), (u'qu\xe9', u'que'), (u'qwangoiss\xe9', u"qu'angoiss\xe9"), (u'realisateur', u'r\xe9alisateur'), (u'reception', u'r\xe9ception'), (u're\xe9valu', u'r\xe9\xe9valu'), (u'repute', u'r\xe9put\xe9'), (u'reussi', u'r\xe9ussi'), (u"s'arr\xe9tait", u"s'arr\xeatait"), (u"s'ave'rer", u"s'av\xe9rer"), (u'scenario', u'sc\xe9nario'), (u'scene', u'sc\xe8ne'), (u'scenes', u'sc\xe8nes'), (u'seances', u's\xe9ances'), (u'sequence', u's\xe9quence'), (u's\ufb02\xe9crasa', u"s'\xe9crasa"), (u'speciale', u'sp\xe9ciale'), (u'Supen', u'Super'), (u'torturee', u'tortur\xe9e'), (u'Uadmirable', u"L'admirable"), (u'Uensemblier', u"L'ensemblier"), (u'Uexplosion', u"L'explosion"), (u'Uouvre', u"L'ouvre"), (u'Vaise', u"l'aise"), (u'vecu', u'v\xe9cu'), (u'vehicules', u'v\xe9hicules'), (u'\u0178appr\xe9ciais', u"J'appr\xe9ciais"), (u'\u0178esp\xe8re', u"J'esp\xe8re"), (u'\xff\xe9trangle', u"s'\xe9trangle")]),
+                        'pattern': u"(?um)(\\b|^)(?:\\@immatriculation|acquer|acteurjoue|aerien|agreable|aientjamais|AII|aitjamais|aitjus|alle|alles|appele|apres|aujourdhui|aupres|beaute|cabossee|carj\\'|Carj\\'|carla|CEdipe|Cest|c\\'etaient|C\\\xe9taient|c\\'etait|C\\'etait|C\\\xe9tait|choregraphiee|cinema|cl\\'AIcatraz|cles|c\\\u0153urjoie|completer|costumiere|cree|daccord|d\\'AIbert|d\\'AIdous|d\\'AIec|danniversaire|d\\'Arra\\'bida|d\\'autod\\\xe9rision|dautres|debattait|decor|decorateurs|decors|defi|dej\\\xe0|d\\\xe9j\\\xe0m|dejeunait|dengager|d\\\xe9quipement|d\\\xe9rni\\\xe8r\\\xe9|Desole|dessayage|dessence|d\\\xe9taient|detail|dexcellents|dexp\\\xe9rience|dexp\\\xe9riences|d\\'h\\\xe9ro\\'l\\'ne|d\\'idees|d\\'intensite|dontj|doublaitAlfo|DrNo|e\\'|ecrit|elegant|Ell\\\xe9|\\\xe9n|equipe|erjus|estjamais|\\\xe9t|etaient|etait|ete|etiez|etj\\'|Etj\\'|etje|Etje|EtsouvenL|eviter|Fabsence|fadapter|fadore|F\\\xe2ge|Fagent|faiessay\\\xe9|Failure|Fambiance|Famener|Fanniversaire|Fapparence|Fapres|Fapr\\\xe8s|Farm\\\xe9e|Farri\\\xe8re|Farriv\\\xe9e|Fascenseur|Fascension|Fassaut|Fassomme|Fatmosph\\\xe8re|Fattention|Favalanche|F\\\xe9clairage|F\\\xe9cran|F\\\xe9motion|Femplacement|Fendroit|Fenseigne|Fensemble|Fentouraient|Fentr\\\xe9e|F\\\xe9paisseur|F\\\xe9poque|F\\\xe9quipe|Fespace|fesp\\\xe9rais|Fesp\\\xe8re|Festh\\\xe9tique|Fetranger|F\\\xe9vasion|F\\\xe9voque|Fexp\\\xe9rience|Fexplique|Fexplosion|Fext\\\xe9rieur|Fhabituelle|Fh\\\xe9licopt\\\xe8re|Fh\\\xe9liport|Fh\\\xe9listation|Fhonneur|Fhorloge|Fid\\\xe9e|Fimage|Fimportance|Fimpression|Finfluence|Finscription|Fint\\\xe9rieur|Fintrigue|Fobjectif|Foccasion|Fordre|Forigine|fr\\\xeare|gaylns|general|hawa\\\xefennel|hawa\\'l\\'en|Ia|I\\\xe0|Iaryngotomie|idee|idees|Ie|Ies|Iester|II|Iimit|IIs|immediatement|insufflee|integrer|interessante|Iogions|Iorsqu|isee|Iumiere|Iynchage|J\\'espere|Jessaie|j\\'etais|J\\'etais|lat\\\xe9ral\\\xe9m\\\xe9nt|lci|Lci|l\\\xe9\\-|lepidopteres|litteraire|ll|Ll|lls|Lls|maintenanu|maniere|mariee|Mayer\\/ing|meilleurjour|melange|n\\'avai\\\xe9nt|n\\'etait|oitjamais|oitjus|ontete|operateur|ouv\\\xe9rt\\\xe9|P\\\xe9preuve|pere|plateforme|pourjouer|precipice|preferes|premierjour|presenter|prevu|prevue|propriete|prot\\\xe8geraient|qu\\\xe9|qwangoiss\\\xe9|realisateur|reception|re\\\xe9valu|repute|reussi|s\\'arr\\\xe9tait|s\\'ave\\'rer|scenario|scene|scenes|seances|sequence|s\\\ufb02\\\xe9crasa|speciale|Supen|torturee|Uadmirable|Uensemblier|Uexplosion|Uouvre|Vaise|vecu|vehicules|\\\u0178appr\\\xe9ciais|\\\u0178esp\\\xe8re|\\\xff\\\xe9trangle)(\\b|$)"}},
+ 'hrv': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict([(u'Ako ej', u'Ako je'), (u'ako ej', u'ako je'), (u'bez svesti', u'bez svijesti'), (u'Bi\u0107u uz', u'Bit \u0107u uz'), (u'bi ja', u'bih ja'), (u'bi la', u'bila'), (u'biti uredu', u'biti u redu'), (u'bi da bude', u'bi biti'), (u'Bi ste', u'Biste'), (u'Bilo ko', u'Bilo tko'), (u'bilo ko', u'bilo tko'), (u'\u0107e da do\u0111e', u'\u0107e do\u0107i'), (u'Da li \u0107e', u'Ho\u0107e li'), (u'Da li \u0107emo', u'Ho\u0107emo li'), (u'Da li \u0107u', u'Ho\u0107u li'), (u'da li \u0107u', u'ho\u0107u li'), (u'dali \u0107u', u'ho\u0107u li'), (u'Da li je', u'Je li'), (u'da li je', u'je li'), (u'dali je', u'je li'), (u'Da li ste', u'Jeste li'), (u'Da li si', u'Jesi li'), (u'dali si', u'jesi li'), (u'da li \u0107e', u'ho\u0107e li'), (u'dali \u0107e', u'ho\u0107e li'), (u'do srede', u'do srijede'), (u'Dobro ve\u010de', u'Dobra ve\u010der'), (u'Dobro ve\u010der', u'Dobra ve\u010der'), (u'Dobar ve\u010der', u'Dobra ve\u010der'), (u'gdje ide\u0161', u'kamo ide\u0161'), (u'Gdje ide\u0161', u'Kamo ide\u0161'), (u'Gdje sada', u'Kamo sada'), (u'gle ko', u'gle tko'), (u'ho\u0107u da budem', u'\u017eelim biti'), (u'Ho\u0107u da budem', u'\u017delim biti'), (u'ho\u0107u da ka\u017eem', u'\u017eelim re\u0107i'), (u'ho\u0107e\u0161 da ka\u017ee\u0161', u'\u017eeli\u0161 re\u0107i'), (u'ho\u0107e da ka\u017ee', u'\u017eeli re\u0107i'), (u'ho\u0107u da \u017eivim', u'\u017eelim \u017eivjeti'), (u'Izvini se', u'Ispri\u010daj se'), (u'izvini se', u'ispri\u010daj se'), (u'Izvinite me', u'Ispri\u010dajte me'), (u'Izvinite nas', u'Ispri\u010dajte nas'), (u'izvinite nas', u'ispri\u010dajte nas'), (u'Izvinjavamo se', u'Ispri\u010davamo se'), (u'ja bi', u'ja bih'), (u'Ja bi', u'Ja bih'), (u'Jel sam ti', u'Jesam li ti'), (u'Jeli se', u'Je li se'), (u'Jeli sve', u'Je li sve'), (u'Jeli ti', u'Je li ti'), (u'ko je', u'tko je'), (u'ko si', u'tko si'), (u'ko ti je', u'tko ti je'), (u'ko te je', u'tko te je'), (u'ko zna', u'tko zna'), (u'mo\u0107i da idemo', u'mo\u0107i i\u0107i'), (u'moglo da bude', u'moglo biti'), (u'moje sau\u010de\u0161\u0107e', u'moja su\u0107ut'), (u'mora da bude', u'mora biti'), (u'moram da budem', u'moram biti'), (u'Moram da idem', u'Moram i\u0107i'), (u'moram da idem', u'moram i\u0107i'), (u'Mora\u0161 da ide\u0161', u'Mora\u0161 i\u0107i'), (u'Moramo da idemo', u'Moramo i\u0107i'), (u'moram da vidim', u'moram vidjeti'), (u'moram da zaboravim', u'moram zaboraviti'), (u'mora\u0161 da zaboravi\u0161', u'mora\u0161 zaboraviti'), (u'mora da zna', u'mora znati'), (u'moram da znam', u'moram znati'), (u'Moram da znam', u'Moram znati'), (u'mora\u0161 da zna\u0161', u'mora\u0161 znati'), (u'mora\u0161 da ide\u0161', u'mora\u0161 i\u0107i'), (u'mo\u017ee da bude', u'mo\u017ee biti'), (u'mo\u017ee\u0161 da bude\u0161', u'mo\u017ee\u0161 biti'), (u'mo\u017ee da di\u0161e', u'mo\u017ee disati'), (u'mo\u017ee\u0161 da dobije\u0161', u'mo\u017ee\u0161 dobiti'), (u'mo\u017eemo da imamo', u'mo\u017eemo imati'), (u'na ve\u010der', u'nave\u010der'), (u'Na ve\u010der', u'Nave\u010der'), (u'ne\u0107e da bude', u'ne\u0107e biti'), (u'ne\u0107e\u0161 da bude\u0161', u'ne\u0107e\u0161 biti'), (u'ne\u0107e\u0161 da po\u017eali\u0161', u'ne\u0107e\u0161 po\u017ealiti'), (u'Neko ko', u'Netko tko'), (u'neko ko', u'netko tko'), (u'neko ne\u0161to', u'netko ne\u0161to'), (u'nedjelju dana', u'tjedan dana'), (u'Ne mogu da verujem', u'Ne mogu vjerovati'), (u'new yor\u0161ki', u'njujor\u0161ki'), (u'nju jor\u0161ki', u'njujor\u0161ki'), (u'od kako', u'otkako'), (u'Pla\u0161im se', u'Bojim se'), (u'pla\u0161im se', u'bojim se'), (u'pravo u o\u010di', u'ravno u o\u010di'), (u'sa njim', u's njim'), (u'sa njima', u's njima'), (u'sa njom', u's njom'), (u'sa tim', u's tim'), (u'sa tom', u's tom'), (u'sa tobom', u's tobom'), (u'sa vama', u's vama'), (u'sam da budem', u'sam biti'), (u'si\u0107i dolje', u'si\u0107i'), (u'Si dobro', u'Jesi li dobro'), (u'Svako ko', u'Svatko tko'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'smeo da', u'smio'), (u'smeli da', u'smjeli'), (u'\u0160to ej', u'\u0160to je'), (u'\u0161to ej', u'\u0161to je'), (u'to j', u'to je'), (u'to ej', u'to je'), (u'To ej', u'To je'), (u'tamo natrag', u'tamo iza'), (u'tamo je natrag', u'tamo je iza'), (u'Tamo je natrag', u'Tamo je iza'), (u'treba da bude', u'treba biti'), (u'u jutro', u'ujutro'), (u'u\u0107i unutra', u'u\u0107i'), (u'vas je lagao', u'vam je lagao'), (u'za uvijek', u'zauvijek'), (u'zato sto', u'zato \u0161to'), (u'zna da bude', u'zna biti'), (u'zna ko', u'zna tko'), (u'znati ko', u'znati tko'), (u'\u017eele da budu', u'\u017eele biti'), (u'\u017eeli da bude', u'\u017eeli biti'), (u'\u017eelio da budem', u'\u017eelio biti'), (u'\u017eelim da budem', u'\u017eelim biti'), (u'\u017delim da budem', u'\u017delim biti'), (u'\u017eeli\u0161 da bude\u0161', u'\u017eeli\u0161 biti'), (u'\u017eelim da idem', u'\u017eelim i\u0107i'), (u'\u017eelim da odem', u'\u017eelim oti\u0107i'), (u'\u017eeli\u0161 da ode\u0161', u'\u017eeli\u0161 oti\u0107i'), (u'\u017eeli\u0161 da u\u0111e\u0161', u'\u017eeli\u0161 u\u0107i'), (u'\u017eelim da umrem', u'\u017eelim umrijeti'), (u'\u017delim da znam', u'\u017delim znati'), (u'\u017eelim da znam', u'\u017eelim znati'), (u'\u017eeli\u0161 da zna\u0161', u'\u017eeli\u0161 znati')]),
+                          'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:Ako\\ ej|ako\\ ej|bez\\ svesti|Bi\\\u0107u\\ uz|bi\\ ja|bi\\ la|biti\\ uredu|bi\\ da\\ bude|Bi\\ ste|Bilo\\ ko|bilo\\ ko|\\\u0107e\\ da\\ do\\\u0111e|Da\\ li\\ \\\u0107e|Da\\ li\\ \\\u0107emo|Da\\ li\\ \\\u0107u|da\\ li\\ \\\u0107u|dali\\ \\\u0107u|Da\\ li\\ je|da\\ li\\ je|dali\\ je|Da\\ li\\ ste|Da\\ li\\ si|dali\\ si|da\\ li\\ \\\u0107e|dali\\ \\\u0107e|do\\ srede|Dobro\\ ve\\\u010de|Dobro\\ ve\\\u010der|Dobar\\ ve\\\u010der|gdje\\ ide\\\u0161|Gdje\\ ide\\\u0161|Gdje\\ sada|gle\\ ko|ho\\\u0107u\\ da\\ budem|Ho\\\u0107u\\ da\\ budem|ho\\\u0107u\\ da\\ ka\\\u017eem|ho\\\u0107e\\\u0161\\ da\\ ka\\\u017ee\\\u0161|ho\\\u0107e\\ da\\ ka\\\u017ee|ho\\\u0107u\\ da\\ \\\u017eivim|Izvini\\ se|izvini\\ se|Izvinite\\ me|Izvinite\\ nas|izvinite\\ nas|Izvinjavamo\\ se|ja\\ bi|Ja\\ bi|Jel\\ sam\\ ti|Jeli\\ se|Jeli\\ sve|Jeli\\ ti|ko\\ je|ko\\ si|ko\\ ti\\ je|ko\\ te\\ je|ko\\ zna|mo\\\u0107i\\ da\\ idemo|moglo\\ da\\ bude|moje\\ sau\\\u010de\\\u0161\\\u0107e|mora\\ da\\ bude|moram\\ da\\ budem|Moram\\ da\\ idem|moram\\ da\\ idem|Mora\\\u0161\\ da\\ ide\\\u0161|Moramo\\ da\\ idemo|moram\\ da\\ vidim|moram\\ da\\ zaboravim|mora\\\u0161\\ da\\ zaboravi\\\u0161|mora\\ da\\ zna|moram\\ da\\ znam|Moram\\ da\\ znam|mora\\\u0161\\ da\\ zna\\\u0161|mora\\\u0161\\ da\\ ide\\\u0161|mo\\\u017ee\\ da\\ bude|mo\\\u017ee\\\u0161\\ da\\ bude\\\u0161|mo\\\u017ee\\ da\\ di\\\u0161e|mo\\\u017ee\\\u0161\\ da\\ dobije\\\u0161|mo\\\u017eemo\\ da\\ imamo|na\\ ve\\\u010der|Na\\ ve\\\u010der|ne\\\u0107e\\ da\\ bude|ne\\\u0107e\\\u0161\\ da\\ bude\\\u0161|ne\\\u0107e\\\u0161\\ da\\ po\\\u017eali\\\u0161|Neko\\ ko|neko\\ ko|neko\\ ne\\\u0161to|nedjelju\\ dana|Ne\\ mogu\\ da\\ verujem|new\\ yor\\\u0161ki|nju\\ jor\\\u0161ki|od\\ kako|Pla\\\u0161im\\ se|pla\\\u0161im\\ se|pravo\\ u\\ o\\\u010di|sa\\ njim|sa\\ njima|sa\\ njom|sa\\ tim|sa\\ tom|sa\\ tobom|sa\\ vama|sam\\ da\\ budem|si\\\u0107i\\ dolje|Si\\ dobro|Svako\\ ko|Svo\\ vreme|Svo\\ vrijeme|smeo\\ da|smeli\\ da|\\\u0160to\\ ej|\\\u0161to\\ ej|to\\ j|to\\ ej|To\\ ej|tamo\\ natrag|tamo\\ je\\ natrag|Tamo\\ je\\ natrag|treba\\ da\\ bude|u\\ jutro|u\\\u0107i\\ unutra|vas\\ je\\ lagao|za\\ uvijek|zato\\ sto|zna\\ da\\ bude|zna\\ ko|znati\\ ko|\\\u017eele\\ da\\ budu|\\\u017eeli\\ da\\ bude|\\\u017eelio\\ da\\ budem|\\\u017eelim\\ da\\ budem|\\\u017delim\\ da\\ budem|\\\u017eeli\\\u0161\\ da\\ bude\\\u0161|\\\u017eelim\\ da\\ idem|\\\u017eelim\\ da\\ odem|\\\u017eeli\\\u0161\\ da\\ ode\\\u0161|\\\u017eeli\\\u0161\\ da\\ u\\\u0111e\\\u0161|\\\u017eelim\\ da\\ umrem|\\\u017delim\\ da\\ znam|\\\u017eelim\\ da\\ znam|\\\u017eeli\\\u0161\\ da\\ zna\\\u0161)(?:(?=\\s)|(?=$)|(?=\\b))'},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'advokati', u'odvjetnici'), (u'Advokati', u'Odvjetnici'), (u'advokatima', u'odvjetnicima'), (u'Advokatima', u'Odvjetnicima'), (u'afirmi\u0161e', u'afirmira'), (u'akcenat', u'naglasak'), (u'akcionara', u'dioni\u010dara'), (u'akvarijum', u'akvarij'), (u'akvarijumu', u'akvariju'), (u'amin', u'amen'), (u'Amin', u'Amen'), (u'ans', u'nas'), (u'apsorbovanje', u'apsorbiranje'), (u'apsorbuje', u'apsorbira'), (u'azot', u'du\u0161ik'), (u'ba\u0161ta', u'vrt'), (u'Ba\u0161ta', u'Vrt'), (u'ba\u0161te', u'vrtovi'), (u'Ba\u0161te', u'Vrtovi'), (u'ba\u0161ti', u'vrtu'), (u'ba\u0161tu', u'vrt'), (u'Ba\u0161tu', u'Vrt'), (u'ba\u0161tom', u'vrtom'), (u'bedan', u'bijedan'), (u'bede', u'bijede'), (u'bedi', u'bijedi'), (u'bejah', u'bijah'), (u'bejahu', u'bijahu'), (u'bele\u0161ci', u'bilje\u0161ci'), (u'be\u0161ike', u'mjehure'), (u'bebisiterka', u'dadilja'), (u'beg', u'bijeg'), (u'begu', u'bijegu'), (u'begstva', u'bijega'), (u'beja\u0161e', u'bija\u0161e'), (u'bekstvo', u'bijeg'), (u'bekstvu', u'bijegu'), (u'begstvu', u'bijegu'), (u'bes', u'bijes'), (u'besa', u'bijesa'), (u'besan', u'bijesan'), (u'besom', u'bijesom'), (u'besu', u'bijesu'), (u'be\u0161e', u'bje\u0161e'), (u'bimso', u'bismo'), (u'blije\u0111i', u'blje\u0111i'), (u'bioje', u'bio je'), (u'bi smo', u'bismo'), (u'bi ste', u'biste'), (u'bioskop', u'kino'), (u'bioskopi', u'kina'), (u'bitci', u'bitki'), (u'bled', u'blijed'), (u'blede', u'blijede'), (u'boksuje\u0161', u'boksa\u0161'), (u'bolesan', u'bolestan'), (u'bolila', u'boljela'), (u'bori\u0107e\u0161', u'borit \u0107e\u0161'), (u'Bori\u0107e\u0161', u'Borit \u0107e\u0161'), (u'braon', u'sme\u0111a'), (u'bregu', u'brijegu'), (u'bti', u'biti'), (u'cedilu', u'cjedilu'), (u'ceo', u'cijeli'), (u'Ceo', u'Cijeli'), (u'cepa', u'cijepa'), (u'cev', u'cijev'), (u'cevi', u'cijevi'), (u'cjevi', u'cijevi'), (u'cevima', u'cijevima'), (u'Cevi', u'Cijevi'), (u'Cjevi', u'Cijevi'), (u'Cevima', u'Cijevima'), (u'Cjevima', u'Cijevima'), (u'cev\u010dica', u'cjev\u010dica'), (u'cev\u010dicu', u'cjev\u010dicu'), (u'cutanje', u'\u0161utnja'), (u'\u010dutanje', u'\u0161utnja'), (u'\u0107utanje', u'\u0161utnja'), (u'Cutanje', u'\u0160utnja'), (u'\u010cutanje', u'\u0160utnja'), (u'\u0106utanje', u'\u0160utnja'), (u'cutanjem', u'\u0161utnjom'), (u'\u010dutanjem', u'\u0161utnjom'), (u'\u0107utanjem', u'\u0161utnjom'), (u'Cutanjem', u'\u0160utnjom'), (u'\u010cutanjem', u'\u0160utnjom'), (u'\u0106utanjem', u'\u0160utnjom'), (u'cvetaju', u'cvjetaju'), (u'cvetove', u'cvjetove'), (u'cvetu', u'cvijetu'), (u'cvjetu', u'cvijetu'), (u'cvetalo', u'cvjetalo'), (u'cvjetom', u'cvijetom'), (u'\u010cakom', u'Chuckom'), (u'\u010dar\u0161av', u'plahta'), (u'\u010dar\u0161ave', u'plahte'), (u'\u010dar\u0161avi', u'plahte'), (u'\u010dar\u0161avima', u'plahtama'), (u'\u010das', u'sat'), (u'\u010detvoro', u'\u010detvero'), (u'\u010cita\u0107u', u'\u010citat \u0107u'), (u'\u010derku', u'k\u0107er'), (u'\u010cerku', u'K\u0107er'), (u'\u0107erku', u'k\u0107er'), (u'\u0106erku', u'K\u0107er'), (u'\u0107erkama', u'k\u0107erima'), (u'\u010derkama', u'k\u0107erima'), (u'\u0107erkom', u'k\u0107eri'), (u'\u010derkom', u'k\u0107eri'), (u'k\u0107erkom', u'k\u0107eri'), (u'k\u010derkom', u'k\u0107eri'), (u'\u010cu', u'\u0106u'), (u'\u010ce\u0161', u'\u0106e\u0161'), (u'\u010ce', u'\u0106e'), (u'\u010cemo', u'\u0106emo'), (u'\u010cete', u'\u0106ete'), (u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'\u0107ebe', u'deku'), (u'\u0107ebetu', u'deki'), (u'\u010dk', u'\u010dak'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107ale', u'tata'), (u'\u0107aletom', u'ocem'), (u'\u0107aleta', u'oca'), (u'\u0107aletu', u'ocu'), (u'\u0107orsokak', u'slijepa ulica'), (u'\u0107orsokaku', u'slijepoj ulici'), (u'\u0107o\u0161ak', u'ugao'), (u'\u0107o\u0161ku', u'uglu'), (u'\u0107erka', u'k\u0107i'), (u'\u0106erka', u'K\u0107i'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010du\u0107e', u'\u010dut \u0107e'), (u'\u010du\u0107emo', u'\u010dut \u0107emo'), (u'\u010cu\u0107emo', u'\u010cut \u0107emo'), (u'\u010cu\u0107ete', u'\u010cut \u0107ete'), (u'\u010cu\u0107e', u'\u010cut \u0107e'), (u'\u0107uo', u'\u010duo'), (u'\u0107utao', u'\u0161utio'), (u'\u0106utao', u'\u0160utio'), (u'\u0107ute', u'\u0161ute'), (u'\u0106ute', u'\u0160ute'), (u'cvetova', u'cvjetova'), (u'daga', u'da ga'), (u'damas', u'danas'), (u'date', u'dane'), (u'deda', u'djed'), (u'Deda', u'Djed'), (u'dede', u'djeda'), (u'dedi', u'djedu'), (u'dedom', u'djedom'), (u'defini\u0161e', u'definira'), (u'dejstvo', u'djelovanje'), (u'Dejstvo', u'Djelovanje'), (u'dejstvom', u'djelovanjem'), (u'Dejstvom', u'Djelovanjem'), (u'dele\u0107i', u'dijele\u0107i'), (u'deo', u'dio'), (u'Deo', u'Dio'), (u'de\u0161ava', u'doga\u0111a'), (u'dete', u'dijete'), (u'Dete', u'Dijete'), (u'diluje', u'dila'), (u'diluju', u'dilaju'), (u'diskutuje', u'raspravlja'), (u'Diskutuje', u'Raspravlja'), (u'diskutujemo', u'raspravljamo'), (u'Diskutujemo', u'Raspravljamo'), (u'djete', u'dijete'), (u'Djete', u'Dijete'), (u'detektuje', u'detektira'), (u'dodju', u'do\u0111u'), (u'dole', u'dolje'), (u'Dole', u'Dolje'), (u'donijeo', u'donio'), (u'Donijeo', u'Donio'), (u'Donije\u0107u', u'Donijet \u0107u'), (u'dosledan', u'dosljedan'), (u'dospeo', u'dospio'), (u'dospeju', u'dospiju'), (u'do\u0111avola', u'dovraga'), (u'Do\u0111avola', u'Dovraga'), (u'drug', u'prijatelj'), (u'drugari', u'prijatelji'), (u'drugare', u'prijatelje'), (u'drug\u010diji', u'druga\u010diji'), (u'drugde', u'drugdje'), (u'duuga', u'd\xfaga'), (u'duvana', u'duhana'), (u'dve', u'dvije'), (u'Dve', u'Dvije'), (u'dvema', u'dvjema'), (u'\u0111avo', u'vrag'), (u'\u0111avola', u'vraga'), (u'\u0111emper', u'd\u017eemper'), (u'd\u017eanki', u'ovisnik'), (u'd\u017eelat', u'krvnik'), (u'\u0111ubre', u'sme\u0107e'), (u'efekat', u'efekt'), (u'eksperata', u'stru\u010dnjaka'), (u'eksperti', u'stru\u010dnjaci'), (u'Eksperti', u'Stru\u010dnjaci'), (u'ekspertima', u'stru\u010dnjacima'), (u'en', u'ne'), (u'emitovao', u'emitirao'), (u'emitovati', u'emitirati'), (u'emituje', u'emitira'), (u'emitujem', u'emitiram'), (u'Emitujem', u'Emitiram'), (u'emituju', u'emitiraju'), (u'evra', u'eura'), (u'familija', u'obitelj'), (u'Familija', u'Obitelj'), (u'familiju', u'obitelj'), (u'Familiju', u'Obitelj'), (u'familijama', u'obiteljima'), (u'familiji', u'obitelji'), (u'flertuje', u'o\u010dijuka'), (u'foka', u'tuljan'), (u'foku', u'tuljana'), (u'foke', u'tuljani'), (u'fokama', u'tuljanima'), (u'fotografi\u0161u', u'fotografiraju'), (u'gasova', u'plinova'), (u'gde', u'gdje'), (u'Gde', u'Gdje'), (u'gluhonem', u'gluhonijem'), (u'gre\u0161e', u'grije\u0161e'), (u'grje\u0161e', u'grije\u0161e'), (u'gre\u0161i', u'grije\u0161i'), (u'grje\u0161i', u'grije\u0161i'), (u'gre\u0161ki', u'gre\u0161ci'), (u'grijehova', u'grijeha'), (u'grijehove', u'grijehe'), (u'hipnotisao', u'hipnotizirao'), (u'hipnotisana', u'hipnotizirana'), (u'hipnoti\u0161e', u'hipnotizira'), (u'Historija', u'Povijest'), (u'Historiju', u'Povijest'), (u'Historije', u'Povijesti'), (u'Historiji', u'Povijesti'), (u'Istorija', u'Povijest'), (u'Istoriju', u'Povijest'), (u'Istorije', u'Povijesti'), (u'Istoriji', u'Povijesti'), (u'historije', u'povijesti'), (u'historiji', u'povijesti'), (u'istorije', u'povijesti'), (u'istoriji', u'povijesti'), (u'istorijom', u'povije\u0161\u0107u'), (u'hakuje', u'hakira'), (u'Hakuje', u'Hakira'), (u'hakujemo', u'hakiramo'), (u'Hakujemo', u'Hakiramo'), (u'Hakuju', u'Hakiraju'), (u'hakuju', u'hakiraju'), (u'ho\u010du', u'ho\u0107u'), (u'Ho\u010du', u'Ho\u0107u'), (u'hte\u0107e', u'htjet \u0107e'), (u'htedoh', u'htjedoh'), (u'Htjeo', u'Htio'), (u'Hteo', u'Htio'), (u'htjeo', u'htio'), (u'hteo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'I\u010di', u'I\u0107i'), (u'iko', u'itko'), (u'ignori\u0161i', u'ignoriraj'), (u'Ignori\u0161i', u'Ignoriraj'), (u'ignori\u0161ite', u'ignorirajte'), (u'Ignori\u0161ite', u'Ignorirajte'), (u'ignori\u0161u', u'ignoriraju'), (u'ilustruju', u'ilustriraju'), (u'inspirisao', u'inspirirao'), (u'interesantan', u'zanimljiv'), (u'Interesantan', u'Zanimljiv'), (u'interesuje', u'zanima'), (u'Interesuje', u'Zanima'), (u'interesujemo', u'zanimamo'), (u'Interesujemo', u'Zanimamo'), (u'interesujete', u'zanimate'), (u'Interesujete', u'Zanimate'), (u'Interesuju', u'Zanimaju'), (u'interesuju', u'zanimaju'), (u'isekao', u'izrezao'), (u'isterao', u'istjerao'), (u'istera\u0161', u'istjera\u0161'), (u'Istera\u0161', u'Istjera\u0161'), (u'istrebi', u'istrijebi'), (u'istrebiti', u'istrijebiti'), (u'isuvi\u0161e', u'previ\u0161e'), (u'ivica', u'rub'), (u'ivice', u'ruba'), (u'ivici', u'rubu'), (u'ivicu', u'rub'), (u'izduvaj', u'ispu\u0161i'), (u'izduvamo', u'ispu\u0161emo'), (u'izoluje', u'izolira'), (u'izolujemo', u'izoliramo'), (u'izoluje\u0161', u'izolira\u0161'), (u'Izolujete', u'Izolirate'), (u'Izolujte', u'Izolirajte'), (u'izolujte', u'izolirajte'), (u'izgladneo', u'izgladnio'), (u'izmeriti', u'izmjeriti'), (u'izmerio', u'izmjerio'), (u'izme\u0161ane', u'izmije\u0161ane'), (u'izneo', u'iznio'), (u'izneti', u'iznijeti'), (u'izvestan', u'izvjestan'), (u'izvinem', u'ispri\u010dam'), (u'izvine\u0161', u'ispri\u010da\u0161'), (u'Izvinem', u'Ispri\u010dam'), (u'Izvine\u0161', u'Ispri\u010da\u0161'), (u'izvinim', u'ispri\u010dam'), (u'izvini\u0161', u'ispri\u010da\u0161'), (u'izviniti', u'ispri\u010dati'), (u'izvinjenje', u'isprika'), (u'izvinjenja', u'isprike'), (u'izvinjenju', u'isprici'), (u'jedamput', u'jedanput'), (u'jelda', u"jel' da"), (u'Je\u0161\u0107emo', u'Jest \u0107emo'), (u'Je\u0161\u0107e\u0161', u'Jest \u0107e\u0161'), (u'je\u0161\u0107e', u'jest \u0107e'), (u'je\u0161\u0107u', u'jest \u0107u'), (u'Je\u0161\u0107u', u'Jest \u0107u'), (u'je\u0161\u0107e\u0161', u'jest \u0107e\u0161'), (u'je\u0161\u0107emo', u'jest \u0107emo'), (u'ju\u010de', u'ju\u010der'), (u'Ju\u010de', u'Ju\u010der'), (u'kakava', u'kakva'), (u'kampovao', u'kampirao'), (u'kampuje', u'kampira'), (u'kampujemo', u'kampiramo'), (u'kampuju', u'kampiraju'), (u'kancelarija', u'ured'), (u'kancelarijama', u'uredima'), (u'kancelariju', u'ured'), (u'Kancelarija', u'Ured'), (u'Kancelariju', u'Ured'), (u'kancelariji', u'uredu'), (u'kancelarije', u'ureda'), (u'kancelarijom', u'uredom'), (u'kancera', u'raka'), (u'kandidovati', u'kandidirati'), (u'kandidujem', u'kandidiram'), (u'kapar', u'kopar'), (u'kapra', u'kopra'), (u'karmin', u'ru\u017e'), (u'karminom', u'ru\u017eem'), (u'k\u0107erci', u'k\u0107eri'), (u'k\u0107erka', u'k\u0107i'), (u'k\u010derka', u'k\u0107i'), (u'K\u0107erka', u'K\u0107i'), (u'K\u010derka', u'K\u0107i'), (u'k\u0107erkama', u'k\u0107erima'), (u'ker', u'pas'), (u'Ker', u'Pas'), (u'kerova', u'pasa'), (u'kidnapovan', u'otet'), (u'Kidnapovan', u'Otet'), (u'kiji', u'koji'), (u'kijim', u'kojim'), (u'klasifikuju', u'klasificiraju'), (u'kle\u0161ta', u'klije\u0161ta'), (u'klje\u0161ta', u'klije\u0161ta'), (u'Ko', u'Tko'), (u'koa', u'kao'), (u'koaj', u'koja'), (u'kola', u'auto'), (u'kolima', u'autu'), (u'komandni', u'zapovjedni'), (u'kombinuju', u'kombiniraju'), (u'kompanija', u'tvrtka'), (u'komponovao', u'skladao'), (u'kom\u0161ija', u'susjed'), (u'kom\u0161iji', u'susjedu'), (u'kom\u0161iju', u'susjeda'), (u'kom\u0161iluk', u'susjedstvo'), (u'kom\u0161iluka', u'susjedstva'), (u'kom\u0161iluku', u'susjedstvu'), (u'kom\u0161ije', u'susjedi'), (u'kom\u0161ijama', u'susjedima'), (u'kom\u0161inica', u'susjeda'), (u'kom\u0161inicu', u'susjedu'), (u'konektovan', u'spojen'), (u'konektovati', u'spojiti'), (u'kontroli\u0161u', u'kontroliraju'), (u'Kontroli\u0161u', u'Kontroliraju'), (u'Kontroli\u0161i', u'Kontroliraj'), (u'kontroli\u0161i', u'kontroliraj'), (u'Kontroli\u0161ite', u'Kontrolirajte'), (u'kontroli\u0161ite', u'kontrolirajte'), (u'korpu', u'ko\u0161aru'), (u'kritikuju', u'kritiziraju'), (u'krsta', u'kri\u017ea'), (u'krsta\u0161i', u'kri\u017eari'), (u'krstu', u'kri\u017eu'), (u'krsti\u0107a', u'kri\u017ei\u0107a'), (u'krsti\u0107u', u'kri\u017ei\u0107u'), (u'Krsta', u'Kri\u017ea'), (u'Krstu', u'Kri\u017eu'), (u'Krsti\u0107a', u'Kri\u017ei\u0107a'), (u'Krsti\u0107u', u'Kri\u017ei\u0107u'), (u'krstom', u'kri\u017eem'), (u'krstove', u'kri\u017eeve'), (u'Krstove', u'Kri\u017eeve'), (u'krstovima', u'kri\u017eevima'), (u'Krstovima', u'Kri\u017eevima'), (u'kri\u017eom', u'kri\u017eem'), (u'kupatilo', u'kupaona'), (u'kupatilu', u'kupaoni'), (u'kvalifikuju', u'kvalificiraju'), (u'la\u017eeju', u'la\u017eu'), (u'La\u017eov', u'La\u017eljivac'), (u'la\u017eov', u'la\u017eljivac'), (u'la\u017eovi', u'la\u017eljivci'), (u'la\u017eovu', u'la\u017eljivcu'), (u'la\u017eovima', u'la\u017eljivcima'), (u'la\u017eovom', u'la\u017eljivcem'), (u'lebdeo', u'lebdio'), (u'le\u010di', u'lije\u010di'), (u'le\u010de', u'lije\u010de'), (u'lje\u010di', u'lije\u010di'), (u'Le\u010di', u'Lije\u010di'), (u'Lje\u010di', u'Lije\u010di'), (u'Lejn', u'Lane'), (u'Lenja', u'Lijena'), (u'lenji', u'lijeni'), (u'lenja', u'lijena'), (u'le\u0161nik', u'lje\u0161njak'), (u'Leta', u'Ljeta'), (u'leto', u'ljeto'), (u'Leto', u'Ljeto'), (u'letos', u'ljetos'), (u'letiti', u'letjeti'), (u'leve', u'lijeve'), (u'lo\u017ei', u'pali'), (u'lza', u'Iza'), (u'ljepiti', u'lijepiti'), (u'ljepili', u'lijepili'), (u'magnezijuma', u'magnezija'), (u'magnezijumu', u'magneziju'), (u'maja', u'svibnja'), (u'maju', u'svibnju'), (u'majem', u'svibnjem'), (u'majca', u'majica'), (u'majce', u'majice'), (u'majcu', u'majicu'), (u'majcom', u'majicom'), (u'Malopre', u'Malo prije'), (u'malopre', u'malo prije'), (u'maloprije', u'malo prije'), (u'manifestuje', u'manifestira'), (u'manifestuju', u'manifestiraju'), (u'marta', u'o\u017eujka'), (u'martu', u'o\u017eujku'), (u'martom', u'o\u017eujkom'), (u'mehur', u'mjehur'), (u'menom', u'mnom'), (u'mera\u010d', u'mjera\u010d'), (u'meri', u'mjeri'), (u'mere', u'mjere'), (u'merdevine', u'ljestve'), (u'merdevinama', u'ljestvama'), (u'merljivo', u'mjerljivo'), (u'me\u0161ane', u'mije\u0161ane'), (u'me\u0161avina', u'mje\u0161avina'), (u'me\u0161avine', u'mje\u0161avine'), (u'me\u0161avinu', u'mje\u0161avinu'), (u'minut', u'minutu'), (u'mleo', u'mljeo'), (u'mo\u010d', u'mo\u0107'), (u'mofu', u'mogu'), (u'momenat', u'trenutak'), (u'momenta', u'trena'), (u'muzejem', u'muzejom'), (u'muzici', u'glazbi'), (u'muzika', u'glazba'), (u'muzike', u'glazbe'), (u'muzikom', u'glazbom'), (u'Muzika', u'Glazba'), (u'Muzike', u'Glazbe'), (u'Muzikom', u'Glazbom'), (u'na\u010di', u'na\u0107i'), (u'nadevati', u'nadijevati'), (u'naduvan', u'napu\u0161en'), (u'najpre', u'najprije'), (u'Najpre', u'Najprije'), (u'najzad', u'napokon'), (u'nanev\u0161i', u'nanjev\u0161i'), (u'nanjeli', u'nanijeli'), (u'napastvuje', u'napastuje'), (u'Napolje', u'Van'), (u'napolje', u'van'), (u'Napolju', u'Vani'), (u'napolju', u'vani'), (u'nauka', u'znanost'), (u'Nauka', u'Znanost'), (u'nauci', u'znanosti'), (u'nazad', u'natrag'), (u'Nazad', u'Natrag'), (u'napred', u'naprijed'), (u'Napred', u'Naprijed'), (u'naprimjer', u'na primjer'), (u'naseo', u'nasjeo'), (u'nasesti', u'nasjesti'), (u'nasre\u0107u', u'na sre\u0107u'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebismo', u'ne bismo'), (u'Nebismo', u'Ne bismo'), (u'nebiste', u'ne biste'), (u'Nebiste', u'Ne biste'), (u'nedaj', u'ne daj'), (u'negde', u'negdje'), (u'Negde', u'Negdje'), (u'neguje', u'njeguje'), (u'neguju', u'njeguju'), (u'nekto', u'netko'), (u'nemi', u'nijemi'), (u'nemrem', u'ne mogu'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nene', u'njene'), (u'ne\u0161o', u'ne\u0161to'), (u'nevesta', u'nevjesta'), (u'nevreme', u'nevrijeme'), (u'nezi', u'njezi'), (u'niasm', u'nisam'), (u'nigde', u'nigdje'), (u'Nigde', u'Nigdje'), (u'nikakave', u'nikakve'), (u'niko', u'nitko'), (u'Niko', u'Nitko'), (u'nisma', u'nisam'), (u'Nisma', u'Nisam'), (u'ne\u0107\u0161', u'ne\u0107e\u0161'), (u'nejde', u'ne ide'), (u'Nejde', u'Ne ide'), (u'neda', u'ne da'), (u'nedam', u'ne dam'), (u'negujem', u'njegujem'), (u'njegi', u'njezi'), (u'ne\u017eeli', u'ne \u017eeli'), (u'niej', u'nije'), (u'nili', u'niti'), (u'njie', u'nije'), (u'njem', u'nijem'), (u'njeme', u'njene'), (u'nominovan', u'nominiran'), (u'nsiam', u'nisam'), (u'nteko', u'netko'), (u'obe', u'obje'), (u'Obe', u'Obje'), (u'obema', u'objema'), (u'Obezbe\u0111uju', u'Osiguravaju'), (u'obezbe\u0111uju', u'osiguravaju'), (u'objekat', u'objekt'), (u'oblast', u'podru\u010dje'), (u'oblastima', u'podru\u010djima'), (u'oblasti', u'podru\u010dj*'), (u'obolelu', u'oboljelu'), (u'obo\u017eavalac', u'obo\u017eavatelj'), (u'obu\u010di', u'obu\u0107i'), (u'obuhvata', u'obuhva\u0107a'), (u'odandje', u'odande'), (u'odavdje', u'odavde'), (u'Odavdje', u'Odavde'), (u'odbi\u0107e\u0161', u'odbit \u0107e\u0161'), (u'odbi\u0107emo', u'odbit \u0107emo'), (u'odela', u'odjela'), (u'odelu', u'odjelu'), (u'odelenja', u'odjela'), (u'odelenje', u'odjel'), (u'odelenju', u'odjelu'), (u'odeljak', u'odjeljak'), (u'odeljenje', u'odjel'), (u'Odeljenje', u'Odjel'), (u'odjeljenje', u'odjel'), (u'Odjeljenje', u'Odjel'), (u'odeljenjem', u'odjelom'), (u'odma', u'odmah'), (u'Odne\u0107u', u'Odnijet \u0107u'), (u'odne\u0107u', u'odnijet \u0107u'), (u'odne\u0107e', u'odnijet \u0107e'), (u'odoliti', u'odoljeti'), (u'odneti', u'odnijeti'), (u'odseo', u'odsjeo'), (u'odsela', u'odsjela'), (u'odsesti', u'odsjesti'), (u'odupreti', u'oduprijeti'), (u'oduvek', u'oduvijek'), (u'Oduvek', u'Oduvijek'), (u'oduvjek', u'oduvijek'), (u'Oduvjek', u'Oduvijek'), (u'ogladneo', u'ogladnio'), (u'okoreli', u'okorjeli'), (u'organizuju', u'organiziraju'), (u'Organizuju', u'Organiziraju'), (u'osje\u0107anja', u'osje\u0107aje'), (u'osmehe', u'osmijehe'), (u'osmehne', u'osmjehne'), (u'osmehnu', u'osmjehnu'), (u'osobenosti', u'osobnosti'), (u'ostareli', u'ostarjeli'), (u'ostrva', u'otoka'), (u'ostrvu', u'otoku'), (u'ostrvom', u'otokom'), (u'Ostrva', u'Otoka'), (u'Ostrvu', u'Otoku'), (u'Ostrvom', u'Otokom'), (u'ostrvima', u'otocima'), (u'osete', u'osjete'), (u'ostrvo', u'otok'), (u'Ostrvo', u'Otok'), (u'osvjetljen', u'osvijetljen'), (u'ovde', u'ovdje'), (u'Ovde', u'Ovdje'), (u'ovdej', u'ovdje'), (u'ovdije', u'ovdje'), (u'Ovdije', u'Ovdje'), (u'ovjde', u'ovdje'), (u'Ovjde', u'Ovdje'), (u'pakuje', u'pakira'), (u'Pakuje', u'Pakira'), (u'Pakuju', u'Pakiraju'), (u'pakuju', u'pakiraju'), (u'palatama', u'pala\u010dama'), (u'palate', u'pala\u010de'), (u'palatu', u'pala\u010du'), (u'palati', u'pala\u010di'), (u'pantalone', u'hla\u010de'), (u'Pantalone', u'Hla\u010de'), (u'pantalona', u'hla\u010da'), (u'pantalonama', u'hla\u010dama'), (u'par\u010de', u'komadi\u0107'), (u'par\u010deta', u'komadi\u0107a'), (u'par\u010detu', u'komadi\u0107u'), (u'par\u010detom', u'komadi\u0107em'), (u'parampar\u010dad', u'komadi\u0107i'), (u'pastuv', u'pastuh'), (u'pastuva', u'pastuha'), (u'pastuvu', u'pastuhu'), (u'pd', u'od'), (u'pemzija', u'penzija'), (u'pemziju', u'penziju'), (u'penzionerski', u'umirovljeni\u010dki'), (u'Penzionerski', u'Umirovljeni\u010dki'), (u'pertle', u'\u017enirance'), (u'pesama', u'pjesama'), (u'pesnicima', u'pjesnicima'), (u'pe\u0161ice', u'pje\u0161ice'), (u'Pe\u0161ice', u'Pje\u0161ice'), (u'pe\u0161ke', u'pje\u0161ke'), (u'plata', u'pla\u0107a'), (u'pla\u010da', u'pla\u0107a'), (u'platom', u'pla\u0107om'), (u'platu', u'pla\u0107u'), (u'pla\u010danje', u'pla\u0107anje'), (u'pla\u010danjem', u'pla\u0107anjem'), (u'pla\u0107e\u0161', u'pla\u010de\u0161'), (u'plen', u'plijen'), (u'Plen', u'Plijen'), (u'pljen', u'plijen'), (u'Pljen', u'Plijen'), (u'po\u010de\u0107u', u'po\u010det \u0107u'), (u'podjelimo', u'podijelimo'), (u'podnesti', u'podnijeti'), (u'podstreka\u010d', u'poticatelj'), (u'podsete', u'podsjete'), (u'poen', u'bod'), (u'poena', u'boda'), (u'poene', u'bodove'), (u'poeni', u'bodovi'), (u'Poeni', u'Bodovi'), (u'poenima', u'bodovima'), (u'poludili', u'poludjeli'), (u'poma\u0107i', u'pomaknuti'), (u'pomaknim', u'pomaknem'), (u'pomaknio', u'pomaknuo'), (u'pomakni\u0161', u'pomakne\u0161'), (u'pomakniti', u'pomaknuti'), (u'pomenu', u'spomenu'), (u'Pomera', u'Mi\u010de'), (u'pomera', u'mi\u010de'), (u'pomjera', u'pomi\u010de'), (u'pomerajte', u'mi\u010dite'), (u'pomjeri', u'pomakni'), (u'pomeraj', u'mi\u010di'), (u'pomjeraj', u'mi\u010di'), (u'pomeraju', u'mi\u010du'), (u'pomerala', u'micala'), (u'pomjerala', u'pomicala'), (u'pomjeraju', u'pomi\u010du'), (u'pomeranja', u'pomicanja'), (u'pomerati', u'micati'), (u'pomjerati', u'pomicati'), (u'pomeri\u0161', u'pomakne\u0161'), (u'ponaosob', u'osobno'), (u'ponesla', u'ponijela'), (u'Ponesla', u'Ponijela'), (u'pore\u0111enje', u'usporedba'), (u'pore\u0111enju', u'usporedbi'), (u'porekla', u'podrijetla'), (u'poreklo', u'podrijetlo'), (u'poreklu', u'podrijetlu'), (u'Porodica', u'Obitelj'), (u'Porodice', u'Obitelji'), (u'porodica', u'obitelj'), (u'porodice', u'obitelji'), (u'porodici', u'obitelji'), (u'porodicama', u'obiteljima'), (u'porodicom', u'obitelji'), (u'porodicu', u'obitelj'), (u'poslata', u'poslana'), (u'posle', u'poslije'), (u'Posle', u'Poslije'), (u'poslje', u'poslije'), (u'posredi', u'posrijedi'), (u'postara', u'pobrine'), (u'Postara\u0107u', u'Pobrinut \u0107u'), (u'postara\u0107u', u'pobrinut \u0107u'), (u'postaraj', u'pobrini'), (u'Postaraj', u'Pobrini'), (u'Postaraju', u'Pobrinu'), (u'postaraju', u'pobrinu'), (u'postarajmo', u'pobrinimo'), (u'postaramo', u'pobrinemo'), (u'postara\u0161', u'pobrine\u0161'), (u'povesne', u'povijesne'), (u'Povinuju', u'Pokoravaju'), (u'povinuju', u'pokoravaju'), (u'pozadi', u'iza'), (u'po\u017eeleo', u'po\u017eelio'), (u'Po\u017eeleo', u'Po\u017eelio'), (u'Po\u017eeljeo', u'Po\u017eelio'), (u'po\u017eeljeo', u'po\u017eelio'), (u'praktikuj', u'prakticiraj'), (u'praktikuju', u'prakticiraju'), (u'praktikovala', u'prakticirala'), (u'praktikovati', u'prakticirati'), (u'pre', u'prije'), (u'Pre', u'Prije'), (u'predela', u'predjela'), (u'predelu', u'predjelu'), (u'Pre\u0107i', u'Prije\u0107i'), (u'pre\u0107i', u'prije\u0107i'), (u'pre\u0107utkuje', u'pre\u0161u\u0107uje'), (u'predame', u'preda me'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'preformuli\u0161i', u'preformuliraj'), (u'preklo', u'porijeklo'), (u'preloma', u'prijeloma'), (u'Prene\u0107u', u'Prenijet \u0107u'), (u'prene\u0107u', u'prenijet \u0107u'), (u'prenos', u'prijenos'), (u'prenosa', u'prijenosa'), (u'prenosom', u'prijenosom'), (u'prenosu', u'prijenosu'), (u'preneo', u'prenio'), (u'Preneo', u'Prenio'), (u'prenela', u'prenijela'), (u'prenjela', u'prenijela'), (u'preneli', u'prenijeli'), (u'prenjeli', u'prenijeli'), (u'preneti', u'prenijeti'), (u'preporu\u010da', u'preporu\u010duje'), (u'prese\u0107i', u'presje\u0107i'), (u'preti', u'prijeti'), (u'prete', u'prijete'), (u'Prete', u'Prijete'), (u'prjeti', u'prijeti'), (u'prjete', u'prijete'), (u'prete\u0107im', u'prijete\u0107im'), (u'prete\u0107ih', u'prijete\u0107ih'), (u'pretrpeo', u'pretrpio'), (u'prevod', u'prijevod'), (u'Prevod', u'Prijevod'), (u'prezentovati', u'prezentirati'), (u'prezentovane', u'prezentirane'), (u'prezentovan', u'prezentiran'), (u'prezentovani', u'prezentirani'), (u'prezentovano', u'prezentirano'), (u'pridonjeti', u'pridonijeti'), (u'prijatan', u'ugodan'), (u'prime\u0107ivao', u'primje\u0107ivao'), (u'primedbi', u'primjedbi'), (u'primjete', u'primijete'), (u'prisetim', u'prisjetim'), (u'prisetio', u'prisjetio'), (u'prisetite', u'prisjetite'), (u'pritiskam', u'priti\u0161\u0107em'), (u'prmda', u'iako'), (u'procenat', u'postotak'), (u'procent', u'postotak'), (u'procenta', u'postotka'), (u'procenata', u'postotaka'), (u'procenti', u'postoci'), (u'Procenti', u'Postoci'), (u'procente', u'postotke'), (u'Procente', u'Postotke'), (u'procentu', u'postotku'), (u'Procentu', u'Postotku'), (u'procentima', u'postocima'), (u'prodato', u'prodano'), (u'prohte', u'prohtije'), (u'projekat', u'projekt'), (u'Projekat', u'Projekt'), (u'promijena', u'promjena'), (u'prosledili', u'proslijedili'), (u'protestvovat', u'protestirat'), (u'Protestvovat', u'Protestirat'), (u'Protestvujem', u'Protestiram'), (u'protestvujem', u'protestiram'), (u'protestvuju', u'protestiraju'), (u'protestuju\u0107i', u'protestiraju\u0107i'), (u'psihi\u0107ki', u'psihi\u010dki'), (u'pto', u'\u0161to'), (u'ptom', u'potom'), (u'punoletan', u'punoljetan'), (u'Punoletan', u'Punoljetan'), (u'ra\u010dunari', u'ra\u010dunala'), (u'ra\u010dunare', u'ra\u010dunala'), (u'radijo', u'radio'), (u'ra\u0111e', u'radije'), (u'ranac', u'ruksak'), (u'rancu', u'ruksaku'), (u'rascep', u'rascjep'), (u'rasejan', u'rastresen'), (u'rasejana', u'rastresena'), (u'raspust', u'odmor'), (u'razbi\u0107u', u'razbit \u0107u'), (u'razbijesneo', u'razbjesnio'), (u'ra\u0161\u0107e', u'rast \u0107e'), (u'Razbi\u0107u', u'Razbit \u0107u'), (u'razdevi\u010de', u'razdjevi\u010de'), (u'razgovrati', u'razgovarati'), (u'razre\u0161i', u'razrije\u0161i'), (u'razume', u'razumije'), (u'razumeju', u'razumiju'), (u're\u010dju', u'rije\u010dju'), (u'Re\u010dju', u'Rije\u010dju'), (u'rje\u010dju', u'rije\u010dju'), (u'Rje\u010dju', u'Rije\u010dju'), (u'reagujte', u'reagirajte'), (u'redov', u'vojnik'), (u'redovu', u'vojniku'), (u're\u0111e', u'rje\u0111e'), (u're\u0111i', u'rje\u0111i'), (u'rejv', u'rave'), (u'rejvu', u'raveu'), (u'reko', u'rekao'), (u'rengen', u'rendgen'), (u'repuje\u0161', u'repa\u0161'), (u'resetuje', u'resetira'), (u'resetujte', u'resetirajte'), (u'Resetujte', u'Resetirajte'), (u'rije\u0111i', u'rje\u0111i'), (u'Rizikuj', u'Riskiraj'), (u'rizikuju', u'riskiraju'), (u'rizikuje', u'riskira'), (u'rizikujte', u'riskirajte'), (u'rje\u0161io', u'rije\u0161io'), (u'rokenrol', u"rock'n'roll"), (u'ronioc', u'ronilac'), (u'savije\u0161\u0107u', u'savje\u0161\u0107u'), (u'save\u0161\u0107u', u'savje\u0161\u0107u'), (u'secka', u'sjecka'), (u'seckam', u'sjeckam'), (u'sede\u0107e\u0161', u'sjedit \u0107e\u0161'), (u'sedeli', u'sjedili'), (u'sedi\u0161ta', u'sjedala'), (u'sedi\u0161te', u'sjedalo'), (u'sedi\u0161tu', u'sjedalu'), (u'sedni', u'sjedni'), (u'Sedni', u'Sjedni'), (u'sedi', u'sjedi'), (u'Sedi', u'Sjedi'), (u'sedite', u'sjedite'), (u'sesti', u'sjesti'), (u'sekire', u'sjekire'), (u'sekiraj', u'brini'), (u'sekiram', u'brinem'), (u'sekiramo', u'brinemo'), (u'sekira\u0161', u'brine\u0161'), (u'sekirate', u'brinete'), (u'sekirajte', u'brinite'), (u'seme', u'sjeme'), (u'sertan', u'sretan'), (u'Se\u0161\u0107u', u'Sjest \u0107u'), (u'se\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107emo', u'sjest \u0107emo'), (u'seta', u'sjeta'), (u'sigruno', u'sigurno'), (u'siguan', u'siguran'), (u'sija', u'sja'), (u'sijaju', u'sjaju'), (u'sir\u0107e', u'ocat'), (u'sir\u0107eta', u'octa'), (u'sir\u0107etu', u'octu'), (u'sje\u0161\u0107u', u'sjest \u0107u'), (u'sje\u0161\u0107e', u'sjest \u0107e'), (u'sle\u0107e', u'slije\u0107e'), (u'sle\u0107u', u'slije\u0107u'), (u'sle\u0107emo', u'slije\u0107emo'), (u'sleva', u'slijeva'), (u'se\u0107anjima', u'sje\u0107anjima'), (u'seo', u'sjeo'), (u'Seo', u'Sjeo'), (u'sem', u'osim'), (u'sma', u'sam'), (u'smao', u'samo'), (u'Smao', u'Samo'), (u'sme', u'smije'), (u'Sme', u'Smije'), (u'sme\u0107pm', u'sme\u0107em'), (u'smej', u'smij'), (u'Smejte', u'Smijte'), (u'smejte', u'smijte'), (u'smesta', u'smjesta'), (u'Smesta', u'Smjesta'), (u'smeste', u'smjeste'), (u'sme\u0161ak', u'smje\u0161ak'), (u'sme\u0161i', u'smije\u0161i'), (u'Sme\u0161i', u'Smije\u0161i'), (u'sme\u0161io', u'smije\u0161io'), (u'sme\u0161i\u0161', u'smije\u0161i\u0161'), (u'sme\u0161kom', u'smje\u0161kom'), (u'smjeo', u'smio'), (u'smrdeo', u'smrdio'), (u'sintersajzer', u'synthesizer'), (u'sitnisajzer', u'synthesizer'), (u'skelet', u'kostur'), (u'so\u010diva', u'le\u0107e'), (u'so\u010divima', u'le\u0107ama'), (u'so\u010divo', u'le\u0107a'), (u'so\u010divom', u'le\u0107om'), (u'so\u010divu', u'le\u0107i'), (u'Spakuj', u'Spakiraj'), (u'Spakujte', u'Spakirajte'), (u'spakujte', u'spakirajte'), (u'spasao', u'spasio'), (u'Spasao', u'Spasio'), (u'spasen', u'spa\u0161en'), (u'spasla', u'spasila'), (u'spasli', u'spasili'), (u'speluje', u'sri\u010de'), (u'speluju', u'sri\u010du'), (u'spoji\u0107e', u'spojit \u0107e'), (u'spolja', u'izvana'), (u'Sredi\u0107e', u'Sredit \u0107e'), (u'Sredi\u0107u', u'Sredit \u0107u'), (u'stabilizuju', u'stabiliziraju'), (u'starao', u'brinuo'), (u'starati', u'brinuti'), (u'Starati', u'Brinuti'), (u'steni', u'stijeni'), (u'stepen', u'stupanj'), (u'stepena', u'stupnjeva'), (u'stepeni', u'stupnjeva'), (u'stepenu', u'stupnju'), (u'sticati', u'stjecati'), (u'stiditi', u'stidjeti'), (u'streljamo', u'strijeljamo'), (u'streljati', u'strijeljati'), (u'stole\u0107a', u'stolje\u0107a'), (u'stobom', u's tobom'), (u'stvrano', u'stvarno'), (u'Stupi\u0107u', u'Stupit \u0107u'), (u'stupi\u0107u', u'stupit \u0107u'), (u'subjekat', u'subjekt'), (u'sudija', u'sudac'), (u'Sudija', u'Sudac'), (u'sudije', u'suca'), (u'sudiji', u'sucu'), (u'sudijo', u'su\u010de'), (u'sudiju', u'suca'), (u'sudijom', u'sucem'), (u'sudijskog', u'sudskog'), (u'sugeri\u0161u', u'predla\u017eu'), (u'sugeri\u0161e', u'predla\u017ee'), (u'supa', u'juha'), (u'supe', u'juhe'), (u'supi', u'juhi'), (u'supu', u'juhu'), (u'supom', u'juhom'), (u'supama', u'juhama'), (u'Supa', u'Juha'), (u'Supe', u'Juhe'), (u'Supi', u'Juhi'), (u'Supu', u'Juhu'), (u'Supom', u'Juhom'), (u'Supama', u'Juhama'), (u'surfuje', u'surfa'), (u'surfuje\u0161', u'surfa\u0161'), (u'surfuju', u'surfaju'), (u'su\u0161tina', u'bit'), (u'su\u0161tinski', u'bitni'), (u'suvom', u'suhom'), (u'suvog', u'suhog'), (u'suvoj', u'suhoj'), (u'Suvom', u'Suhom'), (u'Suvog', u'Suhog'), (u'Suvoj', u'Suhoj'), (u'suvim', u'suhim'), (u'Suvim', u'Suhim'), (u'svestan', u'svjestan'), (u'svjest', u'svijest'), (u'Svjest', u'Svijest'), (u'svjesti', u'svijesti'), (u'Svjesti', u'Svijesti'), (u'svetova', u'svjetova'), (u'svetove', u'svjetove'), (u'svugde', u'svugdje'), (u'\u0161olja', u'\u0161alica'), (u'\u0161olju', u'\u0161alicu'), (u'\u0160ta', u'\u0160to'), (u'\u0161tagod', u'\u0161to god'), (u'\u0161ta', u'\u0161to'), (u'\u0161tp', u'\u0161to'), (u'\u0161tampa', u'tisak'), (u'\u0161tampu', u'tisak'), (u'\u0161tampom', u'tiskom'), (u'\u0161tampi', u'tisku'), (u'\u0161tampati', u'tiskati'), (u'\u0160utje\u0107e', u'\u0160utjet \u0107e'), (u'tablu', u'plo\u010du'), (u'taguje', u'tagira'), (u'tako\u0111e', u'tako\u0111er'), (u'Tako\u0111e', u'Tako\u0111er'), (u'talas', u'val'), (u'Talas', u'Val'), (u'talasa', u'valova'), (u'talase', u'valove'), (u'talasi', u'valovi'), (u'Talasi', u'Valovi'), (u'talasima', u'valovima'), (u'Talasima', u'Valovima'), (u'te\u010dnost', u'teku\u0107ina'), (u'te\u010dnosti', u'teku\u0107ine'), (u'te\u010dno\u0161\u0107u', u'teku\u0107inom'), (u'tek\u0161o', u'te\u0161ko'), (u'Tek\u0161o', u'Te\u0161ko'), (u'terajte', u'tjerajte'), (u'te\u0161io', u'tje\u0161io'), (u'te\u0161i\u0161', u'tje\u0161i\u0161'), (u'tki', u'tko'), (u'to\u010dak', u'kota\u010d'), (u'To\u010dak', u'Kota\u010d'), (u'toha', u'toga'), (u'tovj', u'tvoj'), (u'trabam', u'trebam'), (u'trkanje', u'utrkivanje'), (u'trkanja', u'utrkivanja'), (u'trkao', u'utrkivao'), (u'trougao', u'trokut'), (u'trougla', u'trokuta'), (u'trouglu', u'trokutu'), (u'trouglove', u'trokute'), (u'trpeo', u'trpio'), (u'Trpeo', u'Trpio'), (u'tugi', u'tuzi'), (u'tvrtci', u'tvrtki'), (u'ubede', u'uvjere'), (u'Ube\u0111ivao', u'Uvjeravao'), (u'ube\u0111ivati', u'uvjeravati'), (u'ubje\u0111ivati', u'uvjeravati'), (u'ube\u0111uje', u'uvjerava'), (u'ube\u0111uje\u0161', u'uvjerava\u0161'), (u'ube\u0111uju', u'uvjeravaju'), (u'ubjediti', u'uvjeriti'), (u'u\u010dtivo', u'uljudno'), (u'u\u010dtivost', u'uljudnost'), (u'u\u010dtivo\u0161\u0107u', u'uljudno\u0161\u0107u'), (u'udata', u'udana'), (u'Udata', u'Udana'), (u'udatoj', u'udanoj'), (u'udeo', u'udio'), (u'ugljenik', u'ugljik'), (u'uliva', u'ulijeva'), (u'ulivali', u'ulijevali'), (u'ulivate', u'ulijevate'), (u'uljeva', u'ulijeva'), (u'ujutru', u'ujutro'), (u'Ukoliko', u'Ako'), (u'ukoliko', u'ako'), (u'ume', u'zna'), (u'umem', u'umijem'), (u'ume\u0161', u'umije\u0161'), (u'umesto', u'umjesto'), (u'Umesto', u'umjesto'), (u'umete', u'znate'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'umetninama', u'umjetninama'), (u'umreti', u'umrijeti'), (u'Umret', u'Umrijet'), (u'umrije\u0107e\u0161', u'umrijet \u0107e\u0161'), (u'umrije\u0107ete', u'umrijet \u0107ete'), (u'Une\u0107u', u'Unijet \u0107u'), (u'univerzitet', u'sveu\u010dili\u0161te'), (u'univerzitetu', u'sveu\u010dili\u0161tu'), (u'Uop\u0161te', u'Uop\u0107e'), (u'uop\u0161te', u'uop\u0107e'), (u'uop\u010de', u'uop\u0107e'), (u'upustva', u'uputstva'), (u'uprkos', u'usprkos'), (u'Uprkos', u'Usprkos'), (u'uradio', u'u\u010dinio'), (u'Uredu', u'U redu'), (u'uspe', u'uspije'), (u'Uspe', u'Uspije'), (u'uspeo', u'uspio'), (u'Uspeo', u'Uspio'), (u'uspe\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspje\u0107e\u0161', u'uspjet \u0107e\u0161'), (u'uspe\u0107emo', u'uspjet \u0107emo'), (u'uspe\u0161', u'uspije\u0161'), (u'uspeju', u'uspiju'), (u'uspjevala', u'uspijevala'), (u'uspijo', u'uspio'), (u'u sred', u'usred'), (u'usled', u'uslijed'), (u'Usled', u'Uslijed'), (u'usledila', u'uslijedila'), (u'usljed', u'uslijed'), (u'Usljed', u'Uslijed'), (u'u\u0161unjate', u'u\u0161uljate'), (u'utehe', u'utjehe'), (u'uve\u010de', u'nave\u010der'), (u'uvek', u'uvijek'), (u'Uvek', u'Uvijek'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'uvijet', u'uvjet'), (u'uvijeti', u'uvjeti'), (u'uvijetima', u'uvjetima'), (u'uva', u'uha'), (u'Uva', u'Uha'), (u'uvo', u'uho'), (u'Uvo', u'Uho'), (u'uvom', u'uhom'), (u'Uvom', u'Uhom'), (u'uvu', u'uhu'), (u'Uvu', u'Uhu'), (u'vaistinu', u'uistinu'), (u'Vaistinu', u'Uistinu'), (u'vajar', u'kipar'), (u'vakcini\u0161e', u'cijepi'), (u'varnica', u'iskra'), (u'varnicu', u'iskru'), (u'vaspitala', u'odgojila'), (u'vaspitavan', u'odgajan'), (u'vaspitavanju', u'odgoju'), (u'va\u0161ljivi', u'u\u0161ljivi'), (u'va\u017ei', u'vrijedi'), (u've\u010dan', u'vje\u010dan'), (u've\u0107ati', u'vije\u0107ati'), (u'vek', u'stolje\u0107e'), (u'veka', u'stolje\u0107a'), (u'veke', u'vijeke'), (u'vekova', u'stolje\u0107a'), (u'venca', u'vijenca'), (u've\u010dnost', u'vje\u010dnost'), (u'veoma', u'vrlo'), (u'Veoma', u'Vrlo'), (u'vera', u'vjera'), (u'vere', u'vjere'), (u'veri', u'vjeri'), (u'verom', u'vjerom'), (u'veru', u'vjeru'), (u'veran', u'vjeran'), (u'verama', u'vjerama'), (u'Vera', u'Vjera'), (u'Vere', u'Vjere'), (u'Veri', u'Vjeri'), (u'Verom', u'Vjerom'), (u'Veru', u'Vjeru'), (u'Veran', u'Vjeran'), (u'Verama', u'Vjerama'), (u'veren', u'zaru\u010den'), (u'Veren', u'Zaru\u010den'), (u'verena', u'zaru\u010dena'), (u'vereni', u'zaru\u010deni'), (u'verimo', u'zaru\u010dimo'), (u'vest', u'vijest'), (u'Vest', u'Vijest'), (u'vesti', u'vijesti'), (u'Vesti', u'Vijesti'), (u'Vjesti', u'Vijesti'), (u'vjesti', u'vijesti'), (u'vestima', u'vijestima'), (u'Vestima', u'Vijestima'), (u'vjestima', u'vijestima'), (u'Vjestima', u'Vijestima'), (u've\u0161ala', u'vje\u0161ala'), (u've\u0161\u0107u', u'vije\u0161\u0107u'), (u've\u0161u', u'rublju'), (u'vide\u0161e', u'vidje\u0161e'), (u'vidjeo', u'vidio'), (u'Vidjeo', u'Vidio'), (u'vjerojatno\u0107a', u'vjerojatnost'), (u'vje\u0161\u0107u', u'vije\u0161\u0107u'), (u'vlo', u'vrlo'), (u'Vodi\u0107e', u'Vodit \u0107e'), (u'Vodi\u0107u', u'Vodit \u0107u'), (u'voliti', u'voljeti'), (u'vredelo', u'vrijedilo'), (u'vrednom', u'vrijednom'), (u'vrednog', u'vrijednog'), (u'vreme', u'vrijeme'), (u'Vreme', u'Vrijeme'), (u'vrjeme', u'vrijeme'), (u'Vrjeme', u'Vrijeme'), (u'vrteo', u'vrtio'), (u'vrvela', u'vrvjela'), (u'whiskey', u'viski'), (u'zaceljivanje', u'zacjeljivanje'), (u'zagreva', u'zagrijava'), (u'Zagreva', u'Zagrijava'), (u'Zagrevate', u'Zagrijavate'), (u'zagrevanje', u'zagrijavanje'), (u'zakunio', u'zakleo'), (u'zalepili', u'zalijepili'), (u'zalepiti', u'zalijepiti'), (u'zaliv', u'zaljev'), (u'zalivu', u'zaljevu'), (u'zanm', u'znam'), (u'zanma', u'zanima'), (u'zaplena', u'zapljena'), (u'zapleni', u'zaplijeni'), (u'zaplenu', u'zapljenu'), (u'zaspem', u'zaspim'), (u'zastareo', u'zastario'), (u'zauvek', u'zauvijek'), (u'Zauvek', u'Zauvijek'), (u'zauvjek', u'zauvijek'), (u'Zauvjek', u'Zauvijek'), (u'zavera', u'zavjera'), (u'zahtev', u'zahtjev'), (u'Zahtev', u'Zahtjev'), (u'zasede', u'zasjede'), (u'zasedi', u'zasjedi'), (u'zasedu', u'zasjedu'), (u'zatp', u'zato'), (u'Zatp', u'Zato'), (u'za\u017eeleo', u'za\u017eelio'), (u'Za\u017eeleo', u'Za\u017eelio'), (u'Za\u017eeljeo', u'Za\u017eelio'), (u'za\u017eeljeo', u'za\u017eelio'), (u'zbg', u'zbog'), (u'zdrvo', u'zdravo'), (u'Zdrvo', u'Zdravo'), (u'zlodela', u'zlodjela'), (u'zna\u0107i', u'zna\u010di'), (u'zvani\u010dan', u'slu\u017eben'), (u'zvezdom', u'zvijezdom'), (u'\u017eemo', u'\u0107emo'), (u'\u017eeleo', u'\u017eelio'), (u'\u017deleo', u'\u017delio'), (u'\u017deljeo', u'\u017delio'), (u'\u017eeljeo', u'\u017eelio'), (u'\u017diveo', u'\u017divio'), (u'\u017eiveo', u'\u017eivio'), (u'\u017emureo', u'\u017emirio'), (u'Abi', u'Abby'), (u'Alis', u'Alice'), (u'Ajk', u'Ike'), (u'Ajku', u'Ikeu'), (u'Ajrin', u'Irene'), (u'Ajris', u'Iris'), (u'Ajron', u'Iron'), (u'Ajvi', u'Ivy'), (u'An\u0111eles', u'Angeles'), (u'An\u0111elesa', u'Angelesa'), (u'An\u0111elesu', u'Angelesu'), (u'An\u0111elesom', u'Angelesom'), (u'Antoni', u'Anthony'), (u'Antoniju', u'Anthonyju'), (u'Ar\u010di', u'Archie'), (u'Beverli', u'Beverly'), (u'Bejker', u'Baker'), (u'Bitls', u'Beatles'), (u'Bitlsi', u'Beatlesi'), (u'Brid\u017eit', u'Bridget'), (u'Bri\u017eit', u'Brigitte'), (u'Bruks', u'Brooks'), (u'Dablin', u'Dublin'), (u'Dablina', u'Dublina'), (u'Dablinu', u'Dublinu'), (u'Dag', u'Doug'), (u'Darvin', u'Darwin'), (u'Darvina', u'Darwina'), (u'Darvinu', u'Darwinu'), (u'Darvinom', u'Darwinom'), (u'Dejv', u'Dave'), (u'Dejvi', u'Davie'), (u'Dejva', u'Davea'), (u'Dejvu', u'Daveu'), (u'Dejvom', u'Daveom'), (u'Den', u'Dan'), (u'Deril', u'Daryl'), (u'Dijaz', u'Diaz'), (u'Dru', u'Drew'), (u'\u0110eni', u'Jenny'), (u'\u0110o\u0161ua', u'Joshua'), (u'D\u017eejmi', u'Jamie'), (u'D\u017ead', u'Jude'), (u'D\u017eeri', u'Jerry'), (u'D\u017eerija', u'Jerryja'), (u'D\u017eo', u'Joe'), (u'D\u017eoel', u'Joel'), (u'D\u017eoelu', u'Joelu'), (u'D\u017eo\u0161', u'Josh'), (u'D\u017eo\u0161u', u'Joshu'), (u'D\u017eosi', u'Josie'), (u'D\u017eozi', u'Josie'), (u'D\u017ees', u'Jess'), (u'D\u017een', u'Jen'), (u'D\u017eej', u'Jay'), (u'D\u017eejn', u'Jane'), (u'D\u017eil', u'Jill'), (u'D\u017eodi', u'Jody'), (u'D\u017eud', u'Jude'), (u'D\u017euli', u'Julie'), (u'Ebi', u'Abby'), (u'Ejb', u'Abe'), (u'Ejba', u'Abea'), (u'Ejmi', u'Amy'), (u'Ejpril', u'April'), (u'Empajer', u'Empire'), (u'En\u0111el', u'Angel'), (u'End\u017ei', u'Angie'), (u'Entoni', u'Anthony'), (u'E\u0161ford', u'Ashford'), (u'E\u0161forda', u'Ashforda'), (u'E\u0161li', u'Ashley'), (u'Fibi', u'Phoebe'), (u'Filovo', u'Philovo'), (u'Flober', u'Flaubert'), (u'Fokner', u'Faulkner'), (u'Fren', u'Fran'), (u'Gre\u010den', u'Gretchen'), (u'Grejs', u'Grace'), (u'Hadson', u'Hudson'), (u'Hadsonu', u'Hudsonu'), (u'Hant', u'Hunt'), (u'Hemingvej', u'Hemingway'), (u'Henk', u'Hank'), (u'Hejstings', u'Hastings'), (u'Hju', u'Hugh'), (u'Hjua', u'Hugha'), (u'Hjuz', u'Hughes'), (u'Hjuza', u'Hughesa'), (u'Hjuston', u'Houston'), (u'Hjustonu', u'Houstonu'), (u'Igo', u'Hugo'), (u'Ilejn', u'Elaine'), (u'\u017didovin', u'\u017didov'), (u'Johni', u'Johnny'), (u'Jud\u017ein', u'Eugene'), (u'Kasl', u'Castle'), (u'Kejd\u017e', u'Cage'), (u'Kejn', u'Kane'), (u'Kejsi', u'Casey'), (u'Kejti', u'Katie'), (u'Keren', u'Karen'), (u'Kerol', u'Carol'), (u'Kerolajn', u'Caroline'), (u'Klajv', u'Clive'), (u'Klajva', u'Clivea'), (u'Klajve', u'Clive'), (u'Klajvu', u'Cliveu'), (u'Klarens', u'Clarence'), (u'Kler', u'Claire'), (u'Kloi', u'Chloe'), (u'Klod', u'Claude'), (u'Klode', u'Claude'), (u'Kol', u'Cole'), (u'Kolins', u'Collins'), (u'Kortni', u'Courtney'), (u'Krej?g', u'Craig'), (u'Kristi', u'Christie'), (u'Lajf', u'Life'), (u'Lajl', u'Lile'), (u'Lejk', u'Lake'), (u'Lorejn', u'Loraine'), (u'Lorens', u'Lawrence'), (u'Lusi', u'Lucy'), (u'Majk', u'Mike'), (u'Majkeve', u'Mikeove'), (u'Majlo', u'Milo'), (u'Maslou', u'Maslow'), (u'Medlin', u'Madelaine'), (u'Medelin', u'Madeline'), (u'Mejbel', u'Mabel'), (u'Mejn', u'Maine'), (u'Mejna', u'Mainea'), (u'Mejnu', u'Maineu'), (u'Mejnom', u'Maineom'), (u'Mejpls', u'Maples'), (u'Mejsi', u'Maisy'), (u'Mek', u'Mac'), (u'Merilend', u'Maryland'), (u'Mi\u010del', u'Mitchell'), (u'Nensi', u'Nancy'), (u'Ni\u010de', u'Nietzsche'), (u'Ni\u010dea', u'Nietzschea'), (u'Ni\u010deu', u'Nietzscheu'), (u'Ni\u010deom', u'Nietzscheom'), (u'Odri', u'Audrey'), (u'Ohajo', u'Ohio'), (u'Ohaja', u'Ohia'), (u'Ohaju', u'Ohiu'), (u'Olbrajt', u'Albright'), (u"O'Nil", u"O'Neal"), (u'Orlins', u'Orleans'), (u'Orlinsa', u'Orleansa'), (u'Orlinsu', u'Orleansu'), (u'Pem', u'Pam'), (u'Pejd\u017e', u'Paige'), (u'Red\u017ei', u'Reggie'), (u'Red\u017einald', u'Reginald'), (u'Rej', u'Ray'), (u'Rej\u010del', u'Rachel'), (u'Ri\u010d', u'Rich'), (u'Rouz', u'Rose'), (u'Sendi', u'Sandy'), (u'Sidnej', u'Sidney'), (u'Sindi', u'Cindy'), (u'Sojer', u'Sawyer'), (u'Sojeru', u'Sawyeru'), (u'Sole', u'Saule'), (u'Stejsi', u'Stacy'), (u'Stoun', u'Stone'), (u'\u0160eron', u'Sharon'), (u'\u0160eril', u'Cheryl'), (u'\u0160irli', u'Shirley'), (u'\u0160paniji', u'\u0160panjolskoj'), (u'Tajms', u'Times'), (u'Tejlor', u'Taylor'), (u'Vajlder', u'Wilder'), (u'Val\u0161', u'Walsh'), (u'Vins', u'Vince'), (u'Voren', u'Warren'), (u'Vud', u'Wood'), (u'\u017dak', u'Jacques'), (u'\u017dil', u'Jules'), (u'januar', u'sije\u010danj'), (u'Januar', u'Sije\u010danj'), (u'februar', u'velja\u010da'), (u'februara', u'velja\u010de'), (u'februaru', u'velja\u010di'), (u'Februar', u'Velja\u010da'), (u'Februara', u'Velja\u010de'), (u'Februaru', u'Velja\u010di'), (u'mart', u'o\u017eujak'), (u'Mart', u'O\u017eujak'), (u'april', u'travanj'), (u'April', u'Travanj'), (u'maj', u'svibanj'), (u'Maj', u'Svibanj'), (u'svibnjom', u'svibnjem'), (u'jun', u'lipanj'), (u'juna', u'lipnja'), (u'junu', u'lipnju'), (u'Jun', u'Lipanj'), (u'Juni', u'Lipanj'), (u'juli', u'srpanj'), (u'jula', u'srpnja'), (u'julu', u'srpnju'), (u'Juli', u'Srpanj'), (u'septembar', u'rujan'), (u'Septembar', u'Rujan'), (u'oktobar', u'listopad'), (u'Oktobar', u'Listopad'), (u'oktobra', u'listopada'), (u'oktobru', u'listopadu'), (u'novembar', u'studeni'), (u'november', u'studeni'), (u'novembra', u'studenog'), (u'novembru', u'studenom'), (u'Novembar', u'Studeni'), (u'November', u'Studeni'), (u'Novembra', u'Studenog'), (u'Novembru', u'Studenom'), (u'decembar', u'prosinac'), (u'Decembar', u'Prosinac')]),
+                        'pattern': u"(?um)(\\b|^)(?:advokati|Advokati|advokatima|Advokatima|afirmi\\\u0161e|akcenat|akcionara|akvarijum|akvarijumu|amin|Amin|ans|apsorbovanje|apsorbuje|azot|ba\\\u0161ta|Ba\\\u0161ta|ba\\\u0161te|Ba\\\u0161te|ba\\\u0161ti|ba\\\u0161tu|Ba\\\u0161tu|ba\\\u0161tom|bedan|bede|bedi|bejah|bejahu|bele\\\u0161ci|be\\\u0161ike|bebisiterka|beg|begu|begstva|beja\\\u0161e|bekstvo|bekstvu|begstvu|bes|besa|besan|besom|besu|be\\\u0161e|bimso|blije\\\u0111i|bioje|bi\\ smo|bi\\ ste|bioskop|bioskopi|bitci|bled|blede|boksuje\\\u0161|bolesan|bolila|bori\\\u0107e\\\u0161|Bori\\\u0107e\\\u0161|braon|bregu|bti|cedilu|ceo|Ceo|cepa|cev|cevi|cjevi|cevima|Cevi|Cjevi|Cevima|Cjevima|cev\\\u010dica|cev\\\u010dicu|cutanje|\\\u010dutanje|\\\u0107utanje|Cutanje|\\\u010cutanje|\\\u0106utanje|cutanjem|\\\u010dutanjem|\\\u0107utanjem|Cutanjem|\\\u010cutanjem|\\\u0106utanjem|cvetaju|cvetove|cvetu|cvjetu|cvetalo|cvjetom|\\\u010cakom|\\\u010dar\\\u0161av|\\\u010dar\\\u0161ave|\\\u010dar\\\u0161avi|\\\u010dar\\\u0161avima|\\\u010das|\\\u010detvoro|\\\u010cita\\\u0107u|\\\u010derku|\\\u010cerku|\\\u0107erku|\\\u0106erku|\\\u0107erkama|\\\u010derkama|\\\u0107erkom|\\\u010derkom|k\\\u0107erkom|k\\\u010derkom|\\\u010cu|\\\u010ce\\\u0161|\\\u010ce|\\\u010cemo|\\\u010cete|\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u010demo|\\\u010dete|\\\u0107ebe|\\\u0107ebetu|\\\u010dk|\\\u0107\\\u0161|\\\u0107ale|\\\u0107aletom|\\\u0107aleta|\\\u0107aletu|\\\u0107orsokak|\\\u0107orsokaku|\\\u0107o\\\u0161ak|\\\u0107o\\\u0161ku|\\\u0107erka|\\\u0106erka|\\\u0107mo|\\\u0107te|\\\u010du\\\u0107e|\\\u010du\\\u0107emo|\\\u010cu\\\u0107emo|\\\u010cu\\\u0107ete|\\\u010cu\\\u0107e|\\\u0107uo|\\\u0107utao|\\\u0106utao|\\\u0107ute|\\\u0106ute|cvetova|daga|damas|date|deda|Deda|dede|dedi|dedom|defini\\\u0161e|dejstvo|Dejstvo|dejstvom|Dejstvom|dele\\\u0107i|deo|Deo|de\\\u0161ava|dete|Dete|diluje|diluju|diskutuje|Diskutuje|diskutujemo|Diskutujemo|djete|Djete|detektuje|dodju|dole|Dole|donijeo|Donijeo|Donije\\\u0107u|dosledan|dospeo|dospeju|do\\\u0111avola|Do\\\u0111avola|drug|drugari|drugare|drug\\\u010diji|drugde|duuga|duvana|dve|Dve|dvema|\\\u0111avo|\\\u0111avola|\\\u0111emper|d\\\u017eanki|d\\\u017eelat|\\\u0111ubre|efekat|eksperata|eksperti|Eksperti|ekspertima|en|emitovao|emitovati|emituje|emitujem|Emitujem|emituju|evra|familija|Familija|familiju|Familiju|familijama|familiji|flertuje|foka|foku|foke|fokama|fotografi\\\u0161u|gasova|gde|Gde|gluhonem|gre\\\u0161e|grje\\\u0161e|gre\\\u0161i|grje\\\u0161i|gre\\\u0161ki|grijehova|grijehove|hipnotisao|hipnotisana|hipnoti\\\u0161e|Historija|Historiju|Historije|Historiji|Istorija|Istoriju|Istorije|Istoriji|historije|historiji|istorije|istoriji|istorijom|hakuje|Hakuje|hakujemo|Hakujemo|Hakuju|hakuju|ho\\\u010du|Ho\\\u010du|hte\\\u0107e|htedoh|Htjeo|Hteo|htjeo|hteo|i\\\u010di|I\\\u010di|iko|ignori\\\u0161i|Ignori\\\u0161i|ignori\\\u0161ite|Ignori\\\u0161ite|ignori\\\u0161u|ilustruju|inspirisao|interesantan|Interesantan|interesuje|Interesuje|interesujemo|Interesujemo|interesujete|Interesujete|Interesuju|interesuju|isekao|isterao|istera\\\u0161|Istera\\\u0161|istrebi|istrebiti|isuvi\\\u0161e|ivica|ivice|ivici|ivicu|izduvaj|izduvamo|izoluje|izolujemo|izoluje\\\u0161|Izolujete|Izolujte|izolujte|izgladneo|izmeriti|izmerio|izme\\\u0161ane|izneo|izneti|izvestan|izvinem|izvine\\\u0161|Izvinem|Izvine\\\u0161|izvinim|izvini\\\u0161|izviniti|izvinjenje|izvinjenja|izvinjenju|jedamput|jelda|Je\\\u0161\\\u0107emo|Je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107e|je\\\u0161\\\u0107u|Je\\\u0161\\\u0107u|je\\\u0161\\\u0107e\\\u0161|je\\\u0161\\\u0107emo|ju\\\u010de|Ju\\\u010de|kakava|kampovao|kampuje|kampujemo|kampuju|kancelarija|kancelarijama|kancelariju|Kancelarija|Kancelariju|kancelariji|kancelarije|kancelarijom|kancera|kandidovati|kandidujem|kapar|kapra|karmin|karminom|k\\\u0107erci|k\\\u0107erka|k\\\u010derka|K\\\u0107erka|K\\\u010derka|k\\\u0107erkama|ker|Ker|kerova|kidnapovan|Kidnapovan|kiji|kijim|klasifikuju|kle\\\u0161ta|klje\\\u0161ta|Ko|koa|koaj|kola|kolima|komandni|kombinuju|kompanija|komponovao|kom\\\u0161ija|kom\\\u0161iji|kom\\\u0161iju|kom\\\u0161iluk|kom\\\u0161iluka|kom\\\u0161iluku|kom\\\u0161ije|kom\\\u0161ijama|kom\\\u0161inica|kom\\\u0161inicu|konektovan|konektovati|kontroli\\\u0161u|Kontroli\\\u0161u|Kontroli\\\u0161i|kontroli\\\u0161i|Kontroli\\\u0161ite|kontroli\\\u0161ite|korpu|kritikuju|krsta|krsta\\\u0161i|krstu|krsti\\\u0107a|krsti\\\u0107u|Krsta|Krstu|Krsti\\\u0107a|Krsti\\\u0107u|krstom|krstove|Krstove|krstovima|Krstovima|kri\\\u017eom|kupatilo|kupatilu|kvalifikuju|la\\\u017eeju|La\\\u017eov|la\\\u017eov|la\\\u017eovi|la\\\u017eovu|la\\\u017eovima|la\\\u017eovom|lebdeo|le\\\u010di|le\\\u010de|lje\\\u010di|Le\\\u010di|Lje\\\u010di|Lejn|Lenja|lenji|lenja|le\\\u0161nik|Leta|leto|Leto|letos|letiti|leve|lo\\\u017ei|lza|ljepiti|ljepili|magnezijuma|magnezijumu|maja|maju|majem|majca|majce|majcu|majcom|Malopre|malopre|maloprije|manifestuje|manifestuju|marta|martu|martom|mehur|menom|mera\\\u010d|meri|mere|merdevine|merdevinama|merljivo|me\\\u0161ane|me\\\u0161avina|me\\\u0161avine|me\\\u0161avinu|minut|mleo|mo\\\u010d|mofu|momenat|momenta|muzejem|muzici|muzika|muzike|muzikom|Muzika|Muzike|Muzikom|na\\\u010di|nadevati|naduvan|najpre|Najpre|najzad|nanev\\\u0161i|nanjeli|napastvuje|Napolje|napolje|Napolju|napolju|nauka|Nauka|nauci|nazad|Nazad|napred|Napred|naprimjer|naseo|nasesti|nasre\\\u0107u|nebi|nebih|Nebi|Nebih|nebismo|Nebismo|nebiste|Nebiste|nedaj|negde|Negde|neguje|neguju|nekto|nemi|nemrem|nemogu|Nemogu|nemora|Nemora|nene|ne\\\u0161o|nevesta|nevreme|nezi|niasm|nigde|Nigde|nikakave|niko|Niko|nisma|Nisma|ne\\\u0107\\\u0161|nejde|Nejde|neda|nedam|negujem|njegi|ne\\\u017eeli|niej|nili|njie|njem|njeme|nominovan|nsiam|nteko|obe|Obe|obema|Obezbe\\\u0111uju|obezbe\\\u0111uju|objekat|oblast|oblastima|oblasti|obolelu|obo\\\u017eavalac|obu\\\u010di|obuhvata|odandje|odavdje|Odavdje|odbi\\\u0107e\\\u0161|odbi\\\u0107emo|odela|odelu|odelenja|odelenje|odelenju|odeljak|odeljenje|Odeljenje|odjeljenje|Odjeljenje|odeljenjem|odma|Odne\\\u0107u|odne\\\u0107u|odne\\\u0107e|odoliti|odneti|odseo|odsela|odsesti|odupreti|oduvek|Oduvek|oduvjek|Oduvjek|ogladneo|okoreli|organizuju|Organizuju|osje\\\u0107anja|osmehe|osmehne|osmehnu|osobenosti|ostareli|ostrva|ostrvu|ostrvom|Ostrva|Ostrvu|Ostrvom|ostrvima|osete|ostrvo|Ostrvo|osvjetljen|ovde|Ovde|ovdej|ovdije|Ovdije|ovjde|Ovjde|pakuje|Pakuje|Pakuju|pakuju|palatama|palate|palatu|palati|pantalone|Pantalone|pantalona|pantalonama|par\\\u010de|par\\\u010deta|par\\\u010detu|par\\\u010detom|parampar\\\u010dad|pastuv|pastuva|pastuvu|pd|pemzija|pemziju|penzionerski|Penzionerski|pertle|pesama|pesnicima|pe\\\u0161ice|Pe\\\u0161ice|pe\\\u0161ke|plata|pla\\\u010da|platom|platu|pla\\\u010danje|pla\\\u010danjem|pla\\\u0107e\\\u0161|plen|Plen|pljen|Pljen|po\\\u010de\\\u0107u|podjelimo|podnesti|podstreka\\\u010d|podsete|poen|poena|poene|poeni|Poeni|poenima|poludili|poma\\\u0107i|pomaknim|pomaknio|pomakni\\\u0161|pomakniti|pomenu|Pomera|pomera|pomjera|pomerajte|pomjeri|pomeraj|pomjeraj|pomeraju|pomerala|pomjerala|pomjeraju|pomeranja|pomerati|pomjerati|pomeri\\\u0161|ponaosob|ponesla|Ponesla|pore\\\u0111enje|pore\\\u0111enju|porekla|poreklo|poreklu|Porodica|Porodice|porodica|porodice|porodici|porodicama|porodicom|porodicu|poslata|posle|Posle|poslje|posredi|postara|Postara\\\u0107u|postara\\\u0107u|postaraj|Postaraj|Postaraju|postaraju|postarajmo|postaramo|postara\\\u0161|povesne|Povinuju|povinuju|pozadi|po\\\u017eeleo|Po\\\u017eeleo|Po\\\u017eeljeo|po\\\u017eeljeo|praktikuj|praktikuju|praktikovala|praktikovati|pre|Pre|predela|predelu|Pre\\\u0107i|pre\\\u0107i|pre\\\u0107utkuje|predame|predamnom|Predamnom|preformuli\\\u0161i|preklo|preloma|Prene\\\u0107u|prene\\\u0107u|prenos|prenosa|prenosom|prenosu|preneo|Preneo|prenela|prenjela|preneli|prenjeli|preneti|preporu\\\u010da|prese\\\u0107i|preti|prete|Prete|prjeti|prjete|prete\\\u0107im|prete\\\u0107ih|pretrpeo|prevod|Prevod|prezentovati|prezentovane|prezentovan|prezentovani|prezentovano|pridonjeti|prijatan|prime\\\u0107ivao|primedbi|primjete|prisetim|prisetio|prisetite|pritiskam|prmda|procenat|procent|procenta|procenata|procenti|Procenti|procente|Procente|procentu|Procentu|procentima|prodato|prohte|projekat|Projekat|promijena|prosledili|protestvovat|Protestvovat|Protestvujem|protestvujem|protestvuju|protestuju\\\u0107i|psihi\\\u0107ki|pto|ptom|punoletan|Punoletan|ra\\\u010dunari|ra\\\u010dunare|radijo|ra\\\u0111e|ranac|rancu|rascep|rasejan|rasejana|raspust|razbi\\\u0107u|razbijesneo|ra\\\u0161\\\u0107e|Razbi\\\u0107u|razdevi\\\u010de|razgovrati|razre\\\u0161i|razume|razumeju|re\\\u010dju|Re\\\u010dju|rje\\\u010dju|Rje\\\u010dju|reagujte|redov|redovu|re\\\u0111e|re\\\u0111i|rejv|rejvu|reko|rengen|repuje\\\u0161|resetuje|resetujte|Resetujte|rije\\\u0111i|Rizikuj|rizikuju|rizikuje|rizikujte|rje\\\u0161io|rokenrol|ronioc|savije\\\u0161\\\u0107u|save\\\u0161\\\u0107u|secka|seckam|sede\\\u0107e\\\u0161|sedeli|sedi\\\u0161ta|sedi\\\u0161te|sedi\\\u0161tu|sedni|Sedni|sedi|Sedi|sedite|sesti|sekire|sekiraj|sekiram|sekiramo|sekira\\\u0161|sekirate|sekirajte|seme|sertan|Se\\\u0161\\\u0107u|se\\\u0161\\\u0107u|sje\\\u0161\\\u0107emo|seta|sigruno|siguan|sija|sijaju|sir\\\u0107e|sir\\\u0107eta|sir\\\u0107etu|sje\\\u0161\\\u0107u|sje\\\u0161\\\u0107e|sle\\\u0107e|sle\\\u0107u|sle\\\u0107emo|sleva|se\\\u0107anjima|seo|Seo|sem|sma|smao|Smao|sme|Sme|sme\\\u0107pm|smej|Smejte|smejte|smesta|Smesta|smeste|sme\\\u0161ak|sme\\\u0161i|Sme\\\u0161i|sme\\\u0161io|sme\\\u0161i\\\u0161|sme\\\u0161kom|smjeo|smrdeo|sintersajzer|sitnisajzer|skelet|so\\\u010diva|so\\\u010divima|so\\\u010divo|so\\\u010divom|so\\\u010divu|Spakuj|Spakujte|spakujte|spasao|Spasao|spasen|spasla|spasli|speluje|speluju|spoji\\\u0107e|spolja|Sredi\\\u0107e|Sredi\\\u0107u|stabilizuju|starao|starati|Starati|steni|stepen|stepena|stepeni|stepenu|sticati|stiditi|streljamo|streljati|stole\\\u0107a|stobom|stvrano|Stupi\\\u0107u|stupi\\\u0107u|subjekat|sudija|Sudija|sudije|sudiji|sudijo|sudiju|sudijom|sudijskog|sugeri\\\u0161u|sugeri\\\u0161e|supa|supe|supi|supu|supom|supama|Supa|Supe|Supi|Supu|Supom|Supama|surfuje|surfuje\\\u0161|surfuju|su\\\u0161tina|su\\\u0161tinski|suvom|suvog|suvoj|Suvom|Suvog|Suvoj|suvim|Suvim|svestan|svjest|Svjest|svjesti|Svjesti|svetova|svetove|svugde|\\\u0161olja|\\\u0161olju|\\\u0160ta|\\\u0161tagod|\\\u0161ta|\\\u0161tp|\\\u0161tampa|\\\u0161tampu|\\\u0161tampom|\\\u0161tampi|\\\u0161tampati|\\\u0160utje\\\u0107e|tablu|taguje|tako\\\u0111e|Tako\\\u0111e|talas|Talas|talasa|talase|talasi|Talasi|talasima|Talasima|te\\\u010dnost|te\\\u010dnosti|te\\\u010dno\\\u0161\\\u0107u|tek\\\u0161o|Tek\\\u0161o|terajte|te\\\u0161io|te\\\u0161i\\\u0161|tki|to\\\u010dak|To\\\u010dak|toha|tovj|trabam|trkanje|trkanja|trkao|trougao|trougla|trouglu|trouglove|trpeo|Trpeo|tugi|tvrtci|ubede|Ube\\\u0111ivao|ube\\\u0111ivati|ubje\\\u0111ivati|ube\\\u0111uje|ube\\\u0111uje\\\u0161|ube\\\u0111uju|ubjediti|u\\\u010dtivo|u\\\u010dtivost|u\\\u010dtivo\\\u0161\\\u0107u|udata|Udata|udatoj|udeo|ugljenik|uliva|ulivali|ulivate|uljeva|ujutru|Ukoliko|ukoliko|ume|umem|ume\\\u0161|umesto|Umesto|umete|umijesto|Umijesto|umetninama|umreti|Umret|umrije\\\u0107e\\\u0161|umrije\\\u0107ete|Une\\\u0107u|univerzitet|univerzitetu|Uop\\\u0161te|uop\\\u0161te|uop\\\u010de|upustva|uprkos|Uprkos|uradio|Uredu|uspe|Uspe|uspeo|Uspeo|uspe\\\u0107e\\\u0161|uspje\\\u0107e\\\u0161|uspe\\\u0107emo|uspe\\\u0161|uspeju|uspjevala|uspijo|u\\ sred|usled|Usled|usledila|usljed|Usljed|u\\\u0161unjate|utehe|uve\\\u010de|uvek|Uvek|uvjek|Uvjek|uvijet|uvijeti|uvijetima|uva|Uva|uvo|Uvo|uvom|Uvom|uvu|Uvu|vaistinu|Vaistinu|vajar|vakcini\\\u0161e|varnica|varnicu|vaspitala|vaspitavan|vaspitavanju|va\\\u0161ljivi|va\\\u017ei|ve\\\u010dan|ve\\\u0107ati|vek|veka|veke|vekova|venca|ve\\\u010dnost|veoma|Veoma|vera|vere|veri|verom|veru|veran|verama|Vera|Vere|Veri|Verom|Veru|Veran|Verama|veren|Veren|verena|vereni|verimo|vest|Vest|vesti|Vesti|Vjesti|vjesti|vestima|Vestima|vjestima|Vjestima|ve\\\u0161ala|ve\\\u0161\\\u0107u|ve\\\u0161u|vide\\\u0161e|vidjeo|Vidjeo|vjerojatno\\\u0107a|vje\\\u0161\\\u0107u|vlo|Vodi\\\u0107e|Vodi\\\u0107u|voliti|vredelo|vrednom|vrednog|vreme|Vreme|vrjeme|Vrjeme|vrteo|vrvela|whiskey|zaceljivanje|zagreva|Zagreva|Zagrevate|zagrevanje|zakunio|zalepili|zalepiti|zaliv|zalivu|zanm|zanma|zaplena|zapleni|zaplenu|zaspem|zastareo|zauvek|Zauvek|zauvjek|Zauvjek|zavera|zahtev|Zahtev|zasede|zasedi|zasedu|zatp|Zatp|za\\\u017eeleo|Za\\\u017eeleo|Za\\\u017eeljeo|za\\\u017eeljeo|zbg|zdrvo|Zdrvo|zlodela|zna\\\u0107i|zvani\\\u010dan|zvezdom|\\\u017eemo|\\\u017eeleo|\\\u017deleo|\\\u017deljeo|\\\u017eeljeo|\\\u017diveo|\\\u017eiveo|\\\u017emureo|Abi|Alis|Ajk|Ajku|Ajrin|Ajris|Ajron|Ajvi|An\\\u0111eles|An\\\u0111elesa|An\\\u0111elesu|An\\\u0111elesom|Antoni|Antoniju|Ar\\\u010di|Beverli|Bejker|Bitls|Bitlsi|Brid\\\u017eit|Bri\\\u017eit|Bruks|Dablin|Dablina|Dablinu|Dag|Darvin|Darvina|Darvinu|Darvinom|Dejv|Dejvi|Dejva|Dejvu|Dejvom|Den|Deril|Dijaz|Dru|\\\u0110eni|\\\u0110o\\\u0161ua|D\\\u017eejmi|D\\\u017ead|D\\\u017eeri|D\\\u017eerija|D\\\u017eo|D\\\u017eoel|D\\\u017eoelu|D\\\u017eo\\\u0161|D\\\u017eo\\\u0161u|D\\\u017eosi|D\\\u017eozi|D\\\u017ees|D\\\u017een|D\\\u017eej|D\\\u017eejn|D\\\u017eil|D\\\u017eodi|D\\\u017eud|D\\\u017euli|Ebi|Ejb|Ejba|Ejmi|Ejpril|Empajer|En\\\u0111el|End\\\u017ei|Entoni|E\\\u0161ford|E\\\u0161forda|E\\\u0161li|Fibi|Filovo|Flober|Fokner|Fren|Gre\\\u010den|Grejs|Hadson|Hadsonu|Hant|Hemingvej|Henk|Hejstings|Hju|Hjua|Hjuz|Hjuza|Hjuston|Hjustonu|Igo|Ilejn|\\\u017didovin|Johni|Jud\\\u017ein|Kasl|Kejd\\\u017e|Kejn|Kejsi|Kejti|Keren|Kerol|Kerolajn|Klajv|Klajva|Klajve|Klajvu|Klarens|Kler|Kloi|Klod|Klode|Kol|Kolins|Kortni|Krej\\?g|Kristi|Lajf|Lajl|Lejk|Lorejn|Lorens|Lusi|Majk|Majkeve|Majlo|Maslou|Medlin|Medelin|Mejbel|Mejn|Mejna|Mejnu|Mejnom|Mejpls|Mejsi|Mek|Merilend|Mi\\\u010del|Nensi|Ni\\\u010de|Ni\\\u010dea|Ni\\\u010deu|Ni\\\u010deom|Odri|Ohajo|Ohaja|Ohaju|Olbrajt|O\\'Nil|Orlins|Orlinsa|Orlinsu|Pem|Pejd\\\u017e|Red\\\u017ei|Red\\\u017einald|Rej|Rej\\\u010del|Ri\\\u010d|Rouz|Sendi|Sidnej|Sindi|Sojer|Sojeru|Sole|Stejsi|Stoun|\\\u0160eron|\\\u0160eril|\\\u0160irli|\\\u0160paniji|Tajms|Tejlor|Vajlder|Val\\\u0161|Vins|Voren|Vud|\\\u017dak|\\\u017dil|januar|Januar|februar|februara|februaru|Februar|Februara|Februaru|mart|Mart|april|April|maj|Maj|svibnjom|jun|juna|junu|Jun|Juni|juli|jula|julu|Juli|septembar|Septembar|oktobar|Oktobar|oktobra|oktobru|novembar|november|novembra|novembru|Novembar|November|Novembra|Novembru|decembar|Decembar)(\\b|$)"}},
+ 'hun': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict(),
+                        'pattern': None}},
+ 'nld': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\u010d', u'\xe8'), (u'I\u05bb', u'I'), (u'\u05d0', u'\xe0'), (u'\u05d9', u'\xe9'), (u'\u05d8', u'\xe8'), (u'\u05db', u'\xeb'), (u'\u05dd', u'i'), (u'\u05df', u'\xef'), (u'\u05e3', u'\xf3'), (u'\u05e4', u'o'), (u'\u05e6', u'\xeb'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'ls', u'Is'), (u'ln', u'In'), (u'lk', u'Ik'), (u'ledereen', u'Iedereen'), (u'ledere', u'Iedere'), (u'lemand', u'Iemand')]),
+                        'pattern': u'(?um)(\\b|^)(?:ls|ln|lk|ledereen|ledere|lemand)(\\b|$)'}},
+ 'nob': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'varjeg', u'var jeg'), (u'omjeg', u'om jeg'), (u'menjeg', u'men jeg'), (u'noejeg', u'noe jeg'), (u'f\xf8rjeg', u'f\xf8r jeg'), (u'harjobbet', u'har jobbet'), (u'Kunnejeg', u'Kunne jeg'), (u'haddejeg', u'hadde jeg'), (u'p\xe5jorden', u'p\xe5 jorden'), (u'n\xe5rjeg', u'n\xe5r jeg'), (u'tenkerjeg', u'tenker jeg'), (u'helejorden', u'hele jorden'), (u'menjorden', u'men jorden'), (u'rundtjorden', u'rundt jorden'), (u'forjorden', u'for jorden'), (u'avjordens', u'av jordens')]),
+                        'pattern': u'(?um)(\\b|^)(?:varjeg|omjeg|menjeg|noejeg|f\\\xf8rjeg|harjobbet|Kunnejeg|haddejeg|p\\\xe5jorden|n\\\xe5rjeg|tenkerjeg|helejorden|menjorden|rundtjorden|forjorden|avjordens)(\\b|$)'}},
+ 'nor': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict(),
+                        'pattern': None}},
+ 'por': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict([(u'IN 6-E', u'N 6 E'), (u'in tegrar-se', u'integrar-se'), (u'in teresse', u'interesse'), (u'in testinos', u'intestinos'), (u'indica \xe7\xe3o', u'indica\xe7\xe3o'), (u'inte tino', u'intestino'), (u'intes tinos', u'intestinos'), (u'L da', u'Lda'), (u'mal estar', u'mal-estar'), (u'mastiga \xe7\xe1o', u'mastiga\xe7\xe3o'), (u'm\xe9di cas', u'm\xe9dicas'), (u'mineo rais', u'minerais'), (u'mola res', u'molares'), (u'movi mentos', u'movimentos'), (u'movimen to', u'movimento'), (u'N 5-Estendido', u'N\xba 5 Estendido'), (u'oxig\xe9 nio', u'oxig\xe9nio'), (u'pod mos', u'podemos'), (u'poder-se ia', u'poder-se-ia'), (u'pos sibilidade', u'possibilidade'), (u'possibi lidades', u'possibilidades'), (u'pro duto', u'produto'), (u'procu rar', u'procurar'), (u'Q u e', u'Que'), (u'qualifi cam', u'qualificam'), (u'R egi\xe3o', u'Regi\xe3o'), (u'unsuficien temente', u'insuficientemente')]),
+                          'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:IN\\ 6\\-E|in\\ tegrar\\-se|in\\ teresse|in\\ testinos|indica\\ \\\xe7\\\xe3o|inte\\ tino|intes\\ tinos|L\\ da|mal\\ estar|mastiga\\ \\\xe7\\\xe1o|m\\\xe9di\\ cas|mineo\\ rais|mola\\ res|movi\\ mentos|movimen\\ to|N\\ 5\\-Estendido|oxig\\\xe9\\ nio|pod\\ mos|poder\\-se\\ ia|pos\\ sibilidade|possibi\\ lidades|pro\\ duto|procu\\ rar|Q\\ u\\ e|qualifi\\ cam|R\\ egi\\\xe3o|unsuficien\\ temente)(?:(?=\\s)|(?=$)|(?=\\b))'},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'abitual', u'habitual'), (u'\xe0cerca', u'acerca'), (u'acessor', u'assessor'), (u'ac\xf3lico', u'ac\xf3lito'), (u'a\xe7oreano', u'a\xe7oriano'), (u'actuacao', u'actua\xe7\xe3o'), (u'acucar', u'a\xe7\xfacar'), (u'a\xe7ucar', u'a\xe7\xfacar'), (u'advinhar', u'adivinhar'), (u'africa', u'\xc1frica'), (u'ajuisar', u'ajuizar'), (u'album', u'\xe1lbum'), (u'alcool\xe9mia', u'alcoolemia'), (u'aldi\xe3o', u'alde\xe3o'), (u'algerino', u'argelino'), (u'ameixeal', u'ameixial'), (u'amia\xe7a', u'amea\xe7a'), (u'analizar', u'analisar'), (u'and\xe1ste', u'andaste'), (u'anemona', u'an\xe9mona'), (u'antartico', u'ant\xe1rctico'), (u'ant\xe1rtico', u'ant\xe1rctico'), (u'antep\xf4r', u'antepor'), (u'ap\xe1rte', u'aparte'), (u'apiadeiro', u'apeadeiro'), (u'apiar', u'apear'), (u'apreciacao', u'aprecia\xe7\xe3o'), (u'arctico', u'\xe1rctico'), (u'arrazar', u'arrasar'), (u'\xe1rtico', u'\xe1rctico'), (u'artifice', u'art\xedfice'), (u'artif\xedcial', u'artificial'), (u'ascen\xe7\xe3o', u'ascens\xe3o'), (u'ass\xfacar', u'a\xe7\xfacar'), (u'aste', u'haste'), (u'aster\xedstico', u'asterisco'), (u'aver\xe7\xe3o', u'avers\xe3o'), (u'avizar', u'avisar'), (u'avulsso', u'avulso'), (u'ba\xednha', u'bainha'), (u'banca-rota', u'bancarrota'), (u'bandeija', u'bandeja'), (u'b\xe9b\xe9', u'beb\xe9'), (u'beige', u'bege'), (u'ben\xe7\xe3o', u'b\xean\xe7\xe3o'), (u'benefici\xeancia', u'benefic\xeancia'), (u'beneficiente', u'beneficente'), (u'benvinda', u'bem-vinda'), (u'benvindo', u'bem-vindo'), (u'boasvindas', u'boas-vindas'), (u'borborinho', u'burburinho'), (u'Brazil', u'Brasil'), (u'bussula', u'b\xfassola'), (u'cabo-verdeano', u'cabo-verdiano'), (u'caimbras', u'c\xe3ibras'), (u'calc\xe1reo', u'calc\xe1rio'), (u'calsado', u'cal\xe7ado'), (u'calv\xedce', u'calv\xedcie'), (u'camoneano', u'camoniano'), (u'campi\xe3o', u'campe\xe3o'), (u'can\xe7acos', u'cansa\xe7os'), (u'caracter', u'car\xe1cter'), (u'caract\xe9res', u'caracteres'), (u'catequeze', u'catequese'), (u'catequisador', u'catequizador'), (u'catequisar', u'catequizar'), (u'ch\xedcara', u'x\xedcara'), (u'ciclano', u'sicrano'), (u'cicrano', u'sicrano'), (u'cidad\xe3es', u'cidad\xe3os'), (u'cidad\xf5es', u'cidad\xe3os'), (u'cincoenta', u'cinquenta'), (u'cinseiro', u'cinzeiro'), (u'cinsero', u'sincero'), (u'citacoes', u'cita\xe7\xf5es'), (u'coaliz\xe3o', u'colis\xe3o'), (u'c\xf4dia', u'c\xf4dea'), (u'comb\xf3io', u'comboio'), (u'comp\xf4r', u'compor'), (u'concerteza', u'com certeza'), (u'constituia', u'constitu\xeda'), (u'constitu\xedu', u'constituiu'), (u'contato', u'contacto'), (u'contens\xe3o', u'conten\xe7\xe3o'), (u'contribuicoes', u'contribui\xe7\xf5es'), (u'c\xf4r', u'cor'), (u'corass\xe3o', u'cora\xe7\xe3o'), (u'cor\xe7ario', u'cors\xe1rio'), (u'cor\xe7\xe1rio', u'cors\xe1rio'), (u'cornprimidosinbo', u'comprimidozinho'), (u'cr\xe2neo', u'cr\xe2nio'), (u'dE', u'de'), (u'defeni\xe7\xe3o', u'defini\xe7\xe3o'), (u'defenido', u'definido'), (u'defenir', u'definir'), (u'deficite', u'd\xe9fice'), (u'degladiar', u'digladiar'), (u'deiche', u'deixe'), (u'desinteria', u'disenteria'), (u'despendio', u'disp\xeandio'), (u'desp\xeandio', u'disp\xeandio'), (u'desplic\xeancia', u'displic\xeancia'), (u'dificulidade', u'dificuldade'), (u'dispender', u'despender'), (u'dispendio', u'disp\xeandio'), (u'distribuido', u'distribu\xeddo'), (u'dru\xedda', u'druida'), (u'\xe9cr\xe3', u'ecr\xe3'), (u'ecran', u'ecr\xe3'), (u'\xe9cran', u'ecr\xe3'), (u'\xeale', u'ele'), (u'elice', u'h\xe9lice'), (u'\xe9lice', u'h\xe9lice'), (u'emiratos', u'emirados'), (u'engolis-te', u'engoliste'), (u'engulir', u'engolir'), (u'enguliste', u'engoliste'), (u'entertido', u'entretido'), (u'entitular', u'intitular'), (u'entreterimento', u'entretenimento'), (u'entreti-me', u'entretive-me'), (u'env\xf3lucro', u'inv\xf3lucro'), (u'er\xf3i', u'her\xf3i'), (u'escluir', u'excluir'), (u'esclus\xe3o', u'exclus\xe3o'), (u'escriv\xf5es', u'escriv\xe3es'), (u'esqueiro', u'isqueiro'), (u'esquesito', u'esquisito'), (u'estacoes', u'esta\xe7\xf5es'), (u'esteje', u'esteja'), (u'excava\xe7\xe3o', u'escava\xe7\xe3o'), (u'excavar', u'escavar'), (u'exdr\xfaxula', u'esdr\xfaxula'), (u'exdr\xfaxulas', u'esdr\xfaxulas'), (u'exitar', u'hesitar'), (u'explicacoes', u'explica\xe7\xf5es'), (u'exquisito', u'esquisito'), (u'extende', u'estende'), (u'extender', u'estender'), (u'f\xe0cilmenfe', u'facilmente'), (u'f\xe0cilmente', u'facilmente'), (u'fariam-lhe', u'far-lhe-iam'), (u'FARM\xc1ClAS', u'FARM\xc1CIAS'), (u'farmec\xeautico', u'farmac\xeautico'), (u'fassa', u'fa\xe7a'), (u'f\xe9bre', u'febre'), (u'fecula', u'f\xe9cula'), (u'f\xe9mea', u'f\xeamea'), (u'femenino', u'feminino'), (u'femininismo', u'feminismo'), (u'f\xedsiologista', u'fisiologista'), (u'fiz\xe9mos', u'fizemos'), (u'fizes-te', u'fizeste'), (u'fl\xf4r', u'flor'), (u'for\xe3o', u'foram'), (u'formalisar', u'formalizar'), (u'f\xf4ro', u'foro'), (u'fos-te', u'foste'), (u'frag\xe2ncia', u'fragr\xe2ncia'), (u'fran\xe7\xeas', u'franc\xeas'), (u'frasqutnho', u'frasquinho'), (u'frustado', u'frustrado'), (u'fur\xe1', u'furar'), (u'gaz', u'g\xe1s'), (u'g\xe1z', u'g\xe1s'), (u'geito', u'jeito'), (u'geneceu', u'gineceu'), (u'geropiga', u'jeropiga'), (u'glic\xe9mia', u'glicemia'), (u'gorgeta', u'gorjeta'), (u'grangear', u'granjear'), (u'guizar', u'guisar'), (u'hectar', u'hectare'), (u'herm\xe9ticamente', u'hermeticamente'), (u'hernia', u'h\xe9rnia'), (u'higi\xe9ne', u'higiene'), (u'hilariedade', u'hilaridade'), (u'hiperac\xeddez', u'hiperacidez'), (u'hontem', u'ontem'), (u'igiene', u'higiene'), (u'igienico', u'higi\xe9nico'), (u'igi\xe9nico', u'higi\xe9nico'), (u'igreija', u'igreja'), (u'iguasu', u'igua\xe7u'), (u'ilac\xe7\xe3o', u'ila\xe7\xe3o'), (u'imbigo', u'umbigo'), (u'impecilho', u'empecilho'), (u'\xedncas', u'incas'), (u'inc\xeasto', u'incesto'), (u'inclusiv\xe9', u'inclusive'), (u'inc\xf4modos', u'inc\xf3modos'), (u'incontest\xe1velmente', u'incontestavelmente'), (u'incontest\xe0velmente', u'incontestavelmente'), (u'indespens\xe1veis', u'indispens\xe1veis'), (u'indespens\xe1vel', u'indispens\xe1vel'), (u'India', u'\xcdndia'), (u'indiguina\xe7\xe3o', u'indigna\xe7\xe3o'), (u'indiguinado', u'indignado'), (u'indiguinar', u'indignar'), (u'inflac\xe7\xe3o', u'infla\xe7\xe3o'), (u'ingreja', u'igreja'), (u'INSCRICOES', u'INSCRI\xc7\xd5ES'), (u'intens\xe3o', u'inten\xe7\xe3o'), (u'intertido', u'entretido'), (u'intoxica', u'Intoxica'), (u'intrega', u'entrega'), (u'inveros\xedmel', u'inveros\xedmil'), (u'iorgute', u'iogurte'), (u'ipop\xf3tamo', u'hipop\xf3tamo'), (u'ipsilon', u'\xedpsilon'), (u'ipslon', u'\xedpsilon'), (u'isquesito', u'esquisito'), (u'ju\xedz', u'juiz'), (u'juiza', u'ju\xedza'), (u'j\xfaniores', u'juniores'), (u'justanzente', u'justamente'), (u'juz', u'jus'), (u'kilo', u'quilo'), (u'laborat\xf3rio-porque', u'laborat\xf3rio porque'), (u'ladravaz', u'ladrava'), (u'lament\xe0velmente', u'lamentavelmente'), (u'lampe\xe3o', u'lampi\xe3o'), (u'largartixa', u'lagartixa'), (u'largarto', u'lagarto'), (u'l\xeam', u'l\xeaem'), (u'leuc\xe9mia', u'leucemia'), (u'licensa', u'licen\xe7a'), (u'lingu\xedsta', u'linguista'), (u'lisongear', u'lisonjear'), (u'logista', u'lojista'), (u'ma\xe7ajar', u'massajar'), (u'Macfadden-o', u'Macfadden o'), (u'mae', u'm\xe3e'), (u'magestade', u'majestade'), (u'm\xe3gua', u'm\xe1goa'), (u'mangerico', u'manjerico'), (u'mangerona', u'manjerona'), (u'manteem-se', u'mant\xeam-se'), (u'mantega', u'manteiga'), (u'mantem-se', u'mant\xe9m-se'), (u'massi\xe7o', u'maci\xe7o'), (u'massisso', u'maci\xe7o'), (u'm\xe9dica-Rio', u'm\xe9dica Rio'), (u'menistro', u'ministro'), (u'merciaria', u'mercearia'), (u'metrelhadora', u'metralhadora'), (u'miscegena\xe7\xe3o', u'miscigena\xe7\xe3o'), (u'misogenia', u'misoginia'), (u'misogeno', u'mis\xf3gino'), (u'mis\xf3geno', u'mis\xf3gino'), (u'm\xba', u'\xba'), (u'm\xf4lho', u'molho'), (u'monument\xe2nea', u'moment\xe2nea'), (u'mortandela', u'mortadela'), (u'morteIa', u'mortela'), (u'muinto', u'muito'), (u'nasaias', u'nasais'), (u'n\xeale', u'nele'), (u'nest', u'neste'), (u'Nivea', u'N\xedvea'), (u'nonagessimo', u'nonag\xe9simo'), (u'nonag\xe9ssimo', u'nonag\xe9simo'), (u'nornal', u'normal'), (u'not\xe0velmente', u'notavelmente'), (u'obcess\xe3o', u'obsess\xe3o'), (u'obesidae', u'obesidade'), (u'\xf3bviamente', u'obviamente'), (u'\xf2bviamente', u'obviamente'), (u'ofecina', u'oficina'), (u'oje', u'hoje'), (u'omem', u'homem'), (u'opcoes', u'op\xe7\xf5es'), (u'op\xf3brio', u'opr\xf3brio'), (u'opr\xf3bio', u'opr\xf3brio'), (u'orf\xe3o', u'\xf3rf\xe3o'), (u'organigrama', u'organograma'), (u'organisar', u'organizar'), (u'org\xe3o', u'\xf3rg\xe3o'), (u'orta', u'horta'), (u'\xf3tima', u'\xf3ptima'), (u'\xf3timos', u'\xf3ptimos'), (u'paraliza\xe7\xe3o', u'paralisa\xe7\xe3o'), (u'paralizado', u'paralisado'), (u'paralizar', u'paralisar'), (u'par\xe1ste', u'paraste'), (u'P\xe1tria', u'p\xe1tria'), (u'pa\xfal', u'Paul'), (u'pecal\xe7o', u'percal\xe7o'), (u'p\xeaga', u'pega'), (u'periodo', u'per\xedodo'), (u'pertubar', u'perturbar'), (u'per\xfa', u'peru'), (u'piqueno', u'pequeno'), (u'pirin\xe9us', u'Piren\xe9us'), (u'poblema', u'problema'), (u'pobrema', u'problema'), (u'poden', u'podem'), (u'poder-mos', u'pudermos'), (u'ponteagudo', u'pontiagudo'), (u'pontuacoes', u'pontua\xe7\xf5es'), (u'prazeiroso', u'prazeroso'), (u'precaridade', u'precariedade'), (u'precizar', u'precisar'), (u'preserveran\xe7a', u'perseveran\xe7a'), (u'previl\xe9gio', u'privil\xe9gio'), (u'prim\xe1ria-que', u'prim\xe1ria que'), (u'pri\xfado', u'per\xedodo'), (u'probalidade', u'probabilidade'), (u'progreso', u'progresso'), (u'proib\xeddo', u'proibido'), (u'pro\xedbido', u'proibido'), (u'pr\xf3pia', u'pr\xf3pria'), (u'propiedade', u'propriedade'), (u'propio', u'pr\xf3prio'), (u'pr\xf3pio', u'pr\xf3prio'), (u'provocacoes', u'provoca\xe7\xf5es'), (u'prsen\xe7a', u'presen\xe7a'), (u'prustituta', u'prostituta'), (u'pud\xe9rmos', u'pudermos'), (u'p\xfalico', u'p\xfablico'), (u'p\xfas', u'pus'), (u'pus\xe9mos', u'pusemos'), (u'quadricomia', u'quadricromia'), (u'quadriplicado', u'quadruplicado'), (u'quaisqueres', u'quaisquer'), (u'quer-a', u'quere-a'), (u'quere-se', u'quer-se'), (u'quer-o', u'quere-o'), (u'qu\xedmco', u'qu\xedmico'), (u'quises-te', u'quiseste'), (u'quizer', u'quiser'), (u'quizeram', u'quiseram'), (u'quizesse', u'quisesse'), (u'quizessem', u'quisessem'), (u'ra\xednha', u'rainha'), (u'ra\xedz', u'raiz'), (u'raizes', u'ra\xedzes'), (u'ratato', u'retrato'), (u'ra\xfal', u'raul'), (u'razar', u'rasar'), (u'rectaguarda', u'retaguarda'), (u'r\xe9dia', u'r\xe9dea'), (u'reestabelecer', u'restabelecer'), (u'refeicoes', u'refei\xe7\xf5es'), (u'ref\xearencia', u'refer\xeancia'), (u'regeitar', u'rejeitar'), (u'regurjitar', u'regurgitar'), (u'reinvidica\xe7\xe3o', u'reivindica\xe7\xe3o'), (u'reinvidicar', u'reivindicar'), (u'requer-a', u'requere-a'), (u'requere-se', u'requer-se'), (u'requer-o', u'requere-o'), (u'requesito', u'requisito'), (u'requisicoes', u'requisi\xe7\xf5es'), (u'RESIDENCIA', u'RESID\xcaNCIA'), (u'respira\xe7\xe1o', u'respira\xe7\xe3o'), (u'restablecer', u'restabelecer'), (u'r\xe9stea', u'r\xe9stia'), (u'ruborisar', u'ruborizar'), (u'r\xfabrica', u'rubrica'), (u's\xe0dia', u'sadia'), (u'saiem', u'saem'), (u'salchicha', u'salsicha'), (u'salchichas', u'salsichas'), (u'saloice', u'saloiice'), (u'salv\xe9', u'salve'), (u'salve-ra\xednha', u'salve-rainha'), (u'salv\xe9-rainha', u'salve-rainha'), (u'salv\xe9-ra\xednha', u'salve-rainha'), (u'sao', u's\xe3o'), (u'sargeta', u'sarjeta'), (u'se\xe7\xf5es', u'sec\xe7\xf5es'), (u'seija', u'seja'), (u'seissentos', u'seiscentos'), (u'seje', u'seja'), (u'semiar', u'semear'), (u's\xe9niores', u'seniores'), (u'sensibilidadc', u'sensibilidade'), (u'sens\xedvelmente', u'sensivelmente'), (u'setessentos', u'setecentos'), (u'siclano', u'sicrano'), (u'Sifilis', u'S\xedfilis'), (u'sif\xedlis', u's\xedfilis'), (u'sin\xe3o', u'sen\xe3o'), (u'sinmtoma', u'sintoma'), (u'sint\xe9ticamente', u'sinteticamente'), (u'sintetisa', u'sintetiza'), (u'S\xd3', u's\xf3'), (u's\xf4fra', u'sofra'), (u's\xf4fregamente', u'sofregamente'), (u'som\xe1ste', u'somaste'), (u'sombracelha', u'sobrancelha'), (u'sombrancelha', u'sobrancelha'), (u'sombrancelhas', u'sobrancelhas'), (u'suavisar', u'suavizar'), (u'substituido', u'substitu\xeddo'), (u'suburbio', u'sub\xfarbio'), (u'suI', u'sul'), (u'Sui\xe7a', u'Su\xed\xe7a'), (u'sui\xe7as', u'su\xed\xe7as'), (u'sui\xe7o', u'su\xed\xe7o'), (u'sui\xe7os', u'su\xed\xe7os'), (u'sup\xf4r', u'supor'), (u'tabeli\xf5es', u'tabeli\xe3es'), (u'ta\xednha', u'tainha'), (u'tava', u'estava'), (u't\xeaem', u't\xeam'), (u'telemovel', u'telem\xf3vel'), (u'tel\xe9movel', u'telem\xf3vel'), (u'terminacoes', u'termina\xe7\xf5es'), (u'tor\xe1xico', u'tor\xe1cico'), (u'tou', u'estou'), (u'transp\xf4r', u'transpor'), (u'trasnporte', u'transporte'), (u'tumors', u'tumores'), (u'\xfamida', u'h\xfamida'), (u'umidade', u'unidade'), (u'vai-vem', u'vaiv\xe9m'), (u'vegil\xe2ncia', u'vigil\xe2ncia'), (u'vegilante', u'vigilante'), (u'vento\xednha', u'ventoinha'), (u'veros\xedmel', u'veros\xedmil'), (u'video', u'v\xeddeo'), (u'virus', u'v\xedrus'), (u'visiense', u'viseense'), (u'vo\xe7e', u'voc\xea'), (u'vo\xe7\xea', u'voc\xea'), (u'v\xf4o', u'voo'), (u'xadr\xeas', u'xadrez'), (u'xafariz', u'chafariz'), (u'x\xe9x\xe9', u'xex\xe9'), (u'xilindr\xf3', u'chilindr\xf3'), (u'za\xedre', u'Zaire'), (u'zepelin', u'zepelim'), (u'zig-zag', u'ziguezague'), (u'zo\xf4', u'zoo'), (u'z\xf4o', u'zoo'), (u'zuar', u'zoar'), (u'zum-zum', u'zunzum')]),
+                        'pattern': u'(?um)(\\b|^)(?:abitual|\\\xe0cerca|acessor|ac\\\xf3lico|a\\\xe7oreano|actuacao|acucar|a\\\xe7ucar|advinhar|africa|ajuisar|album|alcool\\\xe9mia|aldi\\\xe3o|algerino|ameixeal|amia\\\xe7a|analizar|and\\\xe1ste|anemona|antartico|ant\\\xe1rtico|antep\\\xf4r|ap\\\xe1rte|apiadeiro|apiar|apreciacao|arctico|arrazar|\\\xe1rtico|artifice|artif\\\xedcial|ascen\\\xe7\\\xe3o|ass\\\xfacar|aste|aster\\\xedstico|aver\\\xe7\\\xe3o|avizar|avulsso|ba\\\xednha|banca\\-rota|bandeija|b\\\xe9b\\\xe9|beige|ben\\\xe7\\\xe3o|benefici\\\xeancia|beneficiente|benvinda|benvindo|boasvindas|borborinho|Brazil|bussula|cabo\\-verdeano|caimbras|calc\\\xe1reo|calsado|calv\\\xedce|camoneano|campi\\\xe3o|can\\\xe7acos|caracter|caract\\\xe9res|catequeze|catequisador|catequisar|ch\\\xedcara|ciclano|cicrano|cidad\\\xe3es|cidad\\\xf5es|cincoenta|cinseiro|cinsero|citacoes|coaliz\\\xe3o|c\\\xf4dia|comb\\\xf3io|comp\\\xf4r|concerteza|constituia|constitu\\\xedu|contato|contens\\\xe3o|contribuicoes|c\\\xf4r|corass\\\xe3o|cor\\\xe7ario|cor\\\xe7\\\xe1rio|cornprimidosinbo|cr\\\xe2neo|dE|defeni\\\xe7\\\xe3o|defenido|defenir|deficite|degladiar|deiche|desinteria|despendio|desp\\\xeandio|desplic\\\xeancia|dificulidade|dispender|dispendio|distribuido|dru\\\xedda|\\\xe9cr\\\xe3|ecran|\\\xe9cran|\\\xeale|elice|\\\xe9lice|emiratos|engolis\\-te|engulir|enguliste|entertido|entitular|entreterimento|entreti\\-me|env\\\xf3lucro|er\\\xf3i|escluir|esclus\\\xe3o|escriv\\\xf5es|esqueiro|esquesito|estacoes|esteje|excava\\\xe7\\\xe3o|excavar|exdr\\\xfaxula|exdr\\\xfaxulas|exitar|explicacoes|exquisito|extende|extender|f\\\xe0cilmenfe|f\\\xe0cilmente|fariam\\-lhe|FARM\\\xc1ClAS|farmec\\\xeautico|fassa|f\\\xe9bre|fecula|f\\\xe9mea|femenino|femininismo|f\\\xedsiologista|fiz\\\xe9mos|fizes\\-te|fl\\\xf4r|for\\\xe3o|formalisar|f\\\xf4ro|fos\\-te|frag\\\xe2ncia|fran\\\xe7\\\xeas|frasqutnho|frustado|fur\\\xe1|gaz|g\\\xe1z|geito|geneceu|geropiga|glic\\\xe9mia|gorgeta|grangear|guizar|hectar|herm\\\xe9ticamente|hernia|higi\\\xe9ne|hilariedade|hiperac\\\xeddez|hontem|igiene|igienico|igi\\\xe9nico|igreija|iguasu|ilac\\\xe7\\\xe3o|imbigo|impecilho|\\\xedncas|inc\\\xeasto|inclusiv\\\xe9|inc\\\xf4modos|incontest\\\xe1velmente|incontest\\\xe0velmente|indespens\\\xe1veis|indespens\\\xe1vel|India|indiguina\\\xe7\\\xe3o|indiguinado|indiguinar|inflac\\\xe7\\\xe3o|ingreja|INSCRICOES|intens\\\xe3o|intertido|intoxica|intrega|inveros\\\xedmel|iorgute|ipop\\\xf3tamo|ipsilon|ipslon|isquesito|ju\\\xedz|juiza|j\\\xfaniores|justanzente|juz|kilo|laborat\\\xf3rio\\-porque|ladravaz|lament\\\xe0velmente|lampe\\\xe3o|largartixa|largarto|l\\\xeam|leuc\\\xe9mia|licensa|lingu\\\xedsta|lisongear|logista|ma\\\xe7ajar|Macfadden\\-o|mae|magestade|m\\\xe3gua|mangerico|mangerona|manteem\\-se|mantega|mantem\\-se|massi\\\xe7o|massisso|m\\\xe9dica\\-Rio|menistro|merciaria|metrelhadora|miscegena\\\xe7\\\xe3o|misogenia|misogeno|mis\\\xf3geno|m\\\xba|m\\\xf4lho|monument\\\xe2nea|mortandela|morteIa|muinto|nasaias|n\\\xeale|nest|Nivea|nonagessimo|nonag\\\xe9ssimo|nornal|not\\\xe0velmente|obcess\\\xe3o|obesidae|\\\xf3bviamente|\\\xf2bviamente|ofecina|oje|omem|opcoes|op\\\xf3brio|opr\\\xf3bio|orf\\\xe3o|organigrama|organisar|org\\\xe3o|orta|\\\xf3tima|\\\xf3timos|paraliza\\\xe7\\\xe3o|paralizado|paralizar|par\\\xe1ste|P\\\xe1tria|pa\\\xfal|pecal\\\xe7o|p\\\xeaga|periodo|pertubar|per\\\xfa|piqueno|pirin\\\xe9us|poblema|pobrema|poden|poder\\-mos|ponteagudo|pontuacoes|prazeiroso|precaridade|precizar|preserveran\\\xe7a|previl\\\xe9gio|prim\\\xe1ria\\-que|pri\\\xfado|probalidade|progreso|proib\\\xeddo|pro\\\xedbido|pr\\\xf3pia|propiedade|propio|pr\\\xf3pio|provocacoes|prsen\\\xe7a|prustituta|pud\\\xe9rmos|p\\\xfalico|p\\\xfas|pus\\\xe9mos|quadricomia|quadriplicado|quaisqueres|quer\\-a|quere\\-se|quer\\-o|qu\\\xedmco|quises\\-te|quizer|quizeram|quizesse|quizessem|ra\\\xednha|ra\\\xedz|raizes|ratato|ra\\\xfal|razar|rectaguarda|r\\\xe9dia|reestabelecer|refeicoes|ref\\\xearencia|regeitar|regurjitar|reinvidica\\\xe7\\\xe3o|reinvidicar|requer\\-a|requere\\-se|requer\\-o|requesito|requisicoes|RESIDENCIA|respira\\\xe7\\\xe1o|restablecer|r\\\xe9stea|ruborisar|r\\\xfabrica|s\\\xe0dia|saiem|salchicha|salchichas|saloice|salv\\\xe9|salve\\-ra\\\xednha|salv\\\xe9\\-rainha|salv\\\xe9\\-ra\\\xednha|sao|sargeta|se\\\xe7\\\xf5es|seija|seissentos|seje|semiar|s\\\xe9niores|sensibilidadc|sens\\\xedvelmente|setessentos|siclano|Sifilis|sif\\\xedlis|sin\\\xe3o|sinmtoma|sint\\\xe9ticamente|sintetisa|S\\\xd3|s\\\xf4fra|s\\\xf4fregamente|som\\\xe1ste|sombracelha|sombrancelha|sombrancelhas|suavisar|substituido|suburbio|suI|Sui\\\xe7a|sui\\\xe7as|sui\\\xe7o|sui\\\xe7os|sup\\\xf4r|tabeli\\\xf5es|ta\\\xednha|tava|t\\\xeaem|telemovel|tel\\\xe9movel|terminacoes|tor\\\xe1xico|tou|transp\\\xf4r|trasnporte|tumors|\\\xfamida|umidade|vai\\-vem|vegil\\\xe2ncia|vegilante|vento\\\xednha|veros\\\xedmel|video|virus|visiense|vo\\\xe7e|vo\\\xe7\\\xea|v\\\xf4o|xadr\\\xeas|xafariz|x\\\xe9x\\\xe9|xilindr\\\xf3|za\\\xedre|zepelin|zig\\-zag|zo\\\xf4|z\\\xf4o|zuar|zum\\-zum)(\\b|$)'}},
+ 'rus': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'\u041d\u0404\u0419', u'\u041d\u0415\u0419'), (u'\u041e\u0420\u0413\u0417\u041d\u0418\u0417\u041c\u041e\u0411', u'\u041e\u0420\u0413\u0410\u041d\u0418\u0417\u041c\u0410'), (u'\u0427\u04570', u'\u0427\u0422\u041e'), (u'\u041d\u042d', u'\u041d\u0410'), (u'\u0421\u041e\u0421\u0404\u0414\u041d\u042e\u042e', u'\u0421\u041e\u0421\u0415\u0414\u041d\u042e\u042e'), (u'\u041f\u041b\u0417\u041d\u0404\u0422\u0423', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0423'), (u'\u0417\u0417\u0413\u042d\u0414\u041e\u041a', u'\u0417\u0410\u0413\u0410\u0414\u041e\u041a'), (u'\u0421\u041e\u0422\u0412\u041e\u0420\u0404\u041d\u0418\u042f', u'\u0421\u041e\u0422\u0412\u041e\u0420\u0415\u041d\u0418\u042f'), (u'\u041c\u0418\u0420\u042d', u'\u041c\u0418\u0420\u0410'), (u'\u041f\u041e\u042f\u0411\u041b\u0404\u041d\u0418\u042f', u'\u041f\u041e\u042f\u0412\u041b\u0415\u041d\u0418\u042f'), (u'\u0417\u0404\u041c\u041b\u0404', u'\u0417\u0415\u041c\u041b\u0415'), (u'\u0404\u0429\u0404', u'\u0415\u0429\u0401'), (u'\u0422\u0404\u041c\u041d\u042c\u0406\u0425', u'\u0422\u0415\u041c\u041d\u042b\u0425'), (u'\u0421\u0404\u0420\u042c\u0404\u0417\u041d\u042c\u0406\u041c', u'\u0421\u0415\u0420\u042c\u0415\u0417\u041d\u042b\u041c'), (u'\u041f\u041e\u0428\u0406\u04060', u'\u041f\u041e\u0428\u041b\u041e'), (u'\u041f\u04400\u0418\u04170\u0428\u0404\u041b', u'\u041f\u0420\u041e\u0418\u0417\u041e\u0428\u0415\u041b'), (u'\u0421\u0404\u041a\u0420\u0404\u0422\u042d\u041c\u0418', u'\u0421\u0415\u041a\u0420\u0415\u0422\u0410\u041c\u0418'), (u'\u041c\u042d\u0422\u0404\u0420\u0418\u0417\u041b\u042c\u0406', u'\u041c\u0410\u0422\u0415\u0420\u0418\u0410\u041b\u042b'), (u'\u041f\u042f\u0422\u0404\u041d', u'\u041f\u042f\u0422\u0415\u041d'), (u'\u041f\u041b\u0430\u041d\u0404\u0457\u0404', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0415'), (u'\u041a\u0417\u0422\u042d\u041a\u041b\u0418\u0417\u041c', u'\u041a\u0410\u0422\u0410\u041a\u041b\u0418\u0417\u041c'), (u'\u041e\u041a\u0417\u0417\u0417\u041b\u0421\u042f', u'\u041e\u041a\u0410\u0417\u0410\u041b\u0421\u042f'), (u'\u0414\u042d\u041b\u042c\u0428\u0415', u'\u0414\u0410\u041b\u042c\u0428\u0415'), (u'\u0422\u0412\u041a', u'\u0422\u0410\u041a'), (u'\u041f\u041b\u0417\u041d\u0404\u0422\u0417', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0410'), (u'\u0427\u0404\u0413\u041e', u'\u0427\u0415\u0413\u041e'), (u'\u0423\u0417\u041d\u042d\u0422\u042c', u'\u0423\u0417\u041d\u0410\u0422\u042c'), (u'\u041f\u041b\u042d\u041d\u0404\u0422\u0404', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0415'), (u'\u041d\u0404\u041c', u'\u041d\u0415\u041c'), (u'\u0411\u041e\u0417\u041c\u041e\u0416\u041d\u0417', u'\u0412\u041e\u0417\u041c\u041e\u0416\u041d\u0410'), (u'\u0421\u041e\u0411\u0404\u0420\u0428\u0404\u041d\u041d\u041e', u'\u0421\u041e\u0412\u0415\u0420\u0428\u0415\u041d\u041d\u041e'), (u'\u0418\u041d\u042d\u0427\u0404', u'\u0418\u041d\u0410\u0427\u0415'), (u'\u0411\u0421\u0404', u'\u0412\u0421\u0415'), (u'\u041d\u0415\u0414\u041e\u0421\u0422\u0417\u0422\u041a\u0418', u'\u041d\u0415\u0414\u041e\u0421\u0422\u0410\u0422\u041a\u0418'), (u'\u041d\u041e\u0412\u042c\u0406\u0404', u'\u041d\u041e\u0412\u042b\u0415'), (u'\u0412\u0404\u041b\u0418\u041a\u041e\u041b\u0404\u041f\u041d\u042d\u042f', u'\u0412\u0415\u041b\u0418\u041a\u041e\u041b\u0415\u041f\u041d\u0410\u042f'), (u'\u041e\u0421\u0422\u042d\u0406\u0406\u041e\u0421\u042c', u'\u041e\u0421\u0422\u0410\u041b\u041e\u0421\u042c'), (u'\u041d\u0417\u041b\u0418\u0427\u0418\u0404', u'\u041d\u0410\u041b\u0418\u0427\u0418\u0415'), (u'\u0431\u042b', u'\u0431\u044b'), (u'\u041f\u0420\u041e\u0426\u0412\u0415\u0422\u0412\u0422\u042c', u'\u041f\u0420\u041e\u0426\u0412\u0415\u0422\u0410\u0422\u042c'), (u'\u041a\u0417\u041a', u'\u041a\u0410\u041a'), (u'\u0412\u041e\u0414\u0417', u'\u0412\u041e\u0414\u0410'), (u'\u041d\u0417\u0428\u0415\u041b', u'\u041d\u0410\u0428\u0415\u041b'), (u'\u041d\u0404', u'\u041d\u0415'), (u'\u0422\u041e\u0416\u0404', u'\u0422\u041e\u0416\u0415'), (u'\u0412\u0423\u041b\u041a\u042d\u041d\u0418\u0427\u0404\u0421\u041a\u041e\u0419', u'\u0412\u0423\u041b\u041a\u0410\u041d\u0418\u0427\u0415\u0421\u041a\u041e\u0419'), (u'\u042d\u041a\u0422\u0418\u0411\u041d\u041e\u0421\u0422\u0418', u'\u0410\u041a\u0422\u0418\u0412\u041d\u041e\u0421\u0422\u0418'), (u'\u041f\u041e\u042f\u0412\u0418\u041b\u0417\u0421\u042c', u'\u041f\u041e\u042f\u0412\u0418\u041b\u0410\u0421\u042c'), (u'\u041d\u041e\u0412\u0417\u042f', u'\u041d\u041e\u0412\u0410\u042f'), (u'\u0421\u0422\u0420\u042d\u0422\u0404\u0413\u0418\u042f', u'\u0421\u0422\u0420\u0410\u0422\u0415\u0413\u0418\u042f'), (u'\u0423\u0421\u041f\u0404\u0428\u041d0', u'\u0423\u0421\u041f\u0415\u0428\u041d\u041e'), (u'\u041f\u041e\u0421\u0417\u0414\u041a\u0423', u'\u041f\u041e\u0421\u0410\u0414\u041a\u0423'), (u'\u0413\u041e\u0422\u041e\u0411\u042b', u'\u0413\u041e\u0422\u041e\u0412\u042b'), (u'\u041d\u0417\u0427\u0417\u0422\u042c', u'\u041d\u0410\u0427\u0410\u0422\u042c'), (u'\u041e\u0425\u041e\u0422\u042d', u'\u041e\u0425\u041e\u0422\u0410'), (u'\u041f\u0420\u0418\u0417\u041d\u0417\u041a\u0417\u041c\u0418', u'\u041f\u0420\u0418\u0417\u041d\u0410\u041a\u0410\u041c\u0418'), (u'\u041f\u04400\u0428\u041b\u041e\u041c', u'\u041f\u0420\u041e\u0428\u041b\u041e\u041c'), (u'\u041d\u042d\u0421\u0422\u041e\u042f\u0429\u0404\u041c', u'\u041d\u0410\u0421\u0422\u041e\u042f\u0429\u0415\u041c'), (u'\u041f\u0423\u0421\u0422\u041e\u0422\u0417\u0425', u'\u041f\u0423\u0421\u0422\u041e\u0422\u0410\u0425'), (u'\u0411\u041b\u0417\u0416\u041d\u041e\u0419', u'\u0412\u041b\u0410\u0416\u041d\u041e\u0419'), (u'\u041f\u041e\u0427\u0411\u0404', u'\u041f\u041e\u0427\u0412\u0415'), (u'\u041c\u042c\u0406', u'\u041c\u042b'), (u'\u0421\u0404\u0419\u0427\u0417\u0421', u'\u0421\u0415\u0419\u0427\u0410\u0421'), (u'\u0404\u0421\u041b\u0418', u'\u0415\u0421\u041b\u0418'), (u'\u0417\u0417\u0422\u0420\u041e\u041d\u0415\u041c', u'\u0417\u0410\u0422\u0420\u041e\u041d\u0415\u041c'), (u'\u041e\u041f\u0417\u0421\u0417\u0404\u041c\u0421\u042f', u'\u041e\u041f\u0410\u0421\u0410\u0415\u041c\u0421\u042f'), (u'\u0421\u0418\u041b\u042c\u041d0', u'\u0421\u0418\u041b\u042c\u041d\u041e'), (u'\u041e\u0422\u041b\u0418\u0427\u0417\u0404\u0422\u0421\u042f', u'\u041e\u0422\u041b\u0418\u0427\u0410\u0415\u0422\u0421\u042f'), (u'\u0420\u042d\u041d\u042c\u0428\u0404', u'\u0420\u0410\u041d\u042c\u0428\u0415'), (u'\u041d\u0417\u0417\u042c\u0406\u0412\u0417\u042e\u0422', u'\u041d\u0410\u0417\u042b\u0412\u0410\u042e\u0422'), (u'\u0422\u0404\u041a\u041b3', u'\u0422\u0415\u041a\u041b\u0410'), (u'\u041e\u0421\u0417\u0414\u041e\u0427\u041d\u042b\u041c\u0418', u'\u041e\u0421\u0410\u0414\u041e\u0427\u041d\u042b\u041c\u0418'), (u'\u041f\u041e\u0421\u0422\u0404\u041f\u0404\u041d\u041d0', u'\u041f\u041e\u0421\u0422\u0415\u041f\u0415\u041d\u041d\u041e'), (u'\u0418\u0421\u041f\u042d\u0420\u042f\u041b\u0417\u0421\u042c', u'\u0418\u0421\u041f\u0410\u0420\u042f\u041b\u0410\u0421\u042c'), (u'\u0404\u041e\u041b\u042c\u0428\u041e\u0404', u'\u0411\u041e\u041b\u042c\u0428\u041e\u0415'), (u'\u041a\u041e\u041b\u0418\u0427\u0404\u0421\u0422\u0411\u041e', u'\u041a\u041e\u041b\u0418\u0427\u0415\u0421\u0422\u0412\u041e'), (u'\u0413\u0404\u041c\u0417\u0422\u0418\u0422\u0415', u'\u0413\u0415\u041c\u0410\u0422\u0418\u0422\u0410'), (u'\u041f\u041e\u041b\u0423\u0427\u042d\u0404\u0422', u'\u041f\u041e\u041b\u0423\u0427\u0410\u0415\u0422'), (u'\u041d\u0404\u0414\u041e\u0421\u0422\u0417\u0427\u041d0', u'\u041d\u0415\u0414\u041e\u0421\u0422\u0410\u0422\u041e\u0427\u041d\u041e'), (u'\u041f\u0418\u0422\u042d\u041d\u0418\u042f', u'\u041f\u0418\u0422\u0410\u041d\u0418\u042f'), (u'\u041f\u041e\u041a\u0417', u'\u041f\u041e\u041a\u0410'), (u'\u0411\u042c\u0406\u0425\u041e\u0414\u0418\u041b\u0418', u'\u0412\u042b\u0425\u041e\u0414\u0418\u041b\u0418'), (u'\u0417\u0404\u041c\u0406\u0406\u0404', u'\u0417\u0415\u041c\u041b\u0415'), (u'\u0412\u0404\u0421\u042c\u0406\u0418\u0417', u'\u0412\u0415\u0421\u042c\u041c\u0410'), (u'\u0417\u0404\u041c\u041b\u0418', u'\u0417\u0415\u041c\u041b\u0418'), (u'\u0431\u042c\u0406\u041b\u041e', u'\u0411\u042b\u041b\u041e'), (u'\u041a\u0418\u0417\u041d\u0418', u'\u0416\u0418\u0417\u041d\u0418'), (u'\u0421\u0422\u0417\u041d\u041e\u0412\u0418\u041b\u0417\u0421\u042c', u'\u0421\u0422\u0410\u041d\u041e\u0412\u0418\u041b\u0410\u0421\u042c'), (u'\u0421\u041e\u041b\u0404\u041d\u0404\u0404', u'\u0421\u041e\u041b\u0401\u041d\u0415\u0415'), (u'\u041c\u042d\u0413\u041d\u0418\u0422\u041d\u042b\u041c', u'\u041c\u0410\u0413\u041d\u0418\u0422\u041d\u042b\u041c'), (u'\u0427\u0422\u041e\u0431\u042c\u0406', u'\u0427\u0422\u041e\u0411\u042b'), (u'\u0421\u041e\u0417\u0414\u0415\u0422\u042c', u'\u0421\u041e\u0417\u0414\u0410\u0422\u042c'), (u'\u041c\u0417\u0413\u041d\u0418\u0422\u041d\u041e\u0404', u'\u041c\u0410\u0413\u041d\u0418\u0422\u041d\u041e\u0415'), (u'\u041a\u042d\u0416\u0423\u0422\u0421\u042f', u'\u041a\u0410\u0416\u0423\u0422\u0421\u042f'), (u'\u041e\u0417\u041d\u0417\u0427\u0417\u0404\u0422', u'\u041e\u0417\u041d\u0410\u0427\u0410\u0415\u0422'), (u'\u041c\u041e\u0413\u041b\u0417', u'\u041c\u041e\u0413\u041b\u0410'), (u'\u0418\u041c\u0404\u0422\u042c', u'\u0418\u041c\u0415\u0422\u042c'), (u'\u041a\u041e\u0421\u041c\u041e\u0421\u042d', u'\u041a\u041e\u0421\u041c\u041e\u0421\u0410'), (u'\u0421\u041e\u041b\u041d\u0404\u0427\u041d\u0417\u042f', u'\u0421\u041e\u041b\u041d\u0415\u0427\u041d\u0410\u042f'), (u'\u0421\u0418\u0421\u0422\u0404\u041c\u0417', u'\u0421\u0418\u0421\u0422\u0415\u041c\u0410'), (u'\u041f\u041e\u0421\u0406\u0406\u0423\u0416\u0418\u041b\u041e', u'\u041f\u041e\u0421\u041b\u0423\u0416\u0418\u041b\u041e'), (u'\u041c\u0417\u0413\u041d\u0418\u0422\u041d\u041e\u0413\u041e', u'\u041c\u0410\u0413\u041d\u0418\u0422\u041d\u041e\u0413\u041e'), (u'\u041f\u041b\u0412\u041d\u0404\u0422\u042b', u'\u041f\u041b\u0410\u041d\u0415\u0422\u042b'), (u'\u041b\u041e\u041a\u0417\u041b\u042c\u041d\u042c\u0406\u0425', u'\u041b\u041e\u041a\u0410\u041b\u042c\u041d\u042b\u0425'), (u'\u041f\u041e\u041b\u0404\u0419', u'\u041f\u041e\u041b\u0415\u0419'), (u'\u041a\u0417\u0416\u0423\u0422\u0421\u042f', u'\u041a\u0410\u0416\u0423\u0422\u0421\u042f'), (u'\u041a\u0417\u041a\u041e\u0413\u041e', u'\u041a\u0410\u041a\u041e\u0413\u041e'), (u'\u0421\u0422\u0420\u0417\u0428\u041d\u041e\u0413\u041e', u'\u0421\u0422\u0420\u0410\u0428\u041d\u041e\u0413\u041e'), (u'\u0421\u0422\u041e\u041b\u041a\u041d\u041e\u0415\u0404\u041d\u0418\u042f', u'\u0421\u0422\u041e\u041b\u041a\u041d\u041e\u0412\u0415\u041d\u0418\u042f'), (u'\u041c\u0415\u0421\u0422\u0417\u041c\u0418', u'\u041c\u0415\u0421\u0422\u0410\u041c\u0418'), (u'\u0421\u0414\u0404\u041b\u0417\u0422\u042c', u'\u0421\u0414\u0415\u041b\u0410\u0422\u042c'), (u'\u0421\u0422\u0417\u041b\u041e', u'\u0421\u0422\u0410\u041b\u041e'), (u'\u041c\u042d\u0413\u041d\u0418\u0422\u041d\u041e\u0413\u041e', u'\u041c\u0410\u0413\u041d\u0418\u0422\u041d\u041e\u0413\u041e'), (u'\u0417\u0417\u041a\u041b\u042e\u0427\u0417\u0412\u0428\u0404\u0419\u0421\u042f', u'\u0417\u0410\u041a\u041b\u042e\u0427\u0410\u0412\u0428\u0415\u0419\u0421\u042f'), (u'\u0404\u0413\u041e', u'\u0415\u0413\u041e'), (u'\u042f\u0414\u0420\u0404', u'\u042f\u0414\u0420\u0415'), (u'\u041d\u0417', u'\u041d\u0410'), (u'\u0418\u0421\u0427\u0404\u0417\u041b3', u'\u0418\u0421\u0427\u0415\u0417\u041b\u0410'), (u'\u0421\u0427\u0418\u0422\u0417\u042e', u'\u0421\u0427\u0418\u0422\u0410\u042e'), (u'\u0428\u042d\u041d\u0421\u042b', u'\u0428\u0410\u041d\u0421\u042b'), (u'\u0418\u041d\u0417\u0427\u0404', u'\u0418\u041d\u0410\u0427\u0415'), (u'\u0421\u0422\u0417\u041b', u'\u0421\u0422\u0410\u041b'), (u'\u0422\u0420\u0417\u0422\u0418\u0422\u042c', u'\u0422\u0420\u0410\u0422\u0418\u0422\u042c'), (u'\u041d\u0417\u041f\u0420\u0417\u0412\u041b\u042f\u0404\u0422\u0421\u042f', u'\u041d\u0410\u041f\u0420\u0410\u0412\u041b\u042f\u0415\u0422\u0421\u042f'), (u'\u041e\u0411\u041b\u042d\u0421\u0422\u0418', u'\u041e\u0411\u041b\u0410\u0421\u0422\u0418'), (u'\u042f\u0412\u041b\u042f\u0406\u041e\u0422\u0421\u042f', u'\u042f\u0412\u041b\u042f\u042e\u0422\u0421\u042f'), (u'\u0413\u041b\u042d\u0412\u041d\u041e\u0419', u'\u0413\u041b\u0410\u0412\u041d\u041e\u0419'), (u'\u0414\u041e\u041a\u0417\u0417\u0417\u0422\u0404\u041b\u042c\u0421\u0422\u0412', u'\u0414\u041e\u041a\u0410\u0417\u0410\u0422\u0415\u041b\u042c\u0421\u0422\u0412'), (u'\u041a\u0418\u0421\u041b\u041e\u0422\u042d\u041c\u0418', u'\u041a\u0418\u0421\u041b\u041e\u0422\u0410\u041c\u0418'), (u'\u041e\u041d\u042d', u'\u041e\u041d\u0410'), (u'\u041f\u0420\u0417\u041a\u0422\u0418\u0427\u0404\u0421\u041a\u0418', u'\u041f\u0420\u0410\u041a\u0422\u0418\u0427\u0415\u0421\u041a\u0418'), (u'\u041b\u0404\u0421\u0423', u'\u041b\u0415\u0421\u0423'), (u'\u0423\u0421\u041b\u041e\u0411\u0418\u042f\u041c', u'\u0423\u0421\u041b\u041e\u0412\u0418\u042f\u041c'), (u'\u0421\u041f\u0417\u0421\u0422\u0418\u0421\u042c', u'\u0421\u041f\u0410\u0421\u0422\u0418\u0421\u042c'), (u'\u0420\u0417\u0417\u0412\u0418\u0412\u0417\u042e\u0429\u0418\u0404\u0421\u042f', u'\u0420\u0410\u0417\u0412\u0418\u0412\u0410\u042e\u0429\u0418\u0415\u0421\u042f'), (u'\u0428\u042d\u041f\u041a\u0418', u'\u0428\u0410\u041f\u041a\u0418'), (u'\u0417\u041d\u0417\u0404\u041c', u'\u0417\u041d\u0410\u0415\u041c'), (u'\u0421\u041e\u041e\u0418\u0420\u042d\u0404\u041c\u0421\u042f', u'\u0421\u041e\u0411\u0418\u0420\u0410\u0415\u041c\u0421\u042f'), (u'\u0411\u042b\u042f\u0421\u041d\u0418\u0422\u042c', u'\u0412\u042b\u042f\u0421\u041d\u0418\u0422\u042c'), (u'\u0421\u0417\u041c', u'\u0421\u0410\u041c'), (u'\u0420\u0417\u0421\u041f\u041e\u0417\u041d\u0417\u0422\u042c', u'\u0420\u0410\u0421\u041f\u041e\u0417\u041d\u0410\u0422\u042c'), (u'\u0423\u0417\u041d\u0417\u0422\u042c', u'\u0423\u0417\u041d\u0410\u0422\u042c'), (u'\u041a\u042d\u0416\u0404\u0422\u0421\u042f', u'\u041a\u0410\u0416\u0415\u0422\u0421\u042f'), (u'\u041e\u0420\u0404\u0418\u0422\u0417\u041b\u042c\u041d\u042c\u0406\u0404', u'\u041e\u0420\u0411\u0418\u0422\u0410\u041b\u042c\u041d\u042b\u0415'), (u'\u041b\u0404\u0422\u042d\u0422\u0404\u041b\u042c\u041d\u042c\u0406\u0404', u'\u041b\u0415\u0422\u0410\u0422\u0415\u041b\u042c\u041d\u042b\u0415'), (u'\u0417\u041f\u041f\u0417\u0420\u0415\u0422\u042c\u0406', u'\u0410\u041f\u041f\u0410\u0420\u0410\u0422\u042b'), (u'\u0416\u0404', u'\u0416\u0415'), (u'\u0422\u0417\u041a\u0417\u042f', u'\u0422\u0410\u041a\u0410\u042f'), (u'\u041c\u0417\u041b\u0404\u041d\u042c\u041a\u0417\u042f', u'\u041c\u0410\u041b\u0415\u041d\u042c\u041a\u0410\u042f'), (u'\u041f\u041b\u042d\u041d\u0404\u0422\u0417', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0410'), (u'\u0421\u041f\u0417\u0406\u0406\u042c\u041a\u041e', u'\u0421\u0422\u041e\u041b\u042c\u041a\u041e'), (u'\u0431\u042c\u0406\u041b3', u'\u0411\u042b\u041b\u0410'), (u'\u0401\u0415\u0421\u0427\u0418\u0421\u041b\u0404\u041d\u041d\u041e\u0404', u'\u0411\u0415\u0421\u0427\u0418\u0421\u041b\u0415\u041d\u041d\u041e\u0415'), (u'\u041c\u0417\u0413\u041d\u0418\u0457\u041d\u042c\u0406\u0425', u'\u041c\u0410\u0413\u041d\u0418\u0422\u041d\u042b\u0425'), (u'\u041f\u041e\u0421\u0422\u0440\u0430\u04143\u041b', u'\u041f\u041e\u0421\u0422\u0420\u0410\u0414\u0410\u041b'), (u'\u0414\u0417\u0416\u0404', u'\u0414\u0410\u0416\u0415'), (u'\u0420\u0417\u0417\u041d\u042c\u0406\u041c\u0418', u'\u0420\u0410\u0417\u041d\u042b\u041c\u0418'), (u'\u0421\u0423\u0429\u0404\u0421\u0422\u0411\u041e\u0412\u042d\u041d\u0418\u0404', u'\u0421\u0423\u0429\u0415\u0421\u0422\u0412\u041e\u0412\u0410\u041d\u0418\u0415'), (u'\u041f\u041b\u0430\u041d\u0404\u0457\u042c\u0406', u'\u041f\u041b\u0410\u041d\u0415\u0422\u042b'), (u'\u041f\u041e\u0414\u0412\u0404\u0420\u0413\u041b\u0417\u0421\u042c', u'\u041f\u041e\u0414\u0412\u0415\u0420\u0413\u041b\u0410\u0421\u042c'), (u'\u041e\u041f\u0417\u0421\u0406-\u0406\u041e\u0421\u0422\u0418', u'\u041e\u041f\u0410\u0421\u041d\u041e\u0421\u0422\u0418'), (u'\u041f\u041b\u0417\u041d\u0404\u0422\u0404', u'\u041f\u041b\u0410\u041d\u0415\u0422\u0415'), (u'\u041d0', u'\u041d\u041e'), (u'\u0431\u042c\u0406', u'\u0411\u042b'), (u'\u041e\u0422\u0414\u0417\u041b\u0404\u041d\u041d\u042b\u0404', u'\u041e\u0422\u0414\u0410\u041b\u0401\u041d\u041d\u042b\u0415'), (u'\u041f\u041e\u041b\u042f\u0420\u041d\u042c\u0406\u0404', u'\u041f\u041e\u041b\u042f\u0420\u041d\u042b\u0415'), (u'\u0426\u0404\u041b\u042c\u0406-\u041e', u'\u0426\u0415\u041b\u042c\u042e'), (u'\u041f\u0404\u0429\u0404\u0420\u0417\u0425', u'\u041f\u0415\u0429\u0415\u0420\u0410\u0425'), (u'\u041d\u0417\u041f\u041e\u041b\u041d\u0404\u041d\u041d\u042c\u0406\u0425', u'\u041d\u0410\u041f\u041e\u041b\u041d\u0415\u041d\u041d\u042b\u0425'), (u'\u0418\u0421\u041f\u0417\u0420\u0404\u041d\u0418\u042f\u041c\u0418', u'\u0418\u0421\u041f\u0410\u0420\u0415\u041d\u0418\u042f\u041c\u0418'), (u'\u041c\u0418\u041d\u0418\u0417\u0422\u042e\u0420\u041d\u042c\u0406\u0404', u'\u041c\u0418\u041d\u0418\u0410\u0422\u042e\u0420\u041d\u042b\u0415'), (u'\u0422\u042d\u041a\u0417\u042f', u'\u0422\u0410\u041a\u0410\u042f'), (u'\u041f\u0440\u0418\u0421\u041f0\u0421\u041e\u0431\u0418\u0422\u042c\u0421\u042f', u'\u041f\u0420\u0418\u0421\u041f\u041e\u0421\u041e\u0411\u0418\u0422\u042c\u0421\u042f'), (u'\u041d\u0404\u041e\u0404\u0425\u041e\u0414\u0418\u041c\u042c\u0406\u0404', u'\u041d\u0415\u041e\u0411\u0425\u041e\u0414\u0418\u041c\u042b\u0415'), (u'\u041e\u0420\u0413\u0412\u041d\u0418\u0427\u0404\u0421\u041a\u0418\u0404', u'\u041e\u0420\u0413\u0410\u041d\u0418\u0427\u0415\u0421\u041a\u0418\u0415'), (u'\u041c\u0417\u0420\u0421\u0418\u0417\u041d\u0421\u041a\u0418\u0404', u'\u041c\u0410\u0420\u0421\u0418\u0410\u041d\u0421\u041a\u0418\u0415'), (u'\u041c\u0404\u0421\u0422\u0404', u'\u041c\u0415\u0421\u0422\u0415'), (u'\u0406\\/\u0406\u0410\u041a\u041a\u0415\u0419\u0428', u'\u041c\u0410\u041a\u041a\u0415\u0419\u041d'), (u'\u041d\u0417\u0425\u041e\u0414\u042f\u0429\u0418\u0404\u0421\u042f', u'\u041d\u0410\u0425\u041e\u0414\u042f\u0429\u0418\u0415\u0421\u042f'), (u'\u041d\u0404\u0417\u041a\u0422\u0418\u0412\u041d\u041e\u041c', u'\u041d\u0415\u0410\u041a\u0422\u0418\u0412\u041d\u041e\u041c'), (u'\u0417\u042d\u0421\u041d\u042f\u0422\u042c', u'\u0417\u0410\u0421\u041d\u042f\u0422\u042c'), (u'\u041e\u0420\u0413\u0417\u041d\u0418\u0417\u041c\u042c\u0406', u'\u041e\u0420\u0413\u0410\u041d\u0418\u0417\u041c\u042b'), (u'\u0412\u0417\u0415\u0418\u041c\u041e\u0414\u0404\u0419\u0421\u0422\u0412\u041e\u0412\u0415\u0422\u042c', u'\u0412\u0417\u0410\u0418\u041c\u041e\u0414\u0415\u0419\u0421\u0422\u0412\u041e\u0412\u0410\u0422\u042c'), (u'\u041f\u0423\u0422\u0404\u0428\u0404\u0421\u0422\u0411\u0418\u0404', u'\u041f\u0423\u0422\u0415\u0428\u0415\u0421\u0422\u0412\u0418\u0415'), (u'\u041f\u0443\u0421\u0457\u042c\u0406\u041d\u041d\u042b\u0425', u'\u041f\u0423\u0421\u0422\u042b\u041d\u041d\u042b\u0425'), (u'\u0422\u0417\u041a\u0418\u0425', u'\u0422\u0410\u041a\u0418\u0425'), (u'\u041f\u0404\u0420\u0404\u0422\u0417\u0421\u041a\u0418\u0412\u0417\u0404\u041c', u'\u041f\u0415\u0420\u0415\u0422\u0410\u0421\u041a\u0418\u0412\u0410\u0415\u041c'), (u'\u0427\u04220', u'\u0427\u0422\u041e'), (u'\u0412\u0404\u0421\u042c\u041c\u0417', u'\u0412\u0415\u0421\u042c\u041c\u0410'), (u'\u041f\u041e\u041b\u041e\u0421\u0417\u041c\u0418', u'\u041f\u041e\u041b\u041e\u0421\u0410\u041c\u0418'), (u'\u041e\u0440\u0457\u042d\u041d\u0418\u0417\u041c\u042c\u0406', u'\u041e\u0420\u0413\u0410\u041d\u0418\u0417\u041c\u042b'), (u'\u041e\u0401\u041b\u0417\u0421\u0422\u0418', u'\u041e\u0411\u041b\u0410\u0421\u0422\u0418'), (u'\u042f\u0411\u041b\u042f\u042e\u0422\u0421\u042f', u'\u042f\u0412\u041b\u042f\u042e\u0422\u0421\u042f'), (u'\u0426\u0404\u041b\u042c\u042e', u'\u0426\u0415\u041b\u042c\u042e'), (u'\u041f\u041e\u0418\u0421\u041a\u041e\u0411', u'\u041f\u041e\u0418\u0421\u041a\u041e\u0412'), (u'\u0414\u041e\u041a\u0417\u0417\u0417\u0422\u0404\u0406\u0406\u042c\u0421\u0422\u0412', u'\u0414\u041e\u041a\u0410\u0417\u0410\u0422\u0415\u041b\u042c\u0421\u0422\u0412'), (u'\u041c\u041e\u0416\u0404\u0422', u'\u041c\u041e\u0416\u0415\u0422'), (u'\u041d\u042d\u0425\u041e\u0414\u0418\u0422\u042c\u0421\u042f', u'\u041d\u0410\u0425\u041e\u0414\u0418\u0422\u042c\u0421\u042f'), (u'\u041e\u0427\u0404\u041d\u042c', u'\u041e\u0427\u0415\u041d\u042c'), (u'\u0421\u0420\u0417\u0412\u041d\u0418\u0422\u042c', u'\u0421\u0420\u0410\u0412\u041d\u0418\u0422\u042c'), (u'\u041e\u0404\u041d\u0417\u0420\u0423\u0416\u0418\u041b', u'\u041e\u0411\u041d\u0410\u0420\u0423\u0416\u0418\u041b'), (u'\u041b\u042c\u0414\u0417', u'\u041b\u042c\u0414\u0410'), (u'\u041f\u041e\u0422\u0404\u041f\u041b\u0404\u041d\u0418\u0404\u0406\u0418', u'\u041f\u041e\u0422\u0415\u041f\u041b\u0415\u041d\u0418\u0415\u041c'), (u'\u041f\u041e\u0425\u041e\u041b\u041e\u0414\u0417\u041d\u0418\u0404\u0411\u0414', u'\u041f\u041e\u0425\u041e\u041b\u041e\u0414\u0410\u041d\u0418\u0415\u041c'), (u'\u041a\u042d\u041a', u'\u041a\u0410\u041a'), (u'\u0422\u0404\u041b\u041e', u'\u0422\u0415\u041b\u041e'), (u'\u0431\u041e\u041b\u042c\u0428\u0404', u'\u0411\u041e\u041b\u042c\u0428\u0415'), (u'\u041d\u042d\u041a\u041b\u041e\u041d\u042f\u0404\u0422\u0421\u042f', u'\u041d\u0410\u041a\u041b\u041e\u041d\u042f\u0415\u0422\u0421\u042f'), (u'\u0421\u041e\u0406\u0406\u041d\u0426\u0423', u'\u0421\u041e\u041b\u041d\u0426\u0423'), (u'\u0421\u04223\u0431\u0418\u041b\u0418\u0417\u0418\u0440\u041e\u0411\u0417\u0422\u042c', u'\u0421\u0422\u0410\u0411\u0418\u041b\u0418\u0417\u0418\u0420\u041e\u0412\u0410\u0422\u042c'), (u'\u0421\u0422\u042d\u0411\u0418\u041b\u042c\u041d\u042d', u'\u0421\u0422\u0410\u0411\u0418\u041b\u042c\u041d\u0410'), (u'\u041c\u0418\u041b\u0406\u0406\u0418\u041e\u041d\u041e\u0412', u'\u041c\u0418\u041b\u041b\u0418\u041e\u041d\u041e\u0412'), (u'\u041d\u0417\u0417\u042d\u0414', u'\u041d\u0410\u0417\u0410\u0414'), (u'\u0422\u0404\u041f\u041b0', u'\u0422\u0415\u041f\u041b\u041e'), (u'\u041f\u041e\u0406\u0406\u042f\u0420\u041d\u042b\u0425', u'\u041f\u041e\u041b\u042f\u0420\u041d\u042b\u0425'), (u'\u0421\u041e\u0406\u0406\u0415\u041d\u042b\u041c\u0418', u'\u0421\u041e\u041b\u0415\u041d\u042b\u041c\u0418'), (u'\u041a\u0415\u041a\u0418\u041c\u0418', u'\u041a\u0410\u041a\u0418\u041c\u0418'), (u'\u043a\u0438\u0441\u043b\u044e\u0442\u043d\u044e\u0441\u0433\u0433\u044c', u'\u043a\u0438\u0441\u043b\u043e\u0442\u043d\u043e\u0441\u0442\u044c'), (u'\u0422\u0417\u041c', u'\u0422\u0410\u041c'), (u'\u041e\u0420\u0413\u0417\u041d\u0418\u0417\u041c\u042b', u'\u041e\u0420\u0413\u0410\u041d\u0418\u0417\u041c\u042b'), (u'\u0421\u0423\u0429\u0404\u0421\u0422\u0412\u041e\u0412\u0404\u0422\u042c', u'\u0421\u0423\u0429\u0415\u0421\u0422\u0412\u041e\u0412\u0410\u0422\u042c'), (u'\u0412\u041d\u0418\u041c\u0417\u041d\u0418\u0404', u'\u0412\u041d\u0418\u041c\u0410\u041d\u0418\u0415'), (u'\u0421\u0414\u0404\u041b\u0417\u0404\u0422', u'\u0421\u0414\u0415\u041b\u0410\u0415\u0422'), (u'\u041f\u041e\u0417\u041d\u042d\u041a\u041e\u041c\u0418\u0422\u042c\u0421\u042f', u'\u041f\u041e\u0417\u041d\u0410\u041a\u041e\u041c\u0418\u0422\u042c\u0421\u042f'), (u'\u041d\u042d\u0428\u0418\u041c', u'\u041d\u0410\u0428\u0418\u041c'), (u'\u0414\u041e\u041a\u0417\u0417\u042d\u0422\u0404\u041b\u042c\u0421\u0422\u0411\u041e', u'\u0414\u041e\u041a\u0410\u0417\u0410\u0422\u0415\u041b\u042c\u0421\u0422\u0412\u041e'), (u'\u0429\u0417\u0417\u0429\u0404\u041d\u0418\u042f', u'\u0412\u0420\u0410\u0429\u0415\u041d\u0418\u042f'), (u'\u0431\u042c\u0406\u041b0', u'\u0411\u042b\u041b\u041e'), (u'\u041e\u0404\u041b\u0415\u0421\u0422\u042f\u0425', u'\u041e\u0411\u041b\u0410\u0421\u0422\u042f\u0425'), (u'\u0431\u042c\u0406\u041b\u0418', u'\u0411\u042b\u041b\u0418'), (u'\u0420\u042d\u0417\u041c\u042c\u0406\u0428\u041b\u042f\u0406\u0406\u0418', u'\u0420\u0410\u0417\u041c\u042b\u0428\u041b\u042f\u041b\u0418'), (u'\u041a\u041e\u041b\u0418\u0427\u0404\u0421\u0422\u0411\u0404', u'\u041a\u041e\u041b\u0418\u0427\u0415\u0421\u0422\u0412\u0415'), (u'\u0429\u0404\u0406\u0406\u041e\u0427\u041d\u042b\u0404', u'\u0429\u0415\u041b\u041e\u0427\u041d\u042b\u0415'), (u'\u041d\u0404\u041a\u041e\u0422\u0429\u0417\u042c\u0406\u0404', u'\u041d\u0415\u041a\u041e\u0422\u041e\u0420\u042b\u0415'), (u'\u041f\u0440\u0418\u0411\u04061\u0415\u041a\u0443\u0457', u'\u041f\u0420\u0418\u0412\u041b\u0415\u041a\u0423\u0422'), (u'\u041d\u0417\u0417\u042c\u0406\u0412\u042d\u0404\u041c\u042b\u0404', u'\u041d\u0410\u0417\u042b\u0412\u0410\u0415\u041c\u042b\u0415'), (u'\u0427\u045706\u042b', u'\u0427\u0422\u041e\u0411\u042b')]),
+                        'pattern': u'(?um)(\\b|^)(?:\\\u041d\\\u0404\\\u0419|\\\u041e\\\u0420\\\u0413\\\u0417\\\u041d\\\u0418\\\u0417\\\u041c\\\u041e\\\u0411|\\\u0427\\\u04570|\\\u041d\\\u042d|\\\u0421\\\u041e\\\u0421\\\u0404\\\u0414\\\u041d\\\u042e\\\u042e|\\\u041f\\\u041b\\\u0417\\\u041d\\\u0404\\\u0422\\\u0423|\\\u0417\\\u0417\\\u0413\\\u042d\\\u0414\\\u041e\\\u041a|\\\u0421\\\u041e\\\u0422\\\u0412\\\u041e\\\u0420\\\u0404\\\u041d\\\u0418\\\u042f|\\\u041c\\\u0418\\\u0420\\\u042d|\\\u041f\\\u041e\\\u042f\\\u0411\\\u041b\\\u0404\\\u041d\\\u0418\\\u042f|\\\u0417\\\u0404\\\u041c\\\u041b\\\u0404|\\\u0404\\\u0429\\\u0404|\\\u0422\\\u0404\\\u041c\\\u041d\\\u042c\\\u0406\\\u0425|\\\u0421\\\u0404\\\u0420\\\u042c\\\u0404\\\u0417\\\u041d\\\u042c\\\u0406\\\u041c|\\\u041f\\\u041e\\\u0428\\\u0406\\\u04060|\\\u041f\\\u04400\\\u0418\\\u04170\\\u0428\\\u0404\\\u041b|\\\u0421\\\u0404\\\u041a\\\u0420\\\u0404\\\u0422\\\u042d\\\u041c\\\u0418|\\\u041c\\\u042d\\\u0422\\\u0404\\\u0420\\\u0418\\\u0417\\\u041b\\\u042c\\\u0406|\\\u041f\\\u042f\\\u0422\\\u0404\\\u041d|\\\u041f\\\u041b\\\u0430\\\u041d\\\u0404\\\u0457\\\u0404|\\\u041a\\\u0417\\\u0422\\\u042d\\\u041a\\\u041b\\\u0418\\\u0417\\\u041c|\\\u041e\\\u041a\\\u0417\\\u0417\\\u0417\\\u041b\\\u0421\\\u042f|\\\u0414\\\u042d\\\u041b\\\u042c\\\u0428\\\u0415|\\\u0422\\\u0412\\\u041a|\\\u041f\\\u041b\\\u0417\\\u041d\\\u0404\\\u0422\\\u0417|\\\u0427\\\u0404\\\u0413\\\u041e|\\\u0423\\\u0417\\\u041d\\\u042d\\\u0422\\\u042c|\\\u041f\\\u041b\\\u042d\\\u041d\\\u0404\\\u0422\\\u0404|\\\u041d\\\u0404\\\u041c|\\\u0411\\\u041e\\\u0417\\\u041c\\\u041e\\\u0416\\\u041d\\\u0417|\\\u0421\\\u041e\\\u0411\\\u0404\\\u0420\\\u0428\\\u0404\\\u041d\\\u041d\\\u041e|\\\u0418\\\u041d\\\u042d\\\u0427\\\u0404|\\\u0411\\\u0421\\\u0404|\\\u041d\\\u0415\\\u0414\\\u041e\\\u0421\\\u0422\\\u0417\\\u0422\\\u041a\\\u0418|\\\u041d\\\u041e\\\u0412\\\u042c\\\u0406\\\u0404|\\\u0412\\\u0404\\\u041b\\\u0418\\\u041a\\\u041e\\\u041b\\\u0404\\\u041f\\\u041d\\\u042d\\\u042f|\\\u041e\\\u0421\\\u0422\\\u042d\\\u0406\\\u0406\\\u041e\\\u0421\\\u042c|\\\u041d\\\u0417\\\u041b\\\u0418\\\u0427\\\u0418\\\u0404|\\\u0431\\\u042b|\\\u041f\\\u0420\\\u041e\\\u0426\\\u0412\\\u0415\\\u0422\\\u0412\\\u0422\\\u042c|\\\u041a\\\u0417\\\u041a|\\\u0412\\\u041e\\\u0414\\\u0417|\\\u041d\\\u0417\\\u0428\\\u0415\\\u041b|\\\u041d\\\u0404|\\\u0422\\\u041e\\\u0416\\\u0404|\\\u0412\\\u0423\\\u041b\\\u041a\\\u042d\\\u041d\\\u0418\\\u0427\\\u0404\\\u0421\\\u041a\\\u041e\\\u0419|\\\u042d\\\u041a\\\u0422\\\u0418\\\u0411\\\u041d\\\u041e\\\u0421\\\u0422\\\u0418|\\\u041f\\\u041e\\\u042f\\\u0412\\\u0418\\\u041b\\\u0417\\\u0421\\\u042c|\\\u041d\\\u041e\\\u0412\\\u0417\\\u042f|\\\u0421\\\u0422\\\u0420\\\u042d\\\u0422\\\u0404\\\u0413\\\u0418\\\u042f|\\\u0423\\\u0421\\\u041f\\\u0404\\\u0428\\\u041d0|\\\u041f\\\u041e\\\u0421\\\u0417\\\u0414\\\u041a\\\u0423|\\\u0413\\\u041e\\\u0422\\\u041e\\\u0411\\\u042b|\\\u041d\\\u0417\\\u0427\\\u0417\\\u0422\\\u042c|\\\u041e\\\u0425\\\u041e\\\u0422\\\u042d|\\\u041f\\\u0420\\\u0418\\\u0417\\\u041d\\\u0417\\\u041a\\\u0417\\\u041c\\\u0418|\\\u041f\\\u04400\\\u0428\\\u041b\\\u041e\\\u041c|\\\u041d\\\u042d\\\u0421\\\u0422\\\u041e\\\u042f\\\u0429\\\u0404\\\u041c|\\\u041f\\\u0423\\\u0421\\\u0422\\\u041e\\\u0422\\\u0417\\\u0425|\\\u0411\\\u041b\\\u0417\\\u0416\\\u041d\\\u041e\\\u0419|\\\u041f\\\u041e\\\u0427\\\u0411\\\u0404|\\\u041c\\\u042c\\\u0406|\\\u0421\\\u0404\\\u0419\\\u0427\\\u0417\\\u0421|\\\u0404\\\u0421\\\u041b\\\u0418|\\\u0417\\\u0417\\\u0422\\\u0420\\\u041e\\\u041d\\\u0415\\\u041c|\\\u041e\\\u041f\\\u0417\\\u0421\\\u0417\\\u0404\\\u041c\\\u0421\\\u042f|\\\u0421\\\u0418\\\u041b\\\u042c\\\u041d0|\\\u041e\\\u0422\\\u041b\\\u0418\\\u0427\\\u0417\\\u0404\\\u0422\\\u0421\\\u042f|\\\u0420\\\u042d\\\u041d\\\u042c\\\u0428\\\u0404|\\\u041d\\\u0417\\\u0417\\\u042c\\\u0406\\\u0412\\\u0417\\\u042e\\\u0422|\\\u0422\\\u0404\\\u041a\\\u041b3|\\\u041e\\\u0421\\\u0417\\\u0414\\\u041e\\\u0427\\\u041d\\\u042b\\\u041c\\\u0418|\\\u041f\\\u041e\\\u0421\\\u0422\\\u0404\\\u041f\\\u0404\\\u041d\\\u041d0|\\\u0418\\\u0421\\\u041f\\\u042d\\\u0420\\\u042f\\\u041b\\\u0417\\\u0421\\\u042c|\\\u0404\\\u041e\\\u041b\\\u042c\\\u0428\\\u041e\\\u0404|\\\u041a\\\u041e\\\u041b\\\u0418\\\u0427\\\u0404\\\u0421\\\u0422\\\u0411\\\u041e|\\\u0413\\\u0404\\\u041c\\\u0417\\\u0422\\\u0418\\\u0422\\\u0415|\\\u041f\\\u041e\\\u041b\\\u0423\\\u0427\\\u042d\\\u0404\\\u0422|\\\u041d\\\u0404\\\u0414\\\u041e\\\u0421\\\u0422\\\u0417\\\u0427\\\u041d0|\\\u041f\\\u0418\\\u0422\\\u042d\\\u041d\\\u0418\\\u042f|\\\u041f\\\u041e\\\u041a\\\u0417|\\\u0411\\\u042c\\\u0406\\\u0425\\\u041e\\\u0414\\\u0418\\\u041b\\\u0418|\\\u0417\\\u0404\\\u041c\\\u0406\\\u0406\\\u0404|\\\u0412\\\u0404\\\u0421\\\u042c\\\u0406\\\u0418\\\u0417|\\\u0417\\\u0404\\\u041c\\\u041b\\\u0418|\\\u0431\\\u042c\\\u0406\\\u041b\\\u041e|\\\u041a\\\u0418\\\u0417\\\u041d\\\u0418|\\\u0421\\\u0422\\\u0417\\\u041d\\\u041e\\\u0412\\\u0418\\\u041b\\\u0417\\\u0421\\\u042c|\\\u0421\\\u041e\\\u041b\\\u0404\\\u041d\\\u0404\\\u0404|\\\u041c\\\u042d\\\u0413\\\u041d\\\u0418\\\u0422\\\u041d\\\u042b\\\u041c|\\\u0427\\\u0422\\\u041e\\\u0431\\\u042c\\\u0406|\\\u0421\\\u041e\\\u0417\\\u0414\\\u0415\\\u0422\\\u042c|\\\u041c\\\u0417\\\u0413\\\u041d\\\u0418\\\u0422\\\u041d\\\u041e\\\u0404|\\\u041a\\\u042d\\\u0416\\\u0423\\\u0422\\\u0421\\\u042f|\\\u041e\\\u0417\\\u041d\\\u0417\\\u0427\\\u0417\\\u0404\\\u0422|\\\u041c\\\u041e\\\u0413\\\u041b\\\u0417|\\\u0418\\\u041c\\\u0404\\\u0422\\\u042c|\\\u041a\\\u041e\\\u0421\\\u041c\\\u041e\\\u0421\\\u042d|\\\u0421\\\u041e\\\u041b\\\u041d\\\u0404\\\u0427\\\u041d\\\u0417\\\u042f|\\\u0421\\\u0418\\\u0421\\\u0422\\\u0404\\\u041c\\\u0417|\\\u041f\\\u041e\\\u0421\\\u0406\\\u0406\\\u0423\\\u0416\\\u0418\\\u041b\\\u041e|\\\u041c\\\u0417\\\u0413\\\u041d\\\u0418\\\u0422\\\u041d\\\u041e\\\u0413\\\u041e|\\\u041f\\\u041b\\\u0412\\\u041d\\\u0404\\\u0422\\\u042b|\\\u041b\\\u041e\\\u041a\\\u0417\\\u041b\\\u042c\\\u041d\\\u042c\\\u0406\\\u0425|\\\u041f\\\u041e\\\u041b\\\u0404\\\u0419|\\\u041a\\\u0417\\\u0416\\\u0423\\\u0422\\\u0421\\\u042f|\\\u041a\\\u0417\\\u041a\\\u041e\\\u0413\\\u041e|\\\u0421\\\u0422\\\u0420\\\u0417\\\u0428\\\u041d\\\u041e\\\u0413\\\u041e|\\\u0421\\\u0422\\\u041e\\\u041b\\\u041a\\\u041d\\\u041e\\\u0415\\\u0404\\\u041d\\\u0418\\\u042f|\\\u041c\\\u0415\\\u0421\\\u0422\\\u0417\\\u041c\\\u0418|\\\u0421\\\u0414\\\u0404\\\u041b\\\u0417\\\u0422\\\u042c|\\\u0421\\\u0422\\\u0417\\\u041b\\\u041e|\\\u041c\\\u042d\\\u0413\\\u041d\\\u0418\\\u0422\\\u041d\\\u041e\\\u0413\\\u041e|\\\u0417\\\u0417\\\u041a\\\u041b\\\u042e\\\u0427\\\u0417\\\u0412\\\u0428\\\u0404\\\u0419\\\u0421\\\u042f|\\\u0404\\\u0413\\\u041e|\\\u042f\\\u0414\\\u0420\\\u0404|\\\u041d\\\u0417|\\\u0418\\\u0421\\\u0427\\\u0404\\\u0417\\\u041b3|\\\u0421\\\u0427\\\u0418\\\u0422\\\u0417\\\u042e|\\\u0428\\\u042d\\\u041d\\\u0421\\\u042b|\\\u0418\\\u041d\\\u0417\\\u0427\\\u0404|\\\u0421\\\u0422\\\u0417\\\u041b|\\\u0422\\\u0420\\\u0417\\\u0422\\\u0418\\\u0422\\\u042c|\\\u041d\\\u0417\\\u041f\\\u0420\\\u0417\\\u0412\\\u041b\\\u042f\\\u0404\\\u0422\\\u0421\\\u042f|\\\u041e\\\u0411\\\u041b\\\u042d\\\u0421\\\u0422\\\u0418|\\\u042f\\\u0412\\\u041b\\\u042f\\\u0406\\\u041e\\\u0422\\\u0421\\\u042f|\\\u0413\\\u041b\\\u042d\\\u0412\\\u041d\\\u041e\\\u0419|\\\u0414\\\u041e\\\u041a\\\u0417\\\u0417\\\u0417\\\u0422\\\u0404\\\u041b\\\u042c\\\u0421\\\u0422\\\u0412|\\\u041a\\\u0418\\\u0421\\\u041b\\\u041e\\\u0422\\\u042d\\\u041c\\\u0418|\\\u041e\\\u041d\\\u042d|\\\u041f\\\u0420\\\u0417\\\u041a\\\u0422\\\u0418\\\u0427\\\u0404\\\u0421\\\u041a\\\u0418|\\\u041b\\\u0404\\\u0421\\\u0423|\\\u0423\\\u0421\\\u041b\\\u041e\\\u0411\\\u0418\\\u042f\\\u041c|\\\u0421\\\u041f\\\u0417\\\u0421\\\u0422\\\u0418\\\u0421\\\u042c|\\\u0420\\\u0417\\\u0417\\\u0412\\\u0418\\\u0412\\\u0417\\\u042e\\\u0429\\\u0418\\\u0404\\\u0421\\\u042f|\\\u0428\\\u042d\\\u041f\\\u041a\\\u0418|\\\u0417\\\u041d\\\u0417\\\u0404\\\u041c|\\\u0421\\\u041e\\\u041e\\\u0418\\\u0420\\\u042d\\\u0404\\\u041c\\\u0421\\\u042f|\\\u0411\\\u042b\\\u042f\\\u0421\\\u041d\\\u0418\\\u0422\\\u042c|\\\u0421\\\u0417\\\u041c|\\\u0420\\\u0417\\\u0421\\\u041f\\\u041e\\\u0417\\\u041d\\\u0417\\\u0422\\\u042c|\\\u0423\\\u0417\\\u041d\\\u0417\\\u0422\\\u042c|\\\u041a\\\u042d\\\u0416\\\u0404\\\u0422\\\u0421\\\u042f|\\\u041e\\\u0420\\\u0404\\\u0418\\\u0422\\\u0417\\\u041b\\\u042c\\\u041d\\\u042c\\\u0406\\\u0404|\\\u041b\\\u0404\\\u0422\\\u042d\\\u0422\\\u0404\\\u041b\\\u042c\\\u041d\\\u042c\\\u0406\\\u0404|\\\u0417\\\u041f\\\u041f\\\u0417\\\u0420\\\u0415\\\u0422\\\u042c\\\u0406|\\\u0416\\\u0404|\\\u0422\\\u0417\\\u041a\\\u0417\\\u042f|\\\u041c\\\u0417\\\u041b\\\u0404\\\u041d\\\u042c\\\u041a\\\u0417\\\u042f|\\\u041f\\\u041b\\\u042d\\\u041d\\\u0404\\\u0422\\\u0417|\\\u0421\\\u041f\\\u0417\\\u0406\\\u0406\\\u042c\\\u041a\\\u041e|\\\u0431\\\u042c\\\u0406\\\u041b3|\\\u0401\\\u0415\\\u0421\\\u0427\\\u0418\\\u0421\\\u041b\\\u0404\\\u041d\\\u041d\\\u041e\\\u0404|\\\u041c\\\u0417\\\u0413\\\u041d\\\u0418\\\u0457\\\u041d\\\u042c\\\u0406\\\u0425|\\\u041f\\\u041e\\\u0421\\\u0422\\\u0440\\\u0430\\\u04143\\\u041b|\\\u0414\\\u0417\\\u0416\\\u0404|\\\u0420\\\u0417\\\u0417\\\u041d\\\u042c\\\u0406\\\u041c\\\u0418|\\\u0421\\\u0423\\\u0429\\\u0404\\\u0421\\\u0422\\\u0411\\\u041e\\\u0412\\\u042d\\\u041d\\\u0418\\\u0404|\\\u041f\\\u041b\\\u0430\\\u041d\\\u0404\\\u0457\\\u042c\\\u0406|\\\u041f\\\u041e\\\u0414\\\u0412\\\u0404\\\u0420\\\u0413\\\u041b\\\u0417\\\u0421\\\u042c|\\\u041e\\\u041f\\\u0417\\\u0421\\\u0406\\-\\\u0406\\\u041e\\\u0421\\\u0422\\\u0418|\\\u041f\\\u041b\\\u0417\\\u041d\\\u0404\\\u0422\\\u0404|\\\u041d0|\\\u0431\\\u042c\\\u0406|\\\u041e\\\u0422\\\u0414\\\u0417\\\u041b\\\u0404\\\u041d\\\u041d\\\u042b\\\u0404|\\\u041f\\\u041e\\\u041b\\\u042f\\\u0420\\\u041d\\\u042c\\\u0406\\\u0404|\\\u0426\\\u0404\\\u041b\\\u042c\\\u0406\\-\\\u041e|\\\u041f\\\u0404\\\u0429\\\u0404\\\u0420\\\u0417\\\u0425|\\\u041d\\\u0417\\\u041f\\\u041e\\\u041b\\\u041d\\\u0404\\\u041d\\\u041d\\\u042c\\\u0406\\\u0425|\\\u0418\\\u0421\\\u041f\\\u0417\\\u0420\\\u0404\\\u041d\\\u0418\\\u042f\\\u041c\\\u0418|\\\u041c\\\u0418\\\u041d\\\u0418\\\u0417\\\u0422\\\u042e\\\u0420\\\u041d\\\u042c\\\u0406\\\u0404|\\\u0422\\\u042d\\\u041a\\\u0417\\\u042f|\\\u041f\\\u0440\\\u0418\\\u0421\\\u041f0\\\u0421\\\u041e\\\u0431\\\u0418\\\u0422\\\u042c\\\u0421\\\u042f|\\\u041d\\\u0404\\\u041e\\\u0404\\\u0425\\\u041e\\\u0414\\\u0418\\\u041c\\\u042c\\\u0406\\\u0404|\\\u041e\\\u0420\\\u0413\\\u0412\\\u041d\\\u0418\\\u0427\\\u0404\\\u0421\\\u041a\\\u0418\\\u0404|\\\u041c\\\u0417\\\u0420\\\u0421\\\u0418\\\u0417\\\u041d\\\u0421\\\u041a\\\u0418\\\u0404|\\\u041c\\\u0404\\\u0421\\\u0422\\\u0404|\\\u0406\\\\\\/\\\u0406\\\u0410\\\u041a\\\u041a\\\u0415\\\u0419\\\u0428|\\\u041d\\\u0417\\\u0425\\\u041e\\\u0414\\\u042f\\\u0429\\\u0418\\\u0404\\\u0421\\\u042f|\\\u041d\\\u0404\\\u0417\\\u041a\\\u0422\\\u0418\\\u0412\\\u041d\\\u041e\\\u041c|\\\u0417\\\u042d\\\u0421\\\u041d\\\u042f\\\u0422\\\u042c|\\\u041e\\\u0420\\\u0413\\\u0417\\\u041d\\\u0418\\\u0417\\\u041c\\\u042c\\\u0406|\\\u0412\\\u0417\\\u0415\\\u0418\\\u041c\\\u041e\\\u0414\\\u0404\\\u0419\\\u0421\\\u0422\\\u0412\\\u041e\\\u0412\\\u0415\\\u0422\\\u042c|\\\u041f\\\u0423\\\u0422\\\u0404\\\u0428\\\u0404\\\u0421\\\u0422\\\u0411\\\u0418\\\u0404|\\\u041f\\\u0443\\\u0421\\\u0457\\\u042c\\\u0406\\\u041d\\\u041d\\\u042b\\\u0425|\\\u0422\\\u0417\\\u041a\\\u0418\\\u0425|\\\u041f\\\u0404\\\u0420\\\u0404\\\u0422\\\u0417\\\u0421\\\u041a\\\u0418\\\u0412\\\u0417\\\u0404\\\u041c|\\\u0427\\\u04220|\\\u0412\\\u0404\\\u0421\\\u042c\\\u041c\\\u0417|\\\u041f\\\u041e\\\u041b\\\u041e\\\u0421\\\u0417\\\u041c\\\u0418|\\\u041e\\\u0440\\\u0457\\\u042d\\\u041d\\\u0418\\\u0417\\\u041c\\\u042c\\\u0406|\\\u041e\\\u0401\\\u041b\\\u0417\\\u0421\\\u0422\\\u0418|\\\u042f\\\u0411\\\u041b\\\u042f\\\u042e\\\u0422\\\u0421\\\u042f|\\\u0426\\\u0404\\\u041b\\\u042c\\\u042e|\\\u041f\\\u041e\\\u0418\\\u0421\\\u041a\\\u041e\\\u0411|\\\u0414\\\u041e\\\u041a\\\u0417\\\u0417\\\u0417\\\u0422\\\u0404\\\u0406\\\u0406\\\u042c\\\u0421\\\u0422\\\u0412|\\\u041c\\\u041e\\\u0416\\\u0404\\\u0422|\\\u041d\\\u042d\\\u0425\\\u041e\\\u0414\\\u0418\\\u0422\\\u042c\\\u0421\\\u042f|\\\u041e\\\u0427\\\u0404\\\u041d\\\u042c|\\\u0421\\\u0420\\\u0417\\\u0412\\\u041d\\\u0418\\\u0422\\\u042c|\\\u041e\\\u0404\\\u041d\\\u0417\\\u0420\\\u0423\\\u0416\\\u0418\\\u041b|\\\u041b\\\u042c\\\u0414\\\u0417|\\\u041f\\\u041e\\\u0422\\\u0404\\\u041f\\\u041b\\\u0404\\\u041d\\\u0418\\\u0404\\\u0406\\\u0418|\\\u041f\\\u041e\\\u0425\\\u041e\\\u041b\\\u041e\\\u0414\\\u0417\\\u041d\\\u0418\\\u0404\\\u0411\\\u0414|\\\u041a\\\u042d\\\u041a|\\\u0422\\\u0404\\\u041b\\\u041e|\\\u0431\\\u041e\\\u041b\\\u042c\\\u0428\\\u0404|\\\u041d\\\u042d\\\u041a\\\u041b\\\u041e\\\u041d\\\u042f\\\u0404\\\u0422\\\u0421\\\u042f|\\\u0421\\\u041e\\\u0406\\\u0406\\\u041d\\\u0426\\\u0423|\\\u0421\\\u04223\\\u0431\\\u0418\\\u041b\\\u0418\\\u0417\\\u0418\\\u0440\\\u041e\\\u0411\\\u0417\\\u0422\\\u042c|\\\u0421\\\u0422\\\u042d\\\u0411\\\u0418\\\u041b\\\u042c\\\u041d\\\u042d|\\\u041c\\\u0418\\\u041b\\\u0406\\\u0406\\\u0418\\\u041e\\\u041d\\\u041e\\\u0412|\\\u041d\\\u0417\\\u0417\\\u042d\\\u0414|\\\u0422\\\u0404\\\u041f\\\u041b0|\\\u041f\\\u041e\\\u0406\\\u0406\\\u042f\\\u0420\\\u041d\\\u042b\\\u0425|\\\u0421\\\u041e\\\u0406\\\u0406\\\u0415\\\u041d\\\u042b\\\u041c\\\u0418|\\\u041a\\\u0415\\\u041a\\\u0418\\\u041c\\\u0418|\\\u043a\\\u0438\\\u0441\\\u043b\\\u044e\\\u0442\\\u043d\\\u044e\\\u0441\\\u0433\\\u0433\\\u044c|\\\u0422\\\u0417\\\u041c|\\\u041e\\\u0420\\\u0413\\\u0417\\\u041d\\\u0418\\\u0417\\\u041c\\\u042b|\\\u0421\\\u0423\\\u0429\\\u0404\\\u0421\\\u0422\\\u0412\\\u041e\\\u0412\\\u0404\\\u0422\\\u042c|\\\u0412\\\u041d\\\u0418\\\u041c\\\u0417\\\u041d\\\u0418\\\u0404|\\\u0421\\\u0414\\\u0404\\\u041b\\\u0417\\\u0404\\\u0422|\\\u041f\\\u041e\\\u0417\\\u041d\\\u042d\\\u041a\\\u041e\\\u041c\\\u0418\\\u0422\\\u042c\\\u0421\\\u042f|\\\u041d\\\u042d\\\u0428\\\u0418\\\u041c|\\\u0414\\\u041e\\\u041a\\\u0417\\\u0417\\\u042d\\\u0422\\\u0404\\\u041b\\\u042c\\\u0421\\\u0422\\\u0411\\\u041e|\\\u0429\\\u0417\\\u0417\\\u0429\\\u0404\\\u041d\\\u0418\\\u042f|\\\u0431\\\u042c\\\u0406\\\u041b0|\\\u041e\\\u0404\\\u041b\\\u0415\\\u0421\\\u0422\\\u042f\\\u0425|\\\u0431\\\u042c\\\u0406\\\u041b\\\u0418|\\\u0420\\\u042d\\\u0417\\\u041c\\\u042c\\\u0406\\\u0428\\\u041b\\\u042f\\\u0406\\\u0406\\\u0418|\\\u041a\\\u041e\\\u041b\\\u0418\\\u0427\\\u0404\\\u0421\\\u0422\\\u0411\\\u0404|\\\u0429\\\u0404\\\u0406\\\u0406\\\u041e\\\u0427\\\u041d\\\u042b\\\u0404|\\\u041d\\\u0404\\\u041a\\\u041e\\\u0422\\\u0429\\\u0417\\\u042c\\\u0406\\\u0404|\\\u041f\\\u0440\\\u0418\\\u0411\\\u04061\\\u0415\\\u041a\\\u0443\\\u0457|\\\u041d\\\u0417\\\u0417\\\u042c\\\u0406\\\u0412\\\u042d\\\u0404\\\u041c\\\u042b\\\u0404|\\\u0427\\\u045706\\\u042b)(\\b|$)'}},
+ 'spa': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict([(u'.\xbb.', u'\xbb.')]),
+                      'pattern': u'(?um)(?:\\.\\\xbb\\.)$'},
+         'PartialLines': {'data': OrderedDict([(u'de gratis', u'gratis'), (u'si quiera', u'siquiera'), (u'Cada una de los', u'Cada uno de los'), (u'Cada uno de las', u'Cada una de las'), (u'haber que', u'a ver qu\xe9'), (u'haber qu\xe9', u'a ver qu\xe9'), (u'Haber si', u'A ver si'), (u' que hora', u' qu\xe9 hora'), (u'yo que se', u'yo qu\xe9 s\xe9'), (u'Yo que se', u'Yo qu\xe9 s\xe9'), (u' tu!', u' t\xfa!'), (u' si!', u' s\xed!'), (u' mi!', u' m\xed!'), (u' el!', u' \xe9l!'), (u' tu?', u' t\xfa?'), (u' si?', u' s\xed?'), (u' mi?', u' m\xed?'), (u' el?', u' \xe9l?'), (u' aun?', u' a\xfan?'), (u' mas?', u' m\xe1s?'), (u' que?', u' qu\xe9?'), (u' paso?', u' pas\xf3?'), (u' cuando?', u' cu\xe1ndo?'), (u' cuanto?', u' cu\xe1nto?'), (u' cuanta?', u' cu\xe1nta?'), (u' cuantas?', u' cu\xe1ntas?'), (u' cuantos?', u' cu\xe1ntos?'), (u' donde?', u' d\xf3nde?'), (u' quien?', u' qui\xe9n?'), (u' como?', u' c\xf3mo?'), (u' adonde?', u' ad\xf3nde?'), (u' cual?', u' cu\xe1l?'), (u'\xbfSi?', u'\xbfS\xed?'), (u'\xbfesta bien?', u'\xbfest\xe1 bien?'), (u'\xbfPero qu\xe9 haces?', u'\xa1\xbfPero qu\xe9 haces?!'), (u'\xbfpero qu\xe9 haces?', u'\xa1\xbfpero qu\xe9 haces?!'), (u'\xbfEs que no me has escuchado?', u'\xa1\xbfEs que no me has escuchado?!'), (u'\xa1\xbfes que no me has escuchado?!', u'\xa1\xbfes que no me has escuchado?!'), (u'\xbfaun', u'\xbfa\xfan'), (u'\xbftu ', u'\xbft\xfa '), (u'\xbfque ', u'\xbfqu\xe9 '), (u'\xbfsabes que', u'\xbfsabes qu\xe9'), (u'\xbfsabes adonde', u'\xbfsabes ad\xf3nde'), (u'\xbfsabes cual', u'\xbfsabes cu\xe1l'), (u'\xbfsabes quien', u'\xbfsabes qui\xe9n'), (u'\xbfsabes como', u'\xbfsabes c\xf3mo'), (u'\xbfsabes cuan', u'\xbfsabes cu\xe1n'), (u'\xbfsabes cuanto', u'\xbfsabes cu\xe1nto'), (u'\xbfsabes cuanta', u'\xbfsabes cu\xe1nta'), (u'\xbfsabes cuantos', u'\xbfsabes cu\xe1ntos'), (u'\xbfsabes cuantas', u'\xbfsabes cu\xe1ntas'), (u'\xbfsabes cuando', u'\xbfsabes cu\xe1ndo'), (u'\xbfsabes donde', u'\xbfsabes d\xf3nde'), (u'\xbfsabe que', u'\xbfsabe qu\xe9'), (u'\xbfsabe adonde', u'\xbfsabe ad\xf3nde'), (u'\xbfsabe cual', u'\xbfsabe cu\xe1l'), (u'\xbfsabe quien', u'\xbfsabe qui\xe9n'), (u'\xbfsabe como', u'\xbfsabe c\xf3mo'), (u'\xbfsabe cuan', u'\xbfsabe cu\xe1n'), (u'\xbfsabe cuanto', u'\xbfsabe cu\xe1nto'), (u'\xbfsabe cuanta', u'\xbfsabe cu\xe1nta'), (u'\xbfsabe cuantos', u'\xbfsabe cu\xe1ntos'), (u'\xbfsabe cuantas', u'\xbfsabe cu\xe1ntas'), (u'\xbfsabe cuando', u'\xbfsabe cu\xe1ndo'), (u'\xbfsabe donde', u'\xbfsabe d\xf3nde'), (u'\xbfsaben que', u'\xbfsaben qu\xe9'), (u'\xbfsaben adonde', u'\xbfsaben ad\xf3nde'), (u'\xbfsaben cual', u'\xbfsaben cu\xe1l'), (u'\xbfsaben quien', u'\xbfsaben qui\xe9n'), (u'\xbfsaben como', u'\xbfsaben c\xf3mo'), (u'\xbfsaben cuan', u'\xbfsaben cu\xe1n'), (u'\xbfsaben cuanto', u'\xbfsaben cu\xe1nto'), (u'\xbfsaben cuanta', u'\xbfsaben cu\xe1nta'), (u'\xbfsaben cuantos', u'\xbfsaben cu\xe1ntos'), (u'\xbfsaben cuantas', u'\xbfsaben cu\xe1ntas'), (u'\xbfsaben cuando', u'\xbfsaben cu\xe1ndo'), (u'\xbfsaben donde', u'\xbfsaben d\xf3nde'), (u'\xbfde que', u'\xbfde qu\xe9'), (u'\xbfde donde', u'\xbfde d\xf3nde'), (u'\xbfde cual', u'\xbfde cu\xe1l'), (u'\xbfde quien', u'\xbfde qui\xe9n'), (u'\xbfde cuanto', u'\xbfde cu\xe1nto'), (u'\xbfde cuanta', u'\xbfde cu\xe1nta'), (u'\xbfde cuantos', u'\xbfde cu\xe1ntos'), (u'\xbfde cuantas', u'\xbfde cu\xe1ntas'), (u'\xbfde cuando', u'\xbfde cu\xe1ndo'), (u'\xbfsobre que', u'\xbfsobre qu\xe9'), (u'\xbfcomo ', u'\xbfc\xf3mo '), (u'\xbfcual ', u'\xbfcu\xe1l '), (u'\xbfen cual', u'\xbfen cu\xe1l'), (u'\xbfcuando', u'\xbfcu\xe1ndo'), (u'\xbfhasta cual', u'\xbfhasta cu\xe1l'), (u'\xbfhasta quien', u'\xbfhasta qui\xe9n'), (u'\xbfhasta cuanto', u'\xbfhasta cu\xe1nto'), (u'\xbfhasta cuantas', u'\xbfhasta cu\xe1ntas'), (u'\xbfhasta cuantos', u'\xbfhasta cu\xe1ntos'), (u'\xbfhasta cuando', u'\xbfhasta cu\xe1ndo'), (u'\xbfhasta donde', u'\xbfhasta d\xf3nde'), (u'\xbfhasta que', u'\xbfhasta qu\xe9'), (u'\xbfhasta adonde', u'\xbfhasta ad\xf3nde'), (u'\xbfdesde que', u'\xbfdesde qu\xe9'), (u'\xbfdesde cuando', u'\xbfdesde cu\xe1ndo'), (u'\xbfdesde quien', u'\xbfdesde qui\xe9n'), (u'\xbfdesde donde', u'\xbfdesde d\xf3nde'), (u'\xbfcuanto', u'\xbfcu\xe1nto'), (u'\xbfcuantos', u'\xbfcu\xe1ntos'), (u'\xbfdonde', u'\xbfd\xf3nde'), (u'\xbfadonde', u'\xbfad\xf3nde'), (u'\xbfcon que', u'\xbfcon qu\xe9'), (u'\xbfcon cual', u'\xbfcon cu\xe1l'), (u'\xbfcon quien', u'\xbfcon qui\xe9n'), (u'\xbfcon cuantos', u'\xbfcon cu\xe1ntos'), (u'\xbfcon cuantas', u'\xbfcon cu\xe1ntas'), (u'\xbfcon cuanta', u'\xbfcon cu\xe1nta'), (u'\xbfcon cuanto', u'\xbfcon cu\xe1nto'), (u'\xbfpara donde', u'\xbfpara d\xf3nde'), (u'\xbfpara adonde', u'\xbfpara ad\xf3nde'), (u'\xbfpara cuando', u'\xbfpara cu\xe1ndo'), (u'\xbfpara que', u'\xbfpara qu\xe9'), (u'\xbfpara quien', u'\xbfpara qui\xe9n'), (u'\xbfpara cuanto', u'\xbfpara cu\xe1nto'), (u'\xbfpara cuanta', u'\xbfpara cu\xe1nta'), (u'\xbfpara cuantos', u'\xbfpara cu\xe1ntos'), (u'\xbfpara cuantas', u'\xbfpara cu\xe1ntas'), (u'\xbfa donde', u'\xbfa d\xf3nde'), (u'\xbfa que', u'\xbfa qu\xe9'), (u'\xbfa cual', u'\xbfa cu\xe1l'), (u'\xbfa quien', u'\xbfa quien'), (u'\xbfa como', u'\xbfa c\xf3mo'), (u'\xbfa cuanto', u'\xbfa cu\xe1nto'), (u'\xbfa cuanta', u'\xbfa cu\xe1nta'), (u'\xbfa cuantos', u'\xbfa cu\xe1ntos'), (u'\xbfa cuantas', u'\xbfa cu\xe1ntas'), (u'\xbfpor que', u'\xbfpor qu\xe9'), (u'\xbfpor cual', u'\xbfpor cu\xe1l'), (u'\xbfpor quien', u'\xbfpor qui\xe9n'), (u'\xbfpor cuanto', u'\xbfpor cu\xe1nto'), (u'\xbfpor cuanta', u'\xbfpor cu\xe1nta'), (u'\xbfpor cuantos', u'\xbfpor cu\xe1ntos'), (u'\xbfpor cuantas', u'\xbfpor cu\xe1ntas'), (u'\xbfpor donde', u'\xbfpor d\xf3nde'), (u'\xbfporque', u'\xbfpor qu\xe9'), (u'\xbfporqu\xe9', u'\xbfpor qu\xe9'), (u'\xbfy que', u'\xbfy qu\xe9'), (u'\xbfy como', u'\xbfy c\xf3mo'), (u'\xbfy cuando', u'\xbfy cu\xe1ndo'), (u'\xbfy cual', u'\xbfy cu\xe1l'), (u'\xbfy quien', u'\xbfy qui\xe9n'), (u'\xbfy cuanto', u'\xbfy cu\xe1nto'), (u'\xbfy cuanta', u'\xbfy cu\xe1nta'), (u'\xbfy cuantos', u'\xbfy cu\xe1ntos'), (u'\xbfy cuantas', u'\xbfy cu\xe1ntas'), (u'\xbfy donde', u'\xbfy d\xf3nde'), (u'\xbfy adonde', u'\xbfy ad\xf3nde'), (u'\xbfquien ', u'\xbfqui\xe9n '), (u'\xbfesta ', u'\xbfest\xe1 '), (u'\xbfestas ', u'\xbfest\xe1s '), (u'\xbfAun', u'\xbfA\xfan'), (u'\xbfQue ', u'\xbfQu\xe9 '), (u'\xbfSabes que', u'\xbfSabes qu\xe9'), (u'\xbfSabes adonde', u'\xbfSabes ad\xf3nde'), (u'\xbfSabes cual', u'\xbfSabes cu\xe1l'), (u'\xbfSabes quien', u'\xbfSabes qui\xe9n'), (u'\xbfSabes como', u'\xbfSabes c\xf3mo'), (u'\xbfSabes cuan', u'\xbfSabes cu\xe1n'), (u'\xbfSabes cuanto', u'\xbfSabes cu\xe1nto'), (u'\xbfSabes cuanta', u'\xbfSabes cu\xe1nta'), (u'\xbfSabes cuantos', u'\xbfSabes cu\xe1ntos'), (u'\xbfSabes cuantas', u'\xbfSabes cu\xe1ntas'), (u'\xbfSabes cuando', u'\xbfSabes cu\xe1ndo'), (u'\xbfSabes donde', u'\xbfSabes d\xf3nde'), (u'\xbfSabe que', u'\xbfSabe qu\xe9'), (u'\xbfSabe adonde', u'\xbfSabe ad\xf3nde'), (u'\xbfSabe cual', u'\xbfSabe cu\xe1l'), (u'\xbfSabe quien', u'\xbfSabe qui\xe9n'), (u'\xbfSabe como', u'\xbfSabe c\xf3mo'), (u'\xbfSabe cuan', u'\xbfSabe cu\xe1n'), (u'\xbfSabe cuanto', u'\xbfSabe cu\xe1nto'), (u'\xbfSabe cuanta', u'\xbfSabe cu\xe1nta'), (u'\xbfSabe cuantos', u'\xbfSabe cu\xe1ntos'), (u'\xbfSabe cuantas', u'\xbfSabe cu\xe1ntas'), (u'\xbfSabe cuando', u'\xbfSabe cu\xe1ndo'), (u'\xbfSabe donde', u'\xbfSabe d\xf3nde'), (u'\xbfSaben que', u'\xbfSaben qu\xe9'), (u'\xbfSaben adonde', u'\xbfSaben ad\xf3nde'), (u'\xbfSaben cual', u'\xbfSaben cu\xe1l'), (u'\xbfSaben quien', u'\xbfSaben qui\xe9n'), (u'\xbfSaben como', u'\xbfSaben c\xf3mo'), (u'\xbfSaben cuan', u'\xbfSaben cu\xe1n'), (u'\xbfSaben cuanto', u'\xbfSaben cu\xe1nto'), (u'\xbfSaben cuanta', u'\xbfSaben cu\xe1nta'), (u'\xbfSaben cuantos', u'\xbfSaben cu\xe1ntos'), (u'\xbfSaben cuantas', u'\xbfSaben cu\xe1ntas'), (u'\xbfSaben cuando', u'\xbfSaben cu\xe1ndo'), (u'\xbfSaben donde', u'\xbfSaben d\xf3nde'), (u'\xbfDe que', u'\xbfDe qu\xe9'), (u'\xbfDe donde', u'\xbfDe d\xf3nde'), (u'\xbfDe cual', u'\xbfDe cu\xe1l'), (u'\xbfDe quien', u'\xbfDe qui\xe9n'), (u'\xbfDe cuanto', u'\xbfDe cu\xe1nto'), (u'\xbfDe cuanta', u'\xbfDe cu\xe1nta'), (u'\xbfDe cuantos', u'\xbfDe cu\xe1ntos'), (u'\xbfDe cuantas', u'\xbfDe cu\xe1ntas'), (u'\xbfDe cuando', u'\xbfDe cu\xe1ndo'), (u'\xbfDesde que', u'\xbfDesde qu\xe9'), (u'\xbfDesde cuando', u'\xbfDesde cu\xe1ndo'), (u'\xbfDesde quien', u'\xbfDesde qui\xe9n'), (u'\xbfDesde donde', u'\xbfDesde d\xf3nde'), (u'\xbfSobre que', u'\xbfSobre qu\xe9'), (u'\xbfComo ', u'\xbfC\xf3mo '), (u'\xbfCual ', u'\xbfCu\xe1l '), (u'\xbfEn cual', u'\xbfEn cu\xe1l'), (u'\xbfCuando', u'\xbfCu\xe1ndo'), (u'\xbfHasta cual', u'\xbfHasta cu\xe1l'), (u'\xbfHasta quien', u'\xbfHasta qui\xe9n'), (u'\xbfHasta cuanto', u'\xbfHasta cu\xe1nto'), (u'\xbfHasta cuantas', u'\xbfHasta cu\xe1ntas'), (u'\xbfHasta cuantos', u'\xbfHasta cu\xe1ntos'), (u'\xbfHasta cuando', u'\xbfHasta cu\xe1ndo'), (u'\xbfHasta donde', u'\xbfHasta d\xf3nde'), (u'\xbfHasta que', u'\xbfHasta qu\xe9'), (u'\xbfHasta adonde', u'\xbfHasta ad\xf3nde'), (u'\xbfCuanto', u'\xbfCu\xe1nto'), (u'\xbfCuantos', u'\xbfCu\xe1ntos'), (u'\xbfDonde', u'\xbfD\xf3nde'), (u'\xbfAdonde', u'\xbfAd\xf3nde'), (u'\xbfCon que', u'\xbfCon qu\xe9'), (u'\xbfCon cual', u'\xbfCon cu\xe1l'), (u'\xbfCon quien', u'\xbfCon qui\xe9n'), (u'\xbfCon cuantos', u'\xbfCon cu\xe1ntos'), (u'\xbfCon cuanta', u'\xbfCon cu\xe1nta'), (u'\xbfCon cuanto', u'\xbfCon cu\xe1nto'), (u'\xbfPara donde', u'\xbfPara d\xf3nde'), (u'\xbfPara adonde', u'\xbfPara ad\xf3nde'), (u'\xbfPara cuando', u'\xbfPara cu\xe1ndo'), (u'\xbfPara que', u'\xbfPara qu\xe9'), (u'\xbfPara quien', u'\xbfPara qui\xe9n'), (u'\xbfPara cuanto', u'\xbfPara cu\xe1nto'), (u'\xbfPara cuanta', u'\xbfPara cu\xe1nta'), (u'\xbfPara cuantos', u'\xbfPara cu\xe1ntos'), (u'\xbfPara cuantas', u'\xbfPara cu\xe1ntas'), (u'\xbfA donde', u'\xbfA d\xf3nde'), (u'\xbfA que', u'\xbfA qu\xe9'), (u'\xbfA cual', u'\xbfA cu\xe1l'), (u'\xbfA quien', u'\xbfA quien'), (u'\xbfA como', u'\xbfA c\xf3mo'), (u'\xbfA cuanto', u'\xbfA cu\xe1nto'), (u'\xbfA cuanta', u'\xbfA cu\xe1nta'), (u'\xbfA cuantos', u'\xbfA cu\xe1ntos'), (u'\xbfA cuantas', u'\xbfA cu\xe1ntas'), (u'\xbfPor que', u'\xbfPor qu\xe9'), (u'\xbfPor cual', u'\xbfPor cu\xe1l'), (u'\xbfPor quien', u'\xbfPor qui\xe9n'), (u'\xbfPor cuanto', u'\xbfPor cu\xe1nto'), (u'\xbfPor cuanta', u'\xbfPor cu\xe1nta'), (u'\xbfPor cuantos', u'\xbfPor cu\xe1ntos'), (u'\xbfPor cuantas', u'\xbfPor cu\xe1ntas'), (u'\xbfPor donde', u'\xbfPor d\xf3nde'), (u'\xbfPorque', u'\xbfPor qu\xe9'), (u'\xbfPorqu\xe9', u'\xbfPor qu\xe9'), (u'\xbfY que', u'\xbfY qu\xe9'), (u'\xbfY como', u'\xbfY c\xf3mo'), (u'\xbfY cuando', u'\xbfY cu\xe1ndo'), (u'\xbfY cual', u'\xbfY cu\xe1l'), (u'\xbfY quien', u'\xbfY qui\xe9n'), (u'\xbfY cuanto', u'\xbfY cu\xe1nto'), (u'\xbfY cuanta', u'\xbfY cu\xe1nta'), (u'\xbfY cuantos', u'\xbfY cu\xe1ntos'), (u'\xbfY cuantas', u'\xbfY cu\xe1ntas'), (u'\xbfY donde', u'\xbfY d\xf3nde'), (u'\xbfY adonde', u'\xbfY ad\xf3nde'), (u'\xbfQuien ', u'\xbfQui\xe9n '), (u'\xbfEsta ', u'\xbfEst\xe1 '), (u'el porque', u'el porqu\xe9'), (u'su porque', u'su porqu\xe9'), (u'los porqu\xe9s', u'los porqu\xe9s'), (u'aun,', u'a\xfan,'), (u'aun no', u'a\xfan no'), (u' de y ', u' d\xe9 y '), (u' nos de ', u' nos d\xe9 '), (u' tu ya ', u' t\xfa ya '), (u'Tu ya ', u'T\xfa ya '), (u' de, ', u' d\xe9,'), (u' mi, ', u' m\xed,'), (u' tu, ', u' t\xfa,'), (u' el, ', u' \xe9l,'), (u' te, ', u' t\xe9,'), (u' mas, ', u' m\xe1s,'), (u' quien, ', u' qui\xe9n,'), (u' cual,', u' cu\xe1l,'), (u'porque, ', u'porqu\xe9,'), (u'cuanto, ', u'cu\xe1nto,'), (u'cuando, ', u'cu\xe1ndo,'), (u' se,', u' s\xe9,'), (u'se donde', u's\xe9 d\xf3nde'), (u'se cuando', u's\xe9 cu\xe1ndo'), (u'se adonde', u's\xe9 ad\xf3nde'), (u'se como', u's\xe9 c\xf3mo'), (u'se cual', u's\xe9 cu\xe1l'), (u'se quien', u's\xe9 qui\xe9n'), (u'se cuanto', u's\xe9 cu\xe1nto'), (u'se cuanta', u's\xe9 cu\xe1nta'), (u'se cuantos', u's\xe9 cu\xe1ntos'), (u'se cuantas', u's\xe9 cu\xe1ntas'), (u'se cuan', u's\xe9 cu\xe1n'), (u' el si ', u' el s\xed '), (u'si mismo', u's\xed mismo'), (u'si misma', u's\xed misma'), (u' llegal', u' ilegal'), (u' lluminar', u' iluminar'), (u'sllbato', u'silbato'), (u'sllenclo', u'silencio'), (u'clemencla', u'clemencia'), (u'socledad', u'sociedad'), (u'tlene', u'tiene'), (u'tlempo', u'tiempo'), (u'equlvocaba', u'equivocaba'), (u'qulnce', u'quince'), (u'comlen', u'comien'), (u'historl', u'histori'), (u'misterl', u'misteri'), (u'vivencl', u'vivenci')]),
+                          'pattern': u'(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:de\\ gratis|si\\ quiera|Cada\\ una\\ de\\ los|Cada\\ uno\\ de\\ las|haber\\ que|haber\\ qu\\\xe9|Haber\\ si|\\ que\\ hora|yo\\ que\\ se|Yo\\ que\\ se|\\ tu\\!|\\ si\\!|\\ mi\\!|\\ el\\!|\\ tu\\?|\\ si\\?|\\ mi\\?|\\ el\\?|\\ aun\\?|\\ mas\\?|\\ que\\?|\\ paso\\?|\\ cuando\\?|\\ cuanto\\?|\\ cuanta\\?|\\ cuantas\\?|\\ cuantos\\?|\\ donde\\?|\\ quien\\?|\\ como\\?|\\ adonde\\?|\\ cual\\?|\\\xbfSi\\?|\\\xbfesta\\ bien\\?|\\\xbfPero\\ qu\\\xe9\\ haces\\?|\\\xbfpero\\ qu\\\xe9\\ haces\\?|\\\xbfEs\\ que\\ no\\ me\\ has\\ escuchado\\?|\\\xa1\\\xbfes\\ que\\ no\\ me\\ has\\ escuchado\\?\\!|\\\xbfaun|\\\xbftu\\ |\\\xbfque\\ |\\\xbfsabes\\ que|\\\xbfsabes\\ adonde|\\\xbfsabes\\ cual|\\\xbfsabes\\ quien|\\\xbfsabes\\ como|\\\xbfsabes\\ cuan|\\\xbfsabes\\ cuanto|\\\xbfsabes\\ cuanta|\\\xbfsabes\\ cuantos|\\\xbfsabes\\ cuantas|\\\xbfsabes\\ cuando|\\\xbfsabes\\ donde|\\\xbfsabe\\ que|\\\xbfsabe\\ adonde|\\\xbfsabe\\ cual|\\\xbfsabe\\ quien|\\\xbfsabe\\ como|\\\xbfsabe\\ cuan|\\\xbfsabe\\ cuanto|\\\xbfsabe\\ cuanta|\\\xbfsabe\\ cuantos|\\\xbfsabe\\ cuantas|\\\xbfsabe\\ cuando|\\\xbfsabe\\ donde|\\\xbfsaben\\ que|\\\xbfsaben\\ adonde|\\\xbfsaben\\ cual|\\\xbfsaben\\ quien|\\\xbfsaben\\ como|\\\xbfsaben\\ cuan|\\\xbfsaben\\ cuanto|\\\xbfsaben\\ cuanta|\\\xbfsaben\\ cuantos|\\\xbfsaben\\ cuantas|\\\xbfsaben\\ cuando|\\\xbfsaben\\ donde|\\\xbfde\\ que|\\\xbfde\\ donde|\\\xbfde\\ cual|\\\xbfde\\ quien|\\\xbfde\\ cuanto|\\\xbfde\\ cuanta|\\\xbfde\\ cuantos|\\\xbfde\\ cuantas|\\\xbfde\\ cuando|\\\xbfsobre\\ que|\\\xbfcomo\\ |\\\xbfcual\\ |\\\xbfen\\ cual|\\\xbfcuando|\\\xbfhasta\\ cual|\\\xbfhasta\\ quien|\\\xbfhasta\\ cuanto|\\\xbfhasta\\ cuantas|\\\xbfhasta\\ cuantos|\\\xbfhasta\\ cuando|\\\xbfhasta\\ donde|\\\xbfhasta\\ que|\\\xbfhasta\\ adonde|\\\xbfdesde\\ que|\\\xbfdesde\\ cuando|\\\xbfdesde\\ quien|\\\xbfdesde\\ donde|\\\xbfcuanto|\\\xbfcuantos|\\\xbfdonde|\\\xbfadonde|\\\xbfcon\\ que|\\\xbfcon\\ cual|\\\xbfcon\\ quien|\\\xbfcon\\ cuantos|\\\xbfcon\\ cuantas|\\\xbfcon\\ cuanta|\\\xbfcon\\ cuanto|\\\xbfpara\\ donde|\\\xbfpara\\ adonde|\\\xbfpara\\ cuando|\\\xbfpara\\ que|\\\xbfpara\\ quien|\\\xbfpara\\ cuanto|\\\xbfpara\\ cuanta|\\\xbfpara\\ cuantos|\\\xbfpara\\ cuantas|\\\xbfa\\ donde|\\\xbfa\\ que|\\\xbfa\\ cual|\\\xbfa\\ quien|\\\xbfa\\ como|\\\xbfa\\ cuanto|\\\xbfa\\ cuanta|\\\xbfa\\ cuantos|\\\xbfa\\ cuantas|\\\xbfpor\\ que|\\\xbfpor\\ cual|\\\xbfpor\\ quien|\\\xbfpor\\ cuanto|\\\xbfpor\\ cuanta|\\\xbfpor\\ cuantos|\\\xbfpor\\ cuantas|\\\xbfpor\\ donde|\\\xbfporque|\\\xbfporqu\\\xe9|\\\xbfy\\ que|\\\xbfy\\ como|\\\xbfy\\ cuando|\\\xbfy\\ cual|\\\xbfy\\ quien|\\\xbfy\\ cuanto|\\\xbfy\\ cuanta|\\\xbfy\\ cuantos|\\\xbfy\\ cuantas|\\\xbfy\\ donde|\\\xbfy\\ adonde|\\\xbfquien\\ |\\\xbfesta\\ |\\\xbfestas\\ |\\\xbfAun|\\\xbfQue\\ |\\\xbfSabes\\ que|\\\xbfSabes\\ adonde|\\\xbfSabes\\ cual|\\\xbfSabes\\ quien|\\\xbfSabes\\ como|\\\xbfSabes\\ cuan|\\\xbfSabes\\ cuanto|\\\xbfSabes\\ cuanta|\\\xbfSabes\\ cuantos|\\\xbfSabes\\ cuantas|\\\xbfSabes\\ cuando|\\\xbfSabes\\ donde|\\\xbfSabe\\ que|\\\xbfSabe\\ adonde|\\\xbfSabe\\ cual|\\\xbfSabe\\ quien|\\\xbfSabe\\ como|\\\xbfSabe\\ cuan|\\\xbfSabe\\ cuanto|\\\xbfSabe\\ cuanta|\\\xbfSabe\\ cuantos|\\\xbfSabe\\ cuantas|\\\xbfSabe\\ cuando|\\\xbfSabe\\ donde|\\\xbfSaben\\ que|\\\xbfSaben\\ adonde|\\\xbfSaben\\ cual|\\\xbfSaben\\ quien|\\\xbfSaben\\ como|\\\xbfSaben\\ cuan|\\\xbfSaben\\ cuanto|\\\xbfSaben\\ cuanta|\\\xbfSaben\\ cuantos|\\\xbfSaben\\ cuantas|\\\xbfSaben\\ cuando|\\\xbfSaben\\ donde|\\\xbfDe\\ que|\\\xbfDe\\ donde|\\\xbfDe\\ cual|\\\xbfDe\\ quien|\\\xbfDe\\ cuanto|\\\xbfDe\\ cuanta|\\\xbfDe\\ cuantos|\\\xbfDe\\ cuantas|\\\xbfDe\\ cuando|\\\xbfDesde\\ que|\\\xbfDesde\\ cuando|\\\xbfDesde\\ quien|\\\xbfDesde\\ donde|\\\xbfSobre\\ que|\\\xbfComo\\ |\\\xbfCual\\ |\\\xbfEn\\ cual|\\\xbfCuando|\\\xbfHasta\\ cual|\\\xbfHasta\\ quien|\\\xbfHasta\\ cuanto|\\\xbfHasta\\ cuantas|\\\xbfHasta\\ cuantos|\\\xbfHasta\\ cuando|\\\xbfHasta\\ donde|\\\xbfHasta\\ que|\\\xbfHasta\\ adonde|\\\xbfCuanto|\\\xbfCuantos|\\\xbfDonde|\\\xbfAdonde|\\\xbfCon\\ que|\\\xbfCon\\ cual|\\\xbfCon\\ quien|\\\xbfCon\\ cuantos|\\\xbfCon\\ cuanta|\\\xbfCon\\ cuanto|\\\xbfPara\\ donde|\\\xbfPara\\ adonde|\\\xbfPara\\ cuando|\\\xbfPara\\ que|\\\xbfPara\\ quien|\\\xbfPara\\ cuanto|\\\xbfPara\\ cuanta|\\\xbfPara\\ cuantos|\\\xbfPara\\ cuantas|\\\xbfA\\ donde|\\\xbfA\\ que|\\\xbfA\\ cual|\\\xbfA\\ quien|\\\xbfA\\ como|\\\xbfA\\ cuanto|\\\xbfA\\ cuanta|\\\xbfA\\ cuantos|\\\xbfA\\ cuantas|\\\xbfPor\\ que|\\\xbfPor\\ cual|\\\xbfPor\\ quien|\\\xbfPor\\ cuanto|\\\xbfPor\\ cuanta|\\\xbfPor\\ cuantos|\\\xbfPor\\ cuantas|\\\xbfPor\\ donde|\\\xbfPorque|\\\xbfPorqu\\\xe9|\\\xbfY\\ que|\\\xbfY\\ como|\\\xbfY\\ cuando|\\\xbfY\\ cual|\\\xbfY\\ quien|\\\xbfY\\ cuanto|\\\xbfY\\ cuanta|\\\xbfY\\ cuantos|\\\xbfY\\ cuantas|\\\xbfY\\ donde|\\\xbfY\\ adonde|\\\xbfQuien\\ |\\\xbfEsta\\ |el\\ porque|su\\ porque|los\\ porqu\\\xe9s|aun\\,|aun\\ no|\\ de\\ y\\ |\\ nos\\ de\\ |\\ tu\\ ya\\ |Tu\\ ya\\ |\\ de\\,\\ |\\ mi\\,\\ |\\ tu\\,\\ |\\ el\\,\\ |\\ te\\,\\ |\\ mas\\,\\ |\\ quien\\,\\ |\\ cual\\,|porque\\,\\ |cuanto\\,\\ |cuando\\,\\ |\\ se\\,|se\\ donde|se\\ cuando|se\\ adonde|se\\ como|se\\ cual|se\\ quien|se\\ cuanto|se\\ cuanta|se\\ cuantos|se\\ cuantas|se\\ cuan|\\ el\\ si\\ |si\\ mismo|si\\ misma|\\ llegal|\\ lluminar|sllbato|sllenclo|clemencla|socledad|tlene|tlempo|equlvocaba|qulnce|comlen|historl|misterl|vivencl)(?:(?=\\s)|(?=$)|(?=\\b))'},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict([(u'No', u'No.')]),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'KBs', u'kB'), (u'Vd', u'Ud'), (u'N\xb0', u'N.\xb0'), (u'n\xb0', u'n.\xb0'), (u'nro.', u'n.\xb0'), (u'Nro.', u'N.\xb0'), (u'aca', u'ac\xe1'), (u'actuas', u'act\xfaas'), (u'actues', u'act\xfaes'), (u'adios', u'adi\xf3s'), (u'agarrenla', u'ag\xe1rrenla'), (u'agarrenlo', u'ag\xe1rrenlo'), (u'agarrandose', u'agarr\xe1ndose'), (u'algun', u'alg\xfan'), (u'alli', u'all\xed'), (u'alla', u'all\xe1'), (u'alejate', u'al\xe9jate'), (u'ahi', u'ah\xed'), (u'angel', u'\xe1ngel'), (u'angeles', u'\xe1ngeles'), (u'ansian', u'ans\xedan'), (u'apagala', u'ap\xe1gala'), (u'aqui', u'aqu\xed'), (u'asi', u'as\xed'), (u'bahia', u'bah\xeda'), (u'busqueda', u'b\xfasqueda'), (u'busquedas', u'b\xfasquedas'), (u'callate', u'c\xe1llate'), (u'carcel', u'c\xe1rcel'), (u'camara', u'c\xe1mara'), (u'caido', u'ca\xeddo'), (u'cabron', u'cabr\xf3n'), (u'camion', u'cami\xf3n'), (u'codigo', u'c\xf3digo'), (u'codigos', u'c\xf3digos'), (u'comence', u'comenc\xe9'), (u'comprate', u'c\xf3mprate'), (u'consegui', u'consegu\xed'), (u'confias', u'conf\xedas'), (u'convertira', u'convertir\xe1'), (u'corazon', u'coraz\xf3n'), (u'crei', u'cre\xed'), (u'creia', u'cre\xeda'), (u'creido', u'cre\xeddo'), (u'creiste', u'cre\xedste'), (u'cubrenos', u'c\xfabrenos'), (u'comio', u'comi\xf3'), (u'dara', u'dar\xe1'), (u'dia', u'd\xeda'), (u'dias', u'd\xedas'), (u'debio', u'debi\xf3'), (u'demelo', u'd\xe9melo'), (u'dimelo', u'd\xedmelo'), (u'denoslo', u'd\xe9noslo'), (u'deselo', u'd\xe9selo'), (u'decia', u'dec\xeda'), (u'decian', u'dec\xedan'), (u'detras', u'detr\xe1s'), (u'deberia', u'deber\xeda'), (u'deberas', u'deber\xe1s'), (u'deberias', u'deber\xedas'), (u'deberian', u'deber\xedan'), (u'deberiamos', u'deber\xedamos'), (u'dejame', u'd\xe9jame'), (u'dejate', u'd\xe9jate'), (u'dejalo', u'd\xe9jalo'), (u'dejarian', u'dejar\xedan'), (u'damela', u'd\xe1mela'), (u'despues', u'despu\xe9s'), (u'diciendome', u'dici\xe9ndome'), (u'dificil', u'dif\xedcil'), (u'dificiles', u'dif\xedciles'), (u'disculpate', u'disc\xfalpate'), (u'dolares', u'd\xf3lares'), (u'hechar', u'echar'), (u'examenes', u'ex\xe1menes'), (u'empezo', u'empez\xf3'), (u'empujon', u'empuj\xf3n'), (u'empujalo', u'emp\xfajalo'), (u'energia', u'energ\xeda'), (u'enfrian', u'enfr\xedan'), (u'escondanme', u'esc\xf3ndanme'), (u'esperame', u'esp\xe9rame'), (u'estara', u'estar\xe1'), (u'estare', u'estar\xe9'), (u'estaria', u'estar\xeda'), (u'estan', u'est\xe1n'), (u'estaran', u'estar\xe1n'), (u'estabamos', u'est\xe1bamos'), (u'estuvieramos', u'estuvi\xe9ramos'), (u'exito', u'\xe9xito'), (u'facil', u'f\xe1cil'), (u'fiscalia', u'fiscal\xeda'), (u'fragil', u'fr\xe1gil'), (u'fragiles', u'fr\xe1giles'), (u'frances', u'franc\xe9s'), (u'gustaria', u'gustar\xeda'), (u'habia', u'hab\xeda'), (u'habias', u'hab\xedas'), (u'habian', u'hab\xedan'), (u'habrian', u'habr\xedan'), (u'habrias', u'habr\xedas'), (u'hagalo', u'h\xe1galo'), (u'haria', u'har\xeda'), (u'increible', u'incre\xedble'), (u'incredulo', u'incr\xe9dulo'), (u'intentalo', u'int\xe9ntalo'), (u'ire', u'ir\xe9'), (u'jovenes', u'j\xf3venes'), (u'ladron', u'ladr\xf3n'), (u'linea', u'l\xednea'), (u'llamame', u'll\xe1mame'), (u'llevalo', u'll\xe9valo'), (u'mama', u'mam\xe1'), (u'maricon', u'maric\xf3n'), (u'mayoria', u'mayor\xeda'), (u'metodo', u'm\xe9todo'), (u'metodos', u'm\xe9todos'), (u'mio', u'm\xedo'), (u'mostro', u'mostr\xf3'), (u'morira', u'morir\xe1'), (u'muevete', u'mu\xe9vete'), (u'murio', u'muri\xf3'), (u'numero', u'n\xfamero'), (u'numeros', u'n\xfameros'), (u'ningun', u'ning\xfan'), (u'oido', u'o\xeddo'), (u'oidos', u'o\xeddos'), (u'oimos', u'o\xedmos'), (u'oiste', u'o\xedste'), (u'pasale', u'p\xe1sale'), (u'pasame', u'p\xe1same'), (u'paraiso', u'para\xedso'), (u'parate', u'p\xe1rate'), (u'pense', u'pens\xe9'), (u'peluqueria', u'peluquer\xeda'), (u'platano', u'pl\xe1tano'), (u'plastico', u'pl\xe1stico'), (u'plasticos', u'pl\xe1sticos'), (u'policia', u'polic\xeda'), (u'policias', u'polic\xedas'), (u'poster', u'p\xf3ster'), (u'podia', u'pod\xeda'), (u'podias', u'pod\xedas'), (u'podria', u'podr\xeda'), (u'podrian', u'podr\xedan'), (u'podrias', u'podr\xedas'), (u'podriamos', u'podr\xedamos'), (u'prometio', u'prometi\xf3'), (u'proposito', u'prop\xf3sito'), (u'pideselo', u'p\xeddeselo'), (u'ponganse', u'p\xf3nganse'), (u'prometeme', u'prom\xe9teme'), (u'publico', u'p\xfablico'), (u'publicos', u'p\xfablicos'), (u'publicamente', u'p\xfablicamente'), (u'quedate', u'qu\xe9date'), (u'queria', u'quer\xeda'), (u'querrias', u'querr\xedas'), (u'querian', u'quer\xedan'), (u'rapido', u'r\xe1pido'), (u'rapidamente', u'r\xe1pidamente'), (u'razon', u'raz\xf3n'), (u'rehusen', u'reh\xfasen'), (u'rie', u'r\xede'), (u'rias', u'r\xedas'), (u'rindete', u'r\xedndete'), (u'sacame', u's\xe1came'), (u'sentian', u'sent\xedan'), (u'sientate', u'si\xe9ntate'), (u'sera', u'ser\xe1'), (u'soplon', u'sopl\xf3n'), (u'sueltalo', u'su\xe9ltalo'), (u'tambien', u'tambi\xe9n'), (u'teoria', u'teor\xeda'), (u'tendra', u'tendr\xe1'), (u'telefono', u'tel\xe9fono'), (u'tipica', u't\xedpica'), (u'todavia', u'todav\xeda'), (u'tomalo', u't\xf3malo'), (u'tonterias', u'tonter\xedas'), (u'torci', u'torc\xed'), (u'traelos', u'tr\xe1elos'), (u'traiganlo', u'tr\xe1iganlo'), (u'traiganlos', u'tr\xe1iganlos'), (u'trio', u'tr\xedo'), (u'tuvieramos', u'tuvi\xe9ramos'), (u'union', u'uni\xf3n'), (u'ultimo', u'\xfaltimo'), (u'ultima', u'\xfaltima'), (u'ultimos', u'\xfaltimos'), (u'ultimas', u'\xfaltimas'), (u'unica', u'\xfanica'), (u'unico', u'\xfanico'), (u'vamonos', u'v\xe1monos'), (u'vayanse', u'v\xe1yanse'), (u'victima', u'v\xedctima'), (u'vivira', u'vivir\xe1'), (u'volvio', u'volvi\xf3'), (u'volvia', u'volv\xeda'), (u'volvian', u'volv\xedan'), (u'reir', u're\xedr'), (u'freir', u'fre\xedr'), (u'sonreir', u'sonre\xedr'), (u'hazmerreir', u'hazmerre\xedr'), (u'oir', u'o\xedr'), (u'oirlo', u'o\xedrlo'), (u'oirte', u'o\xedrte'), (u'oirse', u'o\xedrse'), (u'oirme', u'o\xedrme'), (u'oirle', u'o\xedrle'), (u'oirla', u'o\xedrla'), (u'oirles', u'o\xedrles'), (u'oirnos', u'o\xedrnos'), (u'oirlas', u'o\xedrlas'), (u'bi\xe9n', u'bien'), (u'cr\xedmen', u'crimen'), (u'fu\xe9', u'fue'), (u'fu\xed', u'fui'), (u'qui\xe9res', u'quieres'), (u't\xed', u'ti'), (u'd\xed', u'di'), (u'v\xe1', u'va'), (u'v\xe9', u've'), (u'v\xed', u'vi'), (u'vi\xf3', u'vio'), (u'\xf3', u'o'), (u'cl\xf3n', u'clon'), (u'di\xf3', u'dio'), (u'gui\xf3n', u'guion'), (u'd\xf3n', u'don'), (u'f\xe9', u'fe'), (u'\xe1quel', u'aquel'), (u'\xe9ste', u'este'), (u'\xe9sta', u'esta'), (u'\xe9stos', u'estos'), (u'\xe9stas', u'estas'), (u'\xe9se', u'ese'), (u'\xe9sa', u'esa'), (u'\xe9sos', u'esos'), (u'\xe9sas', u'esas'), (u's\xf3lo', u'solo'), (u'coktel', u'c\xf3ctel'), (u'cocktel', u'c\xf3ctel'), (u'conciente', u'consciente'), (u'comenz\xe9', u'comenc\xe9'), (u'desilucionarte', u'desilusionarte'), (u'dijieron', u'dijeron'), (u'empez\xe9', u'empec\xe9'), (u'hize', u'hice'), (u'ilucionarte', u'ilusionarte'), (u'inconciente', u'inconsciente'), (u'quize', u'quise'), (u'quizo', u'quiso'), (u'verguenza', u'verg\xfcenza'), (u'Nu\xf1ez', u'N\xfa\xf1ez'), (u'Ivan', u'Iv\xe1n'), (u'Japon', u'Jap\xf3n'), (u'Monica', u'M\xf3nica'), (u'Maria', u'Mar\xeda'), (u'Jose', u'Jos\xe9'), (u'Ramon', u'Ram\xf3n'), (u'Garcia', u'Garc\xeda'), (u'Gonzalez', u'Gonz\xe1lez'), (u'Jesus', u'Jes\xfas'), (u'Alvarez', u'\xc1lvarez'), (u'Damian', u'Dami\xe1n'), (u'Rene', u'Ren\xe9'), (u'Nicolas', u'Nicol\xe1s'), (u'Jonas', u'Jon\xe1s'), (u'Lopez', u'L\xf3pez'), (u'Hernandez', u'Hern\xe1ndez'), (u'Bermudez', u'Berm\xfadez'), (u'Fernandez', u'Fern\xe1ndez'), (u'Suarez', u'Su\xe1rez'), (u'Sofia', u'Sof\xeda'), (u'Seneca', u'S\xe9neca'), (u'Tokyo', u'Tokio'), (u'Canada', u'Canad\xe1'), (u'Paris', u'Par\xeds'), (u'Turquia', u'Turqu\xeda'), (u'Mexico', u'M\xe9xico'), (u'Mejico', u'M\xe9xico'), (u'Matias', u'Mat\xedas'), (u'Valentin', u'Valent\xedn'), (u'mejicano', u'mexicano'), (u'mejicanos', u'mexicanos'), (u'mejicana', u'mexicana'), (u'mejicanas', u'mexicanas'), (u'io', u'lo'), (u'ia', u'la'), (u'ie', u'le'), (u'Io', u'lo'), (u'Ia', u'la'), (u'AI', u'Al'), (u'Ie', u'le'), (u'EI', u'El'), (u'suba\ufb02uente', u'subafluente'), (u'a\ufb02\xf3jalo', u'afl\xf3jalo'), (u'A\ufb02\xf3jalo', u'Afl\xf3jalo'), (u'perdi', u'perd\xed'), (u'Podria', u'Podr\xeda'), (u'confia', u'conf\xeda'), (u'pasaria', u'pasar\xeda'), (u'Podias', u'Pod\xedas'), (u'responsabke', u'responsable'), (u'Todavia', u'Todav\xeda'), (u'envien', u'env\xeden'), (u'Queria', u'Quer\xeda'), (u'tio', u't\xedo'), (u'traido', u'tra\xeddo'), (u'Asi', u'As\xed'), (u'elegi', u'eleg\xed'), (u'habria', u'habr\xeda'), (u'encantaria', u'encantar\xeda'), (u'leido', u'le\xeddo'), (u'conocias', u'conoc\xedas'), (u'harias', u'har\xedas'), (u'Aqui', u'Aqu\xed'), (u'decidi', u'decid\xed'), (u'mia', u'm\xeda'), (u'Crei', u'Cre\xed'), (u'podiamos', u'pod\xedamos'), (u'avisame', u'av\xedsame'), (u'debia', u'deb\xeda'), (u'pensarias', u'pensar\xedas'), (u'reuniamos', u'reun\xedamos'), (u'PO\xcf', u'por'), (u'vendria', u'vendr\xeda'), (u'caida', u'ca\xedda'), (u'venian', u'ven\xedan'), (u'compa\xf1ias', u'compa\xf1\xedas'), (u'leiste', u'le\xedste'), (u'Leiste', u'Le\xedste'), (u'fiaria', u'fiar\xeda'), (u'Hungria', u'Hungr\xeda'), (u'fotografia', u'fotograf\xeda'), (u'cafeteria', u'cafeter\xeda'), (u'Digame', u'D\xedgame'), (u'debias', u'deb\xedas'), (u'tendria', u'tendr\xeda'), (u'C\xcfGO', u'creo'), (u'anteg', u'antes'), (u'S\xf3Io', u'Solo'), (u'Ilam\xe1ndola', u'llam\xe1ndola'), (u'C\xe1\ufb02at\xe9', u'C\xe1llate'), (u'Ilamaste', u'llamaste'), (u'daria', u'dar\xeda'), (u'Iargaba', u'largaba'), (u'Yati', u'Y a ti'), (u'querias', u'quer\xedas'), (u'Iimpiarlo', u'limpiarlo'), (u'Iargado', u'largado'), (u'galeria', u'galer\xeda'), (u'Bartomeu', u'Bertomeu'), (u'Iocalizarlo', u'localizarlo'), (u'Il\xe1mame', u'll\xe1mame')]),
+                        'pattern': u'(?um)(\\b|^)(?:KBs|Vd|N\\\xb0|n\\\xb0|nro\\.|Nro\\.|aca|actuas|actues|adios|agarrenla|agarrenlo|agarrandose|algun|alli|alla|alejate|ahi|angel|angeles|ansian|apagala|aqui|asi|bahia|busqueda|busquedas|callate|carcel|camara|caido|cabron|camion|codigo|codigos|comence|comprate|consegui|confias|convertira|corazon|crei|creia|creido|creiste|cubrenos|comio|dara|dia|dias|debio|demelo|dimelo|denoslo|deselo|decia|decian|detras|deberia|deberas|deberias|deberian|deberiamos|dejame|dejate|dejalo|dejarian|damela|despues|diciendome|dificil|dificiles|disculpate|dolares|hechar|examenes|empezo|empujon|empujalo|energia|enfrian|escondanme|esperame|estara|estare|estaria|estan|estaran|estabamos|estuvieramos|exito|facil|fiscalia|fragil|fragiles|frances|gustaria|habia|habias|habian|habrian|habrias|hagalo|haria|increible|incredulo|intentalo|ire|jovenes|ladron|linea|llamame|llevalo|mama|maricon|mayoria|metodo|metodos|mio|mostro|morira|muevete|murio|numero|numeros|ningun|oido|oidos|oimos|oiste|pasale|pasame|paraiso|parate|pense|peluqueria|platano|plastico|plasticos|policia|policias|poster|podia|podias|podria|podrian|podrias|podriamos|prometio|proposito|pideselo|ponganse|prometeme|publico|publicos|publicamente|quedate|queria|querrias|querian|rapido|rapidamente|razon|rehusen|rie|rias|rindete|sacame|sentian|sientate|sera|soplon|sueltalo|tambien|teoria|tendra|telefono|tipica|todavia|tomalo|tonterias|torci|traelos|traiganlo|traiganlos|trio|tuvieramos|union|ultimo|ultima|ultimos|ultimas|unica|unico|vamonos|vayanse|victima|vivira|volvio|volvia|volvian|reir|freir|sonreir|hazmerreir|oir|oirlo|oirte|oirse|oirme|oirle|oirla|oirles|oirnos|oirlas|bi\\\xe9n|cr\\\xedmen|fu\\\xe9|fu\\\xed|qui\\\xe9res|t\\\xed|d\\\xed|v\\\xe1|v\\\xe9|v\\\xed|vi\\\xf3|\\\xf3|cl\\\xf3n|di\\\xf3|gui\\\xf3n|d\\\xf3n|f\\\xe9|\\\xe1quel|\\\xe9ste|\\\xe9sta|\\\xe9stos|\\\xe9stas|\\\xe9se|\\\xe9sa|\\\xe9sos|\\\xe9sas|s\\\xf3lo|coktel|cocktel|conciente|comenz\\\xe9|desilucionarte|dijieron|empez\\\xe9|hize|ilucionarte|inconciente|quize|quizo|verguenza|Nu\\\xf1ez|Ivan|Japon|Monica|Maria|Jose|Ramon|Garcia|Gonzalez|Jesus|Alvarez|Damian|Rene|Nicolas|Jonas|Lopez|Hernandez|Bermudez|Fernandez|Suarez|Sofia|Seneca|Tokyo|Canada|Paris|Turquia|Mexico|Mejico|Matias|Valentin|mejicano|mejicanos|mejicana|mejicanas|io|ia|ie|Io|Ia|AI|Ie|EI|suba\\\ufb02uente|a\\\ufb02\\\xf3jalo|A\\\ufb02\\\xf3jalo|perdi|Podria|confia|pasaria|Podias|responsabke|Todavia|envien|Queria|tio|traido|Asi|elegi|habria|encantaria|leido|conocias|harias|Aqui|decidi|mia|Crei|podiamos|avisame|debia|pensarias|reuniamos|PO\\\xcf|vendria|caida|venian|compa\\\xf1ias|leiste|Leiste|fiaria|Hungria|fotografia|cafeteria|Digame|debias|tendria|C\\\xcfGO|anteg|S\\\xf3Io|Ilam\\\xe1ndola|C\\\xe1\\\ufb02at\\\xe9|Ilamaste|daria|Iargaba|Yati|querias|Iimpiarlo|Iargado|galeria|Bartomeu|Iocalizarlo|Il\\\xe1mame)(\\b|$)'}},
+ 'srp': {'BeginLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict([(u'bi smo', u'bismo'), (u'dali je', u'da li je'), (u'dali si', u'da li si'), (u'Dali si', u'Da li si'), (u'Jel sam ti', u'Jesam li ti'), (u'Jel si', u'Jesi li'), (u"Jel' si", u'Jesi li'), (u"Je I'", u'Jesi li'), (u'Jel si to', u'Jesi li to'), (u"Jel' si to", u'Da li si to'), (u'jel si to', u'da li si to'), (u"jel' si to", u'jesi li to'), (u'Jel si ti', u'Da li si ti'), (u"Jel' si ti", u'Da li si ti'), (u'jel si ti', u'da li si ti'), (u"jel' si ti", u'da li si ti'), (u'jel ste ', u'jeste li '), (u'Jel ste', u'Jeste li'), (u"jel' ste ", u'jeste li '), (u"Jel' ste ", u'Jeste li '), (u'Jel su ', u'Jesu li '), (u'Jel da ', u'Zar ne'), (u'jel da ', u'zar ne'), (u"jel'da ", u'zar ne'), (u'Jeli sve ', u'Je li sve'), (u'Jeli on ', u'Je li on'), (u'Jeli ti ', u'Je li ti'), (u'jeli ti ', u'je li ti'), (u'Jeli to ', u'Je li to'), (u'Nebrini', u'Ne brini'), (u'ne \u0107u', u'ne\u0107u'), (u'od kako', u'otkako'), (u'Si dobro', u'Jesi li dobro'), (u'Svo vreme', u'Sve vrijeme'), (u'Svo vrijeme', u'Sve vrijeme'), (u'Cijelo vrijeme', u'Sve vrijeme')]),
+                          'pattern': u"(?um)(?:(?<=\\s)|(?<=^)|(?<=\\b))(?:bi\\ smo|dali\\ je|dali\\ si|Dali\\ si|Jel\\ sam\\ ti|Jel\\ si|Jel\\'\\ si|Je\\ I\\'|Jel\\ si\\ to|Jel\\'\\ si\\ to|jel\\ si\\ to|jel\\'\\ si\\ to|Jel\\ si\\ ti|Jel\\'\\ si\\ ti|jel\\ si\\ ti|jel\\'\\ si\\ ti|jel\\ ste\\ |Jel\\ ste|jel\\'\\ ste\\ |Jel\\'\\ ste\\ |Jel\\ su\\ |Jel\\ da\\ |jel\\ da\\ |jel\\'da\\ |Jeli\\ sve\\ |Jeli\\ on\\ |Jeli\\ ti\\ |jeli\\ ti\\ |Jeli\\ to\\ |Nebrini|ne\\ \\\u0107u|od\\ kako|Si\\ dobro|Svo\\ vreme|Svo\\ vrijeme|Cijelo\\ vrijeme)(?:(?=\\s)|(?=$)|(?=\\b))"},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'\u010du', u'\u0107u'), (u'\u010de\u0161', u'\u0107e\u0161'), (u'\u010de', u'\u0107e'), (u'\u0107\u0161', u'\u0107e\u0161'), (u'\u0107mo', u'\u0107emo'), (u'\u0107te', u'\u0107ete'), (u'\u010demo', u'\u0107emo'), (u'\u010dete', u'\u0107ete'), (u'djete', u'dijete'), (u'Hey', u'Hej'), (u'hey', u'hej'), (u'htjeo', u'htio'), (u'i\u010di', u'i\u0107i'), (u'jel', u"je l'"), (u'Jel', u"Je l'"), (u'Nebi', u'Ne bi'), (u'Nebih', u'Ne bih'), (u'nebi', u'ne bi'), (u'nebih', u'ne bih'), (u'nedaj', u'ne daj'), (u'Nedaj', u'Ne daj'), (u'nedam', u'ne dam'), (u'Nedam', u'Ne dam'), (u'neda\u0161', u'ne da\u0161'), (u'Neda\u0161', u'Ne da\u0161'), (u'nemogu', u'ne mogu'), (u'Nemogu', u'Ne mogu'), (u'nemora', u'ne mora'), (u'Nemora', u'Ne mora'), (u'nemora\u0161', u'ne mora\u0161'), (u'Nemora\u0161', u'Ne mora\u0161'), (u'predamnom', u'preda mnom'), (u'Predamnom', u'Preda mnom'), (u'Rje\u0161it', u'Rije\u0161it'), (u'samnom', u'sa mnom'), (u'Samnom', u'Sa mnom'), (u'smjeo', u'smio'), (u'uop\u010de', u'uop\u0107e'), (u'Uop\u010de', u'Uop\u0107e'), (u'umijesto', u'umjesto'), (u'Umijesto', u'Umjesto'), (u'uspije\u0161an', u'uspje\u0161an'), (u'uvjek', u'uvijek'), (u'Uvjek', u'Uvijek'), (u'valda', u'valjda'), (u'zamnom', u'za mnom'), (u'Zamnom', u'Za mnom'), (u'\u017eelila', u'\u017eeljela')]),
+                        'pattern': u'(?um)(\\b|^)(?:\\\u010du|\\\u010de\\\u0161|\\\u010de|\\\u0107\\\u0161|\\\u0107mo|\\\u0107te|\\\u010demo|\\\u010dete|djete|Hey|hey|htjeo|i\\\u010di|jel|Jel|Nebi|Nebih|nebi|nebih|nedaj|Nedaj|nedam|Nedam|neda\\\u0161|Neda\\\u0161|nemogu|Nemogu|nemora|Nemora|nemora\\\u0161|Nemora\\\u0161|predamnom|Predamnom|Rje\\\u0161it|samnom|Samnom|smjeo|uop\\\u010de|Uop\\\u010de|umijesto|Umijesto|uspije\\\u0161an|uvjek|Uvjek|valda|zamnom|Zamnom|\\\u017eelila)(\\b|$)'}},
+ 'swe': {'BeginLines': {'data': OrderedDict([(u'Ln ', u'In '), (u'U ppfattat', u'Uppfattat')]),
+                        'pattern': u'(?um)^(?:Ln\\ |U\\ ppfattat)'},
+         'EndLines': {'data': OrderedDict(),
+                      'pattern': None},
+         'PartialLines': {'data': OrderedDict(),
+                          'pattern': None},
+         'PartialWordsAlways': {'data': OrderedDict([(u'\u0139', u'\xc5'), (u'\u013a', u'\xe5'), (u'\xb6\xb6', u'\u266b'), (u'\xb6', u'\u266a')]),
+                                'pattern': None},
+         'WholeLines': {'data': OrderedDict(),
+                        'pattern': None},
+         'WholeWords': {'data': OrderedDict([(u'l\xe2rt', u'l\xe4rt'), (u'hederv\xe5rda', u'hederv\xe4rda'), (u'storm\xe2stare', u'storm\xe4stare'), (u'Avf\xe2rd', u'Avf\xe4rd'), (u't\xe2lten', u't\xe4lten'), (u'\xe2rjag', u'\xe4r jag'), (u'\xe4rjag', u'\xe4r jag'), (u'j\xe2mlikar', u'j\xe4mlikar'), (u'Riskako\ufb02', u'Riskakor'), (u'Karamellen/', u'Karamellen'), (u'Lngen\xfcng', u'Ingenting'), (u'\xe4rju', u'\xe4r ju'), (u'S\xe1', u'S\xe5'), (u'n\xe4rjag', u'n\xe4r jag'), (u'alltjag', u'allt jag'), (u'g\xf6rjag', u'g\xf6r jag'), (u'trorjag', u'tror jag'), (u'varju', u'var ju'), (u'g\xf6rju', u'g\xf6r ju'), (u'kanju', u'kan ju'), (u'blirjag', u'blir jag'), (u's\xe4gerjag', u's\xe4ger jag'), (u'beh\xe5llerjag', u'beh\xe5ller jag'), (u'pr\xf8blem', u'problem'), (u'r\xe4ddadeju', u'r\xe4ddade ju'), (u'hon\xf8m', u'honom'), (u'Ln', u'In'), (u'sv\xe5r\ufb02\xf6rtad', u'sv\xe5rfl\xf6rtad'), (u'\xf8ch', u'och'), (u'\ufb02\xf6rtar', u'fl\xf6rtar'), (u'k\xe4nnerjag', u'k\xe4nner jag'), (u'\ufb02ickan', u'flickan'), (u'sn\xf8', u'sn\xf6'), (u'gerju', u'ger ju'), (u'k\xf8ntakter', u'kontakter'), (u'\xf8lycka', u'olycka'), (u'n\xf8lla', u'nolla'), (u'sinnenajublar', u'sinnena jublar'), (u'ijobbet', u'i jobbet'), (u'F\xe5rjag', u'F\xe5r jag'), (u'Ar', u'\xc4r'), (u'liggerju', u'ligger ju'), (u'um', u'om'), (u'lbland', u'Ibland'), (u'skjuterjag', u'skjuter jag'), (u'Vadd\xe5', u'Vad d\xe5'), (u'pratarj\xe4mt', u'pratar j\xe4mt'), (u'harju', u'har ju'), (u'sitterjag', u'sitter jag'), (u'h\xe4\ufb02a', u'h\xe4rja'), (u's\ufb01\xe4l', u'stj\xe4l'), (u'F\xd6U', u'F\xf6lj'), (u'varf\xf6rjag', u'varf\xf6r jag'), (u's\ufb01\xe4rna', u'stj\xe4rna'), (u'b\xf6\ufb02ar', u'b\xf6rjar'), (u'b\xf6\ufb02an', u'b\xf6rjan'), (u'st\xe4ri', u'st\xe5r'), (u'p\xe4', u'p\xe5'), (u'harjag', u'har jag'), (u'attjag', u'att jag'), (u'Verkarjag', u'Verkar jag'), (u'K\xe4nnerjag', u'K\xe4nner jag'), (u'd\xe4rjag', u'd\xe4r jag'), (u'tu\ufb01', u'tuff'), (u'lurarjag', u'lurar jag'), (u'varj\xe4ttebra', u'var j\xe4ttebra'), (u'allvan', u'allvar'), (u'deth\xe4r', u'det h\xe4r'), (u'va\ufb02e', u'varje'), (u'F\xf6Uer', u'F\xf6ljer'), (u'personalm\xf6tetl', u'personalm\xf6tet!'), (u'harjust', u'har just'), (u'\xe4rj\xe4tteduktig', u'\xe4r j\xe4tteduktig'), (u'd\xe4rja', u'd\xe4r ja'), (u'lngen\xfcng', u'lngenting'), (u'iluften', u'i luften'), (u'\xf6sen', u'\xf6ser'), (u'tv\xe2', u'tv\xe5'), (u'Uejerna', u'Tjejerna'), (u'h\xe5n*', u'h\xe5rt'), (u'\xc4rjag', u'\xc4r jag'), (u'keL', u'Okej'), (u'F\xf6rjag', u'F\xf6r jag'), (u'varj\xe4ttekul', u'var j\xe4ttekul'), (u'k\xe4mpan', u'k\xe4mpar'), (u'mycketjobb', u'mycket jobb'), (u'Uus', u'ljus'), (u'serjag', u'ser jag'), (u'vetjag', u'vet jag'), (u'f\xe5rjag', u'f\xe5r jag'), (u'hurjag', u'hur jag'), (u'f\xf6rs\xf6kerjag', u'f\xf6rs\xf6ker jag'), (u't\xe1nagel', u't\xe5nagel'), (u'va\xfce', u'varje'), (u'Uudet', u'ljudet'), (u'amhopa', u'allihopa'), (u'V\xe4\xfc', u'V\xe4lj'), (u'g\xe4ri', u'g\xe5r'), (u'r\xf6d\xfcus', u'r\xf6dljus'), (u'Uuset', u'ljuset'), (u'Rid\xe0n', u'Rid\xe5n'), (u'vi\xfca', u'vilja'), (u'g\xe5ri', u'g\xe5r i'), (u'Hurd\xe5', u'Hur d\xe5'), (u'inter\\/juar', u'intervjuar'), (u'menarjag', u'menar jag'), (u'spyrjag', u'spyr jag'), (u'bri\xfcera', u'briljera'), (u'N\xe4rjag', u'N\xe4r jag'), (u'ner\\/\xf6s', u'nerv\xf6s'), (u'ilivets', u'i livets'), (u'n\xe4got', u'n\xe5got'), (u'p\xe0', u'p\xe5'), (u'Lnnan', u'Innan'), (u'Uf', u'Ut'), (u'lnnan', u'Innan'), (u'D\xe0ren', u'D\xe5ren'), (u'F\xe0rjag', u'F\xe5r jag'), (u'Vad\xe4rdetd\xe4L', u'Vad \xe4r det d\xe4r'), (u'sm\xe0tjuv', u'sm\xe5tjuv'), (u't\xe0gr\xe5nare', u't\xe5gr\xe5nare'), (u'dit\xe0t', u'dit\xe5t'), (u's\xe4', u's\xe5'), (u'v\xe0rdsl\xf6sa', u'v\xe5rdsl\xf6sa'), (u'n\xe0n', u'n\xe5n'), (u'kommerjag', u'kommer jag'), (u'\xe4rj\xe4ttebra', u'\xe4r j\xe4ttebra'), (u'\xe4rj\xe4vligt', u'\xe4r j\xe4vligt'), (u'\xe0kerjag', u'\xe5ker jag'), (u'ellerjapaner', u'eller japaner'), (u'attjaga', u'att jaga'), (u'eften', u'efter'), (u'h\xe4stan', u'h\xe4star'), (u'Lntensivare', u'Intensivare'), (u'fr\xe0garjag', u'fr\xe5gar jag'), (u'pen/ers', u'pervers'), (u'r\xe0barkade', u'r\xe5barkade'), (u'styrkon', u'styrkor'), (u'Dif\xe5f', u'Dit\xe5t'), (u'h\xe4nden', u'h\xe4nder'), (u'f\xf6\ufb01a', u'f\xf6lja'), (u'Idioten/', u'Idioter!'), (u'Varf\xf6rjagade', u'Varf\xf6r jagade'), (u'd\xe4rf\xf6rjag', u'd\xe4rf\xf6r jag'), (u'forjag', u'for jag'), (u'Iivsgladje', u'livsgl\xe4dje'), (u'narjag', u'n\xe4r jag'), (u'sajag', u'sa jag'), (u'genastja', u'genast ja'), (u'rockument\xe0ren', u'rockument\xe4ren'), (u'turne', u'turn\xe9'), (u'fickjag', u'fick jag'), (u'sager', u's\xe4ger'), (u'Ijush\xe5rig', u'ljush\xe5rig'), (u'tradg\xe5rdsolycka', u'tr\xe4dg\xe5rdsolycka'), (u'kvavdes', u'kv\xe4vdes'), (u'd\xe0rja', u'd\xe4r ja'), (u'hedersgaster', u'hedersg\xe4ster'), (u'Nar', u'N\xe4r'), (u'smaki\xf6sa', u'smakl\xf6sa'), (u'lan', u'Ian'), (u'Lan', u'Ian'), (u'eri', u'er i'), (u'universitetsamne', u'universitets\xe4mne'), (u'garna', u'g\xe4rna'), (u'ar', u'\xe4r'), (u'baltdjur', u'b\xe4ltdjur'), (u'varjag', u'var jag'), (u'\xe0r', u'\xe4r'), (u'f\xf6rf\xf6rst\xe0rkare', u'f\xf6rf\xf6rst\xe4rkare'), (u'arjattespeciell', u'\xe4r j\xe4ttespeciell'), (u'h\xe0rg\xe5r', u'h\xe4r g\xe5r'), (u'Ia', u'la'), (u'Iimousinen', u'limousinen'), (u'krickettra', u'krickettr\xe4'), (u'h\xe5rdrockv\xe0rlden', u'h\xe5rdrockv\xe4rlden'), (u'tr\xe0bit', u'tr\xe4bit'), (u'Mellanvastern', u'Mellanv\xe4stern'), (u'arju', u'\xe4r ju'), (u'turnen', u'turn\xe9n'), (u'kanns', u'k\xe4nns'), (u'battre', u'b\xe4ttre'), (u'v\xe0rldsturne', u'v\xe4rldsturne'), (u'dar', u'd\xe4r'), (u'sj\xe0lvant\xe0nder', u'sj\xe4lvant\xe4nder'), (u'jattelange', u'j\xe4ttel\xe4nge'), (u'berattade', u'ber\xe4ttade'), (u'S\xe4', u'S\xe5'), (u'vandpunkten', u'v\xe4ndpunkten'), (u'N\xe0rjag', u'N\xe4r jag'), (u'lasa', u'l\xe4sa'), (u'skitl\xe0skigt', u'skitl\xe4skigt'), (u'sambandsv\xe0g', u'sambandsv\xe4g'), (u'valdigt', u'v\xe4ldigt'), (u'Stamga\ufb01el', u'St\xe4mgaffel'), (u'\xe0rjag', u'\xe4r jag'), (u'tajming', u'tajmning'), (u'utg\xe4ng', u'utg\xe5ng'), (u'H\xe0r\xe5t', u'H\xe4r\xe5t'), (u'h\xe0r\xe5t', u'h\xe4r\xe5t'), (u'anvander', u'anv\xe4nder'), (u'harjobbat', u'har jobbat'), (u'imageide', u'imageid\xe9'), (u'kla\ufb01en', u'klaffen'), (u'sjalv', u'sj\xe4lv'), (u'dvarg', u'dv\xe4rg'), (u'detjag', u'det jag'), (u'dvargarna', u'dv\xe4rgarna'), (u'fantasiv\xe0rld', u'fantasiv\xe4rld'), (u'\ufb01olliga', u'Fjolliga'), (u'mandoiinstr\xe0ngar', u'mandollnstr\xe4ngar'), (u'mittjobb', u'mitt jobb'), (u'Skajag', u'Ska jag'), (u'landari', u'landar i'), (u'gang', u'g\xe4ng'), (u'Detjag', u'Det jag'), (u'Narmre', u'N\xe4rmre'), (u'I\xe5tjavelni', u'l\xe5tj\xe4veln'), (u'H\xe5llerjag', u'H\xe5ller jag'), (u'visionarer', u'vision\xe4rer'), (u'T\xfclvad', u'Till vad'), (u'milit\xe0rbas', u'milit\xe4rbas'), (u'jattegiada', u'j\xe4tteglada'), (u'Fastjag', u'Fast jag'), (u's\xe5jag', u's\xe5 jag'), (u'rockvarlden', u'rockv\xe4rlden'), (u'saknarjag', u'saknar jag'), (u'allafall', u'alla fall'), (u'\ufb01anta', u'fjanta'), (u'Kr\xe0ma', u'Kr\xe4ma'), (u'stammer', u'st\xe4mmer'), (u'budb\xe0rare', u'budb\xe4rare'), (u'Iivsfiiosofi', u'livsfiiosofi'), (u'f\xf6rj\xe4mnan', u'f\xf6r j\xe4mnan'), (u'gillarjag', u'gillar jag'), (u'Iarvat', u'larvat'), (u'klararjag', u'klarar jag'), (u"hatta\ufb01'\xe0r", u'hattaff\xe4r'), (u'D\xe0', u'D\xe5'), (u'upp\ufb01nna', u'uppfinna'), (u'R\xe0ttf\xe5glar', u'R\xe5ttf\xe5glar'), (u'Sv\xe4\xfcboda', u'Sv\xe4ljboda'), (u'P\xe5b\xf6\ufb02ar', u'P\xe5b\xf6rjar'), (u'slutarju', u'slutar ju'), (u'ni\ufb01skebu\xfcken', u'i fiskebutiken'), (u'h\xe4rj\xe4keln', u'h\xe4r j\xe4keln'), (u'H\xdfppa', u'Hoppa'), (u'f\xf6rst\xf6rds', u'f\xf6rst\xf6rdes'), (u'varj\xe4ttegoda', u'var j\xe4ttegoda'), (u'Kor\\/', u'Korv'), (u'br\xfcl\xe9el', u'br\xfcl\xe9e!'), (u'Hei', u'Hej'), (u'\xe4lskarjordgubbsglass', u'\xe4lskar jordgubbsglass'), (u'Sn\xf6bom', u'Sn\xf6boll'), (u'Sn\xf6boH', u'Sn\xf6boll'), (u'Sn\xf6bol', u'Sn\xf6boll'), (u'sn\xf6boH', u'sn\xf6boll'), (u'L\xe4ggerp\xe5', u'L\xe4gger p\xe5'), (u'lnge\ufb02', u'lnget!'), (u'S\xe4gerj\xe4ttesmarta', u'S\xe4ger j\xe4ttesmarta'), (u'dopplen/\xe4derradar', u'dopplerv\xe4derradar'), (u's\xe4kertj\xe4ttefin', u's\xe4kert j\xe4ttefin'), (u'\xe4rj\xe4ttefin', u'\xe4r j\xe4ttefin'), (u'verkarju', u'verkar ju'), (u'blirju', u'blir ju'), (u'kor\\/', u'korv'), (u'naturkatastro\ufb01', u'naturkatastrof!'), (u'stickerjag', u'stickerj ag'), (u'j\xe4ttebu\ufb01\xe9', u'j\xe4ttebuff\xe9'), (u'be\ufb01nner', u'befinner'), (u'Sp\ufb02ng', u'Spring'), (u'trec\ufb01e', u'tredje'), (u'ryckerjag', u'rycker jag'), (u'skullejag', u'skulle jag'), (u'vetju', u'vet ju'), (u'a\ufb02jag', u'att jag'), (u'\ufb02nns', u'finns'), (u'\xe4rl\xe5ng', u'\xe4r l\xe5ng'), (u'k\xe5ra', u'k\xe4ra'), (u'\xe4r\ufb01na', u'\xe4r \ufb01na'), (u'\xe4ri', u'\xe4r i'), (u'h\xf6rden', u'h\xf6r den'), (u'\xe4ttj\xe4g', u'att j\xe4g'), (u'g\xe4r', u'g\xe5r'), (u'f\xf6ri', u'f\xf6r i'), (u'Hurvisste', u'Hur visste'), (u'\ufb01ck', u'fick'), (u'\ufb01nns', u'finns'), (u'\ufb01n', u'fin'), (u'Fa', u'Bra.'), (u'bori', u'bor i'), (u'fiendeplanl', u'fiendeplan!'), (u'if\xf6rnamn', u'i f\xf6rnamn'), (u'detju', u'det ju'), (u'N\xfcd', u'Niki'), (u'hatarjag', u'hatar jag'), (u'Klararjag', u'Klarar jag'), (u'deta\ufb01er', u'detaljer'), (u'v\xe4/', u'v\xe4l'), (u'smakarju', u'smakar ju'), (u'Teache\ufb02', u'Teacher!'), (u'imorse', u'i morse'), (u'drickerjag', u'dricker jag'), (u'st\xe5ri', u'st\xe5r i'), (u'Harjag', u'Har jag'), (u'Talarjag', u'Talar jag'), (u'undrarjag', u'undrar jag'), (u'\xe5lderjag', u'\xe5lder jag'), (u'va\ufb01e', u'varje'), (u'f\xf6rfalskningl', u'f\xf6rfalskning!'), (u'Vi\ufb01iiiam', u'William'), (u'V\\\ufb01lliams', u'Williams'), (u'attjobba', u'att jobba'), (u'intei', u'inte i'), (u'n\xe4rV\\\ufb01lliam', u'n\xe4r William'), (u'V\\\ufb01lliam', u'William'), (u'E\ufb01ersom', u'Eftersom'), (u'Vl\ufb01lliam', u'William'), (u'I\xe4ngejag', u'l\xe4nge jag'), (u"'\ufb01digare", u'Tidigare'), (u'b\xf6rjadei', u'b\xf6rjade i'), (u'merjust', u'mer just'), (u'e\ufb01er\xe5t', u'efter\xe5t'), (u'gjordejag', u'gjorde jag'), (u'hadeju', u'hade ju'), (u'g\xe5rvi', u'g\xe5r vi'), (u'k\xf6perjag', u'k\xf6per jag'), (u'M\xe5stejag', u'M\xe5ste jag'), (u'k\xe4nnerju', u'k\xe4nner ju'), (u'\ufb02n', u'fin'), (u'treviig', u'trevlig'), (u'Grattisl', u'Grattis!'), (u'kande', u'k\xe4nde'), (u"'llden", u'Tiden'), (u'sakjag', u'sak jag'), (u'klartjag', u'klart jag'), (u'h\xe4\ufb01igt', u'h\xe4ftigt'), (u'I\xe4mnarjag', u'l\xe4mnar jag'), (u'gickju', u'gick ju'), (u'skajag', u'ska jag'), (u'G\xf6rjag', u'G\xf6r jag'), (u'm\xe5stejag', u'm\xe5ste jag'), (u'gra\\/iditet', u'graviditet'), (u'hittadqdin', u'hittade din'), (u'\xe4rjobbigt', u'\xe4r jobbigt'), (u'Overdrivet', u'\xd6verdrivet'), (u'hOgtidlig', u'h\xf6gtidlig'), (u'Overtyga', u'\xd6vertyga'), (u'SKILSMASSA', u'SKILSM\xc4SSA'), (u'brukarju', u'brukar ju'), (u'lsabel', u'Isabel'), (u'kundejag', u'kunde jag'), (u'\xe4rl\xe4get', u'\xe4r l\xe4get'), (u'blirinte', u'blir inte'), (u'ijakt', u'i jakt'), (u'avjordens', u'av jordens'), (u'90000O', u'900000'), (u'9O0', u'900'), (u'\xe4rp\xe5', u'\xe4r p\xe5'), (u'\xe4rproteserna', u'\xe4r proteserna'), (u'\xe4rytterst', u'\xe4r ytterst'), (u'beborjorden', u'bebor jorden'), (u'filmjag', u'film jag'), (u'fokuserarp\xe5', u'fokuserar p\xe5'), (u'folkjag', u'folk jag'), (u'f\xf6rest\xe4lldejag', u'f\xf6rest\xe4llde jag'), (u'f\xf6rpubliken', u'f\xf6r publiken'), (u'gilladejag', u'gillade jag'), (u'h\xe5llerp\xe5', u'h\xe5ller p\xe5'), (u'harp\xe5', u'har p\xe5'), (u'harplaner', u'har planer'), (u'harprylar', u'har prylar'), (u'kommerpubliken', u'kommer publiken'), (u'kostymerp\xe5', u'kostymer p\xe5'), (u'litarp\xe5', u'litar p\xe5'), (u'lngen', u'Ingen'), (u'lnom', u'Inom'), (u'lnte', u'Inte'), (u'ochjag', u'och jag'), (u'Ochjag', u'Och jag'), (u'ochjorden', u'och jorden'), (u'omjag', u'om jag'), (u'Omjag', u'Om jag'), (u'passarperfekt', u'passar perfekt'), (u's\xe4ttetjag', u's\xe4ttet jag'), (u'silverp\xe5', u'silver p\xe5'), (u'skruvarjag', u'skruvar jag'), (u'somjag', u'som jag'), (u'Somjag', u'Som jag'), (u'talarp\xe5', u'talar p\xe5'), (u't\xe4nktejag', u't\xe4nkte jag'), (u'tapparjag', u'tappar jag'), (u'tittarp\xe5', u'tittar p\xe5'), (u'visstejag', u'visste jag'), (u'medjetpacks', u'med jetpacks'), (u's\xe4tterp\xe5', u's\xe4tter p\xe5'), (u'st\xe5rp\xe5', u'st\xe5r p\xe5'), (u'tillh\xf6rp\xe5', u'tillh\xf6r p\xe5')]),
+                        'pattern': u"(?um)(\\b|^)(?:l\\\xe2rt|hederv\\\xe5rda|storm\\\xe2stare|Avf\\\xe2rd|t\\\xe2lten|\\\xe2rjag|\\\xe4rjag|j\\\xe2mlikar|Riskako\\\ufb02|Karamellen\\/|Lngen\\\xfcng|\\\xe4rju|S\\\xe1|n\\\xe4rjag|alltjag|g\\\xf6rjag|trorjag|varju|g\\\xf6rju|kanju|blirjag|s\\\xe4gerjag|beh\\\xe5llerjag|pr\\\xf8blem|r\\\xe4ddadeju|hon\\\xf8m|Ln|sv\\\xe5r\\\ufb02\\\xf6rtad|\\\xf8ch|\\\ufb02\\\xf6rtar|k\\\xe4nnerjag|\\\ufb02ickan|sn\\\xf8|gerju|k\\\xf8ntakter|\\\xf8lycka|n\\\xf8lla|sinnenajublar|ijobbet|F\\\xe5rjag|Ar|liggerju|um|lbland|skjuterjag|Vadd\\\xe5|pratarj\\\xe4mt|harju|sitterjag|h\\\xe4\\\ufb02a|s\\\ufb01\\\xe4l|F\\\xd6U|varf\\\xf6rjag|s\\\ufb01\\\xe4rna|b\\\xf6\\\ufb02ar|b\\\xf6\\\ufb02an|st\\\xe4ri|p\\\xe4|harjag|attjag|Verkarjag|K\\\xe4nnerjag|d\\\xe4rjag|tu\\\ufb01|lurarjag|varj\\\xe4ttebra|allvan|deth\\\xe4r|va\\\ufb02e|F\\\xf6Uer|personalm\\\xf6tetl|harjust|\\\xe4rj\\\xe4tteduktig|d\\\xe4rja|lngen\\\xfcng|iluften|\\\xf6sen|tv\\\xe2|Uejerna|h\\\xe5n\\*|\\\xc4rjag|keL|F\\\xf6rjag|varj\\\xe4ttekul|k\\\xe4mpan|mycketjobb|Uus|serjag|vetjag|f\\\xe5rjag|hurjag|f\\\xf6rs\\\xf6kerjag|t\\\xe1nagel|va\\\xfce|Uudet|amhopa|V\\\xe4\\\xfc|g\\\xe4ri|r\\\xf6d\\\xfcus|Uuset|Rid\\\xe0n|vi\\\xfca|g\\\xe5ri|Hurd\\\xe5|inter\\\\\\/juar|menarjag|spyrjag|bri\\\xfcera|N\\\xe4rjag|ner\\\\\\/\\\xf6s|ilivets|n\\\xe4got|p\\\xe0|Lnnan|Uf|lnnan|D\\\xe0ren|F\\\xe0rjag|Vad\\\xe4rdetd\\\xe4L|sm\\\xe0tjuv|t\\\xe0gr\\\xe5nare|dit\\\xe0t|s\\\xe4|v\\\xe0rdsl\\\xf6sa|n\\\xe0n|kommerjag|\\\xe4rj\\\xe4ttebra|\\\xe4rj\\\xe4vligt|\\\xe0kerjag|ellerjapaner|attjaga|eften|h\\\xe4stan|Lntensivare|fr\\\xe0garjag|pen\\/ers|r\\\xe0barkade|styrkon|Dif\\\xe5f|h\\\xe4nden|f\\\xf6\\\ufb01a|Idioten\\/|Varf\\\xf6rjagade|d\\\xe4rf\\\xf6rjag|forjag|Iivsgladje|narjag|sajag|genastja|rockument\\\xe0ren|turne|fickjag|sager|Ijush\\\xe5rig|tradg\\\xe5rdsolycka|kvavdes|d\\\xe0rja|hedersgaster|Nar|smaki\\\xf6sa|lan|Lan|eri|universitetsamne|garna|ar|baltdjur|varjag|\\\xe0r|f\\\xf6rf\\\xf6rst\\\xe0rkare|arjattespeciell|h\\\xe0rg\\\xe5r|Ia|Iimousinen|krickettra|h\\\xe5rdrockv\\\xe0rlden|tr\\\xe0bit|Mellanvastern|arju|turnen|kanns|battre|v\\\xe0rldsturne|dar|sj\\\xe0lvant\\\xe0nder|jattelange|berattade|S\\\xe4|vandpunkten|N\\\xe0rjag|lasa|skitl\\\xe0skigt|sambandsv\\\xe0g|valdigt|Stamga\\\ufb01el|\\\xe0rjag|tajming|utg\\\xe4ng|H\\\xe0r\\\xe5t|h\\\xe0r\\\xe5t|anvander|harjobbat|imageide|kla\\\ufb01en|sjalv|dvarg|detjag|dvargarna|fantasiv\\\xe0rld|\\\ufb01olliga|mandoiinstr\\\xe0ngar|mittjobb|Skajag|landari|gang|Detjag|Narmre|I\\\xe5tjavelni|H\\\xe5llerjag|visionarer|T\\\xfclvad|milit\\\xe0rbas|jattegiada|Fastjag|s\\\xe5jag|rockvarlden|saknarjag|allafall|\\\ufb01anta|Kr\\\xe0ma|stammer|budb\\\xe0rare|Iivsfiiosofi|f\\\xf6rj\\\xe4mnan|gillarjag|Iarvat|klararjag|hatta\\\ufb01\\'\\\xe0r|D\\\xe0|upp\\\ufb01nna|R\\\xe0ttf\\\xe5glar|Sv\\\xe4\\\xfcboda|P\\\xe5b\\\xf6\\\ufb02ar|slutarju|ni\\\ufb01skebu\\\xfcken|h\\\xe4rj\\\xe4keln|H\\\xdfppa|f\\\xf6rst\\\xf6rds|varj\\\xe4ttegoda|Kor\\\\\\/|br\\\xfcl\\\xe9el|Hei|\\\xe4lskarjordgubbsglass|Sn\\\xf6bom|Sn\\\xf6boH|Sn\\\xf6bol|sn\\\xf6boH|L\\\xe4ggerp\\\xe5|lnge\\\ufb02|S\\\xe4gerj\\\xe4ttesmarta|dopplen\\/\\\xe4derradar|s\\\xe4kertj\\\xe4ttefin|\\\xe4rj\\\xe4ttefin|verkarju|blirju|kor\\\\\\/|naturkatastro\\\ufb01|stickerjag|j\\\xe4ttebu\\\ufb01\\\xe9|be\\\ufb01nner|Sp\\\ufb02ng|trec\\\ufb01e|ryckerjag|skullejag|vetju|a\\\ufb02jag|\\\ufb02nns|\\\xe4rl\\\xe5ng|k\\\xe5ra|\\\xe4r\\\ufb01na|\\\xe4ri|h\\\xf6rden|\\\xe4ttj\\\xe4g|g\\\xe4r|f\\\xf6ri|Hurvisste|\\\ufb01ck|\\\ufb01nns|\\\ufb01n|Fa|bori|fiendeplanl|if\\\xf6rnamn|detju|N\\\xfcd|hatarjag|Klararjag|deta\\\ufb01er|v\\\xe4\\/|smakarju|Teache\\\ufb02|imorse|drickerjag|st\\\xe5ri|Harjag|Talarjag|undrarjag|\\\xe5lderjag|va\\\ufb01e|f\\\xf6rfalskningl|Vi\\\ufb01iiiam|V\\\\\\\ufb01lliams|attjobba|intei|n\\\xe4rV\\\\\\\ufb01lliam|V\\\\\\\ufb01lliam|E\\\ufb01ersom|Vl\\\ufb01lliam|I\\\xe4ngejag|\\'\\\ufb01digare|b\\\xf6rjadei|merjust|e\\\ufb01er\\\xe5t|gjordejag|hadeju|g\\\xe5rvi|k\\\xf6perjag|M\\\xe5stejag|k\\\xe4nnerju|\\\ufb02n|treviig|Grattisl|kande|\\'llden|sakjag|klartjag|h\\\xe4\\\ufb01igt|I\\\xe4mnarjag|gickju|skajag|G\\\xf6rjag|m\\\xe5stejag|gra\\\\\\/iditet|hittadqdin|\\\xe4rjobbigt|Overdrivet|hOgtidlig|Overtyga|SKILSMASSA|brukarju|lsabel|kundejag|\\\xe4rl\\\xe4get|blirinte|ijakt|avjordens|90000O|9O0|\\\xe4rp\\\xe5|\\\xe4rproteserna|\\\xe4rytterst|beborjorden|filmjag|fokuserarp\\\xe5|folkjag|f\\\xf6rest\\\xe4lldejag|f\\\xf6rpubliken|gilladejag|h\\\xe5llerp\\\xe5|harp\\\xe5|harplaner|harprylar|kommerpubliken|kostymerp\\\xe5|litarp\\\xe5|lngen|lnom|lnte|ochjag|Ochjag|ochjorden|omjag|Omjag|passarperfekt|s\\\xe4ttetjag|silverp\\\xe5|skruvarjag|somjag|Somjag|talarp\\\xe5|t\\\xe4nktejag|tapparjag|tittarp\\\xe5|visstejag|medjetpacks|s\\\xe4tterp\\\xe5|st\\\xe5rp\\\xe5|tillh\\\xf6rp\\\xe5)(\\b|$)"}}}
+for lang, grps in data.iteritems():
+    for grp in grps.iterkeys():
+        if data[lang][grp]["pattern"]:
+            data[lang][grp]["pattern"] = re.compile(data[lang][grp]["pattern"])
diff --git a/libs/subzero/modification/dictionaries/make_data.py b/libs/subzero/modification/dictionaries/make_data.py
new file mode 100644
index 000000000..1ac99b6e6
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/make_data.py
@@ -0,0 +1,174 @@
+# coding=utf-8
+
+import re
+import os
+import pprint
+from collections import OrderedDict
+
+from bs4 import BeautifulSoup
+
+TEMPLATE = """\
+import re
+from collections import OrderedDict
+data = """
+
+TEMPLATE_END = """\
+
+for lang, grps in data.iteritems():
+    for grp in grps.iterkeys():
+        if data[lang][grp]["pattern"]:
+            data[lang][grp]["pattern"] = re.compile(data[lang][grp]["pattern"])
+"""
+
+
+SZ_FIX_DATA = {
+    "eng": {
+        "PartialWordsAlways": {
+            u"°x°": u"%",
+            u"compiete": u"complete",
+            u"Ă‚s": u"'s",
+            u"ĂĂ‚s": u"'s",
+            u"a/ion": u"ation",
+            u"at/on": u"ation",
+            u"l/an": u"lian",
+            u"lljust": u"ll just",
+            u" L ": u" I ",
+            u" l ": u" I ",
+            u"'sjust": u"'s just",
+            u"'tjust": u"'t just",
+        },
+        "WholeWords": {
+            u"I'11": u"I'll",
+            u"III'll": u"I'll",
+            u"Tun": u"Run",
+            u"pan'": u"part",
+            u"al'": u"at",
+            u"a re": u"are",
+            u"wail'": u"wait",
+            u"he)'": u"hey",
+            u"he)\"": u"hey",
+            u"He)'": u"Hey",
+            u"He)\"": u"Hey",
+            u"He)’": u"Hey",
+            u"Yea h": u"Yeah",
+            u"yea h": u"yeah",
+            u"h is": u"his",
+            u" 're ": u"'re ",
+            u"LAst": u"Last",
+            u"forthis": u"for this",
+            u"Ls": u"Is",
+            u"Iam": u"I am",
+            u"Ican": u"I can",
+        },
+        "PartialLines": {
+            u"L know": u"I know",
+            u"L should": u"I should",
+            u"L do": u"I do",
+            u"L would": u"I would",
+            u"L could": u"I could",
+            u"L can": u"I can",
+            u"L happen": u"I happen",
+            u"L might": u"I might",
+            u"L have ": u"I have",
+            u"L had": u"I had",
+            u"L want": u"I want",
+            u"L was": u"I was",
+            u"L am": u"I am",
+            u"L will": u"I will",
+            u"L suggest": u"I suggest",
+            u"L think": u"I think",
+            u"L reckon": u"I reckon",
+            u"L like": u"I like",
+            u"L love": u"I love",
+            u"L don't": u"I don't",
+            u"L didn't": u"I didn't",
+            u"L wasn't": u"I wasnt't",
+            u"L haven't": u"I haven't",
+            u"L couldn't": u"I couldn't",
+            u"L won't": u"I won't",
+            u"H i": u"Hi",
+        },
+        "BeginLines": {
+            u"l ": u"I ",
+            u"L ": u"I ",
+        }
+    },
+    "nld": {
+        "PartialWordsAlways": {
+            u"×": u"è",
+            u"×™": u"Ă©",
+            u"×›": u"Ă«",
+            u"צ": u"ë",
+            u"ן": u"ï",
+            u"ף": u"ó",
+            u"×": u"Ă ",
+            u"IÖ»": u"I",
+            u"č": u"è",
+            u"פ": u"o",
+            u"ם": u"i",
+        },
+    },
+    "swe": {
+        "PartialWordsAlways": {
+            u"Äş": u"ĂĄ",
+            u"Äą": u"Ă…",
+        }
+    }
+}
+
+SZ_FIX_DATA_GLOBAL = {
+    "PartialWordsAlways": {
+        u"¶¶": u"♫",
+        u"¶": u"♪"
+    }
+}
+
+if __name__ == "__main__":
+    cur_dir = os.path.dirname(os.path.realpath(__file__))
+    xml_dir = os.path.join(cur_dir, "xml")
+    file_list = os.listdir(xml_dir)
+
+    data = {}
+
+    for fn in file_list:
+        if fn.endswith("_OCRFixReplaceList.xml"):
+            lang = fn.split("_")[0]
+            soup = BeautifulSoup(open(os.path.join(xml_dir, fn)), "xml")
+
+            fetch_data = (
+                    # group, item_name, pattern
+                    ("WholeLines", "Line", None),
+                    ("WholeWords", "Word", lambda d: (ur"(?um)(\b|^)(?:" + u"|".join([re.escape(k) for k in d.keys()])
+                                                      + ur')(\b|$)') if d else None),
+                    ("PartialWordsAlways", "WordPart", None),
+                    ("PartialLines", "LinePart", lambda d: (ur"(?um)(?:(?<=\s)|(?<=^)|(?<=\b))(?:" +
+                                                            u"|".join([re.escape(k) for k in d.keys()]) +
+                                                            ur")(?:(?=\s)|(?=$)|(?=\b))") if d else None),
+                    ("BeginLines", "Beginning", lambda d: (ur"(?um)^(?:"+u"|".join([re.escape(k) for k in d.keys()])
+                                                           + ur')') if d else None),
+                    ("EndLines", "Ending", lambda d: (ur"(?um)(?:" + u"|".join([re.escape(k) for k in d.keys()]) +
+                                                      ur")$") if d else None,),
+            )
+
+            data[lang] = dict((grp, {"data": OrderedDict(), "pattern": None}) for grp, item_name, pattern in fetch_data)
+
+            for grp, item_name, pattern in fetch_data:
+                for grp_data in soup.find_all(grp):
+                    for line in grp_data.find_all(item_name):
+                        data[lang][grp]["data"][line["from"]] = line["to"]
+
+                # add our own dictionaries
+                if lang in SZ_FIX_DATA and grp in SZ_FIX_DATA[lang]:
+                    data[lang][grp]["data"].update(SZ_FIX_DATA[lang][grp])
+
+                if grp in SZ_FIX_DATA_GLOBAL:
+                    data[lang][grp]["data"].update(SZ_FIX_DATA_GLOBAL[grp])
+
+                if pattern:
+                    data[lang][grp]["pattern"] = pattern(data[lang][grp]["data"])
+
+    f = open(os.path.join(cur_dir, "data.py"), "w+")
+    f.write(TEMPLATE)
+    f.write(pprint.pformat(data, width=1))
+    f.write(TEMPLATE_END)
+    f.close()
diff --git a/libs/subzero/modification/dictionaries/test_data.py b/libs/subzero/modification/dictionaries/test_data.py
new file mode 100644
index 000000000..538c99fc0
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/test_data.py
@@ -0,0 +1,10 @@
+# coding=utf-8
+
+from subzero.language import Language
+from data import data
+
+#for lang, data in data.iteritems():
+#    print Language.fromietf(lang).alpha2
+
+for find, rep in data["dan"].iteritems():
+    print find, rep
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml
new file mode 100644
index 000000000..4faf79872
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/bos_OCRFixReplaceList.xml
@@ -0,0 +1,1840 @@
+<OCRFixReplaceList>
+	<WholeWords>
+		<Word from="andele" to="anđele" />
+		<Word from="andeli" to="anđeli" />
+		<Word from="bacas" to="bacaš" />
+		<Word from="bas" to="baš" />
+		<Word from="Bas" to="Baš" />
+		<Word from="basta" to="vrt" />
+		<Word from="Basta" to="Vrt" />
+		<Word from="baste" to="vrtovi" />
+		<Word from="Baste" to="Vrtovi" />
+		<Word from="basti" to="vrtu" />
+		<Word from="Basti" to="Vrtu" />
+		<Word from="bastom" to="vrtom" />
+		<Word from="Bastom" to="Vrtom" />
+		<Word from="bastu" to="vrt" />
+		<Word from="Bastu" to="Vrt" />
+		<Word from="Bice" to="Biće" />
+		<Word from="bice" to="biće" />
+		<Word from="Biceš" to="Bit ćeš" />
+		<Word from="Bicu" to="Bit ću" />
+		<Word from="bicu" to="biću" />
+		<Word from="blagonaklonoscu" to="blagonaklonošću" />
+		<Word from="blizi" to="bliĹľi" />
+		<Word from="bljesti" to="bliješti" />
+		<Word from="Bljesti" to="Bliješti" />
+		<Word from="bojis" to="bojiš" />
+		<Word from="braca" to="braća" />
+		<Word from="Braca" to="Braća" />
+		<Word from="broncane" to="bronÄŤane" />
+		<Word from="broncanu" to="bronÄŤanu" />
+		<Word from="budes" to="budeš" />
+		<!--c-->
+		<!-- cic u čić  - nikada automatski za sve! -->
+		<Word from="caj" to="ÄŤaj" />
+		<Word from="caja" to="ÄŤaja" />
+		<Word from="Cak" to="ÄŚak" />
+		<Word from="cak" to="ÄŤak" />
+		<Word from="cale" to="tata" />
+		<Word from="Cao" to="Ćao" />
+		<Word from="cao" to="ćao" />
+		<Word from="cas" to="sat" />
+		<Word from="casno" to="ÄŤasno" />
+		<Word from="Casno" to="ÄŚasno" />
+		<Word from="castis" to="častiš" />
+		<Word from="casu" to="cašu" />
+		<Word from="cašu" to="čašu" />
+		<Word from="cebe" to="deku" />
+		<Word from="cega" to="ÄŤega" />
+		<Word from="Cek" to="ÄŚek" />
+		<Word from="cek" to="ÄŤek" />
+		<Word from="cekali" to="ÄŤekali" />
+		<Word from="cekas" to="čekaš" />
+		<Word from="Cemu" to="ÄŚemu" />
+		<Word from="cemu" to="ÄŤemu" />
+		<Word from="cerka" to="kći" />
+		<Word from="Cerka" to="Kći" />
+		<Word from="cerke" to="kćeri" />
+		<Word from="Cerke" to="Kćeri" />
+		<Word from="cerku" to="kćer" />
+		<Word from="Cerku" to="Kćer" />
+		<Word from="ces" to="ćeš" />
+		<Word from="cesce" to="češće" />
+		<Word from="Cesce" to="Češće" />
+		<Word from="Ceskoj" to="Češkoj" />
+		<Word from="cestitki" to="ÄŤestitki" />
+		<Word from="cesto" to="ÄŤesto" />
+		<Word from="Cesto" to="ÄŚesto" />
+		<Word from="cetiri" to="ÄŤetiri" />
+		<Word from="Cetiri" to="ÄŚetiri" />
+		<Word from="cetri" to="ÄŤetiri" />
+		<Word from="cetu" to="ÄŤetu" />
+		<Word from="ceznja" to="ÄŤeĹľnja" />
+		<Word from="ceznje" to="ÄŤeĹľnje" />
+		<Word from="ceznji" to="ÄŤeĹľnji" />
+		<Word from="ceznjom" to="ÄŤeĹľnjom" />
+		<Word from="ceznju" to="ÄŤeĹľnju" />
+		<Word from="ceznu" to="ÄŤeznu" />
+		<Word from="ceš" to="ćeš" />
+		<Word from="Cija" to="ÄŚija" />
+		<Word from="cija" to="ÄŤija" />
+		<Word from="cije" to="ÄŤije" />
+		<Word from="Ciji" to="ÄŚiji" />
+		<Word from="ciji" to="ÄŤiji" />
+		<Word from="cijih" to="ÄŤijih" />
+		<Word from="Cijih" to="ÄŚijih" />
+		<Word from="cijim" to="ÄŤijim" />
+		<Word from="Cijim" to="ÄŚijim" />
+		<Word from="Cim" to="ÄŚim" />
+		<Word from="cim" to="ÄŤim" />
+		<Word from="cime" to="ÄŤime" />
+		<Word from="cinila" to="ÄŤinila" />
+		<Word from="cinili" to="ÄŤinili" />
+		<Word from="cinio" to="ÄŤinio" />
+		<Word from="cinis" to="činiš" />
+		<Word from="ciniti" to="ÄŤiniti" />
+		<Word from="cipka" to="ÄŤipka" />
+		<Word from="cipku" to="ÄŤipku" />
+		<Word from="cita" to="ÄŤita" />
+		<Word from="citao" to="ÄŤitao" />
+		<Word from="citas" to="čitaš" />
+		<Word from="citavu" to="ÄŤitavu" />
+		<Word from="cizme" to="ÄŤizme" />
+		<Word from="clan" to="ÄŤlan" />
+		<Word from="Clan" to="ÄŚlan" />
+		<Word from="clanke" to="ÄŤlanke" />
+		<Word from="clanove" to="ÄŤlanove" />
+		<Word from="clanovi" to="ÄŤlanovi" />
+		<Word from="clanovima" to="ÄŤlanovima" />
+		<Word from="cmo" to="ćemo" />
+		<Word from="corsokak" to="slijepa ulica" />
+		<Word from="corsokaku" to="slijepoj ulici" />
+		<Word from="cosak" to="ugao" />
+		<Word from="cosku" to="uglu" />
+		<Word from="covece" to="ÄŤovjeÄŤe" />
+		<Word from="covek" to="ÄŤovjek" />
+		<Word from="covjece" to="ÄŤovjeÄŤe" />
+		<Word from="covjecnost" to="ÄŤovjeÄŤnost" />
+		<Word from="covjek" to="ÄŤovjek" />
+		<Word from="covjeka" to="ÄŤovjeka" />
+		<Word from="covjeku" to="ÄŤovjeku" />
+		<Word from="crpeci" to="crpeći" />
+		<Word from="cte" to="ćete" />
+		<Word from="Cu" to="Ću" />
+    		<Word from="Ceš" to="Ćeš" />
+    		<Word from="Ce" to="Će" />
+    		<Word from="Cemo" to="Ćemo" />
+    		<Word from="Cete" to="Ćete" />
+    		<Word from="cu" to="ću" />
+    		<Word from="ce" to="će" />
+    		<Word from="cemo" to="ćemo" />
+    		<Word from="cete" to="ćete" />
+		<Word from="cudi" to="ÄŤudi" />
+		<Word from="Cudo" to="ÄŚudo" />
+		<Word from="cudo" to="ÄŤudo" />
+		<Word from="Cujte" to="ÄŚujte" />
+		<Word from="cula" to="ÄŤula" />
+		<Word from="culi" to="ÄŤuli" />
+		<Word from="Culi" to="ÄŚuli" />
+		<Word from="culima" to="ÄŤulima" />
+		<Word from="cuo" to="ÄŤuo" />
+		<Word from="Cuo" to="ÄŚuo" />
+		<Word from="cupam" to="ÄŤupam" />
+		<Word from="cutanje" to="šutnja" />
+		<Word from="Cutanje" to="Ĺ utnja" />
+		<Word from="cutao" to="šutio" />
+		<Word from="Cutao" to="Ĺ utio" />
+		<Word from="cuti" to="ÄŤuti" />
+		<Word from="cutljiv" to="šutljiv" />
+		<Word from="cutnja" to="šutnja" />
+		<Word from="cuvali" to="ÄŤuvali" />
+		<Word from="cuveni" to="ÄŤuveni" />
+		<!--d-->
+		<Word from="dace" to="dat će" />
+		<Word from="dacemo" to="dat ćemo" />
+		<Word from="davo" to="vrag" />
+		<Word from="definise" to="definira" />
+		<Word from="definisi" to="definiraj" />
+		<Word from="Desava" to="Događa" />
+		<Word from="desava" to="događa" />
+		<Word from="disemo" to="dišemo" />
+		<Word from="disi" to="diši" />
+		<Word from="dobijes" to="dobiješ" />
+		<Word from="dobivas" to="dobivaš" />
+		<Word from="doci" to="doći" />
+		<Word from="dode" to="dođe" />
+		<Word from="dodem" to="dođem" />
+		<Word from="dodes" to="dođeš" />
+		<Word from="dodete" to="dođete" />
+		<Word from="dodeš" to="dođeš" />
+		<Word from="Dodi" to="Dođi" />
+		<Word from="dodi" to="dođi" />
+		<Word from="dodite" to="dođite" />
+		<Word from="Dodji" to="Dođi" />
+		<Word from="dodji" to="dođi" />
+		<Word from="Dodjite" to="Dođite" />
+		<Word from="dodjite" to="dođite" />
+		<Word from="Dodju" to="Dođu" />
+		<Word from="dodju" to="dođu" />
+		<Word from="dodu" to="dođu" />
+		<Word from="dolazis" to="dolaziš" />
+		<Word from="dopustao" to="dopuštao" />
+		<Word from="dorucak" to="doruÄŤak" />
+		<Word from="dorucku" to="doruÄŤku" />
+		<Word from="Dosao" to="Došao" />
+		<Word from="dosao" to="došao" />
+		<Word from="drhteci" to="drhteći" />
+		<Word from="drhteći" to="drhteći" />
+		<Word from="Drhteći" to="Drhteći" />
+		<Word from="drugacija" to="drugaÄŤija" />
+		<Word from="Drugacije" to="DrugaÄŤije" />
+		<Word from="drugacije" to="drugaÄŤije" />
+		<Word from="drugaciji" to="drugaÄŤiji" />
+		<Word from="Drugaciji" to="DrugaÄŤiji" />
+		<Word from="drukciji" to="drugaÄŤiji" />
+		<Word from="drveca" to="drveća" />
+		<Word from="drvece" to="drveće" />
+		<Word from="drvecem" to="drvećem" />
+		<Word from="drvecu" to="drveću" />
+		<Word from="drzi" to="drĹľi" />
+		<Word from="Drzim" to="DrĹľim" />
+		<Word from="dugmici" to="gumbići" />
+		<Word from="duze" to="duĹľe" />
+		<Word from="duzinom" to="duĹľinom" />
+		<Word from="dzanki" to="ovisnik" />
+		<Word from="Dzejk" to="Jake" />
+		<Word from="Dzime" to="Jime" />
+		<Word from="Dzone" to="Johne" />
+		<Word from="flasom" to="flašom" />
+		<Word from="flasu" to="flašu" />
+		<Word from="fucka" to="fućka" />
+		<Word from="funkcionisu" to="funkcioniraju" />
+		<!--g-->
+		<Word from="gacice" to="gaćice" />
+		<Word from="gadao" to="gađao" />
+		<Word from="gadis" to="gadiš" />
+		<Word from="Gadis" to="Gadiš" />
+		<Word from="gdica" to="gđica" />
+		<Word from="gdice" to="gđice" />
+		<Word from="gdici" to="gđici" />
+		<Word from="gdicu" to="gđicu" />
+		<Word from="gdu" to="gđu" />
+		<Word from="glupaco" to="glupaÄŤo" />
+		<Word from="govoris" to="govoriš" />
+		<Word from="gradani" to="građani" />
+		<Word from="gradic" to="gradić" />
+		<Word from="gradica" to="gradića" />
+		<Word from="gradicu" to="gradiću" />
+		<Word from="grancica" to="granÄŤica" />
+		<Word from="grancicu" to="granÄŤicu" />
+		<Word from="gresci" to="grešci" />
+		<Word from="grese" to="griješe" />
+		<Word from="greski" to="grešci" />
+		<Word from="gresku" to="grešku" />
+		<Word from="gubis" to="gubiš" />
+		<Word from="Hoces" to="Hoćeš" />
+		<Word from="hoces" to="hoćeš" />
+		<Word from="hocu" to="hoću" />
+		<Word from="Hocu" to="Hoću" />
+		<Word from="hodas" to="hodaš" />
+		<Word from="htjeo" to="htio" />
+		<!--i-->
+		<Word from="iceg" to="iÄŤeg" />
+		<Word from="icega" to="iÄŤega" />
+		<Word from="icemu" to="iÄŤemu" />
+		<Word from="Ici" to="Ići" />
+		<Word from="ici" to="ići" />
+		<Word from="Ides" to="Ideš" />
+		<Word from="ides" to="ideš" />
+		<Word from="iduce" to="iduće" />
+		<Word from="iduceg" to="idućeg" />
+		<Word from="iducem" to="idućem" />
+		<Word from="Iduci" to="Idući" />
+		<Word from="iduci" to="idući" />
+		<Word from="ignorisi" to="ignoriraj" />
+		<Word from="ignorisi" to="ignoriraju" />
+		<Word from="igras" to="igraš" />
+		<Word from="Ijudi" to="ljudi" />
+		<Word from="imas" to="imaš" />
+		<Word from="imidz" to="imidĹľ" />
+		<Word from="inace" to="inaÄŤe" />
+		<Word from="Inace" to="InaÄŤe" />
+		<Word from="isao" to="išao" />
+		<Word from="Isao" to="Išao" />
+		<Word from="iscupao" to="iščupao" />
+		<Word from="isećemo" to="izrezati" />
+		<Word from="isla" to="išla" />
+		<Word from="istjece" to="istjeÄŤe" />
+		<Word from="istrazio" to="istrazio" />
+		<Word from="Istrazio" to="Istrazio" />
+		<Word from="isuvise" to="previše" />
+		<Word from="izaci" to="izaći" />
+		<Word from="Izaci" to="Izaći" />
+		<Word from="izade" to="izađe" />
+		<Word from="Izade" to="Izađe" />
+		<Word from="izadem" to="izađem" />
+		<Word from="izades" to="izađeš" />
+		<Word from="izadete" to="izađete" />
+		<Word from="Izadi" to="Izađi" />
+		<Word from="izadi" to="izađi" />
+		<Word from="izasao" to="izašao" />
+		<Word from="izasla" to="izašla" />
+		<Word from="izici" to="izići" />
+		<Word from="izluduje" to="izluđuje" />
+		<Word from="izluduju" to="izluđuju" />
+		<Word from="izmedu" to="između" />
+		<Word from="Izmedu" to="Između" />
+		<Word from="izostri" to="izoštri" />
+		<Word from="izostrim" to="izoštrim" />
+		<Word from="izvuci" to="izvući" />
+		<Word from="išcupao" to="iščupao" />
+		<Word from="jebes" to="jebeš" />
+		<Word from="Jebes" to="Jebeš" />
+		<Word from="jos" to="još" />
+		<Word from="Jos" to="Još" />
+		<Word from="juce" to="juÄŤer" />
+		<Word from="Juce" to="JuÄŤer" />
+		<Word from="jucer" to="juÄŤer" />
+		<Word from="Jucer" to="JuÄŤer" />
+		<!--k-->
+		<Word from="kaslja" to="kašlja" />
+		<Word from="kaze" to="kaĹľe" />
+		<Word from="Kaze" to="KaĹľe" />
+		<Word from="kazemo" to="kaĹľemo" />
+		<Word from="kazite" to="kaĹľite" />
+		<Word from="Kazite" to="KaĹľite" />
+		<Word from="kazu" to="kaĹľu" />
+		<Word from="Kcer" to="Kćer" />
+		<Word from="kcer" to="kćer" />
+		<Word from="kcerka" to="kći" />
+		<Word from="Kcerka" to="Kći" />
+		<Word from="kcerkama" to="kćerima" />
+		<Word from="kcerku" to="kćer" />
+		<Word from="Kcerku" to="Kćer" />
+		<Word from="kecap" to="keÄŤap" />
+		<Word from="kecapa" to="keÄŤapa" />
+		<Word from="kise" to="kiše" />
+		<Word from="kisi" to="kiši" />
+		<Word from="kleknes" to="klekneš" />
+		<Word from="kociji" to="koÄŤiji" />
+		<Word from="kolaca" to="kolaÄŤa" />
+		<Word from="kolace" to="kolaÄŤe" />
+		<Word from="komadic" to="komadić" />
+		<Word from="komsijama" to="susjedima" />
+		<Word from="komsije" to="susjedi" />
+		<Word from="komsiji" to="susjedu" />
+		<Word from="komsiluk" to="susjedstvo" />
+		<Word from="komsiluku" to="susjedstvu" />
+		<Word from="komšija" to="susjed" />
+		<Word from="Komšija" to="Susjed" />
+		<Word from="Konkurise" to="Konkurira" />
+		<Word from="konkurise" to="konkurira" />
+		<Word from="konkurisem" to="konkuriram" />
+		<Word from="konkurisu" to="konkuriraju" />
+		<Word from="kontrolisu" to="kontroliraju" />
+		<Word from="kosulja" to="košulja" />
+		<Word from="kosulje" to="košulje" />
+		<Word from="kosulji" to="košulji" />
+		<Word from="kosulju" to="košulju" />
+		<Word from="kovceg" to="kovÄŤeg" />
+		<Word from="kovcegu" to="kovÄŤegu" />
+		<Word from="krada" to="krađa" />
+		<Word from="Krada" to="Krađa" />
+		<Word from="Krece" to="Kreće" />
+		<Word from="krece" to="kreće" />
+		<Word from="Kreci" to="Kreći" />
+		<Word from="kreci" to="kreći" />
+		<Word from="krecu" to="kreću" />
+		<Word from="krećes" to="krećeš" />
+		<Word from="krosnje" to="krošnje" />
+		<Word from="krvaris" to="krvariš" />
+		<Word from="kuca" to="kuća" />
+		<Word from="kucama" to="kućama" />
+		<Word from="kuce" to="kuće" />
+		<Word from="kuci" to="kući" />
+		<Word from="kusa" to="kuša" />
+		<Word from="kusas" to="kušaš" />
+		<Word from="kuča" to="kuća" />
+		<Word from="kuči" to="kući" />
+		<!--l-->
+		<Word from="lakocom" to="lakoćom" />
+		<Word from="laz" to="laĹľ" />
+		<Word from="lazac" to="laĹľljivac" />
+		<Word from="laze" to="laĹľe" />
+		<Word from="lazi" to="laĹľi" />
+		<Word from="lazne" to="laĹľne" />
+		<Word from="lazni" to="laĹľni" />
+		<Word from="lazov" to="laĹľljivac" />
+		<Word from="ledja" to="leđa" />
+		<Word from="ledjima" to="leđima" />
+		<Word from="leprsa" to="leprša" />
+		<Word from="lezala" to="leĹľala" />
+		<Word from="lezali" to="leĹľali" />
+		<Word from="lezati" to="leĹľati" />
+		<Word from="lezis" to="ležiš" />
+		<Word from="Lezis" to="Ležiš" />
+		<Word from="lici" to="liÄŤi" />
+		<Word from="licim" to="liÄŤim" />
+		<Word from="licis" to="ličiš" />
+		<Word from="licnost" to="liÄŤnost" />
+		<Word from="licnosti" to="liÄŤnosti" />
+		<Word from="lijecniku" to="lijeÄŤniku" />
+		<Word from="ljubis" to="ljubiš" />
+		<Word from="los" to="loš" />
+		<Word from="losa" to="loša" />
+		<Word from="losu" to="lošu" />
+		<!--m-->
+		<Word from="majcine" to="majÄŤine" />
+		<Word from="masini" to="mašini" />
+		<Word from="medu" to="među" />
+		<Word from="Medutim" to="Međutim" />
+		<Word from="medutim" to="međutim" />
+		<Word from="mici" to="miÄŤi" />
+		<Word from="Mici" to="MiÄŤi" />
+		<Word from="micu" to="miÄŤu" />
+		<Word from="mislis" to="misliš" />
+		<Word from="Mislis" to="Misliš" />
+		<Word from="mjesecevom" to="mjeseÄŤevom" />
+		<Word from="mjesecine" to="mjeseÄŤine" />
+		<Word from="mjesecini" to="mjeseÄŤini" />
+		<Word from="mjesecinu" to="mjeseÄŤinu" />
+		<Word from="mladic" to="mladić" />
+		<Word from="moc" to="moć" />
+		<Word from="moci" to="moći" />
+		<Word from="motivisu" to="motiviraju" />
+		<Word from="mozda" to="moĹľda" />
+		<Word from="Mozda" to="MoĹľda" />
+		<Word from="moze" to="moĹľe" />
+		<Word from="mozete" to="moĹľete" />
+		<Word from="mreza" to="mreĹľa" />
+		<Word from="mrezu" to="mreĹľu" />
+		<Word from="mrzis" to="mrziš" />
+		<Word from="muce" to="muÄŤe" />
+		<Word from="mucenik" to="muÄŤenik" />
+		<Word from="mucne" to="muÄŤne" />
+		<Word from="muska" to="muška" />
+		<Word from="muz" to="muĹľ" />
+		<Word from="muza" to="muĹľa" />
+		<!--n-->
+		<Word from="naci" to="naći" />
+		<Word from="Naci" to="Naći" />
+		<Word from="nacin" to="naÄŤin" />
+		<Word from="nadem" to="nađem" />
+		<Word from="Nadem" to="Nađem" />
+		<Word from="nademo" to="nađemo" />
+		<Word from="nades" to="nađeš" />
+		<Word from="Nades" to="Nađeš" />
+		<Word from="nadete" to="nađete" />
+		<Word from="nadici" to="nadići" />
+		<Word from="nadje" to="nađe" />
+		<Word from="Nadje" to="Nađe" />
+		<Word from="nadjen" to="nađen" />
+		<Word from="nadjes" to="nađeš" />
+		<Word from="Nadjes" to="Nađeš" />
+		<Word from="nadjete" to="nađete" />
+		<Word from="nagovestaj" to="nagovještaj" />
+		<Word from="najvise" to="najvise" />
+		<Word from="Najvise" to="Najviše" />
+		<Word from="naklonoscu" to="nakolonošću" />
+		<Word from="naocale" to="naoÄŤale" />
+		<Word from="Napisite" to="Napišite" />
+		<Word from="nasa" to="naša" />
+		<Word from="Nase" to="Naše" />
+		<Word from="nase" to="naše" />
+		<Word from="naseg" to="našeg" />
+		<Word from="nasi" to="naši" />
+		<Word from="Nasi" to="Naši" />
+		<Word from="nasao" to="našao" />
+		<Word from="Nasao" to="Našao" />
+		<Word from="nasla" to="našla" />
+		<Word from="Nasla" to="Našla" />
+		<Word from="nasli" to="našli" />
+		<Word from="Nasli" to="Našli" />
+		<Word from="nasoj" to="našoj" />
+		<Word from="nasrecu" to="na sreću" />
+		<Word from="nastavis" to="nastaviš" />
+		<Word from="nasu" to="našu" />
+		<Word from="nauce" to="nauÄŤe" />
+		<Word from="neceg" to="neÄŤeg" />
+		<Word from="necega" to="neÄŤega" />
+		<Word from="necemo" to="nećemo" />
+		<Word from="necemu" to="neÄŤemu" />
+		<Word from="necije" to="neÄŤije" />
+		<Word from="neciji" to="neÄŤiji" />
+		<Word from="necim" to="neÄŤim" />
+		<Word from="necovjecnost" to="neÄŤovjeÄŤnost" />
+		<Word from="necovjecnosti" to="neÄŤovjeÄŤnosti" />
+		<Word from="necu" to="neću" />
+		<Word from="Necu" to="Neću" />
+		<Word from="nekaze" to="ne kaĹľe" />
+		<Word from="nekoc" to="nekoć" />
+		<Word from="Nemas" to="Nemaš" />
+		<Word from="nemas" to="nemaš" />
+		<Word from="Nesreca" to="Nesreća" />
+		<Word from="nesto" to="nešto" />
+		<Word from="Nesto" to="Nešto" />
+		<Word from="new yorski" to="njujorški" />
+		<Word from="Nezan" to="NjeĹľan" />
+		<Word from="nezan" to="njeĹľan" />
+		<Word from="nezna" to="njeĹľna" />
+		<Word from="Neznam" to="Ne znam" />
+		<Word from="Neznas" to="Ne znas" />
+		<Word from="Neznajuci" to="Ne znajući" />
+		<Word from="Neznavsi" to="Ne znavši" />
+		<Word from="neznam" to="ne znam" />
+		<Word from="neznas" to="ne znas" />
+		<Word from="neznajuci" to="ne znajući" />
+		<Word from="neznavsi" to="ne znavši" />
+		<Word from="nezni" to="njeĹľni" />
+		<Word from="neznih" to="njeĹľnih" />
+		<Word from="neznim" to="njeĹľnim" />
+		<Word from="nezno" to="njeĹľno" />
+		<Word from="neznu" to="njeĹľnu" />
+		<Word from="niceg" to="niÄŤeg" />
+		<Word from="nicega" to="niÄŤega" />
+		<Word from="nicemu" to="niÄŤemu" />
+		<Word from="nicija" to="niÄŤija" />
+		<Word from="niciji" to="niÄŤiji" />
+		<Word from="nicim" to="niÄŤim" />
+		<Word from="njezno" to="njeĹľno" />
+		<Word from="nju jorski" to="njujorški" />
+		<Word from="noci" to="noći" />
+		<Word from="nocnu" to="noćnu" />
+		<Word from="nosac" to="nosaÄŤ" />
+		<Word from="nosices" to="nosit ćeš" />
+		<Word from="nosis" to="nosiš" />
+		<Word from="noz" to="noĹľ" />
+		<Word from="nozem" to="noĹľem" />
+		<!--o-->
+		<Word from="Obecao" to="Obećao" />
+		<Word from="Obezbedjuju" to="Osiguravaju" />
+		<Word from="obezbedjuju" to="osiguravaju" />
+		<Word from="obide" to="obiđe" />
+		<Word from="objasnis" to="objasniš" />
+		<Word from="obozavalac" to="oboĹľavatelj" />
+		<Word from="obracas" to="obraćaš" />
+		<Word from="obraćas" to="obraćaš" />
+		<Word from="obuce" to="obuÄŤe" />
+		<Word from="obucem" to="obuÄŤem" />
+		<Word from="oceve" to="oÄŤeve" />
+		<Word from="ocito" to="oÄŤito" />
+		<Word from="ocnjaci" to="oÄŤnjaci" />
+		<Word from="odes" to="odeš" />
+		<Word from="odlazis" to="odlaziš" />
+		<Word from="odlezati" to="odleĹľati" />
+		<Word from="odlucim" to="odluÄŤim" />
+		<Word from="odmice" to="odmiÄŤe" />
+		<Word from="odraduje" to="odrađuje" />
+		<Word from="odreden" to="određen" />
+		<Word from="odreduje" to="određuje" />
+		<Word from="odredujemo" to="određujemo" />
+		<Word from="odvec" to="odveć" />
+		<Word from="ogrtac" to="ogrtaÄŤ" />
+		<Word from="ohrabrujuce" to="ohrabrujuće" />
+		<Word from="ojacam" to="ojaÄŤam" />
+		<Word from="okrece" to="okreće" />
+		<Word from="opasac" to="opasaÄŤ" />
+		<Word from="operise" to="operira" />
+		<Word from="operisemo" to="operiramo" />
+		<Word from="operisete" to="operirate" />
+		<Word from="operiseš" to="operiraš" />
+		<Word from="osecaces" to="osjećat ćeš" />
+		<Word from="osjecaces" to="osjećat ćeš" />
+		<Word from="osjecam" to="osjećam" />
+		<Word from="osjecanja" to="osjećanja" />
+		<Word from="oslobada" to="oslobađa" />
+		<Word from="ostra" to="oštra" />
+		<Word from="ostre" to="oštre" />
+		<Word from="ostri" to="oštri" />
+		<Word from="ostrom" to="oštrom" />
+		<Word from="ostru" to="oštru" />
+		<Word from="osvrnes" to="osvrneš" />
+		<Word from="Osvrnes" to="Osvrneš" />
+		<Word from="otezala" to="oteĹľala" />
+		<Word from="otidi" to="otiđi" />
+		<Word from="otidji" to="otiđi" />
+		<Word from="otisao" to="otišao" />
+		<Word from="oziljak" to="oĹľiljak" />
+		<!--p-->		
+		<Word from="palaca" to="palaÄŤa" />
+		<Word from="palaci" to="palaÄŤi" />
+		<Word from="palacu" to="palaÄŤu" />
+		<Word from="papucama" to="papuÄŤama" />
+		<Word from="parce" to="komadić" />
+		<Word from="pateci" to="pateći" />
+		<Word from="patis" to="patiš" />
+		<Word from="pcela" to="pÄŤela" />
+		<Word from="pcele" to="pÄŤele" />
+		<Word from="pecini" to="pećini" />
+		<Word from="pecinski" to="pećinski" />
+		<Word from="peraca" to="peraÄŤa" />
+		<Word from="Peraci" to="PeraÄŤi" />
+		<Word from="pica" to="pića" />
+		<Word from="pice" to="piće" />
+		<Word from="picem" to="pićem" />
+		<Word from="pijes" to="piješ" />
+		<Word from="pisacoj" to="pisaćoj" />
+		<Word from="pise" to="piše" />
+		<Word from="pisem" to="pišem" />
+		<Word from="pisemo" to="pišemo" />
+		<Word from="pises" to="pišeš" />
+		<Word from="pisite" to="pišite" />
+		<Word from="pisu" to="pišu" />
+		<Word from="pitas" to="pitaš" />
+		<Word from="placa" to="plaća" />
+		<Word from="placam" to="plaćam" />
+		<Word from="placanje" to="plaćanje" />
+		<Word from="placanjem" to="plaćanjem" />
+		<Word from="place" to="plaÄŤe" />
+		<Word from="placem" to="plaÄŤem" />
+		<Word from="placete" to="plaÄŤete" />
+		<Word from="placeš" to="plačeš" />
+		<Word from="placu" to="plaću" />
+		<Word from="placuci" to="plačući" />
+		<Word from="Plasi" to="Boji" />
+		<Word from="plazi" to="plaĹľi" />
+		<Word from="plazu" to="plaĹľu" />
+		<Word from="plese" to="pleše" />
+		<Word from="plesemo" to="plešemo" />
+		<Word from="plesete" to="plešete" />
+		<Word from="plesu" to="plešu" />
+		<Word from="ploca" to="ploÄŤa" />
+		<Word from="ploce" to="ploÄŤe" />
+		<Word from="pluca" to="pluća" />
+		<Word from="plucima" to="plućima" />
+		<Word from="pobjeci" to="pobjeći" />
+		<Word from="pobjeduje" to="pobjeđuje" />
+		<Word from="poceli" to="poÄŤeli" />
+		<Word from="poceo" to="poÄŤeo" />
+		<Word from="pocetak" to="poÄŤetak" />
+		<Word from="pocevsi" to="počevši" />
+		<Word from="pocevši" to="počevši" />
+		<Word from="poci" to="poći" />
+		<Word from="pocinje" to="poÄŤinje" />
+		<Word from="pociva" to="poÄŤiva" />
+		<Word from="pocivali" to="poÄŤivali" />
+		<Word from="pocivao" to="poÄŤivao" />
+		<Word from="pode" to="pođe" />
+		<Word from="podi" to="pođi" />
+		<Word from="podici" to="podići" />
+		<Word from="Podici" to="Podići" />
+		<Word from="podimo" to="pođimo" />
+		<Word from="Podimo" to="Pođimo" />
+		<Word from="podje" to="pođe" />
+		<Word from="Podje" to="Pođe" />
+		<Word from="Podji" to="Pođi" />
+		<Word from="podji" to="pođi" />
+		<Word from="podneses" to="podneseš" />
+		<Word from="podocnjacima" to="podoÄŤnjacima" />
+		<Word from="podocnjake" to="podoÄŤnjake" />
+		<Word from="podstice" to="potiÄŤe" />
+		<Word from="poduzeca" to="poduzeća" />
+		<Word from="poduzece" to="poduzeće" />
+		<Word from="poduzecu" to="poduzeću" />
+		<Word from="pojesce" to="pojest će" />
+		<Word from="pojiliste" to="pojilište" />
+		<Word from="pokazi" to="pokaĹľi" />
+		<Word from="Pokazi" to="PokaĹľi" />
+		<Word from="pokrece" to="pokreće" />
+		<Word from="pokusaj" to="pokušaj" />
+		<Word from="pokusam" to="pokušam" />
+		<Word from="pokusas" to="pokušaš" />
+		<Word from="poletis" to="poletiš" />
+		<Word from="polozaja" to="poloĹľaja" />
+		<Word from="polozaju" to="poloĹľaju" />
+		<Word from="pomaci" to="pomaknuti" />
+		<Word from="pomazes" to="pomažeš" />
+		<Word from="pomislis" to="pomisliš" />
+		<Word from="pomognes" to="pomogneš" />
+		<Word from="poneses" to="poneseš" />
+		<Word from="ponovis" to="ponoviš" />
+		<Word from="poreci" to="poreći" />
+		<Word from="porice" to="poriÄŤe" />
+		<Word from="posalji" to="pošalji" />
+		<Word from="Posalji" to="Pošalji" />
+		<Word from="posaljite" to="pošaljite" />
+		<Word from="posle" to="poslije" />
+		<Word from="posluzili" to="posluĹľili" />
+		<Word from="Posluzite" to="PosluĹľite" />
+		<Word from="posluzite" to="posluĹľite" />
+		<Word from="postaras" to="pobrineš" />
+		<Word from="posto" to="pošto" />
+		<Word from="Posto" to="Pošto" />
+		<Word from="potece" to="poteÄŤe" />
+		<Word from="potice" to="potiÄŤe" />
+		<Word from="potici" to="potiÄŤi" />
+		<Word from="potjece" to="potjeÄŤe" />
+		<Word from="potjecem" to="potjeÄŤem" />
+		<Word from="potjeces" to="potječeš" />
+		<Word from="potpises" to="potpišeš" />
+		<Word from="povedes" to="povedeš" />
+		<Word from="pozuda" to="poĹľuda" />
+		<Word from="pozude" to="poĹľude" />
+		<Word from="pozudi" to="poĹľudi" />
+		<Word from="pozudu" to="poĹľudu" />
+		<Word from="prakticno" to="praktiÄŤno" />
+		<Word from="premasuje" to="premašuje" />
+		<Word from="premasuju" to="premašuju" />
+		<Word from="preporuca" to="preporuÄŤuje" />
+		<Word from="presao" to="prešao" />
+		<Word from="presjecen" to="presjeÄŤen" />
+		<Word from="Previse" to="Previše" />
+		<Word from="previse" to="previše" />
+		<Word from="preziveo" to="preĹľivio" />
+		<Word from="Priblizi" to="PribliĹľi" />
+		<Word from="price" to="priÄŤe" />
+		<Word from="prici" to="priÄŤi" />
+		<Word from="pricu" to="priÄŤu" />
+		<Word from="Pridji" to="Priđi" />
+		<Word from="pridji" to="priđi" />
+		<Word from="prijeci" to="prijeći" />
+		<Word from="prijedi" to="prijeđi" />
+		<Word from="prilazis" to="prilaziš" />
+		<Word from="prisao" to="prišao" />
+		<Word from="priusti" to="priušti" />
+		<Word from="priustimo" to="priuštimo" />
+		<Word from="priustiti" to="priuštiti" />
+		<Word from="proci" to="proći" />
+		<Word from="prodavac" to="prodavaÄŤ" />
+		<Word from="promasio" to="promašio" />
+		<Word from="Promasio" to="Promašio" />
+		<Word from="prosao" to="prošao" />
+		<Word from="prosla" to="prošla" />
+		<Word from="Prosle" to="Prošle" />
+		<Word from="prosle" to="prošle" />
+		<Word from="prosli" to="prošli" />
+		<Word from="Prosli" to="Prošli" />
+		<Word from="proslim" to="prošlim" />
+		<Word from="proslo" to="prošlo" />
+		<Word from="Proslo" to="Prošlo" />
+		<Word from="provedes" to="provedeš" />
+		<Word from="provlaci" to="provlaÄŤi" />
+		<Word from="provlacimo" to="provlaÄŤimo" />
+		<Word from="pticica" to="ptiÄŤica" />
+		<Word from="pticicu" to="ptiÄŤicu" />
+		<Word from="pucini" to="puÄŤini" />
+		<Word from="pupcanu" to="pupÄŤanu" />
+		<Word from="pusac" to="pušač" />
+		<Word from="pusaci" to="pušači" />
+		<Word from="pusi" to="puši" />
+		<Word from="pusimo" to="pušimo" />
+		<Word from="pusite" to="pušite" />
+		<Word from="pustam" to="puštam" />
+		<!--r-->		
+		<Word from="racunare" to="raÄŤunala" />
+		<Word from="racunari" to="raÄŤunala" />
+		<Word from="radis" to="radiš" />
+		<Word from="Radis" to="Radiš" />
+		<Word from="raskosni" to="raskošni" />
+		<Word from="razumes" to="razumiješ" />
+		<Word from="Razumes" to="Razumiješ" />
+		<Word from="rec" to="rijeÄŤ" />
+		<Word from="rece" to="reÄŤe" />
+		<Word from="Receno" to="ReÄŤeno" />
+		<Word from="receno" to="reÄŤeno" />
+		<Word from="recima" to="rijeÄŤima" />
+		<Word from="resimo" to="riješimo" />
+		<Word from="rijec" to="rijeÄŤ" />
+		<Word from="Rijeci" to="RijeÄŤi" />
+		<Word from="rijedji" to="rjeđi" />
+		<Word from="rjedji" to="rjeđi" />
+		<Word from="Rjesit" to="Riješit" />
+		<Word from="rodena" to="rođena" />
+		<Word from="rodeni" to="rođeni" />
+		<Word from="rodis" to="rodiš" />
+		<Word from="rodjen" to="rođen" />
+		<Word from="rucno" to="ruÄŤno" />
+		<Word from="ruza" to="ruĹľa" />
+		<Word from="ruzan" to="ruĹľan" />
+		<Word from="ruzu" to="ruĹľu" />
+		<!-- s -->
+		<Word from="sadrze" to="sadrĹľe" />
+		<Word from="sadrzi" to="sadrĹľi" />
+		<Word from="salje" to="šalje" />
+		<Word from="saljes" to="šalješ" />
+		<Word from="salju" to="šalju" />
+		<Word from="sasila" to="sašila" />
+		<Word from="sasili" to="sašili" />
+		<Word from="sasio" to="sašio" />
+		<Word from="sasiti" to="sašiti" />
+		<Word from="savescu" to="savješću" />
+		<Word from="savijescu" to="savješću" />
+		<Word from="sedeces" to="sjedit ćeš" />
+		<Word from="sedis" to="sjediš" />
+		<Word from="sedista" to="sjedala" />
+		<Word from="sediste" to="sjedište" />
+		<Word from="sendvic" to="sendviÄŤ" />
+		<Word from="sesir" to="šešir" />
+		<Word from="sesirom" to="šeširom" />
+		<Word from="sest" to="šest" />
+		<Word from="setala" to="šetala" />
+		<Word from="setam" to="šetam" />
+		<Word from="setis" to="sjetiš" />
+		<Word from="seva" to="ševa" />
+		<Word from="sevu" to="ševu" />
+		<Word from="sezdeset" to="šezdeset" />
+		<Word from="Sidji" to="Siđi" />
+		<Word from="sidji" to="siđi" />
+		<Word from="sijecanj" to="sijeÄŤanj" />
+		<Word from="siroki" to="široki" />
+		<Word from="sjecaju" to="sjećaju" />
+		<Word from="sjecam" to="sjećam" />
+		<Word from="Sjecam" to="Sjećam" />
+		<Word from="sjecanja" to="sjećanja" />
+		<Word from="sjecanje" to="sjećanje" />
+		<Word from="skace" to="skaÄŤe" />
+		<Word from="skaci" to="skaÄŤi" />
+		<Word from="skacu" to="skaÄŤu" />
+		<Word from="sklanjas" to="sklanjaš" />
+		<Word from="sklonoscu" to="sklonošću" />
+		<Word from="sklupcam" to="sklupÄŤam" />
+		<Word from="skola" to="škola" />
+		<Word from="Skola" to="Ĺ kola" />
+		<Word from="Skotska" to="Ĺ kotska" />
+		<Word from="Skotskoj" to="Ĺ kotskoj" />
+		<Word from="skrt" to="škrt" />
+		<Word from="skrte" to="škrte" />
+		<Word from="skrusena" to="skrušena" />
+		<Word from="Skrusena" to="Skrušena" />
+		<Word from="sledeca" to="sljedeća" />
+		<Word from="Sledece" to="Sljedeće" />
+		<Word from="sledeci" to="sljedeći" />
+		<Word from="Sledeci" to="Sljedeći" />
+		<Word from="slicno" to="sliÄŤno" />
+		<Word from="sljedeci" to="sljedeći" />
+		<Word from="Sljedeci" to="Sljedeći" />
+		<Word from="slozila" to="sloĹľila" />
+		<Word from="slozili" to="sloĹľili" />
+		<Word from="slozio" to="sloĹľio" />
+		<Word from="sloziti" to="sloĹľiti" />
+		<Word from="slucaja" to="sluÄŤaja" />
+		<Word from="Smatras" to="Smatraš" />
+		<Word from="smatras" to="smatraš" />
+		<Word from="smece" to="smeće" />
+		<Word from="smeda" to="smeđa" />
+		<Word from="smedem" to="smeđem" />
+		<Word from="smedi" to="smeđi" />
+		<Word from="smedoj" to="smeđoj" />
+		<Word from="smedu" to="smeđu" />
+		<Word from="smesak" to="smješak" />
+		<Word from="Smijes" to="Smiješ" />
+		<Word from="smijes" to="smiješ" />
+		<Word from="smionoscu" to="smionošću" />
+		<Word from="smraci" to="smraÄŤi" />
+		<Word from="smracilo" to="smraÄŤilo" />
+		<Word from="smrcu" to="smrću" />
+		<Word from="snimacete" to="snimat ćete" />
+		<Word from="sokiras" to="šokiraš" />
+		<Word from="spases" to="spasiš" />
+		<Word from="Spases" to="Spasiš" />
+		<Word from="spavaca" to="spavaća" />
+		<Word from="spavacoj" to="spavaćoj" />
+		<Word from="spominjes" to="spominješ" />
+		<Word from="spustamo" to="spuštamo" />
+		<Word from="srdacan" to="srdaÄŤan" />
+		<Word from="srecom" to="srećom" />
+		<Word from="sresce" to="srest će" />
+		<Word from="srešce" to="srest će" />
+		<Word from="srljas" to="srljaš" />
+		<Word from="Sta" to="Ĺ to" />
+		<Word from="sta" to="što" />
+		<Word from="stab" to="stoĹľer" />
+		<Word from="Stab" to="StoĹľer" />
+		<Word from="stagod" to="što god" />
+		<Word from="stampa" to="tisak" />
+		<Word from="stampati" to="tiskati" />
+		<Word from="stampi" to="tisku" />
+		<Word from="stampom" to="tiskom" />
+		<Word from="stampu" to="tisak" />
+		<Word from="standa" to="štanda" />
+		<Word from="standu" to="štandu" />
+		<Word from="stavis" to="staviš" />
+		<Word from="Stavise" to="Štoviše" />
+		<Word from="Stavićemo" to="Stavit ćemo" />
+		<Word from="steceni" to="steÄŤeni" />
+		<Word from="stezuci" to="stežući" />
+		<Word from="stici" to="stići" />
+		<Word from="stojis" to="stojiš" />
+		<Word from="Stojis" to="Stojiš" />
+		<Word from="stp" to="što" />
+		<Word from="strasan" to="strašan" />
+		<Word from="strasno" to="strašno" />
+		<Word from="sudeci" to="sudeći" />
+		<Word from="sudenja" to="suđenja" />
+		<Word from="sudenje" to="suđenje" />
+		<Word from="sudenju" to="suđenju" />
+		<Word from="sugerisu" to="predlaĹľu" />
+		<Word from="sumnjas" to="sumnjaš" />
+		<Word from="sumska" to="šumska" />
+		<Word from="sumski" to="šumski" />
+		<Word from="sumskoj" to="šumskoj" />
+		<Word from="supak" to="šupak" />
+		<Word from="suraduj" to="surađuj" />
+		<Word from="suraduje" to="surađuje" />
+		<Word from="suradujemo" to="surađujemo" />
+		<Word from="suraduju" to="surađuju" />
+		<Word from="Suraduj" to="Surađuj" />
+		<Word from="Suraduje" to="Surađuje" />
+		<Word from="Suradujemo" to="Surađujemo" />
+		<Word from="Suraduju" to="Surađuju" />
+		<Word from="sustina" to="bit" />
+	    	<Word from="sustine" to="biti" />
+    		<Word from="sustini" to="biti" />
+    		<Word from="Sustine" to="Biti" />
+    		<Word from="Sustini" to="Biti" />
+    		<Word from="Sustinom" to="Biti" />
+    		<Word from="sustinom" to="biti" />
+		<Word from="sustinski" to="bitni" />
+		<Word from="suti" to="šuti" />
+		<Word from="Suti" to="Ĺ uti" />
+		<Word from="svacije" to="svaÄŤije" />
+		<Word from="svaciji" to="svaÄŤiji" />
+		<Word from="svaciju" to="svaÄŤiju" />
+		<Word from="svecan" to="sveÄŤan" />
+		<Word from="svecani" to="sveÄŤani" />
+		<Word from="svez" to="svjeĹľ" />
+    		<Word from="sveza" to="svjeĹľa" />
+    		<Word from="svezu" to="svjeĹľu" />
+    		<Word from="svezi" to="svjeĹľi" />
+    		<Word from="sveze" to="svjeĹľe" />
+    		<Word from="svezim" to="svjeĹľim" />
+    		<Word from="svezom" to="svjeĹľom" />
+    		<Word from="svezoj" to="svjeĹľoj" />
+    		<Word from="svezinom" to="svjeĹľinom" />
+    		<Word from="svezina" to="svjeĹľina" />
+    		<Word from="svezinu" to="svjeĹľinu" />
+    		<Word from="svezini" to="svjeĹľini" />
+    		<Word from="svezine" to="svjeĹľine" />
+		<Word from="Svida" to="Sviđa" />
+		<Word from="svidala" to="sviđala" />
+		<Word from="svidalo" to="sviđalo" />
+		<Word from="svidam" to="sviđam" />
+		<Word from="svidao" to="sviđao" />
+		<Word from="sviras" to="sviraš" />
+		<!--t-->
+		<Word from="taknes" to="takneš" />
+		<Word from="takode" to="također" />
+		<Word from="takoder" to="također" />
+		<Word from="takodje" to="također" />
+		<Word from="Takodje" to="Također" />
+		<Word from="tece" to="teÄŤe" />
+		<Word from="teska" to="teška" />
+		<Word from="Teska" to="Teška" />
+		<Word from="teske" to="teške" />
+		<Word from="teski" to="teški" />
+		<Word from="tesko" to="teško" />
+		<Word from="Tesko" to="Teško" />
+		<Word from="teskom" to="teškom" />
+		<Word from="tezak" to="teĹľak" />
+		<Word from="Tezak" to="TeĹľak" />
+		<Word from="teze" to="teĹľe" />
+		<Word from="tezi" to="teĹľi" />
+		<Word from="Tezi" to="TeĹľi" />
+		<Word from="tezimo" to="teĹľimo" />
+		<Word from="Tezimo" to="TeĹľimo" />
+		<Word from="tezinu" to="teĹľinu" />
+		<Word from="tezis" to="težiš" />
+		<Word from="Teziš" to="Težiš" />
+		<Word from="tisuce" to="tisuće" />
+		<Word from="tisucu" to="tisuću" />
+		<Word from="Tocak" to="KotaÄŤ" />
+		<Word from="tocak" to="kotaÄŤ" />
+		<Word from="tocka" to="toÄŤka" />
+		<Word from="tocku" to="toÄŤku" />
+		<Word from="trajace" to="trajat će" />
+		<Word from="Trajace" to="Trajat će" />
+		<Word from="trazis" to="tražiš" />
+		<Word from="trcao" to="trÄŤao" />
+		<Word from="trce" to="trÄŤe" />
+		<Word from="Trce" to="TrÄŤe" />
+		<Word from="trci" to="trÄŤi" />
+		<Word from="Trci" to="TrÄŤi" />
+		<Word from="trcim" to="trÄŤim" />
+		<Word from="Trcim" to="TrÄŤim" />
+		<Word from="trcimo" to="trÄŤimo" />
+		<Word from="trebas" to="trebaš" />
+		<Word from="Trebas" to="Trebaš" />
+		<Word from="treci" to="treći" />
+		<Word from="tricarija" to="triÄŤarija" />
+		<Word from="trudis" to="trudiš" />
+		<Word from="trunuce" to="trunut će" />
+		<Word from="tuce" to="tuÄŤe" />
+		<Word from="tuces" to="tučeš" />
+		<Word from="tucom" to="tuÄŤom" />
+		<Word from="tucu" to="tuÄŤnjavu" />
+		<Word from="tudje" to="tuđe" />
+		<Word from="tudjeg" to="tuđeg" />
+		<Word from="tudoj" to="tuđoj" />
+		<Word from="tudom" to="tuđom" />
+		<Word from="tudjem" to="tuđem" />
+		<Word from="tudem" to="tuđem" />
+		<Word from="tumaras" to="tumaraš" />
+		<Word from="tvoris" to="tvoriš" />
+		<!--u-->
+		<Word from="ubedjuju" to="uvjeravaju" />
+		<Word from="ubijes" to="ubiješ" />
+		<Word from="Ubijes" to="Ubiješ" />
+		<Word from="uceni" to="uÄŤeni" />
+		<Word from="uci" to="ući" />
+		<Word from="ucine" to="uÄŤine" />
+		<Word from="ucinimo" to="uÄŤinimo" />
+		<Word from="ucinio" to="uÄŤinio" />
+		<Word from="ucio" to="uÄŤio" />
+		<Word from="Ucio" to="UÄŤio" />
+		<Word from="udas" to="udaš" />
+		<Word from="udete" to="uđete" />
+		<Word from="udeš" to="udeš" />
+		<Word from="udi" to="uđi" />
+		<Word from="Udi" to="UÄ‘i" />
+		<Word from="Udje" to="UÄ‘e" />
+		<Word from="udje" to="uđe" />
+		<Word from="udjes" to="uđeš" />
+		<Word from="ugriscu" to="ugrist ću" />
+		<Word from="ukljestena" to="ukliještena" />
+		<Word from="ukljucujuci" to="uključujući" />
+		<Word from="umes" to="umiješ" />
+		<Word from="umiruci" to="umirući" />
+		<Word from="umrecu" to="umrijet ću" />
+		<Word from="umres" to="umreš" />
+		<Word from="unistice" to="uništit će" />
+		<Word from="uopce" to="uopće" />
+		<Word from="Uopce" to="Uopće" />
+		<Word from="Uopste" to="Uopće" />
+		<Word from="uopste" to="uopće" />
+		<Word from="upoznas" to="upoznaš" />
+		<Word from="uradis" to="učiniš" />
+		<Word from="usao" to="ušao" />
+		<Word from="Usao" to="Ušao" />
+		<Word from="usli" to="ušli" />
+		<Word from="Usmjerice" to="Usmjerit će" />
+		<Word from="uspanicio" to="uspaniÄŤio" />
+		<Word from="utapas" to="utapaš" />
+		<Word from="utesi" to="utješi" />
+		<Word from="utesim" to="utješim" />
+		<Word from="uzinu" to="uĹľinu" />
+		<Word from="uzivo" to="uĹľivo" />
+		<!--v-->
+		<Word from="valda" to="valjda" />
+		<Word from="vasa" to="vaša" />
+		<Word from="vaseg" to="vašeg" />
+		<Word from="Vaseg" to="Vašeg" />
+		<Word from="vasem" to="vašem" />
+		<Word from="vasi" to="vaši" />
+		<Word from="vasoj" to="vašoj" />
+		<Word from="vazi" to="vrijedi" />
+		<Word from="Vec" to="Već" />
+		<Word from="vec" to="već" />
+		<Word from="vecan" to="vjeÄŤan" />
+		<Word from="vecera" to="veÄŤera" />
+		<Word from="Veceras" to="VeÄŤeras" />
+		<Word from="veceras" to="veÄŤeras" />
+		<Word from="vecere" to="veÄŤere" />
+		<Word from="veceri" to="veÄŤeri" />
+		<Word from="veceru" to="veÄŤeru" />
+		<Word from="vecih" to="većih" />
+		<Word from="vecitim" to="vjeÄŤitim" />
+		<Word from="vecna" to="vjeÄŤna" />
+		<Word from="vecno" to="vjeÄŤno" />
+		<Word from="vecnost" to="vjeÄŤnost" />
+		<Word from="verovacu" to="vjerovat ću" />
+		<Word from="vice" to="viÄŤe" />
+		<Word from="vicem" to="viÄŤem" />
+		<Word from="vicemo" to="viÄŤemo" />
+		<Word from="vices" to="vičeš" />
+		<Word from="vicete" to="viÄŤete" />
+		<Word from="viden" to="viđen" />
+		<Word from="Viden" to="Viđen" />
+		<Word from="vishe" to="više" />
+		<Word from="vjencali" to="vjenÄŤali" />
+		<Word from="vjencati" to="vjenÄŤati" />
+		<Word from="vjerujes" to="vjeruješ" />
+		<Word from="Vjerujes" to="Vjeruješ" />
+		<Word from="vjetrenjace" to="vjetrenjaÄŤe" />
+		<Word from="voce" to="voće" />
+		<Word from="vocka" to="voćka" />
+		<Word from="vocku" to="voćku" />
+		<Word from="vocnjak" to="voćnjak" />
+		<Word from="vocnjaku" to="voćnjaku" />
+		<Word from="vodic" to="vodiÄŤ" />
+		<Word from="vodju" to="vođu" />
+		<Word from="vozac" to="vozaÄŤ" />
+		<Word from="Vozac" to="VozaÄŤ" />
+		<Word from="vozaca" to="vozaÄŤa" />
+		<Word from="vracam" to="vraćam" />
+		<Word from="vracen" to="vraÄŤen" />
+		<Word from="vrazja" to="vraĹľja" />
+		<Word from="vrazji" to="vraĹľji" />
+		<Word from="vreca" to="vreÄŤa" />
+		<Word from="vrece" to="vreće" />
+		<Word from="vrecu" to="vreću" />
+		<Word from="vredja" to="vrijeđa" />
+		<Word from="vredjanje" to="vrijeđanje" />
+		<Word from="vrtic" to="vrtić" />
+		<Word from="vrtica" to="vrtića" />
+		<Word from="vrticu" to="vrtiću" />
+		<!--z-->
+		<Word from="zacepe" to="zaÄŤepe" />
+		<Word from="Zacepi" to="ZaÄŤepi" />
+		<Word from="Zadrzi" to="ZadrĹľi" />
+		<Word from="zadrzi" to="zadrĹľi" />
+		<Word from="zaduzen" to="zaduĹľen" />
+		<Word from="Zaduzen" to="ZaduĹľen" />
+		<Word from="zagrlis" to="zagrliš" />
+		<Word from="zaljenja" to="Ĺľaljenja" />
+		<Word from="zaljenje" to="Ĺľaljenje" />
+		<Word from="zalosna" to="Ĺľalosna" />
+		<Word from="Zalosna" to="Žalosna" />
+		<Word from="zaokruzi" to="zaokruĹľi" />
+		<Word from="zaokruzim" to="zaokruĹľim" />
+		<Word from="zaokruzimo" to="zaokruĹľimo" />
+		<Word from="zapoceli" to="zapoÄŤeli" />
+		<Word from="zarucen" to="zaruÄŤen" />
+		<Word from="zasto" to="zašto" />
+		<Word from="Zasto" to="Zašto" />
+		<Word from="zateci" to="zateći" />
+		<Word from="zatvoris" to="zatvoriš" />
+		<Word from="zdrebe" to="Ĺľdrijebe" />
+		<Word from="Zele" to="Žele" />
+		<Word from="zele" to="Ĺľele" />
+		<Word from="Zeleci" to="Želeći" />
+		<Word from="zelila" to="Ĺľeljela" />
+		<Word from="Zelis" to="Želiš" />
+		<Word from="zelis" to="želiš" />
+		<Word from="zene" to="Ĺľene" />
+		<Word from="zenke" to="Ĺľenke" />
+		<Word from="zesce" to="žešće" />
+		<Word from="zezas" to="zezaš" />
+		<Word from="zita" to="Ĺľita" />
+		<Word from="zito" to="Ĺľito" />
+		<Word from="zitu" to="Ĺľitu" />
+		<Word from="ziv" to="Ĺľiv" />
+		<Word from="ziva" to="Ĺľiva" />
+		<Word from="zive" to="Ĺľive" />
+		<Word from="zivi" to="Ĺľivi" />
+		<Word from="zivis" to="živiš" />
+		<Word from="zivjeo" to="Ĺľivio" />
+		<Word from="Zivjeo" to="Živio" />
+		<Word from="zmureo" to="Ĺľmirio" />
+		<Word from="znacaj" to="znaÄŤaj" />
+		<Word from="znacaja" to="znaÄŤaja" />
+		<Word from="znace" to="znaÄŤe" />
+		<Word from="znaceš" to="znat ćeš" />
+		<Word from="znas" to="znaš" />
+		<Word from="Znas" to="Znaš" />
+		<Word from="zuris" to="zuriš" />
+		<Word from="zutoj" to="Ĺľutoj" /> 
+		<Word from="zvanican" to="sluĹľben" />
+		<Word from="ćes" to="ćeš" />
+		<Word from="ćte" to="ćete" />
+		<Word from="ÄŚime" to="ÄŚime" />
+		<Word from="želis" to="želiš" />
+		<Word from="Živeo" to="Živio" />
+	</WholeWords>
+	<PartialWordsAlways />
+	<PartialWords />
+	<PartialLines>
+		<LinePart from="da nadjem" to="naći" />
+		<LinePart from="da nadjes" to="naći" />
+		<LinePart from="da budes" to="biti" />
+		<LinePart from="da ides" to="ići" />
+		<LinePart from="da prodemo" to="proći" />
+		<LinePart from="da udem" to="ući" />
+		<LinePart from="gdje ides" to="kamo ideš" />
+		<LinePart from="Gdje ides" to="Kamo ideš" />
+		<LinePart from="hocu da budem" to="Ĺľelim biti" />
+		<LinePart from="Hocu da budem" to="Želim biti" />
+		<LinePart from="hocu da kazem" to="želim reći" />
+		<LinePart from="hoces da kazes" to="želiš reći" />
+		<LinePart from="hoce da kaze" to="želi reći" />
+		<LinePart from="kao sto sam" to="kao što sam" />
+		<LinePart from="me leda" to="me leđa" />
+		<LinePart from="medu nama" to="među nama" />
+		<LinePart from="moramo da idemo" to="moramo ići" />
+		<LinePart from="moras da ides" to="moraš ići" />
+		<LinePart from="na vecer" to="naveÄŤer" />
+		<LinePart from="Na vecer" to="NaveÄŤer" />
+		<LinePart from="ne cu" to="neću" />
+		<LinePart from="ne ces" to="nećeš" />
+		<LinePart  from="nešto sto"  to="nešto što"/>
+		<LinePart from="ono sto" to="ono što" />
+		<LinePart from="Ono sto" to="Ono što" />
+		<LinePart from="reci ću" to="reći ću" />
+		<LinePart from="sto ti se ne" to="što ti se ne" />
+		<LinePart from="sto vise" to="što više" />
+		<LinePart from="sve sto" to="sve što" />
+		<LinePart from="Zao mi" to="Žao mi" />
+		<LinePart from="zao mi" to="Ĺľao mi" />
+		<LinePart from="Zato sto" to="Zato što" />
+		<LinePart from="zato sto" to="zato što" />
+		<LinePart from="znas sto" to="znaš što" />
+		<LinePart from="znaš sto" to="znaš što" />
+	</PartialLines>
+	<PartialLinesAlways />
+	<BeginLines />
+	<EndLines />
+	<WholeLines />
+	<RegularExpressions>
+		<RegEx find="adas(?!v)" replaceWith="adaš" />
+		<RegEx find="(?&lt;![Pp]r|[Nn])adje(?!(v|n(e|u[olt]))\b)" replaceWith="ađe" />
+		<RegEx find="ajuc" replaceWith="ajuć" />
+		<RegEx find="ndj?el" replaceWith="nđel" />
+		<RegEx find="(?&lt;![ou])ndje" replaceWith="nđe" />
+		<RegEx find="([0-9])-ogodisnj([aeiu])\b" replaceWith="$1-godišnj$2" />
+		<RegEx find="(cetr|pet|ses)najst([aeiou]|i[mh]|o[mgj]|ima)\b" replaceWith="$1naest$2" />
+		<RegEx find="ajsmijesnij" replaceWith="ajsmješnij" />
+		<RegEx find="avljas" replaceWith="avljaš" />
+		<RegEx find="bastensk" replaceWith="vrtn" />
+		<RegEx find="beres" replaceWith="bereš" />
+		<RegEx find="([bB])elesk" replaceWith="$1ilješk" />
+		<RegEx find="([bB])elez" replaceWith="$1iljeĹľ" />
+		<RegEx find="\b([bBpP])ice(s|mo|te)\b" replaceWith="$1it će$2" />
+		<RegEx find="\b([bBpP])iti +c([ue]s?|emo|ete)\b" replaceWith="$1it ć$2" />
+		<RegEx find="eznadez" replaceWith="eznad" />
+		<RegEx find="([bB])ezanj" replaceWith="$1jeĹľanj" />
+		<RegEx find="([bB])i?j?ez([ei]|i[ms]|imo|ite|ao|al[aeio]|ati)\b" replaceWith="$1jeĹľ$2" />
+		<RegEx find="boljs" replaceWith="boljš" />
+		<RegEx find="([bB])oric" replaceWith="$1orit ć" />
+		<RegEx find="([bB])ozij" replaceWith="$1oĹľj" />
+		<RegEx find="[bB]o[zž]ic([aeiun]|em|ima)?\b" replaceWith="Božić$1" />
+		<RegEx find="udu[cč]" replaceWith="uduć" />
+		<RegEx find="([cCsS])vj?ec([aeiou]|[oe]m|ama)\b" replaceWith="$1vijeć$2" />
+		<RegEx find="[Cc]acka" replaceWith="ÄŤaÄŤka" />
+		<RegEx find="[cC]amac" replaceWith="ÄŤamac" />
+		<RegEx find="[cC]amc" replaceWith="ÄŤamc" />
+		<RegEx find="\bcaro" replaceWith="ÄŤaro" />
+		<RegEx find="Caroli(?!n)" replaceWith="ÄŚaroli" />
+		<RegEx find="cast" replaceWith="ÄŤast" />
+		<RegEx find="Cast" replaceWith="ÄŚast" />
+		<RegEx find="cas([au]|om|ovima)\b" replaceWith="sat$1" />
+		<RegEx find="Cas([au]|om|ovima)\b" replaceWith="Sat$1" />
+		<RegEx find="[cC]ascen" replaceWith="čašćen" />
+		<RegEx find="[cC]ek" replaceWith="ÄŤek" />
+		<RegEx find="[cC]ekov" replaceWith="ÄŤekov" />
+		<RegEx find="[cC]etvrt" replaceWith="ÄŤetvrt" />
+		<RegEx find="cetv" replaceWith="ÄŤetv" />
+		<RegEx find="Cetv" replaceWith="ÄŚetv" />
+		<RegEx find="[cC]ist" replaceWith="ÄŤist" />
+		<RegEx find="[cC]isce" replaceWith="čišće" />
+		<RegEx find="[cC]ita" replaceWith="ÄŤita" />
+		<RegEx find="\bcin" replaceWith="ÄŤin" />
+		<RegEx find="\bCin" replaceWith="ÄŚin" />
+		<RegEx find="[cCČč]istoc" replaceWith="čistoć" />
+		<RegEx find="[cC]lan" replaceWith="ÄŤlan" />
+		<RegEx find="[cC]okolad" replaceWith="ÄŤokolad" />
+		<RegEx find="[cC]ovi?j?ek" replaceWith="ÄŤovjek" />
+		<RegEx find="[cC]uda" replaceWith="ÄŤuda" />
+		<RegEx find="[cC]udes" replaceWith="ÄŤudes" />
+		<RegEx find="[cC]udn" replaceWith="ÄŤudn" />
+		<RegEx find="[cCČč]udovi[sš]" replaceWith="čudoviš" />
+		<RegEx find="\b[cC]uje" replaceWith="ÄŤuje" />
+		<RegEx find="(?&lt;!a)cuje" replaceWith="ÄŤuje" />
+		<RegEx find="[cC]u([vl])a" replaceWith="ÄŤu$1a" />
+		<RegEx find="cut([ei])" replaceWith="šut$1" />
+		<RegEx find="Cut([ei])" replaceWith="Ĺ ut$1" />
+		<RegEx find="cuta([ltšv])" replaceWith="šutje$1" />
+		<RegEx find="Cuta([ltšv])" replaceWith="Šutje$1" />
+		<RegEx find="[cC]vrst" replaceWith="ÄŤvrst" />
+		<RegEx find="\b([dD])ac([eu])" replaceWith="$1at ć$2" />
+		<RegEx find="dj?avol" replaceWith="vrag" />
+		<RegEx find="([Dd])eck" replaceWith="$1eÄŤk" />
+		<RegEx find="vojcic" replaceWith="vojÄŤic" />
+		<RegEx find="\b([dD])elic" replaceWith="$1jelić" />
+		<RegEx find="\b([dD])elimc" replaceWith="$1jelić" />
+		<RegEx find="\b([dD])j?elis\b" replaceWith="$1ijeliš" />
+		<RegEx find="\b([dD])ecic([aeiou]|om)\b" replaceWith="$1jeÄŤic$2" />
+		<RegEx find="([dD])j?eca([kc])" replaceWith="$1jeÄŤa$2" />
+		<RegEx find="([dD])eci?j([aeiou])" replaceWith="$1jeÄŤj$2" />
+		<RegEx find="\b([dD])esic" replaceWith="$1ogodit ć" />
+		<RegEx find="dnoslj" replaceWith="dnošlj" />
+		<RegEx find="\b([dD])omac" replaceWith="$1omać" />
+		<RegEx find="([ao])gada" replaceWith="$1gađa" />
+		<RegEx find="saduj" replaceWith="sađuj" />
+		<RegEx find="\b([dD])rustv" replaceWith="$1ruštv" />
+		<RegEx find="drzim" replaceWith="drĹľim" />
+		<RegEx find="([dD])o[bc]ic([eu])" replaceWith="$1oći ć$2" />
+		<RegEx find="\b([dDpP])o(d?)nj?ec([eu])" replaceWith="$1o$2nijet ć$3" />
+		<RegEx find="ovesc([eu])" replaceWith="ovest ć$1" />
+		<RegEx find="\bd[jz]ep" replaceWith="dĹľep" />
+		<RegEx find="\bD[jz]ep" replaceWith="DĹľep" />
+		<!-- posao i pošao je drugačije pa ne može biti uopće u skripti -->
+		<RegEx find="([dD])osl([aio])\b" replaceWith="$1ošl$2" />
+		<RegEx find="([dD])rza(?!k)" replaceWith="$1rĹľa" />
+		<RegEx find="druze" replaceWith="druĹľe" />
+		<RegEx find="\b([dD])us" replaceWith="$1uš" />
+		<RegEx find="dzigeric" replaceWith="jetr" />
+		<RegEx find="Dzigeric" replaceWith="Jetr" />
+		<RegEx find="([dD])zinov" replaceWith="$1ivov" />
+		<RegEx find="gipcan" replaceWith="gipćan" />
+		<RegEx find="entise" replaceWith="entira" />
+		<RegEx find="onise" replaceWith="onira" />
+		<RegEx find="([gG])dj(?!e)" replaceWith="$1Ä‘" />
+		<RegEx find="ledac" replaceWith="ledat ć" />
+		<RegEx find="([gG])oruc" replaceWith="$1oruć" />
+		<RegEx find="(?&lt;![pP])radj" replaceWith="rađ" />
+		<RegEx find="\b([gG])rijesn" replaceWith="$1rješn" />
+		<RegEx find="([gG])rj?esi([smotl])" replaceWith="$1riješi$2" />
+		<RegEx find="([gG])reska" replaceWith="$1reška" />
+		<RegEx find="([hH])o[cč]e([sš]|mo|te)?\b" replaceWith="$1oće$2" />
+		<RegEx find="hri?scan" replaceWith="kršćan" />
+		<RegEx find="Hri?scan" replaceWith="Kršćan" />
+		<RegEx find="hronicn" replaceWith="kroniÄŤn" />
+		<RegEx find="Hronicn" replaceWith="KroniÄŤn" />
+		<RegEx find="ijeci([lt])" replaceWith="ijeÄŤi$1" />
+		<RegEx find="gnorise" replaceWith="gnorira" />
+		<RegEx find="gnori[sš]e[sš]" replaceWith="gnoriraš" />
+		<RegEx find="\b([iI])mac([eu]|es|emo|ete)\b" replaceWith="$1mat ć$2" />
+		<RegEx find="\b([iI])mas" replaceWith="$1maš" />
+		<RegEx find="nsistirac" replaceWith="nzistirat ć" />
+		<RegEx find="([iI])zadj" replaceWith="$1zađ" />
+		<RegEx find="zbec" replaceWith="zbjeć" />
+		<RegEx find="nadj?en" replaceWith="nađen" />
+		<RegEx find="([iI])scezn" replaceWith="$1ščezn" />
+		<RegEx find="(?&lt;![ŠšSs])([Pp])rica" replaceWith="$1riča" />
+		<RegEx find="([iI])znj?ec" replaceWith="$1znijet ć" />
+		<RegEx find="zvesta" replaceWith="zvješta" />
+		<RegEx find="jevandjelj" replaceWith="evanđelj" />
+		<RegEx find="kasi[kc]" replaceWith="Ĺľlic" />
+		<RegEx find="Kasi[kc]" replaceWith="Žlic" />
+		<RegEx find="([kKLl])aze([mt])" replaceWith="$1aĹľe$2" />
+		<RegEx find="([kKLl])aze[sš]" replaceWith="$1ažeš" />
+		<RegEx find="aznjava" replaceWith="aĹľnjava" />
+		<RegEx find="kcerk[eio]" replaceWith="kćeri" />
+		<RegEx find="Kcerk[eio]" replaceWith="Kćeri" />
+		<RegEx find="kljuc" replaceWith="kljuÄŤ" />
+		<RegEx find="oledz" replaceWith="oledĹľ" />
+		<RegEx find="\b([kK])olicin" replaceWith="$1oliÄŤin" />
+		<RegEx find="arise" replaceWith="ira" />
+		<RegEx find="komsijsk" replaceWith="susjedn" />
+		<RegEx find="onacn" replaceWith="onaÄŤn" />
+		<RegEx find="centrise" replaceWith="centrira" />
+		<RegEx find="centrisi" replaceWith="centriraj" />
+		<RegEx find="trolise" replaceWith="trolira" />
+		<RegEx find="([kK])ori[sš][tc]en" replaceWith="$1orišten" />
+		<RegEx find="([kKTtSs])rece" replaceWith="$1reće" />
+		<RegEx find="rivicn" replaceWith="aznen" />
+		<RegEx find="krsten" replaceWith="kršten" />
+		<RegEx find="([kK])uck" replaceWith="$1uj" />
+		<RegEx find="([kK])uc([iueo]|no)" replaceWith="$1uć$2" />
+		<RegEx find="kupic" replaceWith="kupit ć" />
+		<RegEx find="\b([kK])rstask([aeiou]|om)?\b" replaceWith="$1riĹľarsk$2" />
+		<RegEx find="\b([lL])j?eci([stol])?" replaceWith="$1ijeÄŤi$2" />
+		<RegEx find="([lL])j?ecni([kc])" replaceWith="$1ijeÄŤni$2" />
+		<RegEx find="\b([lL])j?ecen" replaceWith="$1ijeÄŤen" />
+		<RegEx find="\b([lL])aks" replaceWith="$1akš" />
+		<RegEx find="laksava" replaceWith="akšava" />
+		<RegEx find="([lL])eps" replaceWith="$1jepš" />
+		<RegEx find="[lL]isce" replaceWith="lišće" />
+		<RegEx find="([lL])ogic(?!i)" replaceWith="$1ogiÄŤ" />
+		<RegEx find="\blicn" replaceWith="osobn" />
+		<RegEx find="\bLicn" replaceWith="Osobn" />
+		<RegEx find="\b([lL])os([aeiu]|o[mj]|e[mg])" replaceWith="$1oš$2" />
+		<RegEx find="udack([aeiou]|om)\b" replaceWith="uđa$1" />
+		<RegEx find="mack" replaceWith="maÄŤk" />
+		<RegEx find="(?&lt;![iI]|[kK]a)([mM])j?enjas\b" replaceWith="$1ijenjaš" />
+		<RegEx find="([mM])ast([auoi](?!r))" replaceWith="$1ašt$2" />
+		<!--** besmislicu ?**-->
+		<RegEx find="([mM])islic([eu])" replaceWith="$1islit ć$2" />
+		<RegEx find="mislje" replaceWith="mišlje" />
+		<RegEx find="([mM])j?esalic" replaceWith="$1iješalic" />
+		<RegEx find="([mM])j?esa([jmns]|n[aio]|no[mgj]|nima?|mo|ju|njem|nju|l[aeio]|t[ei])\b" replaceWith="$1iješa$2" />
+		<RegEx find="([mM])lj?ecn" replaceWith="$1lijeÄŤn" />
+		<RegEx find="\b([mMNn])oc([iuna])" replaceWith="$1oć$2" />
+		<RegEx find="oguc" replaceWith="oguć" />
+		<RegEx find="([mM])oras" replaceWith="$1oraš" />
+		<RegEx find="([mM])orac([eu])" replaceWith="$1orat ć$2" />
+		<RegEx find="otivise([mst])" replaceWith="otivira$1" />
+		<RegEx find="medju" replaceWith="među" />
+		<RegEx find="mjestaj" replaceWith="mještaj" />
+		<RegEx find="([mMbB])oze" replaceWith="$1oĹľe" />
+		<RegEx find="([mM])o[zž]es" replaceWith="$1ožeš" />
+		<RegEx find="([mM])racn" replaceWith="$1raÄŤn" />
+		<RegEx find="([mM])rznj" replaceWith="$1rĹľnj" />
+		<RegEx find="rzec" replaceWith="rzit ć" />
+		<RegEx find="([mM])uci([mstol])" replaceWith="$1uÄŤi$2" />
+		<RegEx find="uskar" replaceWith="uškar" />
+		<RegEx find="uvas" replaceWith="otaš" />
+		<RegEx find="muzick" replaceWith="glazben" />
+		<RegEx find="Muzick" replaceWith="Glazben" />
+		<RegEx find="([nNZz])acel" replaceWith="$1aÄŤel" />
+		<RegEx find="([nN])acin" replaceWith="$1aÄŤin" />
+		<RegEx find="(?&lt;![iI])([nN])acic" replaceWith="$1aći ć" />
+		<RegEx find="adji" replaceWith="ađi" />
+		<RegEx find="aocit" replaceWith="aoÄŤit" />
+		<RegEx find="avas" replaceWith="avaš" />
+		<RegEx find="amj?enis" replaceWith="amijeniš" />
+		<RegEx find="amesta" replaceWith="amješta" />
+		<RegEx find="aocar(?!k)" replaceWith="aoÄŤal" />
+		<RegEx find="(?&lt;![[tT])apise" replaceWith="apiše" />
+		<RegEx find="([nN])as([io])([mj])\b" replaceWith="$1aš$2" />
+		<RegEx find="([nNvV])asi([mh])" replaceWith="$1aši$2" />
+		<RegEx find="([nN])auci([mstl])" replaceWith="$1auÄŤi$2" />
+		<RegEx find="(?&lt;![[pP])aucic" replaceWith="aučit ć" />
+		<RegEx find="naucn" replaceWith="znanstven" />
+		<RegEx find="Naucn" replaceWith="Znanstven" />
+		<RegEx find="([nN])a?zvac" replaceWith="$1azvat ć" />
+		<RegEx find="([nN])eca([kc])" replaceWith="$1eća$2" />
+		<RegEx find="\b([nN])ec([ue]|emo|ete)\b" replaceWith="$1eć$2" />
+		<RegEx find="([Nn])eda[cč]" replaceWith="$1edać" />
+		<RegEx find="(?&lt;!j)emack" replaceWith="jemaÄŤk" />
+		<RegEx find="rj?esen" replaceWith="riješen" />
+		<RegEx find="eutralis[eu]" replaceWith="eutralizira" />
+		    <!-- ne diraj -->
+		<RegEx find="\b([nN])ista" replaceWith="$1išta" />
+		<RegEx find="\b([nN])oc" replaceWith="$1oć" />
+		<RegEx find="ovcan" replaceWith="ovÄŤan" />
+		<RegEx find="notez" replaceWith="noteĹľ" />
+		<RegEx find="beca" replaceWith="beća" />
+		<RegEx find="besen" replaceWith="bješen" />
+		<RegEx find="bezbj?edjenj" replaceWith="siguranj" />
+		<RegEx find="bezbj?edjivanj" replaceWith="siguravanj" />
+		<RegEx find="bezbj?edjuje" replaceWith="sigurava" />
+		<RegEx find="bidj" replaceWith="biđ" />
+		<RegEx find="bicn" replaceWith="biÄŤn" />
+		<RegEx find="bozava" replaceWith="boĹľava" />
+		<RegEx find="([oO])brac(?!u)" replaceWith="$1brać" />
+		<RegEx find="([oO])bracu" replaceWith="$1braÄŤu" />
+		<RegEx find="bucen" replaceWith="buÄŤen" />
+		<RegEx find="\b([oO])caj" replaceWith="$1ÄŤaj" />
+		<RegEx find="\b([oO])cev" replaceWith="$1ÄŤev" />
+		<RegEx find="([oO])cek" replaceWith="$1ÄŤek" />
+		<RegEx find="\b([oO])ci" replaceWith="$1ÄŤi" />
+		<RegEx find="dbacen" replaceWith="dbaÄŤen" />
+		<RegEx find="([oO])dl([iu])can" replaceWith="$1dl$2can" />
+		<RegEx find="\b([oO])dj?ec([aeiou]|om)" replaceWith="$1djeć$2" />
+		<RegEx find="\b((?:[oO]|[pP]o|[rR]a|[sS]a)d?)sec" replaceWith="$1sjeć" />
+		<RegEx find="dvesc([eu])" replaceWith="dvest ć$1" />
+		<RegEx find="gadj?a" replaceWith="gađa" />
+		<RegEx find="onizav" replaceWith="oniĹľav" />
+		<RegEx find="\b([oO])pci(?!j)" replaceWith="$1pći" />
+		<RegEx find="rosti[cć]" replaceWith="rostit ć" />
+		<RegEx find="ruzj" replaceWith="ruĹľj" />
+		<RegEx find="([oO])sj?e[cč]a" replaceWith="$1sjeća" />
+		<RegEx find="slobodić" replaceWith="slobodit ć" />
+		<RegEx find="([oO])sta[čć]([eu])" replaceWith="$1stat ć$2" />
+		<RegEx find="([oO])svj?ez" replaceWith="$1svjeĹľ" />
+		<RegEx find="tkri[cč]" replaceWith="tkrić" />
+		<RegEx find="([oOSs])tici" replaceWith="$1tići" />
+		<RegEx find="([oO])tis([al])" replaceWith="$1tiš$2" />
+		<RegEx find="zledjen" replaceWith="zlijeđen" />
+		<RegEx find="pam[cč]" replaceWith="pamć" />
+		<RegEx find="([pP])az([nl])j" replaceWith="$1aĹľ$2j" />
+		<RegEx find="\b([pP])j?es[cć]an" replaceWith="$1ješčan" />
+		<RegEx find="([pP])esa([kc])" replaceWith="$1ješa$2" />
+		<RegEx find="([pP](?:ita|lati|obrinu|okaza|oveza|rica))c" replaceWith="$1t ć" />
+		<RegEx find="istolj" replaceWith="ištolj" />
+		<RegEx find="isuc" replaceWith="išuć" />
+		<RegEx find="pjevas" replaceWith="pjevaš" />
+		<RegEx find="([pP])lasi([mslt])" replaceWith="$1laši$2" />
+		<RegEx find="([pP])lace([sn])" replaceWith="$1laće$2" />
+		<RegEx find="(?&lt;![mM])ljacka" replaceWith="ljaÄŤka" />
+		<RegEx find="prica" replaceWith="priÄŤa" />
+		<RegEx find="([pP])obj?ec" replaceWith="$1objeć" />
+		<RegEx find="objedis" replaceWith="obijediš" />
+		<RegEx find="obacaj" replaceWith="obaÄŤaj" />
+		<RegEx find="([pP])oce([tl])" replaceWith="$1oÄŤe$2" />
+		<RegEx find="([pPTt])ocn" replaceWith="$1oÄŤn" />
+		<RegEx find="\b([pP])o[dt]sj?etis?\b" replaceWith="$1odsjetiš" />
+		<RegEx find="oducava" replaceWith="oduÄŤava" />
+		<RegEx find="([pP])ogres" replaceWith="$1ogreš" />
+		<RegEx find="([pP])ogrj?esi(o|l[aeio]|t[ei])?\b" replaceWith="$1ogriješi$2" />
+		<RegEx find="okusa([jov])" replaceWith="okuša$1" />
+		<RegEx find="([pP])omoc" replaceWith="$1omoć" />
+		<RegEx find="([pP]o|[Ii]z)ludec" replaceWith="$1ludjet ć" />
+		<RegEx find="([pP])onasa" replaceWith="$1onaša" />
+		<RegEx find="porodicn" replaceWith="obiteljsk" />
+		<RegEx find="Porodicn" replaceWith="Obiteljsk" />
+		<RegEx find="([pP])os([lt])ac" replaceWith="$1os$2at ć" />
+		<RegEx find="osten" replaceWith="ošten" />
+		<RegEx find="(?&lt;![gG])ostuje" replaceWith="oštuje" />
+		<RegEx find="([pP])ostova" replaceWith="$1oštova" />
+		<RegEx find="ovredj?en" replaceWith="ovrijeđen" />
+		<RegEx find="([ao])vrj?edis" replaceWith="$1vrijediš" />
+		<RegEx find="pozoris" replaceWith="kazališ" />
+		<RegEx find="Pozoris" replaceWith="Kazališ" />
+		<RegEx find="ozuri" replaceWith="oĹľuri" />
+		<RegEx find="redjas" replaceWith="rijaš" />
+		<RegEx find="redlaz" replaceWith="redlaĹľ" />
+		<RegEx find="(?&lt;![Šš])([pP])rica" replaceWith="$1riča" />
+		<RegEx find="rilicn" replaceWith="riliÄŤn" />
+		<RegEx find="romj?enis" replaceWith="romijeniš" />
+		<RegEx find="([pP](?:ri|od))sj?eca" replaceWith="$1sjeća" />
+		<RegEx find="rosj?ec" replaceWith="rosjeÄŤ" />
+		<RegEx find="roslost" replaceWith="rošlost" />
+		<RegEx find="([pP]r?[io])vesc" replaceWith="$1vest ć" />
+		<RegEx find="rolec" replaceWith="roljeć" />
+		<RegEx find="romj?eniš" replaceWith="romijeniš" />
+		<RegEx find="ronac" replaceWith="ronać" />
+		<RegEx find="([pP])ruzi([lt])" replaceWith="$1ruĹľi$2" />
+		<RegEx find="acun" replaceWith="aÄŤun" />
+		<RegEx find="azlicit" replaceWith="azliÄŤit" />
+		<RegEx find="mislja" replaceWith="mišlja" />
+		<RegEx find="azumijec" replaceWith="azumjeć" />
+		<RegEx find="(?&lt;!v)ecenic" replaceWith="eÄŤenic" />
+		<RegEx find="ecic" replaceWith="eći ć" />
+		<RegEx find="rivlac" replaceWith="rivlaÄŤ" />
+		<RegEx find="([^d])rjesit" replaceWith="$1riješit" />
+		<RegEx find="\b([rR])i?j?esava" replaceWith="$1ješava" />
+		<RegEx find="([rR])i?j?esenj([aeiu])" replaceWith="$1ješenj$2" />
+		<RegEx find="\b([rR])jec(i|ima)?\b" replaceWith="$1ijeÄŤ$2" />
+		<RegEx find="\b([rR])i?j?ecni([kc])" replaceWith="$1jeÄŤni$2" />
+		<RegEx find="(?&lt;!t)rocit" replaceWith="roÄŤit" />
+		<RegEx find="([dDrRvVg])odje" replaceWith="$1ođe" />
+		<RegEx find="(?&lt;![Cc])ucak" replaceWith="uÄŤak" />
+		<RegEx find="ruce" replaceWith="ruÄŤe" />
+		<RegEx find="rucio" replaceWith="ruÄŤio" />
+		<RegEx find="arud[zĹľ]bin" replaceWith="arudĹľb" />
+		<RegEx find="([rR])uck([auo])" replaceWith="$1uÄŤk$2" />
+		<RegEx find="\b([Rr])uca([lt])" replaceWith="$1uÄŤa$2" />
+		<RegEx find="saceka" replaceWith="priÄŤeka" />
+		<RegEx find="Saceka" replaceWith="PriÄŤeka" />
+		<RegEx find="sagarep" replaceWith="mrkv" />
+		<RegEx find="Sagarep" replaceWith="Mrkv" />
+		<RegEx find="([sS])amoc" replaceWith="$1amoć" />
+		<RegEx find="[sS]ans" replaceWith="šans" />
+		<RegEx find="([sS])alj([eu])" replaceWith="$1alj$2" />
+		<RegEx find="saobracaj(?!ac)" replaceWith="promet" />
+		<RegEx find="Saobracaj(?!ac)" replaceWith="Promet" />
+		<RegEx find="aosj?e[cč]a" replaceWith="uosjeća" />
+		<RegEx find="aucesni([kc])" replaceWith="udioni$1" />
+		<RegEx find="([sSZZ])avrs([ei])" replaceWith="$1avrš$2" />
+		<RegEx find="azvac" replaceWith="azvat ć" />
+		<RegEx find="azalj?eva" replaceWith="aĹľalijeva" />
+		<RegEx find="\b([sS])eca([msšo]|mo|t[ei]|ju|l[aeio]|nj[aeu]|njem?)?\b" replaceWith="$1jeća$2" />
+		<RegEx find="([sSŠš])ecer" replaceWith="šećer" />
+		<RegEx find="([sS])edec" replaceWith="$1jedit ć" />
+		<RegEx find="i[cč]u[sš]" replaceWith="ićuš" />
+		<RegEx find="([sS])isark" replaceWith="češer" />
+		<RegEx find="([sS])koci" replaceWith="$1koÄŤi" />
+		<RegEx find="\b[sS]kol(?!a)" replaceWith="škol" />
+		<RegEx find="([sS])li?j?ede[cč]" replaceWith="$1ljedeć" />
+		<RegEx find="(?&lt;!r)icn" replaceWith="iÄŤn" />
+		<RegEx find="([sS])lucaj" replaceWith="$1luÄŤaj" />
+		<RegEx find="([sS])lusa" replaceWith="$1luša" />
+		<RegEx find="([sS])luz([eb])" replaceWith="$1luĹľ$2" />
+		<RegEx find="\b([sS])j?eca[sš]\b" replaceWith="$1jećaš" />
+		<RegEx find="\b([sS])mj?es(n[aeiou]|no[mgj])\b" replaceWith="$1miješ$2" />
+		<RegEx find="mestis" replaceWith="mjestiš" />
+		<RegEx find="([sS])nazn" replaceWith="$1naĹľn" />
+		<RegEx find="nizen" replaceWith="niĹľen" />
+		<RegEx find="([sS])okira" replaceWith="šokira" />
+		<RegEx find="spoljasnj?([aeiu])" replaceWith="vanjsk$1" />
+		<RegEx find="Spoljasnj?([aeiu])" replaceWith="Vanjsk$1" />
+		<RegEx find="pri?j?ecava" replaceWith="prjeÄŤava" />
+		<RegEx find="prj?ec([ei])" replaceWith="prijeÄŤ$1" />
+		<RegEx find="rdac" replaceWith="rdaÄŤ" />
+		<RegEx find="([sS])rec([aeiou])" replaceWith="$1reć$2" />
+		<RegEx find="([sS])rec(a?)n" replaceWith="$1ret$2n" />
+		<RegEx find="spijun" replaceWith="špijun" />
+		<RegEx find="Spijun" replaceWith="Ĺ pijun" />
+		<RegEx find="([sS])rusi" replaceWith="$1ruši" />
+		<RegEx find="\b([sS])tac([eu])" replaceWith="$1tat ć$2" />
+		<RegEx find="stanes" replaceWith="staneš" />
+		<RegEx find="stomac" replaceWith="trbuš" />
+		<RegEx find="Stomac" replaceWith="Trbuš" />
+		<RegEx find="strasi" replaceWith="straši" />
+		<RegEx find="trucn" replaceWith="truÄŤn" />
+		<RegEx find="sugerise" replaceWith="predlaĹľe" />
+		<RegEx find="Sugerise" replaceWith="PredlaĹľe" />
+		<RegEx find="vesteni([kc])" replaceWith="većeni$1" />
+		<RegEx find="([Ss])olj" replaceWith="šalic" />
+		<RegEx find="\bSpanij" replaceWith="Ĺ panjolsk" />
+		<RegEx find="\bSpansk" replaceWith="Ĺ panjolsk" />
+		<RegEx find="stabl" replaceWith="stoĹľer" />
+		<RegEx find="Stabl" replaceWith="StoĹľer" />
+		<RegEx find="stamparsk" replaceWith="tiskovn" />
+		<RegEx find="Stamparsk" replaceWith="Tiskovn" />
+		<RegEx find="[sš]ticen" replaceWith="štićen" />
+		<RegEx find="stedj?e" replaceWith="štedje" />
+		<RegEx find="sicen" replaceWith="sićen" />
+		<RegEx find="eskoc" replaceWith="eškoć" />
+		<RegEx find="([sS])tize" replaceWith="$1tiĹľe" />
+		<RegEx find="uoci" replaceWith="uoÄŤi" />
+		<RegEx find="\b([sS])uti" replaceWith="$1uti" />
+		<RegEx find="([sS])vjez" replaceWith="$1vjeĹľ" />
+		<RegEx find="resu([ct])" replaceWith="rešu$1" />
+		<RegEx find="([DRVdrvg])odja" replaceWith="$1ođa" />
+		<RegEx find="([sS])veći" replaceWith="$1vijeći" />
+		<RegEx find="takmicenj" replaceWith="natjecanj" />
+		<RegEx find="Takmicenj" replaceWith="Natjecanj" />
+		<RegEx find="\b([tT])ac([an])" replaceWith="$1oÄŤ$2" />    
+		<RegEx find="ehnic(?!i)" replaceWith="ehniÄŤ" />
+		<RegEx find="\b([tT])ice" replaceWith="$1iÄŤe" />
+		<RegEx find="\b([tTSs])rcan" replaceWith="$1rÄŤan" />
+		<RegEx find="\b([tT])re[čc]in" replaceWith="$1rećin" />
+		<RegEx find="\b([tTDd])rzis" replaceWith="$1ržiš" />
+		<RegEx find="\b([tT])isin" replaceWith="$1išin" />
+		<RegEx find="\b([tT])is([aeiu]|om|e[mg])\b" replaceWith="$1iš$2" />
+		<RegEx find="\b([tT])raz([ei])" replaceWith="$1raĹľ$2" />
+		<RegEx find="\b([nN])etac([an])" replaceWith="$1etoÄŤ$2" />
+		<RegEx find="\b([uU])cenj" replaceWith="$1ÄŤenj" />
+		<RegEx find="\b([uU])ci([mntl])" replaceWith="$1ÄŤi$2" />
+		<RegEx find="([uU])ci([lt])" replaceWith="$1ÄŤi$2" />
+		<RegEx find="paljac" replaceWith="paljaÄŤ" />
+		<RegEx find="\b([uU])redj" replaceWith="$1ređ" />
+		<RegEx find="([uU])spjes(an|n[aeiou]|no[mgj])" replaceWith="$1spješ$2" />
+		<RegEx find="\b([uU])dje([mst])" replaceWith="$1Ä‘e$2" />
+		<RegEx find="\b([uU])sl([aeio])" replaceWith="$1šl$2" />
+		<RegEx find="\b([uU])zas(?!t)" replaceWith="$1Ĺľas" />
+		<RegEx find="\b([uU])zec([eu])" replaceWith="$1zet ć$2" />
+		<RegEx find="\b([uU])zmes" replaceWith="$1zmeš" />
+		<RegEx find="\b([uU])ziva" replaceWith="$1Ĺľiva" />
+		<RegEx find="([vV])as([aeu]|o[jm])\b" replaceWith="$1aš$2" />
+		<RegEx find="([vV]l?)azn([aeiu]|o[mgj])\b" replaceWith="$1aĹľn$2" />
+		<RegEx find="([vV])ecn" replaceWith="$1jeÄŤn" />
+		<RegEx find="([vV])e[cč]in" replaceWith="$1ećin" />
+		<RegEx find="([vV])estin" replaceWith="$1ještin" />
+		<RegEx find="elicin" replaceWith="eliÄŤin" />
+		<RegEx find="\b([vV])i?j?enca" replaceWith="$1jenÄŤa" />
+		<RegEx find="([vV])j?ezb" replaceWith="$1jeĹľb" />
+		<RegEx find="([vV])idj?ec" replaceWith="$1idjet ć" />
+		<RegEx find="(?&lt;!Da)([vV])idj?a" replaceWith="$1iđa" />
+		<RegEx find="([vV])idis" replaceWith="$1idiš" />
+		<RegEx find="\b([vV])ec([aeiu]|[ei]m|ima|o[mj])?\b" replaceWith="$1eć$2" />
+		<!--pro/do/raz vezeš-->
+		<RegEx find="eze[sš]" replaceWith="ezeš" />
+		<RegEx find="\b([vV])ise" replaceWith="$1iše" />
+		<RegEx find="\b([vV])islj" replaceWith="$1iš" />
+		<RegEx find="odj?enj(?!a[kc])" replaceWith="ođenj" />
+		<RegEx find="([vV])olis" replaceWith="$1oliš" />
+		<RegEx find="([vV])olj?ec" replaceWith="$1oljet ć" />
+		<RegEx find="\b([vV])ozic([eu])" replaceWith="$1ozit ć$2" />
+		<RegEx find="([vV])rac" replaceWith="$1raÄŤ" />
+		<RegEx find="vrsen" replaceWith="vršen" />
+		<RegEx find="\b([vV])ratic" replaceWith="$1ratit ć" />
+		<RegEx find="zalost" replaceWith="Ĺľalost" />
+		<RegEx find="zalosno" replaceWith="Ĺľalosno" />
+		<RegEx find="zalosni" replaceWith="Ĺľalosni" />
+		<RegEx find="zalosc" replaceWith="žalošć" />
+		<RegEx find="gorca" replaceWith="gorÄŤa" />
+		<RegEx find="ahtj?evas" replaceWith="ahtijevaš" />
+		<RegEx find="\bz([ae])li" replaceWith="Ĺľ$1li" />
+		<RegEx find="\bZ([ae])li" replaceWith="Ĺ˝$1li" />
+		<RegEx find="[zZ]alic" replaceWith="žalit ć" />
+		<RegEx find="apo[cÄŤ]mi" replaceWith="apoÄŤni" />
+		<RegEx find="asluzuj" replaceWith="asluĹľuj" />
+		<RegEx find="([zZ])astit" replaceWith="$1aštit" />
+		<RegEx find="astrasujuc" replaceWith="astrašujuć" />
+		<RegEx find="[zZ]edn" replaceWith="Ĺľedn" />
+		<RegEx find="\b[zZ]en([aeui]|om|io|il[aei]|sk)" replaceWith="Ĺľen$1" />
+		<RegEx find="[zZ]eli([mt])" replaceWith="Ĺľeli$1" />
+		<RegEx find="[zZ]ele([ltz])" replaceWith="Ĺľelje$1" />
+		<RegEx find="[zZ]elil" replaceWith="Ĺľeljel" />
+		<RegEx find="[zZ]eli[sš]" replaceWith="želiš" />
+		<!-- zaĹľelio && poĹľelio  -->
+		<RegEx find="[zZ]elj?eo" replaceWith="Ĺľelio" />
+		<RegEx find="[zZ]elj([aeiou])" replaceWith="Ĺľelj$1" />
+		<RegEx find="\b[zZ]ive([lt])" replaceWith="Ĺľivje$1" />
+		<RegEx find="[zZ]ivec([eu])" replaceWith="živjet ć$1" />
+		<RegEx find="([žŽ])ive([lt])" replaceWith="$1ivje$2" />
+		<RegEx find="[zZ]ivi([mšt])" replaceWith="živi$1" />
+		<RegEx find="\b[zZ]ivo([mgjt])" replaceWith="Ĺľivo$1" />
+		<RegEx find="[zZ]lj?ezd([aeiou])" replaceWith="Ĺľlijezd$1" />
+		<RegEx find="\b([zZ])locin" replaceWith="$1loÄŤin" />
+		<RegEx find="([Zz])naci" replaceWith="$1naÄŤi" />
+		<RegEx find="znajes" replaceWith="znaješ" />
+		<RegEx find="([Zz])r?tv" replaceWith="Ĺľrtv" />
+		<RegEx find="zur[ck]" replaceWith="zabav" />
+		<RegEx find="Zur[ck]" replaceWith="Zabav" />
+		<RegEx find="zvanicn" replaceWith="sluĹľben" />
+		<RegEx find="Zvanicn" replaceWith="SluĹľben" />
+		<RegEx find="([zZ])vuca([lto])" replaceWith="$1vuÄŤa$2" />
+		<RegEx find="\b([zZ])vuci" replaceWith="$1vuÄŤi" />
+		<!-- yxy experimental -->
+		<RegEx find="acic" replaceWith="aÄŤic" />
+		<RegEx find="([aeiou])s([čć])" replaceWith="$1š$2" />
+		<RegEx find="bracun" replaceWith="braÄŤun" />
+		<RegEx find="cupa" replaceWith="ÄŤupa" />
+		<RegEx find="dajes" replaceWith="daješ" />
+		<RegEx find="rosj?ecn" replaceWith="rosjeÄŤn" />
+		<RegEx find="([Rr])odj?en" replaceWith="$1ođen" />
+		<RegEx find="jacanj" replaceWith="jaÄŤanj" />
+		<RegEx find="zvecark" replaceWith="zveÄŤark" />
+		<RegEx find="locest" replaceWith="loÄŤest" />
+		<RegEx find="icn" replaceWith="iÄŤn" />
+		<RegEx find="zidem" replaceWith="ziđem" />
+		<RegEx find="zludu" replaceWith="zluđu" />
+		<RegEx find="zopacen" replaceWith="zopaÄŤen" />
+		<RegEx find="eskuc" replaceWith="eskuć" />
+		<RegEx find="([aez])vrsi" replaceWith="$1vrši" />
+		<RegEx find="acma" replaceWith="aÄŤma" />
+		<RegEx find="aces" replaceWith="aćeš" />
+		<RegEx find="ajvec" replaceWith="ajveć" />
+		<RegEx find="amcen" replaceWith="amÄŤen" />
+		<RegEx find="antic([nk])" replaceWith="antiÄŤ$1" />
+		<RegEx find="aredu?j" replaceWith="aređ" />
+		<RegEx find="arezlj" replaceWith="areĹľlj" />
+		<RegEx find="aruci" replaceWith="aruÄŤi" />
+		<RegEx find="avlac" replaceWith="avlaÄŤ" />
+		<RegEx find="azoc" replaceWith="azoÄŤ" />
+		<RegEx find="bacen" replaceWith="baÄŤen" />
+		<RegEx find="bicaj" replaceWith="biÄŤaj" />
+		<RegEx find="bivse" replaceWith="bivše" />
+		<RegEx find="blizn" replaceWith="bliĹľn" />
+		<RegEx find="buden" replaceWith="buđen" />
+		<RegEx find="cemo" replaceWith="ćemo" />
+		<RegEx find="ucestvuj" replaceWith="sudjeluj" />
+		<RegEx find="cinje" replaceWith="ÄŤinje" />
+		<RegEx find="[Cc]injen" replaceWith="ÄŤinjen" />
+		<RegEx find="cisc" replaceWith="čišć" />
+		<RegEx find="Cisc" replaceWith="Čišć" />
+		<RegEx find="dacn" replaceWith="daÄŤn" />
+		<RegEx find="daces" replaceWith="dat ćeš" />
+		<RegEx find="dinacn" replaceWith="dinaÄŤn" />
+		<RegEx find="dlucn" replaceWith="dluÄŤn" />
+		<RegEx find="dlucuj" replaceWith="dluÄŤuj" />
+		<RegEx find="djem" replaceWith="Ä‘em" />
+		<RegEx find="djit" replaceWith="Ä‘it" />
+		<RegEx find="djuj" replaceWith="Ä‘uj" />
+		<RegEx find="djujes" replaceWith="đuješ" />
+		<RegEx find="draz([ao])" replaceWith="draĹľ$1" />
+		<RegEx find="(?&lt;!a)druzi" replaceWith="druĹľi" />
+		<RegEx find="([dD])rzi([ia](?!k))" replaceWith="$1rĹľ$2" />
+		<RegEx find="e[cć]as" replaceWith="ećaš" />
+		<RegEx find="emo[zĹľ]e" replaceWith="e moĹľe" />
+		<RegEx find="(?&lt;![Rr])eces" replaceWith="ećeš" />
+		<RegEx find="emoz" replaceWith="e moĹľ" />
+		<RegEx find="enadjen" replaceWith="enađen" />
+		<RegEx find="erisu" replaceWith="eriraju" />
+		<RegEx find="esavin" replaceWith="ešavin" />
+		<RegEx find="estace[sš]" replaceWith="estat ćeš" />
+		<RegEx find="ezoc" replaceWith="ezoÄŤ" />
+		<RegEx find="fise" replaceWith="fira" />
+		<RegEx find="frick" replaceWith="friÄŤk" />
+		<!-- popravlja i iz/nad/gledaš -->
+		<RegEx find="gledas" replaceWith="gledaš" />
+		<RegEx find="granicava" replaceWith="graniÄŤava" />
+		<RegEx find="grisc(?!i)" replaceWith="grist ć" />
+		<RegEx find="guslj" replaceWith="gušlj" />
+		<RegEx find="gusi" replaceWith="guši" />
+		<RegEx find="(?&lt;!\b[oO]zlo|\b[iI]sp(rip)?ov|i)jedjen" replaceWith="ijeđen" />
+		<RegEx find="hic(k|en)" replaceWith="hić$1" />
+		<RegEx find="hva[cč]a" replaceWith="hvaća" />
+		<RegEx find="hva[cč]as" replaceWith="hvaćaš" />
+		<RegEx find="hva([lt])is" replaceWith="hva$1iš" />
+		<RegEx find="(?&lt;![Gg]r|[Ll])icka" replaceWith="iÄŤka" />
+		<RegEx find="(?&lt;!M)ick([eoiu])" replaceWith="iÄŤk$1" />
+		<RegEx find="idja" replaceWith="iđa" />
+		<RegEx find="idje([mv])" replaceWith="iđe$1" />
+		<RegEx find="igrac" replaceWith="igraÄŤ" />
+		<RegEx find="igraca" replaceWith="igraÄŤa" />
+		<RegEx find="igrace" replaceWith="igraÄŤe" />
+		<RegEx find="igraci" replaceWith="igraÄŤi" />
+		<RegEx find="igracu" replaceWith="igraÄŤu" />
+		<RegEx find="igraliste" replaceWith="igraliste" />
+		<RegEx find="igralistu" replaceWith="igralistu" />
+		<RegEx find="igralista" replaceWith="igralista" />
+		<RegEx find="iznervira" replaceWith="iĹľivcira" />
+		<RegEx find="asnjav" replaceWith="ašnjav" />
+		<RegEx find="jasnic([eu])" replaceWith="jasnit ć$1" />
+		<RegEx find="juci" replaceWith="jući" />
+		<RegEx find="kaslja" replaceWith="kašlja" />
+		<RegEx find="krsi" replaceWith="krši" />
+		<RegEx find="kruze" replaceWith="kruĹľe" />
+		<RegEx find="kusava" replaceWith="kušava" />
+		<RegEx find="lican" replaceWith="liÄŤan" />
+		<RegEx find="lacen" replaceWith="laÄŤen" />
+		<RegEx find="l([ae])dj" replaceWith="l$1Ä‘" />
+		<RegEx find="mj?ecen" replaceWith="mjećen" />
+		<RegEx find="([mv])edje" replaceWith="$1eđe" />
+		<RegEx find="miruce" replaceWith="miruće" />
+		<RegEx find="mec([eu])" replaceWith="meć$1" />
+		<RegEx find="mrsav" replaceWith="mršav" />
+		<RegEx find="naranc" replaceWith="naranÄŤ" />
+		<RegEx find="nacenj" replaceWith="naÄŤenj" />
+		<RegEx find="(?&lt;![Rr]evo)lucio" replaceWith="luÄŤio" />
+		<RegEx find="(?&lt;!sit)nisem" replaceWith="niram" />
+		<RegEx find="(?&lt;!sit)nises" replaceWith="niraš" />
+		<RegEx find="([lrvn])adj" replaceWith="$1ađ" />
+		<RegEx find="nise" replaceWith="nira" />
+		<RegEx find="nisten" replaceWith="ništen" />
+		<RegEx find="(?&lt;![Ee]t|[Gg]e|[Rr]i|[Tt]am)noc" replaceWith="noć" />
+		<RegEx find="oceju" replaceWith="oće" />
+		<RegEx find="oceo" replaceWith="oÄŤeo" />
+		<RegEx find="ocni" replaceWith="oÄŤni" />
+		<RegEx find="o([mk])aze" replaceWith="o$1aĹľe" />
+		<RegEx find="/\bni[cć]k" replaceWith="ničk" />
+		<RegEx find="nosc" replaceWith="nošć" />
+		<RegEx find="sta([jn])es" replaceWith="sta$1eš" />
+		<RegEx find="(?&lt;!m)oroca" replaceWith="oroÄŤa" />
+		<RegEx find="osvece" replaceWith="osveće" />
+		<RegEx find="oti[cć]n" replaceWith="otičn" />
+		<RegEx find="ozen" replaceWith="oĹľen" />
+		<RegEx find="pecific" replaceWith="pecifiÄŤ" />
+		<RegEx find="plase" replaceWith="plaše" />
+		<RegEx find="ptuz" replaceWith="ptuĹľ" />
+		<RegEx find="pustaj" replaceWith="puštaj" />
+		<RegEx find="pustas" replaceWith="puštaš" />
+		<RegEx find="pusten" replaceWith="pušten" />
+		<RegEx find="racen" replaceWith="raćen" />
+		<RegEx find="([auogz])raduj" replaceWith="$1rađuj" />
+		<RegEx find="reden" replaceWith="ređen" />
+		<RegEx find="redoce" replaceWith="redoÄŤe" />
+		<RegEx find="rucin" replaceWith="rućin" />
+		<RegEx find="([lr])adj" replaceWith="$1ađ" />
+		<RegEx find="redje([nm])" replaceWith="ređe$1" />
+		<RegEx find="ronad" replaceWith="ronađ" />
+		<RegEx find="([KkPp])renes\b" replaceWith="$1reneš" />
+		<RegEx find="sapni" replaceWith="šapni" />
+		<RegEx find="setnj" replaceWith="šetnj" />
+		<RegEx find="slusa" replaceWith="sluša" />
+		<RegEx find="slusk" replaceWith="slušk" />
+		<RegEx find="slj?edece" replaceWith="sljedeće" />
+		<RegEx find="spesn" replaceWith="spješn" />
+		<RegEx find="splac" replaceWith="splaÄŤ" />
+		<RegEx find="stand(?!a)" replaceWith="štand" />
+		<RegEx find="sudj?en" replaceWith="suđen" />
+		<RegEx find="tace" replaceWith="tat će" />
+		<RegEx find="tces" replaceWith="t ćeš" />
+		<RegEx find="teza([kv])" replaceWith="teĹľa$1" />
+		<RegEx find="tjesi" replaceWith="tješi" />
+		<RegEx find="tocis" replaceWith="točiš" />
+		<RegEx find="trazi([vo])" replaceWith="traĹľi$1" />
+		<RegEx find="trazuj" replaceWith="traĹľuj" />
+		<RegEx find="trise" replaceWith="trira" />
+		<RegEx find="trisi" replaceWith="triraj" />
+		<RegEx find="tros([ek])" replaceWith="troš$1" />
+		<RegEx find="tumaci" replaceWith="tumaÄŤi" />
+		<RegEx find="\b([DdtTRrNn])uzn" replaceWith="$1uĹľn" />
+		<RegEx find="\b([dtDTRr])uzan" replaceWith="$1uĹľan" />
+		<RegEx find="vrdj" replaceWith="vrđ" />
+		<RegEx find="tvrden" replaceWith="tvrđen" />
+		<RegEx find="\bujes\b" replaceWith="uješ" />
+		<RegEx find="\bzes\b" replaceWith="žeš" />
+		<RegEx find="ucis" replaceWith="učiš" />
+		<RegEx find="ucice" replaceWith="učit će" />
+		<RegEx find="(?&lt;![Kk]lj)učiće" replaceWith="učit će" />
+		<RegEx find="udiva" replaceWith="uđiva" />
+		<RegEx find="udj([aiu])" replaceWith="uđ$1" />
+		<RegEx find="([Uu])nisti" replaceWith="$1ništi" />
+		<RegEx find="nistav" replaceWith="ništav" />
+		<!--busenje je iznimka, ali bušenje nije, dakle češća riječ prevladava-->
+		<RegEx find="(?&lt;![jk])us[cč]" replaceWith="ušć" />
+		<RegEx find="usenj" replaceWith="ušenj" />
+		<RegEx find="uspece" replaceWith="uspjet će" />
+		<RegEx find="varas" replaceWith="varaš" />
+		<RegEx find="vazn" replaceWith="vaĹľn" />
+		<RegEx find="vadj" replaceWith="vađ" />
+		<RegEx find="visis" replaceWith="visiš" />
+		<RegEx find="([Vv])jecn" replaceWith="$1jeÄŤn" />
+		<RegEx find="vjezb" replaceWith="vjeĹľb" />
+		<RegEx find="(?&lt;!p)rsten" replaceWith="ršten" />
+		<RegEx find="vruc" replaceWith="vruć" />
+		<!-- izvuÄŤe // razvuÄŤe  // podvuÄŤe etc. -->
+		<RegEx find="vuce" replaceWith="vuÄŤe" />
+		<RegEx find="\b([Sso])naci" replaceWith="$1naći" />
+		<RegEx find="edjen" replaceWith="eđen" />
+		<RegEx find="ziljk" replaceWith="Ĺľiljk" />
+		<RegEx find="zitk" replaceWith="Ĺľitk" />
+		<RegEx find="zgajivac" replaceWith="zgajivaÄŤ" />
+		<RegEx find="zogira" replaceWith="Ĺľogira" />
+		<!-- preĹľiveo/doĹľiveo/nadĹľiveo etc. -->
+		<RegEx find="zivj?e([lt])i" replaceWith="Ĺľivje$1i" />
+		<RegEx find="ziveo" replaceWith="Ĺľivio" />
+		<!-- pozoveš nazoveš sazoveš -->
+		<RegEx find="zoves" replaceWith="zoveš" />
+		<RegEx find="zurb" replaceWith="Ĺľurb" />
+		<RegEx find="Zurb" replaceWith="Žurb" />
+		<RegEx find="zvucen" replaceWith="zvuÄŤen" />
+	</RegularExpressions>
+</OCRFixReplaceList>
diff --git a/libs/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml
new file mode 100644
index 000000000..2135ce878
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/dan_OCRFixReplaceList.xml
@@ -0,0 +1,642 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="Haner" to="Han er" />
+    <Word from="JaveL" to="Javel" />
+    <Word from="Pa//e" to="Palle" />
+    <Word from="bffte" to="bitte" />
+    <Word from="Utro//gt" to="Utroligt" />
+    <Word from="Kommerdu" to="Kommer du" />
+    <Word from="smi/er" to="smiler" />
+    <Word from="/eg" to="leg" />
+    <Word from="harvinger" to="har vinger" />
+    <Word from="/et" to="let" />
+    <Word from="erjeres" to="er jeres" />
+    <Word from="hardet" to="har det" />
+    <Word from="tænktjer" to="tænkt jer" />
+    <Word from="erjo" to="er jo" />
+    <Word from="sti/" to="stil" />
+    <Word from="Iappe" to="lappe" />
+    <Word from="Beklagelç" to="Beklager," />
+    <Word from="vardet" to="var det" />
+    <Word from="afden" to="af den" />
+    <Word from="snupperjeg" to="snupper jeg" />
+    <Word from="ikkejeg" to="ikke jeg" />
+    <Word from="bliverjeg" to="bliver jeg" />
+    <Word from="hartravit" to="har travlt" />
+    <Word from="pandekagef/ag" to="pandekageflag" />
+    <Word from="Stormvarsell" to="Stormvarsel!" />
+    <Word from="stormvejn" to="stormvejr." />
+    <Word from="morgenkomp/et" to="morgenkomplet" />
+    <Word from="/yv" to="lyv" />
+    <Word from="varjo" to="var jo" />
+    <Word from="/eger" to="leger" />
+    <Word from="harjeg" to="har jeg" />
+    <Word from="havdejeg" to="havde jeg" />
+    <Word from="hvorjeg" to="hvor jeg" />
+    <Word from="nĂĄrjeg" to="nĂĄr jeg" />
+    <Word from="gĂĄrvi" to="gĂĄr vi" />
+    <Word from="atjeg" to="at jeg" />
+    <Word from="isine" to="i sine" />
+    <Word from="fĂĄrjeg" to="fĂĄr jeg" />
+    <Word from="kærtighed" to="kærlighed" />
+    <Word from="skullejeg" to="skulle jeg" />
+    <Word from="laest" to="læst" />
+    <Word from="laese" to="læse" />
+    <Word from="gørjeg" to="gør jeg" />
+    <Word from="gørvi" to="gør vi" />
+    <Word from="angrerjo" to="angrer jo" />
+    <Word from="Hvergang" to="Hver gang" />
+    <Word from="erder" to="er der" />
+    <Word from="villetilgive" to="ville tilgive" />
+    <Word from="ď¬eme" to="fjeme" />
+    <Word from="genopstĂĄri" to="genopstĂĄr i" />
+    <Word from="svigtejer" to="svigte jer" />
+    <Word from="kommernu" to="kommer nu" />
+    <Word from="nĂĄrman" to="nĂĄr man" />
+    <Word from="erfire" to="er fire" />
+    <Word from="Hvorforď¬nderdu" to="Hvorfor ď¬nder du" />
+    <Word from="undertigt" to="underligt" />
+    <Word from="itroen" to="i troen" />
+    <Word from="erløgnt" to="er løgn!" />
+    <Word from="gørden" to="gør den" />
+    <Word from="forhelvede" to="for helvede" />
+    <Word from="hjpe" to="hjælpe" />
+    <Word from="togeti" to="toget i" />
+    <Word from="MĂĄjeg" to="MĂĄ jeg" />
+    <Word from="savnerjer" to="savner jer" />
+    <Word from="erjeg" to="er jeg" />
+    <Word from="vaere" to="være" />
+    <Word from="geme" to="gerne" />
+    <Word from="trorpĂĄ" to="tror pĂĄ" />
+    <Word from="forham" to="for ham" />
+    <Word from="afham" to="af ham" />
+    <Word from="harjo" to="har jo" />
+    <Word from="ovemaď¬et" to="overnattet" />
+    <Word from="begaeď¬ighed" to="begærlighed" />
+    <Word from="sy’g" to="syg" />
+    <Word from="Imensjeg" to="Imens jeg" />
+    <Word from="bliverdu" to="bliver du" />
+    <Word from="ď¬ser" to="fiser" />
+    <Word from="manipuierer" to="manipulerer" />
+    <Word from="forjeg" to="for jeg" />
+    <Word from="iivgivendefor" to="livgivende for" />
+    <Word from="formig" to="for mig" />
+    <Word from="Hardu" to="Har du" />
+    <Word from="fornold" to="forhold" />
+    <Word from="defrelste" to="de frelste" />
+    <Word from="SĂĄjeg" to="SĂĄ jeg" />
+    <Word from="varjeg" to="var jeg" />
+    <Word from="gørved" to="gør ved" />
+    <Word from="kalderjeg" to="kalder jeg" />
+    <Word from="flytte" to="flytte" />
+    <Word from="handlerdet" to="handler det" />
+    <Word from="trorjeg" to="tror jeg" />
+    <Word from="flytter" to="flytter" />
+    <Word from="soverjeg" to="sover jeg" />
+    <Word from="ď¬nderud" to="ď¬nder ud" />
+    <Word from="naboerpĂĄ" to="naboer pĂĄ" />
+    <Word from="ervildt" to="er vildt" />
+    <Word from="væreher" to="være her" />
+    <Word from="hyggerjer" to="hygger jer" />
+    <Word from="borjo" to="bor jo" />
+    <Word from="kommerikke" to="kommer ikke" />
+    <Word from="folkynde" to="forkynde" />
+    <Word from="farglad" to="far glad" />
+    <Word from="misterjeg" to="mister jeg" />
+    <Word from="ď¬nt" to="fint" />
+    <Word from="Harl" to="Har I" />
+    <Word from="bedejer" to="bede jer" />
+    <Word from="synesjeg" to="synes jeg" />
+    <Word from="vartil" to="var til" />
+    <Word from="eren" to="er en" />
+    <Word from="\Al" to="Vil" />
+    <Word from="\A" to="Vi" />
+    <Word from="fjeme" to="fjerne" />
+    <Word from="Iigefyldt" to="lige fyldt" />
+    <Word from="ertil" to="er til" />
+    <Word from="faď¬igt" to="farligt" />
+    <Word from="ď¬nder" to="finder" />
+    <Word from="ď¬ndes" to="findes" />
+    <Word from="irettesaeď¬else" to="irettesættelse" />
+    <Word from="ermed" to="er med" />
+    <Word from="èn" to="én" />
+    <Word from="gikjoi" to="gik jo i" />
+    <Word from="Hvisjeg" to="Hvis jeg" />
+    <Word from="ovemaď¬er" to="overnatter" />
+    <Word from="hoident" to="holdent" />
+    <Word from="\Adne" to="Vidne" />
+    <Word from="fori" to="for i" />
+    <Word from="vei" to="vel" />
+    <Word from="savnerjerjo" to="savner jer jo" />
+    <Word from="elskerjer" to="elsker jer" />
+    <Word from="harløjet" to="har løjet" />
+    <Word from="eri" to="er i" />
+    <Word from="ď¬ende" to="fjende" />
+    <Word from="derjo" to="der jo" />
+    <Word from="sigerjo" to="siger jo" />
+    <Word from="menerjeg" to="mener jeg" />
+    <Word from="Harjeg" to="Har jeg" />
+    <Word from="sigerjeg" to="siger jeg" />
+    <Word from="splitterjeg" to="splitter jeg" />
+    <Word from="erjournalist" to="er journalist" />
+    <Word from="erjoumalist" to="er journalist" />
+    <Word from="Forjeg" to="For jeg" />
+    <Word from="gârjeg" to="går jeg" />
+    <Word from="Nârjeg" to="Når jeg" />
+    <Word from="afllom" to="afkom" />
+    <Word from="farerjo" to="farer jo" />
+    <Word from="tagerjeg" to="tager jeg" />
+    <Word from="Virkerjeg" to="Virker jeg" />
+    <Word from="morerjer" to="morer jer" />
+    <Word from="kommerjo" to="kommer jo" />
+    <Word from="istand" to="i stand" />
+    <Word from="bøm" to="børn" />
+    <Word from="frygterjeg" to="frygter jeg" />
+    <Word from="kommerjeg" to="kommer jeg" />
+    <Word from="eriournalistelev" to="er journalistelev" />
+    <Word from="harfat" to="har fat" />
+    <Word from="fĂĄrď¬ngre" to="fĂĄr ď¬ngre" />
+    <Word from="slârjeg" to="slår jeg" />
+    <Word from="bam" to="barn" />
+    <Word from="erjournalistelev" to="er journalistelev" />
+    <Word from="politietjo" to="politiet jo" />
+    <Word from="elskerjo" to="elsker jo" />
+    <Word from="vari" to="var i" />
+    <Word from="fornemmerjeres" to="fornemmer jeres" />
+    <Word from="udklækketl" to="udklækket!" />
+    <Word from="Ă­" to="i" />
+    <Word from="nyi" to="ny i" />
+    <Word from="Iumijelse" to="fornøjelse" />
+    <Word from="vures" to="vores" />
+    <Word from="I/VashĂ­ngtan" to="Washington" />
+    <Word from="opleverjeg" to="oplever jeg" />
+    <Word from="PANTELĂNER" to="PANTELĂ…NER" />
+    <Word from="Gudmurgen" to="Godmorgen" />
+    <Word from="SKYDEVĂBEN" to="SKYDEVĂ…BEN" />
+    <Word from="PĂLIDELIG" to="PĂ…LIDELIG" />
+    <Word from="avertalte" to="overtalte" />
+    <Word from="OmsĂ­der" to="Omsider" />
+    <Word from="lurtebĂĄd" to="lortebĂĄd" />
+    <Word from="Telrslning" to="Tekstning" />
+    <Word from="miUø" to="miljø" />
+    <Word from="gĂĄri" to="gĂĄr i" />
+    <Word from="Fan/el" to="Farvel" />
+    <Word from="abeď¬Ă¦s" to="abefjæs" />
+    <Word from="hartalt" to="har talt" />
+    <Word from="\Ă…rkelig" to="Virkelig" />
+    <Word from="beklagerjeg" to="beklager jeg" />
+    <Word from="NĂĄrjeg" to="NĂĄr jeg" />
+    <Word from="rnaend" to="mænd" />
+    <Word from="vaskebjorn" to="vaskebjørn" />
+    <Word from="Ivil" to="I vil" />
+    <Word from="besog" to="besøg" />
+    <Word from="Vaer" to="Vær" />
+    <Word from="Undersogte" to="Undersøgte" />
+    <Word from="modte" to="mødte" />
+    <Word from="toj" to="tøj" />
+    <Word from="fodt" to="født" />
+    <Word from="gore" to="gøre" />
+    <Word from="provede" to="prøvede" />
+    <Word from="forste" to="første" />
+    <Word from="igang" to="i gang" />
+    <Word from="ligenu" to="lige nu" />
+    <Word from="clet" to="det" />
+    <Word from="Strombell" to="Strombel!" />
+    <Word from="tmvlt" to="travlt" />
+    <Word from="studererjournalistik" to="studerer journalistik" />
+    <Word from="inforrnererjeg" to="informerer jeg" />
+    <Word from="omkď¬ng" to="omkring" />
+    <Word from="tilAsgĂĄrd" to="til AsgĂĄrd" />
+    <Word from="Kederjeg" to="Keder jeg" />
+    <Word from="jaettetamp" to="jættetamp" />
+    <Word from="erjer" to="er jer" />
+    <Word from="atjulehygge" to="at julehygge" />
+    <Word from="Ueneste" to="tjeneste" />
+    <Word from="foltsaetter" to="fortsætter" />
+    <Word from="A/ice" to="Alice" />
+    <Word from="tvivlerjeg" to="tvivler jeg" />
+    <Word from="henterjer" to="henter jer" />
+    <Word from="forstĂĄrjeg" to="forstĂĄr jeg" />
+    <Word from="hvisjeg" to="hvis jeg" />
+    <Word from="/ært" to="lært" />
+    <Word from="vfgtrgt" to="vigtigt" />
+    <Word from="hurtigtjeg" to="hurtigt jeg" />
+    <Word from="kenderjo" to="kender jo" />
+    <Word from="seiv" to="selv" />
+    <Word from="/ægehuset" to="lægehuset" />
+    <Word from="herjo" to="her jo" />
+    <Word from="stolerjeg" to="stoler jeg" />
+    <Word from="digi" to="dig i" />
+    <Word from="taberi" to="taber i" />
+    <Word from="slĂĄrjeres" to="slĂĄr jeres" />
+    <Word from="laere" to="lære" />
+    <Word from="trænerwushu" to="træner wushu" />
+    <Word from="efterjeg" to="efter jeg" />
+    <Word from="eď¬er" to="efter" />
+    <Word from="dui" to="du i" />
+    <Word from="aď¬en" to="aften" />
+    <Word from="bliveri" to="bliver i" />
+    <Word from="acceptererjer" to="accepterer jer" />
+    <Word from="drikkerjo" to="drikker jo" />
+    <Word from="ď¬anjin" to="Tianjin" />
+    <Word from="erlænge" to="er længe" />
+    <Word from="erikke" to="er ikke" />
+    <Word from="medjer" to="med jer" />
+    <Word from="Tmykke" to="Tillykke" />
+    <Word from="'ď¬anjins" to="Tianjins" />
+    <Word from="Mesteri" to="Mester i" />
+    <Word from="sagdetil" to="sagde til" />
+    <Word from="indei" to="inde i" />
+    <Word from="oď¬e" to="ofte" />
+    <Word from="'ď¬lgiv" to="Tilgiv" />
+    <Word from="LfĂĄr" to="I fĂĄr" />
+    <Word from="viserjer" to="viser jer" />
+    <Word from="Rejsjerblot" to="Rejs jer blot" />
+    <Word from="'ď¬llad" to="Tillad" />
+    <Word from="iiiieď¬nger" to="lilleď¬nger" />
+    <Word from="VILOMFATTE" to="VIL OMFATTE" />
+    <Word from="moď¬o" to="motto" />
+    <Word from="gørjer" to="gør jer" />
+    <Word from="gifi" to="gift" />
+    <Word from="hardu" to="har du" />
+    <Word from="giď¬" to="gift" />
+    <Word from="Iaeggerjeg" to="lægger jeg" />
+    <Word from="iet" to="i et" />
+    <Word from="sv/yte" to="svigte" />
+    <Word from="ti/" to="til" />
+    <Word from="Wdal" to="Vidal" />
+    <Word from="ď¬ĂĄet" to="fĂĄet" />
+    <Word from="Hvo/for" to="Hvorfor" />
+    <Word from="hellerikke" to="heller ikke" />
+    <Word from="Wlle" to="Ville" />
+    <Word from="dr/ver" to="driver" />
+    <Word from="V\fllliam" to="William" />
+    <Word from="V\fllliams" to="Williams" />
+    <Word from="Vkď¬lliam" to="William" />
+    <Word from="vĂĄdejakke" to="vĂĄde jakke" />
+    <Word from="kæfll" to="kæft!" />
+    <Word from="sagdejeg" to="sagde jeg" />
+    <Word from="oven/ejet" to="overvejet" />
+    <Word from="karameisauce" to="karamelsauce" />
+    <Word from="Lfølgejødisk" to="Ifølge jødisk" />
+    <Word from="blevjo" to="blev jo" />
+    <Word from="asiateri" to="asiater i" />
+    <Word from="erV\fllliam" to="er William" />
+    <Word from="lidtflov" to="lidt flov" />
+    <Word from="sagdejo" to="sagde jo" />
+    <Word from="erlige" to="er lige" />
+    <Word from="Vtď¬lliam" to="William" />
+    <Word from="Wď¬II" to="Will" />
+    <Word from="afldarede" to="afklarede" />
+    <Word from="hjæiperjeg" to="hjælper jeg" />
+    <Word from="laderjeg" to="lader jeg" />
+    <Word from="Hândledsbeskyttere" to="Håndledsbeskyttere" />
+    <Word from="Lsabels" to="Isabels" />
+    <Word from="Gørjeg" to="Gør jeg" />
+    <Word from="mâjeg" to="må jeg" />
+    <Word from="ogjeg" to="og jeg" />
+    <Word from="gjordejeg" to="gjorde jeg" />
+    <Word from="villejeg" to="ville jeg" />
+    <Word from="Vlfllliams" to="Williams" />
+    <Word from="Dajeg" to="Da jeg" />
+    <Word from="iorden" to="i orden" />
+    <Word from="fandtjeg" to="fandt jeg" />
+    <Word from="Tilykke" to="Tillykke" />
+    <Word from="kørerjer" to="kører jer" />
+    <Word from="gøfjeg" to="gør jeg" />
+    <Word from="Selvflgelig" to="Selvfølgelig" />
+    <Word from="fdder" to="fadder" />
+    <Word from="bnfaldt" to="bønfaldt" />
+    <Word from="t\/ehovedede" to="tvehovedede" />
+    <Word from="EIler" to="Eller" />
+    <Word from="ringerjeg" to="ringer jeg" />
+    <Word from="blevvæk" to="blev væk" />
+    <Word from="stárjeg" to="står jeg" />
+    <Word from="varforbi" to="var forbi" />
+    <Word from="harfortalt" to="har fortalt" />
+    <Word from="iflere" to="i flere" />
+    <Word from="tørjeg" to="tør jeg" />
+    <Word from="kunnejeg" to="kunne jeg" />
+    <Word from="má" to="må" />
+    <Word from="hartænkt" to="har tænkt" />
+    <Word from="Fárjeg" to="Får jeg" />
+    <Word from="afdelingervar" to="afdelinger var" />
+    <Word from="0rd" to="ord" />
+    <Word from="pástá" to="påstå" />
+    <Word from="gráharet" to="gråharet" />
+    <Word from="varforbløffende" to="var forbløffende" />
+    <Word from="holdtjeg" to="holdt jeg" />
+    <Word from="hængerjo" to="hænger jo" />
+    <Word from="fikjeg" to="fik jeg" />
+    <Word from="fár" to="får" />
+    <Word from="Hvorforfølerjeg" to="Hvorfor føler jeg" />
+    <Word from="harfeber" to="har feber" />
+    <Word from="ándssvagt" to="åndssvagt" />
+    <Word from="0g" to="Og" />
+    <Word from="vartre" to="var tre" />
+    <Word from="abner" to="ĂĄbner" />
+    <Word from="garjeg" to="gĂĄr jeg" />
+    <Word from="sertil" to="ser til" />
+    <Word from="hvorfin" to="hvor fin" />
+    <Word from="harfri" to="har fri" />
+    <Word from="forstarjeg" to="forstĂĄr jeg" />
+    <Word from="Sä" to="Så" />
+    <Word from="hvorfint" to="hvor fint" />
+    <Word from="mærkerjeg" to="mærker jeg" />
+    <Word from="ogsa" to="ogsĂĄ" />
+    <Word from="nárjeg" to="når jeg" />
+    <Word from="Jasá" to="Jaså" />
+    <Word from="bándoptager" to="båndoptager" />
+    <Word from="bedárende" to="bedårende" />
+    <Word from="sá" to="så" />
+    <Word from="nár" to="når" />
+    <Word from="kunnejo" to="kunne jo" />
+    <Word from="Brammertil" to="Brammer til" />
+    <Word from="serjeg" to="ser jeg" />
+    <Word from="gikjeg" to="gik jeg" />
+    <Word from="udholderjeg" to="udholder jeg" />
+    <Word from="máneder" to="måneder" />
+    <Word from="vartræt" to="var træt" />
+    <Word from="dárligt" to="dårligt" />
+    <Word from="klaretjer" to="klaret jer" />
+    <Word from="pavirkelig" to="pĂĄvirkelig" />
+    <Word from="spekulererjeg" to="spekulerer jeg" />
+    <Word from="forsøgerjeg" to="forsøger jeg" />
+    <Word from="huskerjeg" to="husker jeg" />
+    <Word from="ifavnen" to="i favnen" />
+    <Word from="skullejo" to="skulle jo" />
+    <Word from="vartung" to="var tung" />
+    <Word from="varfuldstændig" to="var fuldstændig" />
+    <Word from="Paskedag" to="PĂĄskedag" />
+    <Word from="turi" to="tur i" />
+    <Word from="spillerschumanns" to="spiller Schumanns" />
+    <Word from="forstárjeg" to="forstår jeg" />
+    <Word from="istedet" to="i stedet" />
+    <Word from="nárfrem" to="når frem" />
+    <Word from="habertrods" to="hĂĄber trods" />
+    <Word from="forførste" to="for første" />
+    <Word from="varto" to="var to" />
+    <Word from="overtil" to="over til" />
+    <Word from="forfem" to="for fem" />
+    <Word from="holdtjo" to="holdt jo" />
+    <Word from="passerjo" to="passer jo" />
+    <Word from="ellerto" to="eller to" />
+    <Word from="hartrods" to="har trods" />
+    <Word from="harfuldstændig" to="har fuldstændig" />
+    <Word from="gĂĄrjeg" to="gĂĄr jeg" />
+    <Word from="giderjeg" to="gider jeg" />
+    <Word from="forjer" to="for jer" />
+    <Word from="erindrerjeg" to="erindrer jeg" />
+    <Word from="tænkerjeg" to="tænker jeg" />
+    <Word from="GAEt" to="GĂ…ET" />
+    <Word from="hørerjo" to="hører jo" />
+    <Word from="forladerjeg" to="forlader jeg" />
+    <Word from="kosterjo" to="koster jo" />
+    <Word from="fortællerjeg" to="fortæller jeg" />
+    <Word from="Forstyrrerjeg" to="Forstyrrer jeg" />
+    <Word from="tjekkerjeg" to="tjekker jeg" />
+    <Word from="erjurist" to="er jurist" />
+    <Word from="tlLBUD" to="TILBUD" />
+    <Word from="serjo" to="se rjo" />
+    <Word from="bederjeg" to="beder jeg" />
+    <Word from="bilderjeg" to="bilder jeg" />
+    <Word from="ULVEtlME" to="ULVETlME" />
+    <Word from="skærerjo" to="skærer jo" />
+    <Word from="afjer" to="af jer" />
+    <Word from="ordnerjeg" to="ordner jeg" />
+    <Word from="giverjeg" to="giver jeg" />
+    <Word from="rejservi" to="rejser vi" />
+    <Word from="fangerjeg" to="fanger jeg" />
+    <Word from="erjaloux" to="er jaloux" />
+    <Word from="glemmerjeg" to="glemmer jeg" />
+    <Word from="Behøverjeg" to="Behøver jeg" />
+    <Word from="harvi" to="har vi" />
+    <Word from="ertyndere" to="er tyndere" />
+    <Word from="fĂĄrtordenvejr" to="fĂĄr tordenvejr" />
+    <Word from="varfærdig" to="var færdig" />
+    <Word from="hørerfor" to="hører for" />
+    <Word from="varvel" to="var vel" />
+    <Word from="erforbi" to="er forbi" />
+    <Word from="AIle" to="Alle" />
+    <Word from="læserjo" to="læser jo" />
+    <Word from="Edgarer" to="Edgar er" />
+    <Word from="hartaget" to="har taget" />
+    <Word from="derer" to="der er" />
+    <Word from="stikkerfrem" to="stikker frem" />
+    <Word from="haraldrig" to="har aldrig" />
+    <Word from="ellerfar" to="eller far" />
+    <Word from="erat" to="er at" />
+    <Word from="turtil" to="tur til" />
+    <Word from="erfærdig" to="er færdig" />
+    <Word from="følerjeg" to="føler jeg" />
+    <Word from="jerfra" to="jer fra" />
+    <Word from="eralt" to="er alt" />
+    <Word from="harfaktisk" to="har faktisk" />
+    <Word from="harfundet" to="har fundet" />
+    <Word from="harvendt" to="har vendt" />
+    <Word from="Kunstneraf" to="Kunstner af" />
+    <Word from="ervel" to="er vel" />
+    <Word from="stĂĄransigt" to="stĂĄr ansigt" />
+    <Word from="Erjeg" to="Er jeg" />
+    <Word from="venterjeg" to="venter jeg" />
+    <Word from="Hvorvar" to="Hvor var" />
+    <Word from="varfint" to="var fint" />
+    <Word from="ervarmt" to="er varmt" />
+    <Word from="gĂĄrfint" to="gĂĄr fint" />
+    <Word from="flyverforbi" to="flyver forbi" />
+    <Word from="Dervar" to="Der var" />
+    <Word from="dervar" to="der var" />
+    <Word from="menerĂĄndeligt" to="mener ĂĄndeligt" />
+    <Word from="forat" to="for at" />
+    <Word from="herovertil" to="herover til" />
+    <Word from="soverfor" to="sover for" />
+    <Word from="begyndtejeg" to="begyndte jeg" />
+    <Word from="vendertilbage" to="vender tilbage" />
+    <Word from="erforfærdelig" to="er forfærdelig" />
+    <Word from="gøraltid" to="gør altid" />
+    <Word from="ertilbage" to="er tilbage" />
+    <Word from="harværet" to="har været" />
+    <Word from="bagoverellertil" to="bagover eller til" />
+    <Word from="hertaler" to="her taler" />
+    <Word from="vĂĄgnerjeg" to="vĂĄgner jeg" />
+    <Word from="vartomt" to="var tomt" />
+    <Word from="gĂĄrfrem" to="gĂĄr frem" />
+    <Word from="talertil" to="taler til" />
+    <Word from="ertryg" to="er tryg" />
+    <Word from="ansigtervendes" to="ansigter vendes" />
+    <Word from="hervirkeligt" to="her virkeligt" />
+    <Word from="herer" to="her er" />
+    <Word from="drømmerjo" to="drømmer jo" />
+    <Word from="erfuldkommen" to="er fuldkommen" />
+    <Word from="hveren" to="hver en" />
+    <Word from="erfej" to="er fej" />
+    <Word from="datterforgæves" to="datter forgæves" />
+    <Word from="forsøgerjo" to="forsøger jo" />
+    <Word from="ertom" to="er tom" />
+    <Word from="vareftermiddag" to="var eftermiddag" />
+    <Word from="vartom" to="var tom" />
+    <Word from="angerellerforventninger" to="anger eller forventninger" />
+    <Word from="kørtejeg" to="kørte jeg" />
+    <Word from="Hvorforfortæller" to="Hvorfor fortæller" />
+    <Word from="gĂĄrtil" to="gĂĄr til" />
+    <Word from="ringerefter" to="ringer efter" />
+    <Word from="søgertilflugt" to="søger tilflugt" />
+    <Word from="ertvunget" to="er tvunget" />
+    <Word from="megetjeg" to="meget jeg" />
+    <Word from="varikke" to="var ikke" />
+    <Word from="Derermange" to="Der e rmange" />
+    <Word from="dervilhindre" to="der vil hindre" />
+    <Word from="ersĂĄ" to="er sĂĄ" />
+    <Word from="DetforstĂĄrLeggodt" to="Det forstĂĄr jeg godt" />
+    <Word from="ergodt" to="er godt" />
+    <Word from="vorventen" to="vor venten" />
+    <Word from="tagerfejl" to="tager fejl" />
+    <Word from="ellerer" to="eller er" />
+    <Word from="laverjeg" to="laver jeg" />
+    <Word from="0mgang" to="omgang" />
+    <Word from="afstár" to="afstår" />
+    <Word from="pá" to="på" />
+    <Word from="rejserjeg" to="rejser jeg" />
+    <Word from="ellertage" to="eller tage" />
+    <Word from="takkerjeg" to="takker jeg" />
+    <Word from="ertilfældigvis" to="er tilfældigvis" />
+    <Word from="fremstar" to="fremstĂĄr" />
+    <Word from="ertæt" to="er tæt" />
+    <Word from="ijeres" to="i jeres" />
+    <Word from="Sagdejeg" to="Sagde jeg" />
+    <Word from="overi" to="over i" />
+    <Word from="plukkerjordbær" to="plukker jordbær" />
+    <Word from="klarerjeg" to="klarer jeg" />
+    <Word from="jerfire" to="jer fire" />
+    <Word from="tábeligste" to="tåbeligste" />
+    <Word from="sigertvillingerne" to="siger tvillingerne" />
+    <Word from="erfaktisk" to="er faktisk" />
+    <Word from="gár" to="går" />
+    <Word from="harvasket" to="har vasket" />
+    <Word from="harplukketjordbærtil" to="har plukket jordbær til" />
+    <Word from="plukketjordbær" to="plukket jordbær" />
+    <Word from="klaverfirehændigt" to="klaver firehændigt" />
+    <Word from="erjævnaldrende" to="er jævnaldrende" />
+    <Word from="tierjeg" to="tier jeg" />
+    <Word from="Hvorerden" to="Hvor er den" />
+    <Word from="0veraltjeg" to="overalt jeg" />
+    <Word from="gĂĄrpĂĄ" to="gĂĄr pĂĄ" />
+    <Word from="finderjeg" to="finder jeg" />
+    <Word from="serhans" to="ser hans" />
+    <Word from="tiderbliver" to="tider bliver" />
+    <Word from="ellertrist" to="eller trist" />
+    <Word from="forstĂĄrjeres" to="forstĂĄr jeres" />
+    <Word from="Hvorsjælen" to="Hvor sjælen" />
+    <Word from="finderro" to="finder ro" />
+    <Word from="sidderjeg" to="sidder jeg" />
+    <Word from="tagerjo" to="tager jo" />
+    <Word from="efterjeres" to="efter jeres" />
+    <Word from="10O" to="100" />
+    <Word from="besluttedejeg" to="besluttede jeg" />
+    <Word from="varsket" to="var sket" />
+    <Word from="uadskillige" to="uadskillelige" />
+    <Word from="harjetlag" to="har jetlag" />
+    <Word from="lkke" to="Ikke" />
+    <Word from="lntet" to="Intet" />
+    <Word from="afslørerjeg" to="afslører jeg" />
+    <Word from="mĂĄjeg" to="mĂĄ jeg" />
+    <Word from="Vl" to="VI" />
+    <Word from="atbygge" to="at bygge" />
+    <Word from="detmakabre" to="det makabre" />
+    <Word from="vilikke" to="vil ikke" />
+    <Word from="talsmandbekræfter" to="talsmand bekræfter" />
+    <Word from="vedatrenovere" to="ved at renovere" />
+    <Word from="forsøgeratforstå" to="forsøger at forstå" />
+    <Word from="ersket" to="er sket" />
+    <Word from="morderpĂĄ" to="morder pĂĄ" />
+    <Word from="frifodiRosewood" to="fri fod i Rosewood" />
+    <Word from="holdtpressemøde" to="holdt pressemøde" />
+    <Word from="lngen" to="Ingen" />
+    <Word from="lND" to="IND" />
+    <Word from="henterjeg" to="henter jeg" />
+    <Word from="lsabel" to="Isabel" />
+    <Word from="lsabels" to="Isabels" />
+    <Word from="vinderjo" to="vinder jo" />
+    <Word from="rødmerjo" to="rødmer jo" />
+    <Word from="etjakkesæt" to="et jakkesæt" />
+    <Word from="glæderjeg" to="glæder jeg" />
+    <Word from="lgen" to="Igen" />
+    <Word from="lsær" to="Især" />
+    <Word from="iparken" to="i parken" />
+    <Word from="nĂĄrl" to="nĂĄr I" />
+    <Word from="tilA1" to="til A1" />
+    <Word from="FBl" to="FBI" />
+    <Word from="viljo" to="vil jo" />
+    <Word from="detpĂĄ" to="det pĂĄ" />
+    <Word from="KIar" to="Klar" />
+    <Word from="PIan" to="Plan" />
+    <Word from="EIIer" to="Eller" />
+    <Word from="FIot" to="Flot" />
+    <Word from="AIIe" to="Alle" />
+    <Word from="AIt" to="Alt" />
+    <Word from="KIap" to="Klap" />
+    <Word from="PIaza" to="Plaza" />
+    <Word from="SIap" to="Slap" />
+    <Word from="IĂĄ" to="lĂĄ" />
+    <Word from="BIing" to="Bling" />
+    <Word from="GIade" to="Glade" />
+    <Word from="IejrbĂĄlssange" to="lejrbĂĄlssange" />
+    <Word from="bedtjer" to="bedt jer" />
+    <Word from="hørerjeg" to="hører jeg" />
+    <Word from="FĂĄrjeg" to="FĂĄr jeg" />
+    <Word from="fikJames" to="fik James" />
+    <Word from="atsnakke" to="at snakke" />
+    <Word from="varkun" to="var kun" />
+    <Word from="retterjeg" to="retter jeg" />
+    <Word from="ernormale" to="er normale" />
+    <Word from="viljeg" to="vil jeg" />
+    <Word from="Sætjer" to="Sæt jer" />
+    <Word from="udsatham" to="udsat ham" />
+    <Word from="afen" to="af en" />
+    <Word from="pĂĄjorden" to="pĂĄ jorden" />
+    <Word from="afdem" to="af dem" />
+    <Word from="kmt" to="km/t" />
+  </WholeWords>
+  <PartialWordsAlways>
+    <WordPart from="¤" to="o" />
+    <WordPart from="IVI" to="M" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="lVl" to="M" />
+  </PartialWordsAlways>
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary -->
+    <!-- If new word(s) exists in spelling dictionary, it(they) is accepted -->
+    <WordPart from="ď¬" to="fi" />
+    <WordPart from="fl" to="fl" />
+    <WordPart from="/" to="l" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="l" to="i" />
+    <WordPart from="€" to="e" />
+    <WordPart from="I" to="l" />
+    <WordPart from="c" to="o" />
+    <WordPart from="i" to="t" />
+    <WordPart from="cc" to="oo" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="n/" to="ry" />
+    <WordPart from="ae" to="æ" />
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="c" to="e" />
+    <WordPart from="o" to="e" />
+    <WordPart from="I" to="t" />
+    <WordPart from="n" to="o" />
+    <WordPart from="s" to="e" />
+    <WordPart from="\A" to="Vi" />
+    <WordPart from="n/" to="rv" />
+    <WordPart from="Ă" to="Ă…" />
+    <WordPart from="Ă­" to="i" />
+  </PartialWords>
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/deu_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/deu_OCRFixReplaceList.xml
new file mode 100644
index 000000000..bb64f0987
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/deu_OCRFixReplaceList.xml
@@ -0,0 +1,6865 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="/a" to="Ja" />
+    <Word from="/ch" to="Ich" />
+    <Word from="/d/of" to="Idiot" />
+    <Word from="/ebte" to="lebte" />
+    <Word from="/eid" to="leid" />
+    <Word from="/hn" to="ihn" />
+    <Word from="/hnen" to="Ihnen" />
+    <Word from="/hr" to="Ihr" />
+    <Word from="/hre" to="Ihre" />
+    <Word from="/hren" to="Ihren" />
+    <Word from="/m" to="im" />
+    <Word from="/mmer" to="immer" />
+    <Word from="/n" to="In" />
+    <Word from="/ndividuen" to="Individuen" />
+    <Word from="/nn" to="Inn" />
+    <Word from="/oe" to="Joe" />
+    <Word from="/sf" to="ist" />
+    <Word from="/sf/0/1n" to="Ist John" />
+    <Word from="/ungs" to="Jungs" />
+    <Word from="/Vfinuten" to="Minuten" />
+    <Word from="/énger" to="länger" />
+    <Word from="/éuft" to="läuft" />
+    <Word from="0/1" to="Oh" />
+    <Word from="0/me" to="ohne" />
+    <Word from="0/vne" to="ohne" />
+    <Word from="00om" to="000 m" />
+    <Word from="100m" to="100 m" />
+    <Word from="120m" to="120 m" />
+    <Word from="13Oj§hrie" to="130 jährige" />
+    <Word from="13Oj§hrie" to="130-jährige" />
+    <Word from="145m" to="145 m" />
+    <Word from="150m" to="150 m" />
+    <Word from="160m" to="160 m" />
+    <Word from="165m" to="165 m" />
+    <Word from="19m" to="19 m" />
+    <Word from="20m" to="20 m" />
+    <Word from="27m" to="27 m" />
+    <Word from="30m" to="30 m" />
+    <Word from="37m" to="37 m" />
+    <Word from="38m" to="38 m" />
+    <Word from="3km" to="3 km" />
+    <Word from="5/ch" to="sich" />
+    <Word from="5/cher" to="sicher" />
+    <Word from="5/cherer" to="sicherer" />
+    <Word from="5/e" to="Sie" />
+    <Word from="5/nd" to="Sind" />
+    <Word from="500m" to="500 m" />
+    <Word from="5ulSere" to="äußere" />
+    <Word from="60m" to="60 m" />
+    <Word from="6de" to="öde" />
+    <Word from="6dere" to="ödere" />
+    <Word from="6ffne" to="öffne" />
+    <Word from="6ffnen" to="öffnen" />
+    <Word from="6ffnet" to="Ă–ffnet" />
+    <Word from="6fter" to="öfter" />
+    <Word from="750m" to="750 m" />
+    <Word from="85m" to="85 m" />
+    <Word from="90m" to="90 m" />
+    <Word from="a//em" to="allem" />
+    <Word from="A//es" to="Alles" />
+    <Word from="abbeif$en" to="abbeiĂźen" />
+    <Word from="abdrficken" to="abdrĂĽcken" />
+    <Word from="aBen" to="aĂźen" />
+    <Word from="abergléiubischen" to="abergläubischen" />
+    <Word from="aberja" to="aber ja" />
+    <Word from="aberjemand" to="aber jemand" />
+    <Word from="Aberjetzt" to="Aber jetzt" />
+    <Word from="abféhrt" to="abfährt" />
+    <Word from="abféillt" to="abfällt" />
+    <Word from="abgeférbt" to="abgefärbt" />
+    <Word from="abgehéngt" to="abgehängt" />
+    <Word from="abgehért" to="abgehört" />
+    <Word from="abgelost" to="abgelöst" />
+    <Word from="abgesprengli" to="abgesprengt!" />
+    <Word from="abgestfirztl" to="abgestĂĽrzt" />
+    <Word from="abgestilrzt" to="abgestĂĽrzt" />
+    <Word from="abgestofien" to="abgestoĂźen" />
+    <Word from="abgewéhlt" to="abgewählt" />
+    <Word from="abgewéhnen" to="abgewöhnen" />
+    <Word from="abgewéhnt" to="abgewöhnt" />
+    <Word from="abgeénderten" to="abgeänderten" />
+    <Word from="abhéingt" to="abhängt" />
+    <Word from="abhéngen" to="abhängen" />
+    <Word from="abhéngig" to="abhängig" />
+    <Word from="abhéngiges" to="abhängiges" />
+    <Word from="Abhérstationen" to="Abhörstationen" />
+    <Word from="Abjetzt" to="Ab jetzt" />
+    <Word from="abkfihlen" to="abkĂĽhlen" />
+    <Word from="Abkfirzung" to="AbkĂĽrzung" />
+    <Word from="abkommlich" to="abkömmlich" />
+    <Word from="Ablegenl" to="Ablegen!" />
+    <Word from="ablfisen" to="ablösen" />
+    <Word from="ablosen" to="ablösen" />
+    <Word from="Ablosung" to="Ablösung" />
+    <Word from="abreif$en" to="abreiĂźen" />
+    <Word from="Abrijcken" to="AbrĂĽcken" />
+    <Word from="abréumen" to="abräumen" />
+    <Word from="Absch/ed" to="Abschied" />
+    <Word from="abschiefien" to="abschieĂźen" />
+    <Word from="abschlief$en" to="abschlieĂźen" />
+    <Word from="abschliefien" to="abschlieĂźen" />
+    <Word from="abschwiiren" to="abschwören" />
+    <Word from="abstoflsend" to="abstoĂźend" />
+    <Word from="Abtrijnnige" to="AbtrĂĽnnige" />
+    <Word from="abwiirgt" to="abwĂĽrgt" />
+    <Word from="abwégen" to="abwägen" />
+    <Word from="abzuhéren" to="abzuhören" />
+    <Word from="abzuschwiiren" to="abzuschwören" />
+    <Word from="abzusfofien" to="abzustoĂźen" />
+    <Word from="ACh" to="Ach" />
+    <Word from="Achtungl" to="Achtung!" />
+    <Word from="Achzen" to="Ă„chzen" />
+    <Word from="ACHZT" to="Ă„CHZT" />
+    <Word from="Acic" to="Acid" />
+    <Word from="ADDRESSDATEI" to="ADRESSDATEI" />
+    <Word from="Adiös" to="Adiós" />
+    <Word from="Admiralitat" to="Admiralität" />
+    <Word from="Admiralitéit" to="Admiralität" />
+    <Word from="Admiralitét" to="Admiralität" />
+    <Word from="Affére" to="Affäre" />
+    <Word from="Afféren" to="Affären" />
+    <Word from="AFl" to="AFI" />
+    <Word from="aggresivem" to="aggressivem" />
+    <Word from="Agypten" to="Ă„gypten" />
+    <Word from="aher" to="aber" />
+    <Word from="AI/en/vichtigste" to="Allerwichtigste" />
+    <Word from="Ain/vays" to="Airways" />
+    <Word from="AIs" to="Als" />
+    <Word from="Aktivitéiten" to="Aktivitäten" />
+    <Word from="Aktivitéten" to="Aktivitäten" />
+    <Word from="AKTMERT" to="AKTIVIERT" />
+    <Word from="Alarmsfufe" to="Alarmstufe" />
+    <Word from="albem" to="albern" />
+    <Word from="Albtriiume" to="Albträume" />
+    <Word from="ale" to="als" />
+    <Word from="alleinl" to="allein!" />
+    <Word from="allejubeln" to="alle jubeln" />
+    <Word from="allernéchsten" to="allernächsten" />
+    <Word from="Allmiichtigerl" to="Allmächtiger!" />
+    <Word from="Allméchtige" to="Allmächtige" />
+    <Word from="Allméchtiger" to="Allmächtiger" />
+    <Word from="allméhlich" to="allmählich" />
+    <Word from="Allméichtiger" to="Allmächtiger" />
+    <Word from="Allsparkl" to="Allspark!" />
+    <Word from="alltéiglichen" to="alltäglichen" />
+    <Word from="ALTESTE" to="Ă„LTESTE" />
+    <Word from="Altester" to="Ă„ltester" />
+    <Word from="Alzte" to="Ă„rzte" />
+    <Word from="Amerx'kaner" to="Amerikaner" />
+    <Word from="amfisierst" to="amĂĽsierst" />
+    <Word from="Amiilsierst" to="AmĂĽsierst" />
+    <Word from="amiisieren" to="amĂĽsieren" />
+    <Word from="amiisierenl" to="amĂĽsieren!" />
+    <Word from="amiisierte" to="amĂĽsierte" />
+    <Word from="Amijsant" to="AmĂĽsant" />
+    <Word from="amlllsant" to="amĂĽsant" />
+    <Word from="amlllsiert" to="amĂĽsiert" />
+    <Word from="amtlsant" to="amĂĽsant" />
+    <Word from="Amusanf" to="AmĂĽsant" />
+    <Word from="amusant" to="amĂĽsant" />
+    <Word from="Amusiert" to="AmĂĽsiert" />
+    <Word from="Anderst" to="Ă„nderst" />
+    <Word from="Anderung" to="Ă„nderung" />
+    <Word from="Anderungen" to="Ă„nderungen" />
+    <Word from="anfa'ngt" to="anfängt" />
+    <Word from="Anffihrer" to="AnfĂĽhrer" />
+    <Word from="Anffingerl" to="Anfänger!" />
+    <Word from="Anfiihrer" to="AnfĂĽhrer" />
+    <Word from="anfijhlt" to="anfĂĽhlt" />
+    <Word from="Anfingerl" to="Anfänger!" />
+    <Word from="Anfuhrer" to="AnfĂĽhrer" />
+    <Word from="Anfuhrern" to="AnfĂĽhrern" />
+    <Word from="Anféinger" to="Anfänger" />
+    <Word from="Anféingergliick" to="Anfängerglück" />
+    <Word from="Anfénge" to="Anfänge" />
+    <Word from="anféngst" to="anfängst" />
+    <Word from="anféngt" to="anfängt" />
+    <Word from="angebrfillt" to="angebrĂĽllt" />
+    <Word from="angebrullt" to="angebrĂĽllt" />
+    <Word from="angefiihrt" to="angefĂĽhrt" />
+    <Word from="ANGEHCHDRIGE" to="ANGEHĂ–RIGE" />
+    <Word from="angehfirt" to="angehört" />
+    <Word from="Angehtirigen" to="Angehörigen" />
+    <Word from="angehéren" to="angehören" />
+    <Word from="angehért" to="angehört" />
+    <Word from="angeléchelt" to="angelächelt" />
+    <Word from="angerilhrt" to="angerĂĽhrt" />
+    <Word from="angerflhrt" to="angerührt" />
+    <Word from="angeschweifit" to="angeschweiĂźt" />
+    <Word from="angespruht" to="angesprĂĽht" />
+    <Word from="angetiltert" to="angetĂĽtert" />
+    <Word from="Angriffsplénen" to="Angriffsplänen" />
+    <Word from="Angstschweili" to="AngstschweiĂź" />
+    <Word from="anhiiren" to="anhören" />
+    <Word from="Anhéinger" to="Anhänger" />
+    <Word from="anhélt" to="anhält" />
+    <Word from="anhéngen" to="anhängen" />
+    <Word from="anhéren" to="anhören" />
+    <Word from="ankijndigen" to="ankĂĽndigen" />
+    <Word from="anliigen" to="anlĂĽgen" />
+    <Word from="anlugen" to="anlĂĽgen" />
+    <Word from="anmal3ende" to="anmaĂźende" />
+    <Word from="annéhern" to="annähern" />
+    <Word from="anriihrst" to="anrĂĽhrst" />
+    <Word from="anrijuhren" to="anrĂĽhren" />
+    <Word from="anstéindig" to="anständig" />
+    <Word from="anstéindiger" to="anständiger" />
+    <Word from="anstéindiges" to="anständiges" />
+    <Word from="ansténdig" to="anständig" />
+    <Word from="ansténdige" to="anständige" />
+    <Word from="ansténdigen" to="anständigen" />
+    <Word from="Ansténdiges" to="Anständiges" />
+    <Word from="Antikérper" to="Antikörper" />
+    <Word from="Antiquitét" to="Antiquität" />
+    <Word from="Antistrahlengerét" to="Antistrahlengerät" />
+    <Word from="antwortenl" to="antworten!" />
+    <Word from="Anwe/sung" to="Anweisung" />
+    <Word from="Anwe/sungen" to="Anweisungen" />
+    <Word from="Anwéiltin" to="Anwältin" />
+    <Word from="Anwélte" to="Anwälte" />
+    <Word from="Anwéltin" to="Anwältin" />
+    <Word from="Anzilge" to="AnzĂĽge" />
+    <Word from="Anztinden" to="AnzĂĽnden" />
+    <Word from="Anzuge" to="AnzĂĽge" />
+    <Word from="Anzugen" to="AnzĂĽgen" />
+    <Word from="anzuhiiren" to="anzuhören" />
+    <Word from="anzuhoren" to="anzuhören" />
+    <Word from="anzundenl" to="anzĂĽnden!" />
+    <Word from="anzupiibeln" to="anzupöbeln" />
+    <Word from="Anésthesie" to="Anästhesie" />
+    <Word from="Anésthesieprofessor" to="Anästhesieprofessor" />
+    <Word from="Anésthesieteam" to="Anästhesieteam" />
+    <Word from="Anésthesist" to="Anästhesist" />
+    <Word from="Anésthesisten" to="Anästhesisten" />
+    <Word from="Anésthetikum" to="Anästhetikum" />
+    <Word from="ARBEITERI" to="ARBEITER:" />
+    <Word from="Arbeitsflflgel" to="Arbeitsflügel" />
+    <Word from="Armeefunkgerét" to="Armeefunkgerät" />
+    <Word from="Armel" to="Ă„rmel" />
+    <Word from="Arschkichern" to="Arschlöchern" />
+    <Word from="Arschliicher" to="Arschlöcher" />
+    <Word from="Arschliichern" to="Arschlöchern" />
+    <Word from="Arschlécher" to="Arschlöcher" />
+    <Word from="Arschléchern" to="Arschlöchern" />
+    <Word from="Arzte" to="Ă„rzte" />
+    <Word from="Arzten" to="Ă„rzten" />
+    <Word from="Arztin" to="Ă„rztin" />
+    <Word from="Atemgeréusche" to="Atemgeräusche" />
+    <Word from="Atlantikkiiste" to="AtlantikkĂĽste" />
+    <Word from="Atlantikkuste" to="AtlantikkĂĽste" />
+    <Word from="ATMOSPHARE" to="ATMOSPHĂ„RE" />
+    <Word from="Atmosphére" to="Atmosphäre" />
+    <Word from="Atmosphérenbereich" to="Atmosphärenbereich" />
+    <Word from="Atmosphéreneinflugsequenz" to="Atmosphäreneinflugsequenz" />
+    <Word from="Atmosphéreneintritt" to="Atmosphäreneintritt" />
+    <Word from="Attenfaiter" to="Attentäter" />
+    <Word from="Attentéiter" to="Attentäter" />
+    <Word from="Attentéter" to="Attentäter" />
+    <Word from="Attentéters" to="Attentäters" />
+    <Word from="Attraktivitét" to="Attraktivität" />
+    <Word from="auBen" to="auĂźen" />
+    <Word from="Aubenblick" to="Augenblick" />
+    <Word from="AuBenbord" to="AuĂźenbord" />
+    <Word from="AuBenwelt" to="AuĂźenwelt" />
+    <Word from="auBer" to="auĂźer" />
+    <Word from="AuBerdem" to="AuĂźerdem" />
+    <Word from="auBerhalb" to="auĂźerhalb" />
+    <Word from="auc/1" to="auch" />
+    <Word from="auchl" to="auch!" />
+    <Word from="Auf$erdem" to="AuĂźerdem" />
+    <Word from="auf3er" to="auĂźer" />
+    <Word from="aufAugenh6he" to="auf Augenhöhe" />
+    <Word from="aufblilhende" to="aufblĂĽhende" />
+    <Word from="auff'a'ngt" to="auffängt" />
+    <Word from="Auffélliges" to="Auffälliges" />
+    <Word from="aufgebltiht" to="aufgeblĂĽht" />
+    <Word from="aufgeftlhrt" to="aufgefĂĽhrt" />
+    <Word from="aufgehéingt" to="aufgehängt" />
+    <Word from="aufgehért" to="aufgehört" />
+    <Word from="aufgeklért" to="aufgeklärt" />
+    <Word from="aufgeréumt" to="aufgeräumt" />
+    <Word from="aufgespiefit" to="aufgespieĂźt" />
+    <Word from="aufgewiihlter" to="aufgewĂĽhlter" />
+    <Word from="aufgezéhlt" to="aufgezählt" />
+    <Word from="Aufh6ren" to="Aufhören" />
+    <Word from="aufhbren" to="aufhören" />
+    <Word from="aufhdrf" to="aufhört" />
+    <Word from="aufhfiren" to="aufhören" />
+    <Word from="aufhiiren" to="aufhören" />
+    <Word from="Aufhoren" to="Aufhören" />
+    <Word from="Aufhéiren" to="Aufhören" />
+    <Word from="aufhéngen" to="aufhängen" />
+    <Word from="Aufhéren" to="Aufhören" />
+    <Word from="aufhérenl" to="aufhören" />
+    <Word from="aufi" to="auf," />
+    <Word from="Aufienministerium" to="AuĂźenministerium" />
+    <Word from="aufier" to="auĂźer" />
+    <Word from="Aufierdem" to="AuĂźerdem" />
+    <Word from="aufiergewéhnliche" to="außergewöhnliche" />
+    <Word from="aufierhalb" to="auĂźerhalb" />
+    <Word from="Aufierirdischer" to="AuĂźerirdischer" />
+    <Word from="Aufierlich" to="Ă„uĂźerlich" />
+    <Word from="aufierordentlich" to="auĂźerordentlich" />
+    <Word from="Aufkenposten" to="AuĂźenposten" />
+    <Word from="aufkisen" to="auflösen" />
+    <Word from="aufkléren" to="aufklären" />
+    <Word from="Aufklérung" to="Aufklärung" />
+    <Word from="aufl" to="auf!" />
+    <Word from="Aufl6sung" to="Auflösung" />
+    <Word from="aufliisen" to="auflösen" />
+    <Word from="auflser" to="auĂźer" />
+    <Word from="auflésen" to="auflösen" />
+    <Word from="aufmiibeln" to="aufmöbeln" />
+    <Word from="aufraumte" to="aufräumte" />
+    <Word from="aufréumen" to="aufräumen" />
+    <Word from="aufschlief$en" to="aufschlieĂźen" />
+    <Word from="Aufschlull" to="Aufschluss" />
+    <Word from="aufSer" to="auĂźer" />
+    <Word from="aufSIJBigkeiten" to="auf SĂĽĂźigkeiten" />
+    <Word from="aufspturen" to="aufspĂĽren" />
+    <Word from="aufstellenl" to="aufstellen!" />
+    <Word from="Aufsténdige" to="Aufständische" />
+    <Word from="aufTanis" to="auf Tanis" />
+    <Word from="Auftrége" to="Aufträge" />
+    <Word from="aufvvéndigen" to="aufwändigen" />
+    <Word from="aufwéichst" to="aufwächst" />
+    <Word from="aufwérmen" to="aufwärmen" />
+    <Word from="aufZ&gt;er" to="auĂźer" />
+    <Word from="Aufztlge" to="AufzĂĽge" />
+    <Word from="aufzuhiivren" to="aufzuhören" />
+    <Word from="aufzukléren" to="aufzuklären" />
+    <Word from="aufzuldsen" to="aufzulösen" />
+    <Word from="aufzuréumen" to="aufzuräumen" />
+    <Word from="aufzéhlen" to="aufzählen" />
+    <Word from="auféer" to="außer" />
+    <Word from="auffliegen" to="auffliegen" />
+    <Word from="Augenméigen" to="Augenmägen" />
+    <Word from="aul'5er" to="auĂźer" />
+    <Word from="aul3er" to="auĂźer" />
+    <Word from="Aul3erdem" to="AuĂźerdem" />
+    <Word from="aul5er" to="auĂźer" />
+    <Word from="aulier" to="auĂźer" />
+    <Word from="Aulierdem" to="AuĂźerdem" />
+    <Word from="auliergewfihnlich" to="außergewöhnlich" />
+    <Word from="aulierhalb" to="auĂźerhalb" />
+    <Word from="Aulierirdischen" to="AuĂźerirdischen" />
+    <Word from="auller" to="auĂźer" />
+    <Word from="aullerhalb" to="auĂźerhalb" />
+    <Word from="AulSer" to="AuĂźer" />
+    <Word from="AulSerdem" to="AuĂźerdem" />
+    <Word from="ausdriicken" to="ausdrĂĽcken" />
+    <Word from="ausdriickt" to="ausdrĂĽckt" />
+    <Word from="ausdrijcken" to="ausdrĂĽcken" />
+    <Word from="ausdrucklicher" to="ausdrĂĽcklicher" />
+    <Word from="Ausdrflcken" to="Ausdrücken" />
+    <Word from="Ausen/véhlte" to="Auserwählte" />
+    <Word from="Ausen/véhlter" to="Auserwählter" />
+    <Word from="auserwéhlt" to="auserwählt" />
+    <Word from="Ausffillen" to="AusfĂĽllen" />
+    <Word from="ausfijhren" to="ausfĂĽhren" />
+    <Word from="ausfijhrt" to="ausfĂĽhrt" />
+    <Word from="ausfuhren" to="ausfĂĽhren" />
+    <Word from="ausfullt" to="ausfĂĽllt" />
+    <Word from="ausgefflllt" to="ausgefüllt" />
+    <Word from="ausgeliischt" to="ausgelöscht" />
+    <Word from="ausgeliist" to="ausgelöst" />
+    <Word from="ausgeléist" to="ausgelöst" />
+    <Word from="ausgeléscht" to="ausgelöscht" />
+    <Word from="ausgelést" to="ausgelöst" />
+    <Word from="ausgeriickt" to="ausgerĂĽckt" />
+    <Word from="ausgerijstet" to="ausgerĂĽstet" />
+    <Word from="AUSGEWAHLT" to="AUSGEWĂ„HLT" />
+    <Word from="ausgewéhlt" to="ausgewählt" />
+    <Word from="Ausgéngen" to="Ausgängen" />
+    <Word from="aush6hlen" to="aushöhlen" />
+    <Word from="aushiilt" to="aushält" />
+    <Word from="Aushilfspunkerl" to="Aushilfspunker!" />
+    <Word from="aushélt" to="aushält" />
+    <Word from="ausilben" to="ausĂĽben" />
+    <Word from="Auskunfte" to="AuskĂĽnfte" />
+    <Word from="ausl" to="aus!" />
+    <Word from="Auslénder" to="Ausländer" />
+    <Word from="Auslénderl" to="Ausländer" />
+    <Word from="ausléschen" to="auslöschen" />
+    <Word from="auslésen" to="auslösen" />
+    <Word from="Ausléser" to="Auslöser" />
+    <Word from="AusmaB" to="AusmaĂź" />
+    <Word from="ausprobiefl" to="ausprobiert" />
+    <Word from="Ausriistung" to="AusrĂĽstung" />
+    <Word from="ausrusten" to="ausrĂĽsten" />
+    <Word from="Ausrustung" to="AusrĂĽstung" />
+    <Word from="Ausschullware" to="Ausschussware" />
+    <Word from="ausschwinnenl" to="ausschwärmen!" />
+    <Word from="auszudriicken" to="auszudrĂĽcken" />
+    <Word from="auszuschliefien" to="auszuschlieĂźen" />
+    <Word from="auszuwéhlen" to="auszuwählen" />
+    <Word from="Autoritét" to="Autorität" />
+    <Word from="Autoschlilssel" to="AutoschlĂĽssel" />
+    <Word from="Autoschlflssel" to="Autoschlüssel" />
+    <Word from="aufl/viihlt" to="aufwühlt" />
+    <Word from="Auflergewiihnlich" to="Außergewöhnlich" />
+    <Word from="Azevedol" to="Azevedo!" />
+    <Word from="Afles" to="Alles" />
+    <Word from="B/ick" to="Blick" />
+    <Word from="b/olog/sch" to="biologisch" />
+    <Word from="b/sschen" to="bisschen" />
+    <Word from="B6se" to="Böse" />
+    <Word from="B6sem" to="Bösem" />
+    <Word from="B6ser" to="Böser" />
+    <Word from="Babymédchen" to="Babymädchen" />
+    <Word from="Ballaststéffchen" to="Ballaststöffchen" />
+    <Word from="Ballmédchen" to="Ballmädchen" />
+    <Word from="Ballméidchen" to="Ballmädchen" />
+    <Word from="Ballonverkéufer" to="Ballonverkäufer" />
+    <Word from="Balzenl" to="Balzen!" />
+    <Word from="Bankijberfall" to="BankĂĽberfall" />
+    <Word from="Barbarenilberfall" to="BarbarenĂĽberfall" />
+    <Word from="Barenkénig" to="Barenkönig" />
+    <Word from="basfeln" to="basteln" />
+    <Word from="Bastianol" to="Bastiano!" />
+    <Word from="Bastlano" to="Bastiano" />
+    <Word from="Bauchfellentztmdung" to="BauchfellentzĂĽndung" />
+    <Word from="Bauchkrémpfe" to="Bauchkrämpfe" />
+    <Word from="bauféllig" to="baufällig" />
+    <Word from="bauféllige" to="baufällige" />
+    <Word from="Baumstémme" to="Baumstämme" />
+    <Word from="Baupléne" to="Baupläne" />
+    <Word from="Bbses" to="Böses" />
+    <Word from="be/de" to="beide" />
+    <Word from="bedecktl" to="bedeckt!" />
+    <Word from="Bedilrfnisse" to="BedĂĽrfnisse" />
+    <Word from="Bedilrfnissen" to="BedĂĽrfnissen" />
+    <Word from="Bedllirfnisse" to="BedĂĽrfnisse" />
+    <Word from="bedrijckt" to="bedrĂĽckt" />
+    <Word from="bedréngen" to="bedrängen" />
+    <Word from="bedréngt" to="bedrängt" />
+    <Word from="bedréngten" to="bedrängten" />
+    <Word from="Beeilungf" to="Beeilung!" />
+    <Word from="Beeilungl" to="Beeilung!" />
+    <Word from="Beerdingungsinsiiiui" to="Beerdigungsinstitut" />
+    <Word from="Beerdingungsinstitut" to="Beerdigungsinstitut" />
+    <Word from="Befehll" to="Befehl!" />
+    <Word from="beffirdert" to="befördert" />
+    <Word from="Beffirderung" to="Beförderung" />
+    <Word from="befiirchte" to="befĂĽrchte" />
+    <Word from="befiirchteten" to="befĂĽrchteten" />
+    <Word from="befiirdert" to="befördert" />
+    <Word from="befiirderte" to="beförderte" />
+    <Word from="Befiirderung" to="Beförderung" />
+    <Word from="befilrchtete" to="befĂĽrchtete" />
+    <Word from="befllirchte" to="befĂĽrchte" />
+    <Word from="befurworte" to="befĂĽrworte" />
+    <Word from="befurwortet" to="befĂĽrwortet" />
+    <Word from="beférdere" to="befördere" />
+    <Word from="beférdert" to="befördert" />
+    <Word from="Beférderung" to="Beförderung" />
+    <Word from="beg/ng" to="beging" />
+    <Word from="beglflckt" to="beglückt" />
+    <Word from="begniigt" to="begnĂĽgt" />
+    <Word from="begrfindetes" to="begrĂĽndetes" />
+    <Word from="Begriiliungsruf" to="BegrĂĽĂźungsruf" />
+    <Word from="begrijfien" to="begrĂĽĂźen" />
+    <Word from="Begrilfiung" to="BegrĂĽĂźung" />
+    <Word from="Begrilfkung" to="BegrĂĽĂźung" />
+    <Word from="begrL'llZ&gt;en" to="begrĂĽĂźen" />
+    <Word from="BegrUBungsruf" to="BegrĂĽĂźungsruf" />
+    <Word from="begrUf$t" to="begrĂĽĂźt" />
+    <Word from="begrufie" to="begrĂĽĂźe" />
+    <Word from="begrufit" to="begrĂĽĂźt" />
+    <Word from="Begrundung" to="BegrĂĽndung" />
+    <Word from="Beh6rden" to="Behörden" />
+    <Word from="behélt" to="behält" />
+    <Word from="Behélter" to="Behälter" />
+    <Word from="behémmert" to="behämmert" />
+    <Word from="beiB" to="beiĂź" />
+    <Word from="beiBen" to="beiĂźen" />
+    <Word from="beiBt" to="beiĂźt" />
+    <Word from="beif$t" to="beiĂźt" />
+    <Word from="beif2&gt;en" to="beiĂźen" />
+    <Word from="beifken" to="beiĂźen" />
+    <Word from="beiflsen" to="beiĂźen" />
+    <Word from="beijenen" to="bei jenen" />
+    <Word from="Beiliring" to="BeiĂźring" />
+    <Word from="BEKAMPFEN" to="BEKĂ„MPFEN" />
+    <Word from="bekannf" to="bekannt" />
+    <Word from="bekanntermafken" to="bekanntermaĂźen" />
+    <Word from="bekéme" to="bekäme" />
+    <Word from="bekémpfen" to="bekämpfen" />
+    <Word from="Bekémpfung" to="Bekämpfung" />
+    <Word from="bel" to="bei" />
+    <Word from="belde" to="beide" />
+    <Word from="beliellsen" to="belieĂźen" />
+    <Word from="belm" to="beim" />
+    <Word from="Beltlftungstunnels" to="BelĂĽftungstunnels" />
+    <Word from="Beluftungstunnel" to="BelĂĽftungstunnel" />
+    <Word from="Beluftungstunnell" to="BelĂĽftungstunnel!" />
+    <Word from="beléstigen" to="belästigen" />
+    <Word from="Bemiihe" to="BemĂĽhe" />
+    <Word from="Bemiihen" to="BemĂĽhen" />
+    <Word from="bemL'lhe" to="bemĂĽhe" />
+    <Word from="bemtuht" to="bemĂĽht" />
+    <Word from="bemuhen" to="bemĂĽhen" />
+    <Word from="bemuhten" to="bemĂĽhten" />
+    <Word from="Benétigen" to="Benötigen" />
+    <Word from="benétigt" to="benötigt" />
+    <Word from="benétigten" to="benötigten" />
+    <Word from="Beobachtar" to="Beobachter" />
+    <Word from="bereft" to="bereit" />
+    <Word from="bereitféndet" to="bereitfändet" />
+    <Word from="beriichtigtsten" to="berĂĽchtigtsten" />
+    <Word from="beriichtlgten" to="berĂĽchtigten" />
+    <Word from="beriihmt" to="berĂĽhmt" />
+    <Word from="Beriihmtheiten" to="BerĂĽhmtheiten" />
+    <Word from="beriihren" to="berĂĽhren" />
+    <Word from="Beriihrend" to="BerĂĽhrend" />
+    <Word from="beriihrt" to="berĂĽhrt" />
+    <Word from="Beriihrtl" to="BerĂĽhrt!" />
+    <Word from="berijhrt" to="berĂĽhrt" />
+    <Word from="berilhmter" to="berĂĽhmter" />
+    <Word from="berilhrt" to="berĂĽhrt" />
+    <Word from="Berilhrung" to="BerĂĽhrung" />
+    <Word from="Berks/1/re" to="Berkshire" />
+    <Word from="BerL'lhre" to="BerĂĽhre" />
+    <Word from="berllichtigter" to="berĂĽchtigter" />
+    <Word from="berllihren" to="berĂĽhren" />
+    <Word from="berllihrt" to="berĂĽhrt" />
+    <Word from="berlllhmten" to="berĂĽhmten" />
+    <Word from="Bern/e" to="Bernie" />
+    <Word from="beruhrt" to="berĂĽhrt" />
+    <Word from="beruhrte" to="berĂĽhrte" />
+    <Word from="berflhmter" to="berühmter" />
+    <Word from="besafi" to="besaĂź" />
+    <Word from="Besch'a'ftigt" to="Beschäftigt" />
+    <Word from="bescheifien" to="bescheiĂźen" />
+    <Word from="beschiftigt" to="beschäftigt" />
+    <Word from="beschiiftigt" to="beschäftigt" />
+    <Word from="beschiitzen" to="beschĂĽtzen" />
+    <Word from="beschiitzt" to="beschĂĽtzt" />
+    <Word from="beschiltze" to="beschĂĽtze" />
+    <Word from="beschiltzen" to="beschĂĽtzen" />
+    <Word from="beschleun/gt" to="beschleunigt" />
+    <Word from="beschliefkt" to="beschlieĂźt" />
+    <Word from="beschliefltloszuziehen" to="beschließt loszuziehen" />
+    <Word from="beschllitzet" to="beschĂĽtzet" />
+    <Word from="beschllitzt" to="beschĂĽtzt" />
+    <Word from="beschrénkt" to="beschränkt" />
+    <Word from="Beschrénkungen" to="Beschränkungen" />
+    <Word from="beschtitze" to="beschĂĽtze" />
+    <Word from="beschutzen" to="beschĂĽtzen" />
+    <Word from="beschédigt" to="beschädigt" />
+    <Word from="beschéftigen" to="beschäftigen" />
+    <Word from="beschéftigt" to="beschäftigt" />
+    <Word from="beschéftigte" to="beschäftigte" />
+    <Word from="beschéftigten" to="beschäftigten" />
+    <Word from="beschéiftige" to="beschäftige" />
+    <Word from="beschéiftigt" to="beschäftigt" />
+    <Word from="Beschéimen" to="Beschämen" />
+    <Word from="beschémendste" to="beschämendste" />
+    <Word from="beschéoligen" to="beschädigen" />
+    <Word from="beschfltzen" to="beschützen" />
+    <Word from="Beschfltzer" to="Beschützer" />
+    <Word from="Besféf/gen" to="Bestätigen" />
+    <Word from="Besitztijmer" to="BesitztĂĽmer" />
+    <Word from="BESTATIGE" to="BESTĂ„TIGE" />
+    <Word from="BESTATIGT" to="BESTĂ„TIGT" />
+    <Word from="bestenl" to="besten!" />
+    <Word from="bestiirzt" to="bestĂĽrzt" />
+    <Word from="bestiitigen" to="bestätigen" />
+    <Word from="bestltigt" to="bestätigt" />
+    <Word from="bestx'mmt" to="bestimmt" />
+    <Word from="bestéindige" to="beständige" />
+    <Word from="bestéitigt" to="bestätigt" />
+    <Word from="Bestéitigung" to="Bestätigung" />
+    <Word from="Bestéitigungen" to="Bestätigungen" />
+    <Word from="Bestétige" to="Bestätige" />
+    <Word from="Bestétigen" to="Bestätigen" />
+    <Word from="bestétigt" to="bestätigt" />
+    <Word from="Bestétigung" to="Bestätigung" />
+    <Word from="beséinftigen" to="besänftigen" />
+    <Word from="beséinftigt" to="besänftigt" />
+    <Word from="besénftigen" to="besänftigen" />
+    <Word from="Betiiubt" to="Betäubt" />
+    <Word from="betriibt" to="betrĂĽbt" />
+    <Word from="betriigen" to="betrĂĽgen" />
+    <Word from="Betriiger" to="BetrĂĽger" />
+    <Word from="betriigt" to="betrĂĽgt" />
+    <Word from="betrijgen" to="betrĂĽgen" />
+    <Word from="Betrijgerl" to="BetrĂĽger!" />
+    <Word from="betrilgen" to="betrĂĽgen" />
+    <Word from="betrtlgerischer" to="betrĂĽgerischer" />
+    <Word from="betréchtliches" to="beträchtliches" />
+    <Word from="Betrége" to="Beträge" />
+    <Word from="betrégt" to="beträgt" />
+    <Word from="Bettwéische" to="Bettwäsche" />
+    <Word from="Beviilkerung" to="Bevölkerung" />
+    <Word from="bevorwir" to="bevor wir" />
+    <Word from="bevélkern" to="bevölkern" />
+    <Word from="bewegf" to="bewegt" />
+    <Word from="Bewéhrungsauflage" to="Bewährungsauflage" />
+    <Word from="bewéihrte" to="bewährte" />
+    <Word from="bewéiltigen" to="bewältigen" />
+    <Word from="bewéissern" to="bewässern" />
+    <Word from="bewélkten" to="bewölkten" />
+    <Word from="bewéltigen" to="bewältigen" />
+    <Word from="Bewéltigung" to="Bewältigung" />
+    <Word from="bewéssern" to="bewässern" />
+    <Word from="Bewésserungssysteme" to="Bewässerungssysteme" />
+    <Word from="Bezirksgelinde" to="Bezirksgelände" />
+    <Word from="bezuglich" to="bezĂĽglich" />
+    <Word from="beéingstigende" to="beängstigende" />
+    <Word from="beéngstigend" to="beängstigend" />
+    <Word from="beéngstigender" to="beängstigender" />
+    <Word from="bffnen" to="öffnen" />
+    <Word from="Bficher" to="BĂĽcher" />
+    <Word from="Bfiro" to="BĂĽro" />
+    <Word from="bfirsten" to="bĂĽrsten" />
+    <Word from="bfise" to="böse" />
+    <Word from="bfisen" to="bösen" />
+    <Word from="bfiser" to="böser" />
+    <Word from="bfises" to="böses" />
+    <Word from="bfiseste" to="böseste" />
+    <Word from="bfisesten" to="bösesten" />
+    <Word from="bgsonderen" to="besonderen" />
+    <Word from="BI6de" to="Blöde" />
+    <Word from="Bierbfichse" to="BierbĂĽchse" />
+    <Word from="Biicher" to="BĂĽcher" />
+    <Word from="Biicherei" to="BĂĽcherei" />
+    <Word from="Biick" to="BĂĽck" />
+    <Word from="Biiffel" to="BĂĽffel" />
+    <Word from="BIiHlt" to="BlĂĽht" />
+    <Word from="Biihne" to="BĂĽhne" />
+    <Word from="Biilcherei" to="BĂĽcherei" />
+    <Word from="BIind" to="Blind" />
+    <Word from="Biirger" to="BĂĽrger" />
+    <Word from="Biirgerrechte" to="BĂĽrgerrechte" />
+    <Word from="Biiro" to="BĂĽro" />
+    <Word from="Biiros" to="BĂĽros" />
+    <Word from="Biirotiir" to="BĂĽrotĂĽr" />
+    <Word from="biirsten" to="bĂĽrsten" />
+    <Word from="Biise" to="Böse" />
+    <Word from="Biisen" to="Bösen" />
+    <Word from="biises" to="böses" />
+    <Word from="Bijchern" to="BĂĽchern" />
+    <Word from="Bijhne" to="BĂĽhne" />
+    <Word from="Bijndnis" to="BĂĽndnis" />
+    <Word from="Bijrger" to="BĂĽrger" />
+    <Word from="Bijrgermeister" to="BĂĽrgermeister" />
+    <Word from="Bijro" to="BĂĽro" />
+    <Word from="Bijrokraten" to="BĂĽrokraten" />
+    <Word from="Bijrzel" to="BĂĽrzel" />
+    <Word from="Bilchern" to="BĂĽchern" />
+    <Word from="Bildseitenverhéltnis" to="Bildseitenverhältnis" />
+    <Word from="Bilndel" to="BĂĽndel" />
+    <Word from="Bilro" to="BĂĽro" />
+    <Word from="BIood" to="Blood" />
+    <Word from="BIQIS" to="BloĂź" />
+    <Word from="Bischiife" to="Bischöfe" />
+    <Word from="Bischiifen" to="Bischöfen" />
+    <Word from="Bischéfe" to="Bischöfe" />
+    <Word from="bistja" to="bist ja" />
+    <Word from="bistjetzt" to="bist jetzt" />
+    <Word from="Bittejetzt" to="Bitte jetzt" />
+    <Word from="bittersiJl3es" to="bittersĂĽĂźes" />
+    <Word from="Bitteschén" to="Bitteschön" />
+    <Word from="BIue" to="Blue" />
+    <Word from="biĂźchen" to="bisschen" />
+    <Word from="BL1hne" to="BĂĽhne" />
+    <Word from="Bl6cke" to="Blöcke" />
+    <Word from="bl6d" to="blöd" />
+    <Word from="bl6de" to="blöde" />
+    <Word from="bl6den" to="blöden" />
+    <Word from="bl6der" to="blöder" />
+    <Word from="bl6des" to="blödes" />
+    <Word from="Bl6dian" to="Blödian" />
+    <Word from="Bl6dmann" to="Blödmann" />
+    <Word from="Bl6dsinn" to="Blödsinn" />
+    <Word from="Blauaugel" to="Blauauge!" />
+    <Word from="Blddes" to="Blödes" />
+    <Word from="Ble/bf" to="Bleibt" />
+    <Word from="bleibenl" to="bleiben!" />
+    <Word from="blelbenl" to="blelben!" />
+    <Word from="Blfidmann" to="Blödmann" />
+    <Word from="Blfidsinn" to="Blödsinn" />
+    <Word from="Blfimchen" to="BlĂĽmchen" />
+    <Word from="BLicher" to="BĂĽcher" />
+    <Word from="BLihne" to="BĂĽhne" />
+    <Word from="Bliid" to="Blöd" />
+    <Word from="bliide" to="blöde" />
+    <Word from="bliiden" to="blöden" />
+    <Word from="bliidere" to="blödere" />
+    <Word from="bliides" to="blödes" />
+    <Word from="Bliidmann" to="Blödmann" />
+    <Word from="Bliidsinn" to="Blödsinn" />
+    <Word from="bliiht" to="blĂĽht" />
+    <Word from="bliirgerlichen" to="bĂĽrgerlichen" />
+    <Word from="Blijmchen" to="BlĂĽmchen" />
+    <Word from="Bllck" to="Blick" />
+    <Word from="Bllindel" to="BĂĽndel" />
+    <Word from="Blllroklammer" to="BĂĽroklammer" />
+    <Word from="bln" to="bin" />
+    <Word from="bloB" to="bloĂź" />
+    <Word from="bloBen" to="bloĂźen" />
+    <Word from="bloBstellen" to="bloĂźstellen" />
+    <Word from="blockiertl" to="blockiert!" />
+    <Word from="BLODE" to="BLĂ–DE" />
+    <Word from="blof$" to="bloĂź" />
+    <Word from="blofl" to="bloĂź" />
+    <Word from="Blol2&gt;" to="BloĂź" />
+    <Word from="blol3" to="bloĂź" />
+    <Word from="blol3&gt;" to="bloĂź" />
+    <Word from="blol3stellen" to="bloĂźstellen" />
+    <Word from="bloli" to="bloĂź" />
+    <Word from="blolistellen" to="bloĂźstellen" />
+    <Word from="blolls" to="bloĂź" />
+    <Word from="bls" to="bis" />
+    <Word from="Blst" to="Bist" />
+    <Word from="bltte" to="bitte" />
+    <Word from="Blumenstréiulichen" to="Blumensträußchen" />
+    <Word from="Blumentépfen" to="Blumentöpfen" />
+    <Word from="Blutgetränkte" to="Blut getränkte" />
+    <Word from="Blutgetrénkte" to="Blutgetränkte" />
+    <Word from="blutjungl" to="blutjung!" />
+    <Word from="blutriinstig" to="blutrĂĽnstig" />
+    <Word from="Blutvergiefien" to="BlutvergieĂźen" />
+    <Word from="bléd" to="blöd" />
+    <Word from="Bléde" to="Blöde" />
+    <Word from="bléden" to="blöden" />
+    <Word from="bléder" to="blöder" />
+    <Word from="Blédes" to="Blödes" />
+    <Word from="Blédheit" to="Blödheit" />
+    <Word from="Blédmann" to="Blödmann" />
+    <Word from="Blédsinn" to="Blödsinn" />
+    <Word from="Bléiser" to="Bläser" />
+    <Word from="Bléser" to="Bläser" />
+    <Word from="blést" to="bläst" />
+    <Word from="Bnjicke" to="BrĂĽcke" />
+    <Word from="Bodenschétze" to="Bodenschätze" />
+    <Word from="Bogenschiefien" to="BogenschieĂźen" />
+    <Word from="Bogenschiefienl" to="BogenschieĂźen!" />
+    <Word from="Bogenschiefiens" to="BogenschieĂźens" />
+    <Word from="Bogenschiitze" to="BogenschĂĽtze" />
+    <Word from="Bogenschiitzen" to="BogenschĂĽtzen" />
+    <Word from="Bogenschijtze" to="BogenschĂĽtze" />
+    <Word from="Bogenschijtzen" to="BogenschĂĽtzen" />
+    <Word from="Bogenschutzen" to="BogenschĂĽtzen" />
+    <Word from="Bogenschutzenl" to="BogenschĂĽtzen!" />
+    <Word from="BOnjour" to="Bonjour" />
+    <Word from="bosartige" to="bösartige" />
+    <Word from="Bracken" to="Brocken" />
+    <Word from="Briicke" to="BrĂĽcke" />
+    <Word from="Briicken" to="BrĂĽcken" />
+    <Word from="Briider" to="BrĂĽder" />
+    <Word from="Briihe" to="BrĂĽhe" />
+    <Word from="Briillen" to="BrĂĽllen" />
+    <Word from="briillt" to="brĂĽllt" />
+    <Word from="Brijcke" to="BrĂĽcke" />
+    <Word from="Brijderlichkeit" to="BrĂĽderlichkeit" />
+    <Word from="brijllen" to="brĂĽllen" />
+    <Word from="Brilcke" to="BrĂĽcke" />
+    <Word from="Brilder" to="BrĂĽder" />
+    <Word from="Brilllen" to="BrĂĽllen" />
+    <Word from="brillltjeden" to="brĂĽllt jeden" />
+    <Word from="Brilnette" to="BrĂĽnette" />
+    <Word from="Brilsten" to="BrĂĽsten" />
+    <Word from="brilten" to="brĂĽten" />
+    <Word from="BrL'lcke" to="BrĂĽcke" />
+    <Word from="brL'lllen" to="brĂĽllen" />
+    <Word from="brlliderliche" to="brĂĽderliche" />
+    <Word from="Brllidern" to="BrĂĽdern" />
+    <Word from="Brlliste" to="BrĂĽste" />
+    <Word from="Broschijre" to="BroschĂĽre" />
+    <Word from="Broschilren" to="BroschĂĽren" />
+    <Word from="Broschuren" to="BroschĂĽren" />
+    <Word from="Brucke" to="BrĂĽcke" />
+    <Word from="Brucken" to="BrĂĽcken" />
+    <Word from="Brudern" to="BrĂĽdern" />
+    <Word from="Bruhe" to="BrĂĽhe" />
+    <Word from="brullen" to="brĂĽllen" />
+    <Word from="brullt" to="brĂĽllt" />
+    <Word from="Brutalitiit" to="Brutalität" />
+    <Word from="Brutzelhtihnchen" to="BrutzelhĂĽhnchen" />
+    <Word from="Bréchtet" to="Brächtet" />
+    <Word from="Bréiutigam" to="Bräutigam" />
+    <Word from="Brésel" to="Brösel" />
+    <Word from="Brétchen" to="Brötchen" />
+    <Word from="bréuchte" to="bräuchte" />
+    <Word from="bréuchten" to="bräuchten" />
+    <Word from="bréunen" to="bräunen" />
+    <Word from="Bréute" to="Bräute" />
+    <Word from="Brflcke" to="Brücke" />
+    <Word from="Brflder" to="Brüder" />
+    <Word from="Btiro" to="BĂĽro" />
+    <Word from="Btiser" to="Böser" />
+    <Word from="Bucher" to="BĂĽcher" />
+    <Word from="Buchern" to="BĂĽchern" />
+    <Word from="Budgetkiirzung" to="BudgetkĂĽrzung" />
+    <Word from="BUFO" to="BĂĽro" />
+    <Word from="Bugschutzgerate" to="Bugschutzgeräte" />
+    <Word from="Buhnenbild" to="BĂĽhnenbild" />
+    <Word from="Bullel" to="Bulle!" />
+    <Word from="Buml" to="Bum!" />
+    <Word from="Bundnis" to="BĂĽndnis" />
+    <Word from="Burger" to="BĂĽrger" />
+    <Word from="Burgerrechtlerin" to="BĂĽrgerrechtlerin" />
+    <Word from="Buro" to="BĂĽro" />
+    <Word from="BURO" to="BĂśRO" />
+    <Word from="Burol" to="BĂĽro!" />
+    <Word from="Burottlr" to="BĂĽrotĂĽr" />
+    <Word from="Busche" to="BĂĽsche" />
+    <Word from="Béickchen" to="Bäckchen" />
+    <Word from="Béickerei" to="Bäckerei" />
+    <Word from="Béille" to="Bälle" />
+    <Word from="Béinder" to="Bänder" />
+    <Word from="Béir" to="Bär" />
+    <Word from="BĂ©irgermeister" to="BĂĽrgermeister" />
+    <Word from="BĂ©iro" to="BĂĽro" />
+    <Word from="béise" to="böse" />
+    <Word from="Béiume" to="Bäume" />
+    <Word from="Bénder" to="Bänder" />
+    <Word from="Bér" to="Bär" />
+    <Word from="Béren" to="Bären" />
+    <Word from="Bérenhasser" to="Bärenhasser" />
+    <Word from="Bérenhunger" to="Bärenhunger" />
+    <Word from="Bérenjéger" to="Bärenjäger" />
+    <Word from="Bérenkénig" to="Bärenkönig" />
+    <Word from="Bérenlaute" to="Bärenlaute" />
+    <Word from="Bérenrolle" to="Bärenrolle" />
+    <Word from="Bérenschnitzereien" to="Bärenschnitzereien" />
+    <Word from="Bérenstimmen" to="Bärenstimmen" />
+    <Word from="Bérin" to="Bärin" />
+    <Word from="Bérisch" to="Bärisch" />
+    <Word from="Bérs" to="Bärs" />
+    <Word from="Bérte" to="Bärte" />
+    <Word from="bés" to="bös" />
+    <Word from="bése" to="böse" />
+    <Word from="bésen" to="bösen" />
+    <Word from="Béses" to="Böses" />
+    <Word from="Béume" to="Bäume" />
+    <Word from="Béumen" to="Bäumen" />
+    <Word from="Bflchern" to="Büchern" />
+    <Word from="Bflste" to="Büste" />
+    <Word from="Cafe" to="Café" />
+    <Word from="Cafä" to="Café" />
+    <Word from="CASAREN" to="CĂ„SAREN" />
+    <Word from="Charakterméngel" to="Charaktermängel" />
+    <Word from="Charakterstérke" to="Charakterstärke" />
+    <Word from="Chrlntlna" to="Christina" />
+    <Word from="Ciden" to="öden" />
+    <Word from="Ciffnet" to="Ă–ffnet" />
+    <Word from="Cihrchen" to="Ă–hrchen" />
+    <Word from="Citroén" to="Citroën" />
+    <Word from="clamit" to="damit" />
+    <Word from="class" to="dass" />
+    <Word from="Clbernimmt" to="ĂĽbernimmt" />
+    <Word from="cler" to="der" />
+    <Word from="Coimbrasl" to="Coimbras!" />
+    <Word from="CommanderWill" to="Commander Will" />
+    <Word from="Corenillal" to="Corenilla!" />
+    <Word from="Cowboyscheifi" to="CowboyscheiĂź" />
+    <Word from="César" to="Cäsar" />
+    <Word from="D/e" to="Die" />
+    <Word from="d/ese" to="diese" />
+    <Word from="d/esem" to="diesem" />
+    <Word from="d/esen" to="diesen" />
+    <Word from="D/eser" to="Dieser" />
+    <Word from="D/eses" to="Dieses" />
+    <Word from="D/sko" to="Disko" />
+    <Word from="dabel" to="dabei" />
+    <Word from="dachfen" to="dachten" />
+    <Word from="daffir" to="dafĂĽr" />
+    <Word from="dafiir" to="dafĂĽr" />
+    <Word from="Dafijr" to="DafĂĽr" />
+    <Word from="Dafijur" to="DafĂĽr" />
+    <Word from="Dafilr" to="DafĂĽr" />
+    <Word from="dafL'lr" to="dafĂĽr" />
+    <Word from="dafLir" to="dafĂĽr" />
+    <Word from="dafljr" to="dafĂĽr" />
+    <Word from="dafllir" to="dafĂĽr" />
+    <Word from="Daflllrwar" to="DafĂĽr war" />
+    <Word from="daftir" to="dafĂĽr" />
+    <Word from="dafUr" to="dafĂĽr" />
+    <Word from="dafzjir" to="dafĂĽr" />
+    <Word from="dajemand" to="da jemand" />
+    <Word from="dal" to="da!" />
+    <Word from="Damenhénde" to="Damenhände" />
+    <Word from="damitl" to="damit!" />
+    <Word from="damlt" to="damit" />
+    <Word from="DANEMARK" to="DĂ„NEMARK" />
+    <Word from="darfiber" to="darĂĽber" />
+    <Word from="Dariiber" to="DarĂĽber" />
+    <Word from="darijber" to="darĂĽber" />
+    <Word from="Darilber" to="DarĂĽber" />
+    <Word from="dart/'ber" to="darĂĽber" />
+    <Word from="dartlber" to="darĂĽber" />
+    <Word from="DARUBER" to="DARĂśBER" />
+    <Word from="DarUber" to="DarĂĽber" />
+    <Word from="dasjetzt" to="das jetzt" />
+    <Word from="dasl" to="das!" />
+    <Word from="Dateniibermittlung" to="DatenĂĽbermittlung" />
+    <Word from="dauem" to="dauern" />
+    <Word from="dauerf" to="dauert" />
+    <Word from="dazugehéren" to="dazugehören" />
+    <Word from="DaĂź" to="Dass" />
+    <Word from="Dafllr" to="Dafür" />
+    <Word from="Ddrfern" to="Dörfern" />
+    <Word from="def" to="der" />
+    <Word from="Defekf/v" to="Detektiv" />
+    <Word from="deinerZelle" to="deiner Zelle" />
+    <Word from="deln" to="dein" />
+    <Word from="delne" to="deine" />
+    <Word from="demfiltigen" to="demĂĽtigen" />
+    <Word from="Demijtigung" to="DemĂĽtigung" />
+    <Word from="demllitige" to="demĂĽtige" />
+    <Word from="demllitigen" to="demĂĽtigen" />
+    <Word from="denkwurdiger" to="denkwĂĽrdiger" />
+    <Word from="denkwflrdiger" to="denkwürdiger" />
+    <Word from="derAbgeordnete" to="der Abgeordnete" />
+    <Word from="derAusgabe" to="der Ausgabe" />
+    <Word from="derAusl6ser" to="der Auslöser" />
+    <Word from="DerjL'lngste" to="Der jĂĽngste" />
+    <Word from="derjunge" to="der junge" />
+    <Word from="dermaben" to="dermaĂźen" />
+    <Word from="derTyp" to="der Typ" />
+    <Word from="derWeg" to="der Weg" />
+    <Word from="derWelle" to="der Welle" />
+    <Word from="DerWL1rfel" to="Der WĂĽrfel" />
+    <Word from="DerZauberer" to="Der Zauberer" />
+    <Word from="de__n" to="den" />
+    <Word from="dfeserr" to="diesem" />
+    <Word from="dffentlichen" to="öffentlichen" />
+    <Word from="dffnen" to="öffnen" />
+    <Word from="Dfimonen" to="Dämonen" />
+    <Word from="dfinn" to="dĂĽnn" />
+    <Word from="dichl" to="dich!" />
+    <Word from="diejĂĽngste" to="die JĂĽngste" />
+    <Word from="dienstunfahig" to="dienstunfähig" />
+    <Word from="Dieselkapitéin" to="Dieselkapitän" />
+    <Word from="Dieselkapitén" to="Dieselkapitän" />
+    <Word from="Dieselmotorenl" to="Dieselmotoren!" />
+    <Word from="dieserAufnahme" to="dieser Aufnahme" />
+    <Word from="Dieserjunge" to="Dieser junge" />
+    <Word from="Diiit" to="Diät" />
+    <Word from="diirfe" to="dĂĽrfe" />
+    <Word from="Diirfen" to="DĂĽrfen" />
+    <Word from="diirft" to="dĂĽrft" />
+    <Word from="diirfte" to="dĂĽrfte" />
+    <Word from="dijfien" to="dĂĽrfen" />
+    <Word from="dijnn" to="dĂĽnn" />
+    <Word from="dijrfen" to="dĂĽrfen" />
+    <Word from="Dijrfte" to="DĂĽrfte" />
+    <Word from="dijstere" to="dĂĽstere" />
+    <Word from="dilmmer" to="dĂĽmmer" />
+    <Word from="dilrfen" to="dĂĽrfen" />
+    <Word from="dilrft" to="dĂĽrft" />
+    <Word from="dilrften" to="dĂĽrften" />
+    <Word from="dilrftig" to="dĂĽrftig" />
+    <Word from="Dine" to="Däne" />
+    <Word from="dirja" to="dir ja" />
+    <Word from="dirjemand" to="dir jemand" />
+    <Word from="dirjetzt" to="dir jetzt" />
+    <Word from="dirJulie" to="dir Julie" />
+    <Word from="dirl" to="dir!" />
+    <Word from="dirwehzutun" to="dir wehzutun" />
+    <Word from="Diét" to="Diät" />
+    <Word from="Diétberaterin" to="Diätberaterin" />
+    <Word from="Diétbier" to="Diätbier" />
+    <Word from="dlch" to="dich" />
+    <Word from="Dle" to="Die" />
+    <Word from="dles" to="dies" />
+    <Word from="Dlese" to="Diese" />
+    <Word from="Dlfit" to="Diät" />
+    <Word from="Dlitplan" to="Diätplan" />
+    <Word from="dllirfen" to="dĂĽrfen" />
+    <Word from="dllirft" to="dĂĽrft" />
+    <Word from="dllirstet" to="dĂĽrstet" />
+    <Word from="dlr" to="dir" />
+    <Word from="doc/1" to="doch" />
+    <Word from="dochl" to="doch!" />
+    <Word from="dolthin" to="dorthin" />
+    <Word from="Doppelgfiner" to="Doppelgänger" />
+    <Word from="Doppelgfinger" to="Doppelgänger" />
+    <Word from="Doppelgéinger" to="Doppelgänger" />
+    <Word from="Doppelgénger" to="Doppelgänger" />
+    <Word from="Doppelzijngig" to="DoppelzĂĽngig" />
+    <Word from="doppelztmgiger" to="doppelzĂĽngiger" />
+    <Word from="dor" to="der" />
+    <Word from="Dr'a'ngt" to="Drängt" />
+    <Word from="drachengriinen" to="drachengrĂĽnen" />
+    <Word from="Drahte" to="Drähte" />
+    <Word from="dranl" to="dran!" />
+    <Word from="drau/3en" to="drauĂźen" />
+    <Word from="drau/Sen" to="drauĂźen" />
+    <Word from="drauBen" to="drauĂźen" />
+    <Word from="drauf$en" to="drauĂźen" />
+    <Word from="draufdrilcken" to="draufdrĂĽcken" />
+    <Word from="draufgestllirzt" to="draufgestĂĽrzt" />
+    <Word from="draufgéngerisch" to="draufgängerisch" />
+    <Word from="draufien" to="drauĂźen" />
+    <Word from="draufken" to="drauĂźen" />
+    <Word from="drauflsenl" to="drauĂźen!" />
+    <Word from="drauféen" to="draußen" />
+    <Word from="drauilen" to="drauĂźen" />
+    <Word from="draul3en" to="drauĂźen" />
+    <Word from="draul5en" to="drauĂźen" />
+    <Word from="draulien" to="drauĂźen" />
+    <Word from="draullen" to="drauĂźen" />
+    <Word from="draulSen" to="drauĂźen" />
+    <Word from="Dreckléchern" to="Drecklöchern" />
+    <Word from="Drecksmiihle" to="DrecksmĂĽhle" />
+    <Word from="Drecksécke" to="Drecksäcke" />
+    <Word from="drfiben" to="drĂĽben" />
+    <Word from="Drfick" to="DrĂĽck" />
+    <Word from="Drfingeln" to="Drängeln" />
+    <Word from="drih" to="dritt" />
+    <Word from="driiben" to="drĂĽben" />
+    <Word from="driicken" to="drĂĽcken" />
+    <Word from="driickt" to="drĂĽckt" />
+    <Word from="drijben" to="drĂĽben" />
+    <Word from="drijber" to="drĂĽber" />
+    <Word from="drijck" to="drĂĽck" />
+    <Word from="drijckt" to="drĂĽckt" />
+    <Word from="drilben" to="drĂĽben" />
+    <Word from="drilber" to="drĂĽber" />
+    <Word from="drilcken" to="drĂĽcken" />
+    <Word from="drLiber" to="drĂĽber" />
+    <Word from="drlliben" to="drĂĽben" />
+    <Word from="drlllben" to="drĂĽben" />
+    <Word from="Drogenabhéngige" to="Drogenabhängige" />
+    <Word from="Drticken" to="DrĂĽcken" />
+    <Word from="druben" to="drĂĽben" />
+    <Word from="drubenl" to="drĂĽben!" />
+    <Word from="druber" to="drĂĽber" />
+    <Word from="Druckknépfe" to="Druckknöpfe" />
+    <Word from="drunterliegt" to="drunter liegt" />
+    <Word from="Drénage" to="Dränage" />
+    <Word from="dréngeln" to="drängeln" />
+    <Word from="dréngen" to="drängen" />
+    <Word from="dréngt" to="drängt" />
+    <Word from="drflben" to="drüben" />
+    <Word from="dtirft" to="dĂĽrft" />
+    <Word from="dtlrfen" to="dĂĽrfen" />
+    <Word from="Dudelsécken" to="Dudelsäcken" />
+    <Word from="dUFf€l'1" to="dürfen" />
+    <Word from="dul" to="du!" />
+    <Word from="dull" to="dass" />
+    <Word from="Dummk6pfe" to="Dummköpfe" />
+    <Word from="Dummkiipfe" to="Dummköpfe" />
+    <Word from="Dunnschiss" to="DĂĽnnschiss" />
+    <Word from="durchdrficken" to="durchdrĂĽcken" />
+    <Word from="durchdréngen" to="durchdrängen" />
+    <Word from="Durchfiihrung" to="DurchfĂĽhrung" />
+    <Word from="durchfuhren" to="durchfĂĽhren" />
+    <Word from="durchgefiihlt" to="durchgefĂĽhrt" />
+    <Word from="durchgefijhrt" to="durchgefĂĽhrt" />
+    <Word from="durchgefuhrt" to="durchgefĂĽhrt" />
+    <Word from="durchgefflhrt" to="durchgeführt" />
+    <Word from="Durchgénge" to="Durchgänge" />
+    <Word from="Durchladenl" to="Durchladen!" />
+    <Word from="durchlfichere" to="durchlöchere" />
+    <Word from="durchsetzungsféhiger" to="durchsetzungsfähiger" />
+    <Word from="durchstébern" to="durchstöbern" />
+    <Word from="durchwilhlt" to="durchwĂĽhlt" />
+    <Word from="durchzufilhren" to="durchzufĂĽhren" />
+    <Word from="durchzufuhren" to="durchzufĂĽhren" />
+    <Word from="Durfen" to="DĂĽrfen" />
+    <Word from="durft" to="dĂĽrft" />
+    <Word from="dusterer" to="dĂĽsterer" />
+    <Word from="Décher" to="Dächer" />
+    <Word from="Déimon" to="Dämon" />
+    <Word from="Déimonen" to="Dämonen" />
+    <Word from="Déinemark" to="Dänemark" />
+    <Word from="Déinemarks" to="Dänemarks" />
+    <Word from="Déinen" to="Dänen" />
+    <Word from="déinisches" to="dänisches" />
+    <Word from="démlich" to="dämlich" />
+    <Word from="Démliche" to="Dämliche" />
+    <Word from="démlichen" to="dämlichen" />
+    <Word from="démlicher" to="dämlicher" />
+    <Word from="démlichl" to="dämlich" />
+    <Word from="démmert" to="dämmert" />
+    <Word from="Démonenbéren" to="Dämonenbären" />
+    <Word from="démonischen" to="dämonischen" />
+    <Word from="Dérme" to="Därme" />
+    <Word from="Dérrfleisch" to="Dörrfleisch" />
+    <Word from="Déumchen" to="Däumchen" />
+    <Word from="dflrfen" to="dürfen" />
+    <Word from="E//e" to="Elle" />
+    <Word from="e/n" to="ein" />
+    <Word from="e/ne" to="eine" />
+    <Word from="e/nem" to="einem" />
+    <Word from="e/nen" to="einen" />
+    <Word from="e/ner" to="einer" />
+    <Word from="e/nes" to="eines" />
+    <Word from="e/ns" to="eins" />
+    <Word from="e/nsf" to="einst" />
+    <Word from="E9YPt" to="Egypt" />
+    <Word from="Ea/vtes" to="Echtes" />
+    <Word from="ebenbfirtig" to="ebenbĂĽrtig" />
+    <Word from="ebenburtige" to="ebenbĂĽrtige" />
+    <Word from="Ec/vte" to="Echte" />
+    <Word from="echfen" to="echten" />
+    <Word from="edelmfltig" to="edelmütig" />
+    <Word from="efn" to="ein" />
+    <Word from="efwas" to="etwas" />
+    <Word from="Eheminner" to="Ehemänner" />
+    <Word from="Eheménnern" to="Ehemännern" />
+    <Word from="Ehezerstfirerin" to="Ehezerstörerin" />
+    <Word from="Ehrenbijrger" to="EhrenbĂĽrger" />
+    <Word from="EHRENBURGERSCHAFT" to="EHRENBĂśRGERSCHAFT" />
+    <Word from="Ehrengéiste" to="Ehrengäste" />
+    <Word from="Eichhfirnchen" to="Eichhörnchen" />
+    <Word from="Eichhiirnchen" to="Eichhörnchen" />
+    <Word from="Eichhérnchens" to="Eichhörnchens" />
+    <Word from="eifersfichtig" to="eifersĂĽchtig" />
+    <Word from="eifersiichtig" to="eifersĂĽchtig" />
+    <Word from="eifersflchtig" to="eifersüchtig" />
+    <Word from="eigenhéndig" to="eigenhändig" />
+    <Word from="eigenmlchtig" to="eigenmächtig" />
+    <Word from="eigenntltziges" to="eigennĂĽtziges" />
+    <Word from="Eihnlich" to="ähnlich" />
+    <Word from="Eimen/veise" to="Eimerweise" />
+    <Word from="Einbruche" to="EinbrĂĽche" />
+    <Word from="eindriicken" to="eindrĂĽcken" />
+    <Word from="Eindring/Inge" to="Eindringlinge" />
+    <Word from="eindrucken" to="eindrĂĽcken" />
+    <Word from="einejunge" to="eine junge" />
+    <Word from="einerfrflhen" to="einer frühen" />
+    <Word from="einervorfuhrung" to="einer VorfĂĽhrung" />
+    <Word from="einfiihren" to="einfĂĽhren" />
+    <Word from="Einfiihrung" to="EinfĂĽhrung" />
+    <Word from="einfilgen" to="einfĂĽgen" />
+    <Word from="einfilhlsamsten" to="einfĂĽhlsamsten" />
+    <Word from="einflllgen" to="einfĂĽgen" />
+    <Word from="Einflusse" to="EinflĂĽsse" />
+    <Word from="einfugen" to="einfĂĽgen" />
+    <Word from="einfuhrten" to="einfĂĽhrten" />
+    <Word from="Einfuhrung" to="EinfĂĽhrung" />
+    <Word from="Einféltige" to="Einfältige" />
+    <Word from="eingefiigt" to="eingefĂĽgt" />
+    <Word from="eingefflgt" to="eingefügt" />
+    <Word from="eingehiillt" to="eingehĂĽllt" />
+    <Word from="eingeprégt" to="eingeprägt" />
+    <Word from="eingeréiumt" to="eingeräumt" />
+    <Word from="eingeréumt" to="eingeräumt" />
+    <Word from="eingeschléfert" to="eingeschläfert" />
+    <Word from="eingeschrénkt" to="eingeschränkt" />
+    <Word from="eingeschéitzt" to="eingeschätzt" />
+    <Word from="eingeschétzt" to="eingeschätzt" />
+    <Word from="eingesturzt" to="eingestĂĽrzt" />
+    <Word from="eingieBt" to="eingieĂźt" />
+    <Word from="eingschaltet" to="eingeschaltet" />
+    <Word from="Einhérnern" to="Einhörner" />
+    <Word from="einlegenl" to="einlegen!" />
+    <Word from="einlédt" to="einlädt" />
+    <Word from="einlésen" to="einlösen" />
+    <Word from="Einsatzfahigkeit" to="Einsatzfähigkeit" />
+    <Word from="Einschiichterung" to="EinschĂĽchterung" />
+    <Word from="Einschliefklich" to="EinschlieĂźlich" />
+    <Word from="Einschlielilich" to="EinschlieĂźlich" />
+    <Word from="einstellenl" to="einstellen!" />
+    <Word from="Einsétze" to="Einsätze" />
+    <Word from="einténig" to="eintönig" />
+    <Word from="Einzelgéngerin" to="Einzelgängerin" />
+    <Word from="einzuschétzen" to="einzuschätzen" />
+    <Word from="Eisstiirme" to="EisstĂĽrme" />
+    <Word from="Elektrizitét" to="Elektrizität" />
+    <Word from="elfenbeingetfinte" to="elfenbeingetönte" />
+    <Word from="elitérer" to="elitärer" />
+    <Word from="Eln" to="Ein" />
+    <Word from="Elne" to="Eine" />
+    <Word from="elnem" to="einem" />
+    <Word from="Elnen" to="Einen" />
+    <Word from="elner" to="einer" />
+    <Word from="Elnes" to="Eines" />
+    <Word from="empfindungsféhigen" to="empfindungsfähigen" />
+    <Word from="Empféinger" to="Empfänger" />
+    <Word from="empféngt" to="empfängt" />
+    <Word from="Empiirend" to="Empörend" />
+    <Word from="Empiirendste" to="Empörendste" />
+    <Word from="empiirt" to="empört" />
+    <Word from="emst" to="ernst" />
+    <Word from="en/varten" to="erwarten" />
+    <Word from="En/vartungen" to="Erwartungen" />
+    <Word from="en/véhnt" to="erwähnt" />
+    <Word from="Enchantä" to="Enchanté" />
+    <Word from="endgiiltig" to="endgĂĽltig" />
+    <Word from="endgultig" to="endgĂĽltig" />
+    <Word from="endgultigen" to="endgĂĽltigen" />
+    <Word from="endgflltig" to="endgültig" />
+    <Word from="endlichl" to="endlich!" />
+    <Word from="ENERIGE" to="ENERGIE" />
+    <Word from="enfternt" to="entfernt" />
+    <Word from="Englénder" to="Engländer" />
+    <Word from="Englénderin" to="Engländerin" />
+    <Word from="eniillen" to="erfĂĽllen" />
+    <Word from="entbl6Bte" to="entblößte" />
+    <Word from="entbl6f$en" to="entblößen" />
+    <Word from="entfiihre" to="entfĂĽhre" />
+    <Word from="entfiihrt" to="entfĂĽhrt" />
+    <Word from="entfiihrte" to="entfĂĽhrte" />
+    <Word from="Entfiihrung" to="EntfĂĽhrung" />
+    <Word from="Entftihrung" to="EntfĂĽhrung" />
+    <Word from="ENTFUHRUNGSVERDACHTIGER" to="ENTFĂśHRUNGSVERDĂ„CHTIGER" />
+    <Word from="enthllt" to="enthält" />
+    <Word from="enthUllt" to="enthĂĽllt" />
+    <Word from="enthélt" to="enthält" />
+    <Word from="entliiften" to="entlĂĽften" />
+    <Word from="Entliiftungen" to="EntlĂĽftungen" />
+    <Word from="Entlijlftungen" to="EntlĂĽftungen" />
+    <Word from="entluften" to="entlĂĽften" />
+    <Word from="entlésst" to="entlässt" />
+    <Word from="Entreilit" to="EntreiĂźt" />
+    <Word from="entriistet" to="entrĂĽstet" />
+    <Word from="entréitseln" to="enträtseln" />
+    <Word from="Entschlrfen" to="Entschärfen" />
+    <Word from="Entschlull" to="Entschluss" />
+    <Word from="ENTSCHLUSSELN" to="ENTSCHLĂśSSELN" />
+    <Word from="Entschlussen" to="EntschlĂĽssen" />
+    <Word from="entschérfen" to="entschärfen" />
+    <Word from="enttausche" to="enttäusche" />
+    <Word from="enttiiuscht" to="enttäuscht" />
+    <Word from="Enttluscht" to="Enttäuscht" />
+    <Word from="Enttluschungen" to="Enttäuschungen" />
+    <Word from="enttéiuschen" to="enttäuschen" />
+    <Word from="enttéuschen" to="enttäuschen" />
+    <Word from="enttéuschst" to="enttäuschst" />
+    <Word from="enttéuscht" to="enttäuscht" />
+    <Word from="Entv\/Urfe" to="EntwĂĽrfe" />
+    <Word from="Entwicklungsléndern" to="Entwicklungsländern" />
+    <Word from="entzllickt" to="entzĂĽckt" />
+    <Word from="entzllindet" to="entzĂĽndet" />
+    <Word from="entzuckend" to="entzĂĽckend" />
+    <Word from="entzundet" to="entzĂĽndet" />
+    <Word from="enzvérmt" to="erwärmt" />
+    <Word from="Er6ffnen" to="Eröffnen" />
+    <Word from="erbérml/ch" to="erbärmlich" />
+    <Word from="erbérmlich" to="erbärmlich" />
+    <Word from="Erbérmliches" to="Erbärmliches" />
+    <Word from="Erdnijsse" to="ErdnĂĽsse" />
+    <Word from="erdriickt" to="erdrĂĽckt" />
+    <Word from="erdéihnliche" to="erdähnliche" />
+    <Word from="erfebst" to="erlebst" />
+    <Word from="erffillen" to="erfĂĽllen" />
+    <Word from="erfiffnet" to="eröffnet" />
+    <Word from="erfiille" to="erfĂĽlle" />
+    <Word from="erfiillen" to="erfĂĽllen" />
+    <Word from="erfiillt" to="erfĂĽllt" />
+    <Word from="erfijllt" to="erfĂĽllt" />
+    <Word from="erfillle" to="erfĂĽlle" />
+    <Word from="erfilllen" to="erfĂĽllen" />
+    <Word from="erfilllt" to="erfĂĽllt" />
+    <Word from="erfllille" to="erfĂĽlle" />
+    <Word from="erfllillt" to="erfĂĽllt" />
+    <Word from="erflllllen" to="erfĂĽllen" />
+    <Word from="Erfolgl" to="Erfolg!" />
+    <Word from="erfullen" to="erfĂĽllen" />
+    <Word from="erfullt" to="erfĂĽllt" />
+    <Word from="erféhrst" to="erfährst" />
+    <Word from="erféhrt" to="erfährt" />
+    <Word from="erfflllen" to="erfüllen" />
+    <Word from="ergrllindet" to="ergrĂĽndet" />
+    <Word from="erhalfen" to="erhalten" />
+    <Word from="Erhdhe" to="Erhöhe" />
+    <Word from="erhiihter" to="erhöhter" />
+    <Word from="erhiiren" to="erhören" />
+    <Word from="ERHKLT" to="ERHĂ„LT" />
+    <Word from="erhllt" to="erhält" />
+    <Word from="erhéhen" to="erhöhen" />
+    <Word from="erhéht" to="erhöht" />
+    <Word from="erhéilt" to="erhällt" />
+    <Word from="erhélt" to="erhält" />
+    <Word from="erhért" to="erhört" />
+    <Word from="erhérte" to="erhörte" />
+    <Word from="eriiffnet" to="eröffnet" />
+    <Word from="erja" to="er ja" />
+    <Word from="erjetzt" to="er jetzt" />
+    <Word from="erjung" to="er jung" />
+    <Word from="erkl'a'ren" to="erklären" />
+    <Word from="erkl'air's" to="erklär's" />
+    <Word from="erklaren" to="erklären" />
+    <Word from="erklfire" to="erkläre" />
+    <Word from="Erklfirung" to="Erklärung" />
+    <Word from="erklirt" to="erklärt" />
+    <Word from="erkllre" to="erkläre" />
+    <Word from="erkllrt" to="erklärt" />
+    <Word from="erkllrte" to="erklärte" />
+    <Word from="erkllrten" to="erklärten" />
+    <Word from="Erkllrung" to="Erklärung" />
+    <Word from="erkléir" to="erklär" />
+    <Word from="erkléire" to="erkläre" />
+    <Word from="erkléiren" to="erklären" />
+    <Word from="erklér" to="erklär" />
+    <Word from="erklér's" to="erklär's" />
+    <Word from="erklérbar" to="erklärbar" />
+    <Word from="Erklére" to="Erkläre" />
+    <Word from="erkléren" to="erklären" />
+    <Word from="erklért" to="erklärt" />
+    <Word from="Erklérung" to="Erklärung" />
+    <Word from="erkéltest" to="erkaltest" />
+    <Word from="erlC'&gt;st" to="erlöst" />
+    <Word from="erldse" to="erlöse" />
+    <Word from="Erled/gen" to="Erledigen" />
+    <Word from="erlieB" to="erlieĂź" />
+    <Word from="erlnnem" to="erinnern" />
+    <Word from="erléscht" to="erlöscht" />
+    <Word from="erlésen" to="erlösen" />
+    <Word from="erlést" to="erlöst" />
+    <Word from="Erlésung" to="Erlösung" />
+    <Word from="ermbglichen" to="ermöglichen" />
+    <Word from="Erméchtige" to="Ermächtige" />
+    <Word from="erméglicht" to="ermöglicht" />
+    <Word from="erméglichte" to="ermöglichte" />
+    <Word from="ernlllchtert" to="ernĂĽchtert" />
+    <Word from="ernéhren" to="ernähren" />
+    <Word from="Ernéhrung" to="Ernährung" />
+    <Word from="eroffnet" to="eröffnet" />
+    <Word from="Erpressungsscheilie" to="ErpressungsscheiĂźe" />
+    <Word from="errétst" to="errätst" />
+    <Word from="erschieB" to="erschieĂź" />
+    <Word from="erschieBen" to="erschieĂźen" />
+    <Word from="erschiefien" to="erschieĂźen" />
+    <Word from="erschiefit" to="erschieĂźt" />
+    <Word from="erschiefke" to="erschieĂźe" />
+    <Word from="erschielie" to="erschieĂźe" />
+    <Word from="Erschielit" to="ErschieĂźt" />
+    <Word from="erschiipft" to="erschöpft" />
+    <Word from="erschiittert" to="erschĂĽttert" />
+    <Word from="erschilttert" to="erschĂĽttert" />
+    <Word from="erschlégt" to="erschlägt" />
+    <Word from="ERTCHDNT" to="ERTĂ–NT" />
+    <Word from="ERTCNT" to="ERTĂ–NT" />
+    <Word from="ERTGNT" to="ERTĂ–NT" />
+    <Word from="ertiffnen" to="eröffnen" />
+    <Word from="ertrégst" to="erträgst" />
+    <Word from="ertréinken" to="ertränken" />
+    <Word from="ertént" to="ertönt" />
+    <Word from="ervvartez" to="erwartet" />
+    <Word from="ervvilrgen" to="erwĂĽrgen" />
+    <Word from="ervvéhnen" to="erwähnen" />
+    <Word from="ervvéihnen" to="erwähnen" />
+    <Word from="ervvéihnt" to="erwähnt" />
+    <Word from="ervvéihnte" to="erwähnte" />
+    <Word from="Erv\/an" to="Erwan" />
+    <Word from="Erv\/an's" to="Erwan's" />
+    <Word from="erw'a'hnt" to="erwähnt" />
+    <Word from="Erwar" to="Er war" />
+    <Word from="erwe/sen" to="erweisen" />
+    <Word from="Erwfirmung" to="Erwärmung" />
+    <Word from="Erwird" to="Er wird" />
+    <Word from="Erwtirde" to="Er wĂĽrde" />
+    <Word from="erwégt" to="erwägt" />
+    <Word from="Erwégung" to="Erwägung" />
+    <Word from="Erwéhne" to="Erwähne" />
+    <Word from="erwéhnen" to="erwähnen" />
+    <Word from="erwéhnt" to="erwähnt" />
+    <Word from="erwéhnte" to="erwähnte" />
+    <Word from="Erwéhnung" to="Erwähnung" />
+    <Word from="erwéihlt" to="erwählt" />
+    <Word from="erwéihnt" to="erwähnt" />
+    <Word from="erwérmt" to="erwärmt" />
+    <Word from="erz'a'hlt" to="erzählt" />
+    <Word from="Erzdiiizese" to="Erzdiözese" />
+    <Word from="erzfihlen" to="erzählen" />
+    <Word from="Erzfihler" to="Erzähler" />
+    <Word from="erzihlenl" to="erzählen!" />
+    <Word from="erziihlen" to="erzählen" />
+    <Word from="erziihlt" to="erzählt" />
+    <Word from="erziirnt" to="erzĂĽrnt" />
+    <Word from="erzilrnt" to="erzĂĽrnt" />
+    <Word from="erzllirnt" to="erzĂĽrnt" />
+    <Word from="erzurnen" to="erzĂĽrnen" />
+    <Word from="erzéhl" to="erzähl" />
+    <Word from="erzéhle" to="erzähle" />
+    <Word from="Erzéhlen" to="Erzählen" />
+    <Word from="erzéhlerische" to="erzählerische" />
+    <Word from="erzéhlerischen" to="erzählerischen" />
+    <Word from="erzéhlerischer" to="erzählerischer" />
+    <Word from="Erzéhlkunste" to="Erzählkünste" />
+    <Word from="erzéhlst" to="erzählst" />
+    <Word from="erzéhlt" to="erzählt" />
+    <Word from="erzéhlte" to="erzählte" />
+    <Word from="Erzéhlung" to="Erzählung" />
+    <Word from="Erzéihl" to="Erzähl" />
+    <Word from="Erzéihle" to="Erzähle" />
+    <Word from="erzéihlen" to="erzählen" />
+    <Word from="erzéihlst" to="erzählst" />
+    <Word from="erzéihlt" to="erzählt" />
+    <Word from="erzéihlte" to="erzählte" />
+    <Word from="eréffnen" to="eröffnen" />
+    <Word from="eréffnet" to="eröffnet" />
+    <Word from="eréffnete" to="eröffnete" />
+    <Word from="Eréffnungsaufnahme" to="Eröffnungsaufnahme" />
+    <Word from="Eréffnungssequenz" to="Eröffnungssequenz" />
+    <Word from="Eréffnungsszene" to="Eröffnungsszene" />
+    <Word from="Erfllllen" to="Erfüllen" />
+    <Word from="etemity" to="eternity" />
+    <Word from="etvva" to="etwa" />
+    <Word from="euc/1" to="euch" />
+    <Word from="Européer" to="Europäer" />
+    <Word from="européische" to="europäische" />
+    <Word from="ex'nfac'/7" to="einfach" />
+    <Word from="Examenspriifungen" to="ExamensprĂĽfungen" />
+    <Word from="Exekutivzusténoligkeit" to="Exekutivzuständigkeit" />
+    <Word from="Explosionenl" to="Explosionen!" />
+    <Word from="Extrablattl" to="Extrablatt!" />
+    <Word from="F/nden" to="Finden" />
+    <Word from="F/ugba/I" to="Flugball" />
+    <Word from="Fahnrich" to="Fähnrich" />
+    <Word from="fahrlissiges" to="fahrlässiges" />
+    <Word from="Fairbankverlieh" to="Fairbank verlieh" />
+    <Word from="Fallef" to="Falle!" />
+    <Word from="fallengelassen" to="fallen gelassen" />
+    <Word from="Fallschirmjégereinheiten" to="Fallschirmjägereinheiten" />
+    <Word from="Fam/Z/e" to="Familie" />
+    <Word from="FaĂź" to="Fass" />
+    <Word from="FBl" to="FBI" />
+    <Word from="Fe/nd" to="Feind" />
+    <Word from="fehlschlégt" to="fehlschlägt" />
+    <Word from="Feindberllihrung" to="FeindberĂĽhrung" />
+    <Word from="FeindĂĽbewvachung" to="FeindĂĽberwachung" />
+    <Word from="feltig" to="fertig" />
+    <Word from="femen" to="fernen" />
+    <Word from="fernhéilt" to="fernhält" />
+    <Word from="Festhaltenl" to="Festhalten!" />
+    <Word from="Fettwénste" to="Fettwänste" />
+    <Word from="Feuen/vehr" to="Feuerwehr" />
+    <Word from="Feuerliischer" to="Feuerlöscher" />
+    <Word from="Feuervvehrrnann" to="Feuerwehrrnann" />
+    <Word from="Feuerwehrl" to="Feuerwehr!" />
+    <Word from="Feuerwfirmen" to="Feuer wärmen" />
+    <Word from="Feuefl" to="Feuer!" />
+    <Word from="ff'Ul'1€f'€l'1" to="früheren" />
+    <Word from="Ffiegen" to="Fliegen" />
+    <Word from="ffihft" to="fĂĽhlt" />
+    <Word from="ffihren" to="fĂĽhren" />
+    <Word from="ffinf" to="fĂĽnf" />
+    <Word from="ffir" to="fĂĽr" />
+    <Word from="ffirchte" to="fĂĽrchte" />
+    <Word from="ffirs" to="fĂĽrs" />
+    <Word from="ffittere" to="fĂĽttere" />
+    <Word from="FI6he" to="Flöhe" />
+    <Word from="Fiasenméiher" to="Rasenmäher" />
+    <Word from="fibel" to="ĂĽbel" />
+    <Word from="fiber" to="ĂĽber" />
+    <Word from="fiberdressierter" to="ĂĽberdressierter" />
+    <Word from="fibergezogen" to="ĂĽbergezogen" />
+    <Word from="fiberhaupt" to="ĂĽberhaupt" />
+    <Word from="fiberholt" to="ĂĽberholt" />
+    <Word from="fiberlegt" to="ĂĽberlegt" />
+    <Word from="fibernachtet" to="ĂĽbernachtet" />
+    <Word from="fiberspannt" to="ĂĽberspannt" />
+    <Word from="fibertreiben" to="ĂĽbertreiben" />
+    <Word from="fiberzfichtete" to="ĂĽberzĂĽchtete" />
+    <Word from="fibrig" to="ĂĽbrig" />
+    <Word from="Fieferenz" to="Referenz" />
+    <Word from="Fieifi" to="ReiĂź" />
+    <Word from="fiffentlichkeit" to="Ă–ffentlichkeit" />
+    <Word from="fiffnen" to="öffnen" />
+    <Word from="fiffnest" to="öffnest" />
+    <Word from="fifter" to="öfter" />
+    <Word from="Fihigkeit" to="Fähigkeit" />
+    <Word from="fihneln" to="ähneln" />
+    <Word from="Fihrt" to="Fährt" />
+    <Word from="fiihl" to="fĂĽhl" />
+    <Word from="fiihle" to="fĂĽhle" />
+    <Word from="fiihlen" to="fĂĽhlen" />
+    <Word from="fiihlst" to="fĂĽhlst" />
+    <Word from="fiihlt" to="fĂĽhlt" />
+    <Word from="Fiihlte" to="FĂĽhlte" />
+    <Word from="Fiihre" to="FĂĽhre" />
+    <Word from="Fiihren" to="FĂĽhren" />
+    <Word from="Fiihrerin" to="FĂĽhrerin" />
+    <Word from="Fiihrerschein" to="FĂĽhrerschein" />
+    <Word from="fiihrfe" to="fĂĽhrte" />
+    <Word from="fiihrt" to="fĂĽhrt" />
+    <Word from="fiihrte" to="fĂĽhrte" />
+    <Word from="Fiihrungsféihigkeiten" to="Führungsfähigkeiten" />
+    <Word from="Fiihrungsprogramm" to="FĂĽhrungsprogramm" />
+    <Word from="Fiihrungsstil" to="FĂĽhrungsstil" />
+    <Word from="Fiilcksicht" to="RĂĽcksicht" />
+    <Word from="fiillen" to="fĂĽllen" />
+    <Word from="fiinden" to="fänden" />
+    <Word from="fiinf" to="fĂĽnf" />
+    <Word from="fiinfhundert" to="fĂĽnfhundert" />
+    <Word from="fiinfzehn" to="fĂĽnfzehn" />
+    <Word from="fiir" to="fĂĽr" />
+    <Word from="fiirchte" to="fĂĽrchte" />
+    <Word from="fiirchten" to="fĂĽrchten" />
+    <Word from="fiirchterlich" to="fĂĽrchterlich" />
+    <Word from="fiirchterlichl" to="fĂĽrchterlich!" />
+    <Word from="fiirchterllches" to="fĂĽrchterliches" />
+    <Word from="fiirchtet" to="fĂĽrchtet" />
+    <Word from="fiirchteten" to="fĂĽrchteten" />
+    <Word from="fiirjeden" to="fĂĽr jeden" />
+    <Word from="Fiirmchen" to="Förmchen" />
+    <Word from="fiirs" to="fĂĽrs" />
+    <Word from="Fijgen" to="FĂĽgen" />
+    <Word from="fijhl" to="fĂĽhl" />
+    <Word from="fijhle" to="fĂĽhle" />
+    <Word from="fijhlen" to="fĂĽhlen" />
+    <Word from="fijhlst" to="fĂĽhlst" />
+    <Word from="fijhlt" to="fĂĽhlt" />
+    <Word from="fijhren" to="fĂĽhren" />
+    <Word from="Fijhrer" to="FĂĽhrer" />
+    <Word from="fijhrt" to="fĂĽhrt" />
+    <Word from="Fijhrungsqualitéiten" to="Führungsqualitäten" />
+    <Word from="FiJl3en" to="FĂĽĂźen" />
+    <Word from="Fijlie" to="FĂĽĂźe" />
+    <Word from="fijlr" to="fĂĽr" />
+    <Word from="Fijnf" to="FĂĽnf" />
+    <Word from="Fijnfziger" to="FĂĽnfziger" />
+    <Word from="fijr" to="fĂĽr" />
+    <Word from="fijrchte" to="fĂĽrchte" />
+    <Word from="fijrchten" to="fĂĽrchten" />
+    <Word from="Fijrjedenl" to="FĂĽr jeden!" />
+    <Word from="fijrs" to="fĂĽrs" />
+    <Word from="fiJrVorteile" to="fĂĽr Vorteile" />
+    <Word from="fijttern" to="fĂĽttern" />
+    <Word from="fijur" to="fĂĽr" />
+    <Word from="filhl" to="fĂĽhl" />
+    <Word from="filhle" to="fĂĽhle" />
+    <Word from="filhlen" to="fĂĽhlen" />
+    <Word from="filhlte" to="fĂĽhlte" />
+    <Word from="filhre" to="fĂĽhre" />
+    <Word from="filhren" to="fĂĽhren" />
+    <Word from="Filhrern" to="FĂĽhrern" />
+    <Word from="Filhrerschein" to="FĂĽhrerschein" />
+    <Word from="filhrst" to="fĂĽhrst" />
+    <Word from="filhrt" to="fĂĽhrt" />
+    <Word from="filhrte" to="fĂĽhrte" />
+    <Word from="filhrten" to="fĂĽhrten" />
+    <Word from="Filhrung" to="FĂĽhrung" />
+    <Word from="Fillle" to="FĂĽlle" />
+    <Word from="Fillléen" to="Füßen" />
+    <Word from="Filmemachen" to="Filme machen" />
+    <Word from="Filml" to="Film!" />
+    <Word from="filnf" to="fĂĽnf" />
+    <Word from="Filnfl" to="Fünf!" />
+    <Word from="Filr" to="FĂĽr" />
+    <Word from="filr'ne" to="fĂĽr'ne" />
+    <Word from="filrchten" to="fĂĽrchten" />
+    <Word from="filrchterlich" to="fĂĽrchterlich" />
+    <Word from="filrs" to="fĂĽrs" />
+    <Word from="filter" to="älter" />
+    <Word from="findem" to="ändern" />
+    <Word from="findenlassen" to="finden lassen" />
+    <Word from="Fingerabdrijcke" to="FingerabdrĂĽcke" />
+    <Word from="Fingerabdrilcke" to="FingerabdrĂĽcke" />
+    <Word from="Fingerniigeln" to="Fingernägeln" />
+    <Word from="Fingernégel" to="Fingernägel" />
+    <Word from="Fingernégeln" to="Fingernägeln" />
+    <Word from="fingstlich" to="ängstlich" />
+    <Word from="Fiothaarige" to="Rothaarige" />
+    <Word from="Firmenérzte" to="Firmenärzte" />
+    <Word from="Fischképfe" to="Fischköpfe" />
+    <Word from="FIUssigkeitsgleichgewicht" to="FlĂĽssigkeitsgleichgewicht" />
+    <Word from="Fiusten" to="Fäusten" />
+    <Word from="FIynn" to="Flynn" />
+    <Word from="fjffnen" to="öffnen" />
+    <Word from="fL'1'r" to="fĂĽr" />
+    <Word from="fL'1hle" to="fĂĽhle" />
+    <Word from="FL'1r" to="FĂĽr" />
+    <Word from="fL'ir" to="fĂĽr" />
+    <Word from="fL'lr" to="fĂĽr" />
+    <Word from="fL1r" to="fĂĽr" />
+    <Word from="Fl6he" to="Flöhe" />
+    <Word from="Flclse" to="Rose" />
+    <Word from="fleifkige" to="fleiĂźige" />
+    <Word from="fleifkiges" to="fleiĂźiges" />
+    <Word from="fleil3ig" to="fleiĂźig" />
+    <Word from="Fleischbéllchen" to="Fleischbällchen" />
+    <Word from="Fleischkl6l'Sen" to="Fleischklößen" />
+    <Word from="Flfige" to="FlĂĽge" />
+    <Word from="Flfigell" to="FlĂĽgel!" />
+    <Word from="flfistert" to="flĂĽstert" />
+    <Word from="Flhigkeiten" to="Fähigkeiten" />
+    <Word from="Flhnrich" to="Fähnrich" />
+    <Word from="Flhnriche" to="Fähnriche" />
+    <Word from="flieBen" to="flieĂźen" />
+    <Word from="Fliefiband" to="FlieĂźband" />
+    <Word from="Fliefiheck" to="FlieĂźheck" />
+    <Word from="Flieflsbénder" to="Fließbänder" />
+    <Word from="flielit" to="flieĂźt" />
+    <Word from="flielSt" to="flieĂźt" />
+    <Word from="FLif$e" to="FĂĽĂźe" />
+    <Word from="fLihlt" to="fĂĽhlt" />
+    <Word from="fliichtige" to="flĂĽchtige" />
+    <Word from="Fliigel" to="FlĂĽgel" />
+    <Word from="flijchtig" to="flĂĽchtig" />
+    <Word from="Flijgel" to="FlĂĽgel" />
+    <Word from="Flijgelfedernl" to="FlĂĽgelfedern!" />
+    <Word from="Flilssige" to="FlĂĽssige" />
+    <Word from="flilstert" to="flĂĽstert" />
+    <Word from="fLir" to="fĂĽr" />
+    <Word from="fljhrt" to="fĂĽhrt" />
+    <Word from="Fljr" to="FĂĽr" />
+    <Word from="flJr'n" to="fĂĽr'n" />
+    <Word from="fllihrst" to="fĂĽhrst" />
+    <Word from="Fllihrt" to="FĂĽhrt" />
+    <Word from="fllinf" to="fĂĽnf" />
+    <Word from="fllinften" to="fĂĽnften" />
+    <Word from="Fllinkchen" to="FĂĽnkchen" />
+    <Word from="Fllir" to="FĂĽr" />
+    <Word from="fllirchte" to="fĂĽrchte" />
+    <Word from="fllirchten" to="fĂĽrchten" />
+    <Word from="fllirchterlichen" to="fĂĽrchterlichen" />
+    <Word from="fllirchtet" to="fĂĽrchtet" />
+    <Word from="Fllirsten" to="FĂĽrsten" />
+    <Word from="Fllitterungszeitenl" to="FĂĽtterungszeiten!" />
+    <Word from="flllgte" to="fĂĽgte" />
+    <Word from="flllgten" to="fĂĽgten" />
+    <Word from="flllhrten" to="flĂĽhrten" />
+    <Word from="Flllhrung" to="FĂĽhrung" />
+    <Word from="Fllligel" to="FlĂĽgel" />
+    <Word from="flllistern" to="flĂĽstern" />
+    <Word from="fllllstert" to="flĂĽstert" />
+    <Word from="flllrchte" to="fĂĽrchte" />
+    <Word from="flllrchten" to="fĂĽrchten" />
+    <Word from="flllrjede" to="fĂĽr jede" />
+    <Word from="Flohtransporterl" to="Flohtransporter!" />
+    <Word from="Floli" to="FloĂź" />
+    <Word from="Flottenalzt" to="Flottenarzt" />
+    <Word from="Flottenstiitzpunkt" to="FlottenstĂĽtzpunkt" />
+    <Word from="Flottenstutzpunkt" to="FlottenstĂĽtzpunkt" />
+    <Word from="Flrma" to="Firma" />
+    <Word from="fltlsterte" to="flĂĽsterte" />
+    <Word from="Fluchtig" to="FlĂĽchtig" />
+    <Word from="Flughdhe" to="Flughöhe" />
+    <Word from="Flughiihe" to="Flughöhe" />
+    <Word from="Flughéifen" to="Flughäfen" />
+    <Word from="Flugunféihig" to="Flugunfähig" />
+    <Word from="flugunféihigen" to="flugunfähigen" />
+    <Word from="Flugunféihigl" to="Flugunfähig!" />
+    <Word from="Flugzeugl" to="Flugzeug!" />
+    <Word from="FLUSSIGER" to="FLĂśSSIGER" />
+    <Word from="Flustereffekt" to="FlĂĽstereffekt" />
+    <Word from="Flustern" to="FlĂĽstern" />
+    <Word from="FLUSTERT" to="FLĂśSTERT" />
+    <Word from="flflstern" to="flüstern" />
+    <Word from="flflsterten" to="flüsterten" />
+    <Word from="Folgendesz" to="Folgendes:" />
+    <Word from="fortgespiilt" to="fortgespĂĽlt" />
+    <Word from="fortspiilen" to="fortspĂĽlen" />
+    <Word from="fortwéhrend" to="fortwährend" />
+    <Word from="Fr/ed/10/" to="Friedhof" />
+    <Word from="Fr5ulein" to="Fräulein" />
+    <Word from="Fr6hliche" to="Fröhliche" />
+    <Word from="Frachfmodule" to="Frachtmodule" />
+    <Word from="Frafi" to="FraĂź" />
+    <Word from="fragfe" to="fragte" />
+    <Word from="Fral'S" to="FraĂź" />
+    <Word from="fralken" to="fraĂźen" />
+    <Word from="Franzfisisch" to="Französisch" />
+    <Word from="Franziisin" to="Französin" />
+    <Word from="franziisische" to="französische" />
+    <Word from="franziisischen" to="französischen" />
+    <Word from="franziisischer" to="französischer" />
+    <Word from="franziisisches" to="französisches" />
+    <Word from="Franzésisch" to="Französisch" />
+    <Word from="franzésische" to="französische" />
+    <Word from="franzésischen" to="französischen" />
+    <Word from="franzésischer" to="französischer" />
+    <Word from="Franzésisches" to="Französisches" />
+    <Word from="FRAULEIN" to="FRĂ„ULEIN" />
+    <Word from="fre/em" to="freiem" />
+    <Word from="freffen" to="treffen" />
+    <Word from="freilieB" to="freilieĂź" />
+    <Word from="freimiitigen" to="freimĂĽtigen" />
+    <Word from="Fressgeréusche" to="Fressgeräusche" />
+    <Word from="Frfichtekuchen" to="FrĂĽchtekuchen" />
+    <Word from="frfih" to="frĂĽh" />
+    <Word from="frfiher" to="frĂĽher" />
+    <Word from="Friedhéfe" to="Friedhöfe" />
+    <Word from="Friichtchen" to="FrĂĽchtchen" />
+    <Word from="friih" to="frĂĽh" />
+    <Word from="friihen" to="frĂĽhen" />
+    <Word from="friiher" to="frĂĽher" />
+    <Word from="friihere" to="frĂĽhere" />
+    <Word from="friihliche" to="fröhliche" />
+    <Word from="friihlichen" to="fröhlichen" />
+    <Word from="Friihstiick" to="FrĂĽhstĂĽck" />
+    <Word from="friilher" to="frĂĽher" />
+    <Word from="friilhesten" to="frĂĽhesten" />
+    <Word from="Frijchte" to="FrĂĽchte" />
+    <Word from="frijh" to="frĂĽh" />
+    <Word from="frijher" to="frĂĽher" />
+    <Word from="frijherer" to="friĂĽherer" />
+    <Word from="frilh" to="frĂĽh" />
+    <Word from="frilhen" to="frĂĽhen" />
+    <Word from="Frilher" to="FrĂĽher" />
+    <Word from="frilhere" to="frĂĽhere" />
+    <Word from="Frilhstflck" to="Frühstück" />
+    <Word from="Fris6r" to="Frisör" />
+    <Word from="frL'lher" to="frĂĽher" />
+    <Word from="Frljihling" to="FrĂĽhling" />
+    <Word from="Frllichte" to="FrĂĽchte" />
+    <Word from="frllih" to="frĂĽh" />
+    <Word from="frlliher" to="frĂĽher" />
+    <Word from="Frllihstiickskiiche" to="FrĂĽhstĂĽckskĂĽche" />
+    <Word from="fro/1" to="froh" />
+    <Word from="FROHLICHE" to="FRĂ–HLICHE" />
+    <Word from="frtih" to="frĂĽh" />
+    <Word from="Frtiher" to="FrĂĽher" />
+    <Word from="Frtihliche" to="Fröhliche" />
+    <Word from="Frtihstticksei" to="FrĂĽhstĂĽcksei" />
+    <Word from="Frtlh" to="FrĂĽh" />
+    <Word from="FrUh" to="FrĂĽh" />
+    <Word from="FRUHE" to="FRĂśHE" />
+    <Word from="fruhe" to="frĂĽhe" />
+    <Word from="fruhen" to="frĂĽhen" />
+    <Word from="Fruher" to="FrĂĽher" />
+    <Word from="fruheren" to="frĂĽheren" />
+    <Word from="Fruhling" to="FrĂĽhling" />
+    <Word from="Fruhlingsrolle" to="FrĂĽhlingsrolle" />
+    <Word from="FrUhstUck" to="FrĂĽhstuck" />
+    <Word from="Fruhstuck" to="FrĂĽhstĂĽck" />
+    <Word from="frUhstUcken" to="frĂĽhstĂĽcken" />
+    <Word from="fréhliches" to="fröhliches" />
+    <Word from="fréihfiches" to="fröhliches" />
+    <Word from="fréihlich" to="fröhlich" />
+    <Word from="Fréiulein" to="Fräulein" />
+    <Word from="frénen" to="frönen" />
+    <Word from="Frésche" to="Frösche" />
+    <Word from="Fréulein" to="Fräulein" />
+    <Word from="ftihlen" to="fĂĽhlen" />
+    <Word from="Ftillhorn" to="FĂĽllhorn" />
+    <Word from="Ftir" to="FĂĽr" />
+    <Word from="Ftirs" to="FĂĽrs" />
+    <Word from="Ftlhrung" to="FĂĽhrung" />
+    <Word from="ftlrchte" to="fĂĽrchte" />
+    <Word from="ftmf" to="fĂĽnf" />
+    <Word from="Fu/3" to="FuĂź" />
+    <Word from="FuB" to="FuĂź" />
+    <Word from="FuBballspieler" to="FuĂźballspieler" />
+    <Word from="FUBen" to="FĂĽĂźen" />
+    <Word from="Fuf$" to="FuĂź" />
+    <Word from="Fufi" to="FuĂź" />
+    <Word from="Fufiabdrucke" to="FuĂźabdrĂĽcke" />
+    <Word from="Fufiballtraining" to="FuĂźballtraining" />
+    <Word from="FufL" to="FuĂź" />
+    <Word from="Fuflsball" to="FuĂźball" />
+    <Word from="Fuflsballszene" to="FuĂźballszene" />
+    <Word from="fUhl't" to="fĂĽhrt" />
+    <Word from="fuhle" to="fĂĽhle" />
+    <Word from="fuhlst" to="fĂĽhlst" />
+    <Word from="fUhlt" to="fĂĽhlt" />
+    <Word from="fUhre" to="fĂĽhre" />
+    <Word from="fUhrt" to="fĂĽhrt" />
+    <Word from="fuhrte" to="fĂĽhrte" />
+    <Word from="fuhrten" to="fĂĽhrten" />
+    <Word from="Fuhrung" to="FĂĽhrung" />
+    <Word from="Fuhrungsféhigkeiten" to="Führungsfähigkeiten" />
+    <Word from="Fuhrungsoffizier" to="FĂĽhrungsoffizier" />
+    <Word from="Fuhrungsqualitét" to="Führungsqualität" />
+    <Word from="FUI3en" to="FĂĽĂźen" />
+    <Word from="Fuli" to="FuĂź" />
+    <Word from="Fuliball" to="FuĂźball" />
+    <Word from="Fulisohlen" to="FuĂźsohlen" />
+    <Word from="FUller" to="FĂĽller" />
+    <Word from="fUllten" to="fĂĽllten" />
+    <Word from="fumt" to="fĂĽhlt" />
+    <Word from="Fundbiiro" to="FundbĂĽro" />
+    <Word from="FUnf" to="FĂĽnf" />
+    <Word from="Funftbeste" to="FĂĽnftbeste" />
+    <Word from="Funkchen" to="FĂĽnkchen" />
+    <Word from="Funkgeréit" to="Funkgerät" />
+    <Word from="Funkgeréite" to="Funkgeräte" />
+    <Word from="Funkgerét" to="Funkgerät" />
+    <Word from="funktionstilchtig" to="funktionstĂĽchtig" />
+    <Word from="FUR" to="FĂśR" />
+    <Word from="Fur" to="FĂĽr" />
+    <Word from="fUrAusweichmanc'§ver" to="für Ausweichmanöver" />
+    <Word from="furchteinfl6Bend" to="furchteinflößend" />
+    <Word from="furchteinfl6Bende" to="furchteinflößende" />
+    <Word from="furchten" to="fĂĽrchten" />
+    <Word from="Furchtest" to="FĂĽrchtest" />
+    <Word from="furchtet" to="fĂĽrchtet" />
+    <Word from="furchteten" to="fĂĽrchteten" />
+    <Word from="fureinander" to="fĂĽreinander" />
+    <Word from="furjeden" to="fĂĽr jeden" />
+    <Word from="furjemanden" to="fĂĽr jemanden" />
+    <Word from="furjudische" to="fur jĂĽdische" />
+    <Word from="furs" to="fĂĽrs" />
+    <Word from="FUrWalter" to="FĂĽr Walter" />
+    <Word from="fut" to="tut" />
+    <Word from="Fuflballspiel" to="Fußballspiel" />
+    <Word from="F§hnlein" to="Fähnlein" />
+    <Word from="fé//t" to="fällt" />
+    <Word from="féhig" to="fähig" />
+    <Word from="Féhigkeit" to="Fähigkeit" />
+    <Word from="Féhigkeiten" to="Fähigkeiten" />
+    <Word from="féhnen" to="föhnen" />
+    <Word from="Féhnens" to="Föhnens" />
+    <Word from="Féhnerei" to="Föhnerei" />
+    <Word from="Féhnleinmiitter" to="Fähnleinmütter" />
+    <Word from="Féhre" to="Fähre" />
+    <Word from="féhrst" to="fährst" />
+    <Word from="féhrt" to="fährt" />
+    <Word from="Féihigkeit" to="Fähigkeit" />
+    <Word from="Féihigkeiten" to="Fähigkeiten" />
+    <Word from="féihrt" to="fährt" />
+    <Word from="féillst" to="fällst" />
+    <Word from="féillt" to="fällt" />
+    <Word from="Féilschung" to="Fälschung" />
+    <Word from="Féingt" to="Fängt" />
+    <Word from="féir" to="für" />
+    <Word from="Félle" to="Fälle" />
+    <Word from="Féllen" to="Fällen" />
+    <Word from="félligl" to="fällig" />
+    <Word from="Féllt" to="Fällt" />
+    <Word from="féllt's" to="fällt's" />
+    <Word from="Félschen" to="Fälschen" />
+    <Word from="Félschung" to="Fälschung" />
+    <Word from="fénde" to="fände" />
+    <Word from="Féngst" to="Fängst" />
+    <Word from="Féngt" to="Fängt" />
+    <Word from="férben" to="färben" />
+    <Word from="férbt" to="färbt" />
+    <Word from="férdern" to="fördern" />
+    <Word from="férmlich" to="förmlich" />
+    <Word from="Féustlinge" to="Fäustlinge" />
+    <Word from="fĂĽr'ne" to="fĂĽr 'ne" />
+    <Word from="fĂĽrchlerlichen" to="fĂĽrchterlichen" />
+    <Word from="fĂĽrjede" to="fĂĽr jede" />
+    <Word from="fĂĽrjeden" to="fĂĽr jeden" />
+    <Word from="Fflhrungsprogramm" to="Führungsprogramm" />
+    <Word from="Fflhrungsstil" to="Führungsstil" />
+    <Word from="fflllen" to="füllen" />
+    <Word from="fflllt" to="fällt" />
+    <Word from="fflnf" to="fünf" />
+    <Word from="Fflr" to="Für" />
+    <Word from="fflrchte" to="fürchte" />
+    <Word from="fflrjeden" to="für jeden" />
+    <Word from="g/bf" to="gibt" />
+    <Word from="g/bsf" to="gibst" />
+    <Word from="G5ste" to="Gäste" />
+    <Word from="G6nn" to="Gönn" />
+    <Word from="G6t'lllche" to="Göttliche" />
+    <Word from="G6tter" to="Götter" />
+    <Word from="G6ttern" to="Göttern" />
+    <Word from="Gamilonl" to="Gamilon!" />
+    <Word from="ganzlich" to="gänzlich" />
+    <Word from="gardel" to="garde!" />
+    <Word from="Gasbrfiter" to="Gasbräter" />
+    <Word from="gauze" to="ganze" />
+    <Word from="GCJKTEN" to="GĂ–KTEN" />
+    <Word from="ge6lt" to="geölt" />
+    <Word from="gebauf" to="gebaut" />
+    <Word from="Gebiez" to="Gebiet" />
+    <Word from="Gebiéude" to="Gebäude" />
+    <Word from="gebliebenl" to="geblieben!" />
+    <Word from="GEBRAUCHTWAGENIPOLIZEIITAXI" to="GEBRAUCHTWAGEN/POLIZEI/TAXI" />
+    <Word from="Gebréu" to="Gebräu" />
+    <Word from="gebs" to="geb's" />
+    <Word from="gebuhrend" to="gebĂĽhrend" />
+    <Word from="Gebéick" to="Gebäck" />
+    <Word from="Gebéiude" to="Gebäude" />
+    <Word from="gebérdet" to="gebärdet" />
+    <Word from="Gebérmutter" to="Gebärmutter" />
+    <Word from="Gebérmutterhals" to="Gebärmutterhals" />
+    <Word from="Gebéude" to="Gebäude" />
+    <Word from="Gebéudedach" to="Gebäudedach" />
+    <Word from="Gebéuden" to="Gebäuden" />
+    <Word from="Gebéudes" to="Gebäudes" />
+    <Word from="gedemiitigt" to="gedemĂĽtigt" />
+    <Word from="gedemijtigt" to="gedemĂĽtigt" />
+    <Word from="gedemllitigt" to="gedemĂĽtigt" />
+    <Word from="gedrtickt" to="gedrĂĽckt" />
+    <Word from="gedréngt" to="gedrängt" />
+    <Word from="Gedéchtnisverlustes" to="Gedächtnisverlustes" />
+    <Word from="Gedéichtnis" to="Gedächtnis" />
+    <Word from="gedémpft" to="gedämpft" />
+    <Word from="gef'a'hrlich" to="gefährlich" />
+    <Word from="gef'a'llt" to="gefällt" />
+    <Word from="gef5IIt" to="gefällt" />
+    <Word from="gefahrdet" to="gefährdet" />
+    <Word from="gefahrlich" to="gefährlich" />
+    <Word from="gefallsllichtige" to="gefallsĂĽchtige" />
+    <Word from="GEFANGNISTECHNOLOGIE" to="GEFĂ„NGNISTECHNOLOGIE" />
+    <Word from="Gefechtsausrustung" to="GefechtsausrĂĽstung" />
+    <Word from="Geffihl" to="GefĂĽhl" />
+    <Word from="geffihrt" to="gefĂĽhrt" />
+    <Word from="geffillt" to="gefällt" />
+    <Word from="Gefihrliche" to="Gefärliche" />
+    <Word from="Gefiihl" to="GefĂĽhl" />
+    <Word from="Gefiihle" to="GefĂĽhle" />
+    <Word from="Gefiihlen" to="GefĂĽhlen" />
+    <Word from="Gefiihlslebens" to="GefĂĽhlslebens" />
+    <Word from="gefiihlsmiliigen" to="gefühlsmäßigen" />
+    <Word from="gefiihrt" to="gefĂĽhrt" />
+    <Word from="gefiillst" to="gefällst" />
+    <Word from="gefiillt" to="gefĂĽllt" />
+    <Word from="gefiirchtet" to="gefĂĽrchtet" />
+    <Word from="Gefijhl" to="GefĂĽhl" />
+    <Word from="Gefijhle" to="GefĂĽhle" />
+    <Word from="gefijhlt" to="gefĂĽhlt" />
+    <Word from="gefijllte" to="gefĂĽllte" />
+    <Word from="Gefilhl" to="GefĂĽhl" />
+    <Word from="Gefilhle" to="GefĂĽhle" />
+    <Word from="gefillt" to="gefällt" />
+    <Word from="Gefingnis" to="Gefängnis" />
+    <Word from="gefL'lllten" to="gefĂĽllten" />
+    <Word from="Geflilster" to="GeflĂĽster" />
+    <Word from="gefllihllos" to="gefĂĽhllos" />
+    <Word from="Geflllhlsduselige" to="GefĂĽhlsduselige" />
+    <Word from="GEFLUSTERT" to="GEFLĂśSTERT" />
+    <Word from="Geftuhle" to="GefĂĽhle" />
+    <Word from="Gefuhl" to="GefĂĽhl" />
+    <Word from="Gefuhle" to="GefĂĽhle" />
+    <Word from="Gefuhlen" to="GefĂĽhlen" />
+    <Word from="gefuhlt" to="gefĂĽhlt" />
+    <Word from="gefuhlvolle" to="gefĂĽhlvolle" />
+    <Word from="gefurchtet" to="gefĂĽrchtet" />
+    <Word from="Geféhrde" to="Gefährde" />
+    <Word from="geféhrden" to="gefährden" />
+    <Word from="geféhrdet" to="gefährdet" />
+    <Word from="Geféhrdung" to="Gefährdung" />
+    <Word from="geféhrlich" to="gefährlich" />
+    <Word from="geféhrliche" to="gefährliche" />
+    <Word from="geféhrlicher" to="gefährlicher" />
+    <Word from="geféhrlicheren" to="gefährlicheren" />
+    <Word from="Geféhrliches" to="Gefährliches" />
+    <Word from="Geféhrt" to="Gefährt" />
+    <Word from="geféihrden" to="gefährden" />
+    <Word from="geféihrdet" to="gefährdet" />
+    <Word from="geféihrlich" to="gefährlich" />
+    <Word from="Geféihrte" to="Gefährte" />
+    <Word from="Geféihrten" to="Gefährten" />
+    <Word from="geféillt" to="gefällt" />
+    <Word from="Geféillt's" to="Gefällt's" />
+    <Word from="geféllf" to="gefällt" />
+    <Word from="geféllfs" to="gefällt's" />
+    <Word from="geféllig" to="gefällig" />
+    <Word from="gefélligst" to="gefälligst" />
+    <Word from="geféllst" to="gefällst" />
+    <Word from="Geféllt" to="Gefällt" />
+    <Word from="Geféllt's" to="Gefällt's" />
+    <Word from="gefélscht" to="gefälscht" />
+    <Word from="Geféngnis" to="Gefängnis" />
+    <Word from="Geféngnisregeln" to="Gefängnisregeln" />
+    <Word from="Geféngnisse" to="Gefängnisse" />
+    <Word from="Geféngnissen" to="Gefängnissen" />
+    <Word from="Geféngnisses" to="Gefängnisses" />
+    <Word from="Geféngniswagen" to="Gefängniswagen" />
+    <Word from="gefflgig" to="gefügig" />
+    <Word from="gegenfiber" to="gegenĂĽber" />
+    <Word from="gegeniiber" to="gegenĂĽber" />
+    <Word from="gegeniibertritt" to="gegenĂĽbertritt" />
+    <Word from="gegeniiberzusfehen" to="gegenĂĽberzustehen" />
+    <Word from="gegenijber" to="gegenĂĽber" />
+    <Word from="gegenlliber" to="gegenĂĽber" />
+    <Word from="gegenlliberstehen" to="gegenĂĽberstehen" />
+    <Word from="Gegenstrfimung" to="Gegenströmung" />
+    <Word from="Gegenstrémung" to="Gegenströmung" />
+    <Word from="Gegensttlck" to="GegenstĂĽck" />
+    <Word from="Gegensténde" to="Gegenstände" />
+    <Word from="gegenuber" to="gegenĂĽber" />
+    <Word from="Gegenverschwiirung" to="Gegenverschwörung" />
+    <Word from="gegenwértigen" to="gegenwärtigen" />
+    <Word from="gegriindet" to="gegrĂĽndet" />
+    <Word from="gegrijfit" to="gegrĂĽĂźt" />
+    <Word from="gegrilfit" to="gegrĂĽĂźt" />
+    <Word from="GegrUl3t" to="GegrĂĽĂźt" />
+    <Word from="gegrundet" to="gegrĂĽndet" />
+    <Word from="geh6ren" to="gehören" />
+    <Word from="geh6rt" to="gehört" />
+    <Word from="gehdrt" to="gehört" />
+    <Word from="GeheilS" to="GeheiĂź" />
+    <Word from="geheilSen" to="geheiĂźen" />
+    <Word from="gehejetzt" to="gehe jetzt" />
+    <Word from="gehf" to="geht" />
+    <Word from="gehfiirt" to="gehört" />
+    <Word from="gehfire" to="gehöre" />
+    <Word from="gehfiren" to="gehören" />
+    <Word from="gehfirt" to="gehört" />
+    <Word from="gehiipft" to="gehĂĽpft" />
+    <Word from="Gehiir" to="Gehör" />
+    <Word from="gehiire" to="gehöre" />
+    <Word from="gehiiren" to="gehören" />
+    <Word from="gehiirst" to="gehörst" />
+    <Word from="gehiirt" to="gehört" />
+    <Word from="Gehim" to="Gehirn" />
+    <Word from="Gehirnschéden" to="Gehirnschäden" />
+    <Word from="gehlngt" to="gehängt" />
+    <Word from="gehore" to="gehöre" />
+    <Word from="gehoren" to="gehören" />
+    <Word from="gehort" to="gehört" />
+    <Word from="geht'sl" to="geht's!" />
+    <Word from="Gehtirt" to="Gehört" />
+    <Word from="gehtjetzt" to="geht jetzt" />
+    <Word from="gehéirt" to="gehört" />
+    <Word from="Gehéiuteten" to="Gehäuteten" />
+    <Word from="gehér" to="gehör" />
+    <Word from="gehére" to="gehöre" />
+    <Word from="gehéren" to="gehören" />
+    <Word from="gehérst" to="gehörst" />
+    <Word from="Gehért" to="Gehört" />
+    <Word from="gehérten" to="gehörten" />
+    <Word from="gehértf" to="gehört!" />
+    <Word from="geiiffnet" to="geöffnet" />
+    <Word from="geilbt" to="geĂĽbt" />
+    <Word from="geistesgestort" to="geistesgestört" />
+    <Word from="Geiflblatt" to="Geißblatt" />
+    <Word from="Geiflblattstaude" to="Geißblattstaude" />
+    <Word from="gekiisst" to="gekĂĽsst" />
+    <Word from="gekiisstl" to="gekĂĽsst!" />
+    <Word from="gekijndigt" to="gekĂĽndigt" />
+    <Word from="gekijsst" to="gekĂĽsst" />
+    <Word from="gekilsst" to="gekĂĽsst" />
+    <Word from="gekimpfl" to="gekämpft" />
+    <Word from="gekimpft" to="gekämpft" />
+    <Word from="geklautl" to="geklaut!" />
+    <Word from="gekliirt" to="geklärt" />
+    <Word from="gekllrt" to="geklärt" />
+    <Word from="geklért" to="geklärt" />
+    <Word from="gekriint" to="gekrönt" />
+    <Word from="gekrijmmt" to="gekrĂĽmmt" />
+    <Word from="GEKUHLTER" to="GEKĂśHLTER" />
+    <Word from="gekurzt" to="gekĂĽrzt" />
+    <Word from="gekémpft" to="gekämpft" />
+    <Word from="gelaufenl" to="gelaufen!" />
+    <Word from="gelegf" to="gelegt" />
+    <Word from="gelegtwurde" to="gelegt wurde" />
+    <Word from="geliist" to="gelöst" />
+    <Word from="gelilftet" to="gelĂĽftet" />
+    <Word from="gelndert" to="geändert" />
+    <Word from="Gelst" to="Geist" />
+    <Word from="Geltungsbedurfnis" to="GeltungsbedĂĽrfnis" />
+    <Word from="GELUBDE" to="GELĂśBDE" />
+    <Word from="Geléchter" to="Gelächter" />
+    <Word from="geléhmt" to="gelähmt" />
+    <Word from="geléischt" to="gelöscht" />
+    <Word from="Gelénde" to="Gelände" />
+    <Word from="gelénge" to="gelänge" />
+    <Word from="gelést" to="gelöst" />
+    <Word from="gem" to="gern" />
+    <Word from="gemafiregelt" to="gemaĂźregelt" />
+    <Word from="Geme" to="Gerne" />
+    <Word from="gemfitliches" to="gemĂĽtliches" />
+    <Word from="Gemiise" to="GemĂĽse" />
+    <Word from="gemiitlich" to="gemĂĽtlich" />
+    <Word from="Gemijlse" to="GemĂĽse" />
+    <Word from="Gemilt" to="GemĂĽt" />
+    <Word from="gemiltlicher" to="gemĂĽtlicher" />
+    <Word from="GemLise" to="GemĂĽse" />
+    <Word from="Gemut" to="GemĂĽt" />
+    <Word from="geméfi" to="gemäß" />
+    <Word from="Geméfk" to="Gemäß" />
+    <Word from="geméht" to="gemäht" />
+    <Word from="Geméili" to="Gemäß" />
+    <Word from="Gemélde" to="Gemälde" />
+    <Word from="Gemélden" to="Gemälden" />
+    <Word from="Genaul" to="Genau!" />
+    <Word from="genieBt" to="genieĂźt" />
+    <Word from="genief$en" to="genieĂźen" />
+    <Word from="Geniefien" to="GenieĂźen" />
+    <Word from="geniefk" to="genieĂź" />
+    <Word from="genielien" to="genieĂźen" />
+    <Word from="genielken" to="genieĂźen" />
+    <Word from="genieflen" to="genießen" />
+    <Word from="genligen" to="genĂĽgen" />
+    <Word from="genlligend" to="genĂĽgend" />
+    <Word from="genlligt" to="genĂĽgt" />
+    <Word from="genlllgend" to="genĂĽgend" />
+    <Word from="genugt" to="genĂĽgt" />
+    <Word from="genugte" to="genĂĽgte" />
+    <Word from="georfef" to="geortet" />
+    <Word from="gepfluckt" to="gepflĂĽckt" />
+    <Word from="gepriifter" to="geprĂĽfter" />
+    <Word from="gepruft" to="geprĂĽft" />
+    <Word from="Gepéck" to="Gepäck" />
+    <Word from="gerfit" to="gerät" />
+    <Word from="Geriichte" to="GerĂĽchte" />
+    <Word from="Geriite" to="Geräte" />
+    <Word from="Gerijcht" to="GerĂĽcht" />
+    <Word from="Gerllicht" to="GerĂĽcht" />
+    <Word from="gerllistet" to="gerĂĽstet" />
+    <Word from="gernhaben" to="gern haben" />
+    <Word from="gernhaben" to="gern-haben" />
+    <Word from="gernntgt" to="geröntgt" />
+    <Word from="geréit" to="gerät" />
+    <Word from="Geréiusch" to="Geräusch" />
+    <Word from="Gerét" to="Gerät" />
+    <Word from="Geréte" to="Geräte" />
+    <Word from="Gerétschaften" to="Gerätschaften" />
+    <Word from="geréumt" to="geräumt" />
+    <Word from="Geréusch" to="Geräusch" />
+    <Word from="Geréusche" to="Geräusche" />
+    <Word from="geréuschvoll" to="geräuschvoll" />
+    <Word from="geschafff" to="geschafft" />
+    <Word from="GESCHAFTSFUHRER" to="GESCHĂ„FTSFĂśHRER" />
+    <Word from="geschafli" to="geschafft" />
+    <Word from="Geschfift" to="Geschäft" />
+    <Word from="geschfimt" to="geschämt" />
+    <Word from="Geschift" to="Geschäft" />
+    <Word from="Geschifte" to="Geschäfte" />
+    <Word from="Geschiftsleute" to="Geschäftsleute" />
+    <Word from="Geschiftswelt" to="Geschäftswelt" />
+    <Word from="geschiidigt" to="geschädigt" />
+    <Word from="Geschiift" to="Geschäft" />
+    <Word from="Geschiiftsleben" to="Geschäftsleben" />
+    <Word from="geschijtzten" to="geschĂĽtzten" />
+    <Word from="Geschiltz" to="GeschĂĽtz" />
+    <Word from="Geschiltze" to="GeschĂĽtze" />
+    <Word from="Geschiltzrohre" to="GeschĂĽtzrohre" />
+    <Word from="Geschiltzturm" to="GeschĂĽtzturm" />
+    <Word from="geschlijpftl" to="geschlĂĽpft!" />
+    <Word from="Geschllitzstellungen" to="GeschĂĽtzstellungen" />
+    <Word from="geschnfiffelt" to="geschnĂĽffelt" />
+    <Word from="Geschtitz" to="GeschĂĽtz" />
+    <Word from="Geschtltz" to="GeschĂĽtz" />
+    <Word from="Geschutz" to="GeschĂĽtz" />
+    <Word from="Geschutze" to="GeschĂĽtze" />
+    <Word from="Geschwiir" to="GeschwĂĽr" />
+    <Word from="Geschwllir" to="GeschwĂĽr" />
+    <Word from="Geschwur" to="GeschwĂĽr" />
+    <Word from="geschwécht" to="geschwächt" />
+    <Word from="geschwéingert" to="geschwängert" />
+    <Word from="Geschwétz" to="Geschwätz" />
+    <Word from="Geschéft" to="Geschäft" />
+    <Word from="Geschéfte" to="Geschäfte" />
+    <Word from="Geschéftige" to="Geschäftige" />
+    <Word from="geschéftlich" to="geschäftlich" />
+    <Word from="Geschéfts" to="Geschäfts" />
+    <Word from="Geschéftsleben" to="Geschäftsleben" />
+    <Word from="Geschéift" to="Geschäft" />
+    <Word from="Geschéifte" to="Geschäfte" />
+    <Word from="geschéiftsméifiig" to="geschäftsmäßig" />
+    <Word from="geschéitzt" to="geschätzt" />
+    <Word from="geschénolet" to="geschändet" />
+    <Word from="Geschfltze" to="Geschütze" />
+    <Word from="Gesetzeshiiter" to="GesetzeshĂĽter" />
+    <Word from="Gesichtl" to="Gesicht!" />
+    <Word from="Gesichtsausdrijcke" to="GesichtsausdrĂĽcke" />
+    <Word from="Gesiiff" to="Gesöff" />
+    <Word from="gesiindigt" to="gesĂĽndigt" />
+    <Word from="gespiirt" to="gespĂĽrt" />
+    <Word from="Gesprach" to="Gespräch" />
+    <Word from="GESPRACH" to="GESPRĂ„CH" />
+    <Word from="GESPRACHE" to="GESPRĂ„CHE" />
+    <Word from="Gespréch" to="Gespräch" />
+    <Word from="Gespréche" to="Gespräche" />
+    <Word from="Gespréiche" to="Gespräche" />
+    <Word from="Gespréichsthema" to="Gesprächsthema" />
+    <Word from="Gespur" to="GespĂĽr" />
+    <Word from="gestiirt" to="gestört" />
+    <Word from="gestijrzt" to="gestĂĽrzt" />
+    <Word from="gestijtzte" to="gestĂĽtzte" />
+    <Word from="gestof$en" to="gestoĂźen" />
+    <Word from="gestolken" to="gestoĂźen" />
+    <Word from="Gestriipp" to="GestrĂĽpp" />
+    <Word from="Gestrijpp" to="GestrĂĽpp" />
+    <Word from="GESTURZT" to="GESTĂśRZT" />
+    <Word from="gestéirt" to="gestört" />
+    <Word from="Gesténdnis" to="Geständnis" />
+    <Word from="gestért" to="gestört" />
+    <Word from="gestflrzt" to="gestürzt" />
+    <Word from="Gesundheitsbehijrde" to="Gesundheitsbehörde" />
+    <Word from="Gesundheitsftlrsorge" to="GesundheitsfĂĽrsorge" />
+    <Word from="Geséfitaschel" to="Gesäßtasche!" />
+    <Word from="Geséiffstaschenl" to="Gesäßtaschen!" />
+    <Word from="get6tet" to="getötet" />
+    <Word from="Getiise" to="Getöse" />
+    <Word from="getiitet" to="getötet" />
+    <Word from="getr'a'umt" to="geträumt" />
+    <Word from="getréumt" to="geträumt" />
+    <Word from="getétet" to="getötet" />
+    <Word from="getétetf" to="getötet!" />
+    <Word from="getéuscht" to="getäuscht" />
+    <Word from="gevégelt" to="gevögelt" />
+    <Word from="gew6hnt" to="gewöhnt" />
+    <Word from="GEWACHSHAUS" to="GEWĂ„CHSHAUS" />
+    <Word from="gewalttétig" to="gewalttätig" />
+    <Word from="gewarnf" to="gewarnt" />
+    <Word from="Gewerkschaftsfunktionéren" to="Gewerkschaftsfunktionären" />
+    <Word from="gewfinscht" to="gewĂĽnscht" />
+    <Word from="Gewiasenskonflikte" to="Gewissenskonflikte" />
+    <Word from="gewiihlt" to="gewählt" />
+    <Word from="gewiihnen" to="gewöhnen" />
+    <Word from="gewiihnlich" to="gewöhnlich" />
+    <Word from="gewiihnlicher" to="gewöhnlicher" />
+    <Word from="gewiihnliches" to="gewöhnliches" />
+    <Word from="gewiihnt" to="gewöhnt" />
+    <Word from="gewiinscht" to="gewĂĽnscht" />
+    <Word from="gewijhnlichen" to="gewöhnlichen" />
+    <Word from="gewijnscht" to="gewĂĽnscht" />
+    <Word from="gewissermafien" to="gewissermaĂźen" />
+    <Word from="gewissermallsen" to="gewissermaĂźen" />
+    <Word from="gewlllnscht" to="gewĂĽnscht" />
+    <Word from="Gewohnheitstiter" to="Gewohnheitstäter" />
+    <Word from="gewtinscht" to="gewĂĽnscht" />
+    <Word from="gewunscht" to="gewĂĽnscht" />
+    <Word from="gewunschten" to="gewĂĽnschten" />
+    <Word from="Gewéchshaus" to="Gewächshaus" />
+    <Word from="gewéhlt" to="gewählt" />
+    <Word from="gewéhnen" to="gewöhnen" />
+    <Word from="gewéhnlicher" to="gewöhnlicher" />
+    <Word from="gewéhnst" to="gewöhnst" />
+    <Word from="gewéhnt" to="gewöhnt" />
+    <Word from="Gewéhren" to="Gewähren" />
+    <Word from="gewéhrt" to="gewährt" />
+    <Word from="Gewéisser" to="Gewässer" />
+    <Word from="Gewéssern" to="Gewässern" />
+    <Word from="gezfichtet" to="gezĂĽchtet" />
+    <Word from="gezilndet" to="gezĂĽndet" />
+    <Word from="gezéhlt" to="gezählt" />
+    <Word from="gezéihlt" to="gezählt" />
+    <Word from="gezéihmt" to="gezähmt" />
+    <Word from="geéndert" to="geändert" />
+    <Word from="GF6l'1Z6fUf" to="Grenze fĂĽr" />
+    <Word from="Gfirtel" to="GĂĽrtel" />
+    <Word from="Gfirtner" to="Gärtner" />
+    <Word from="Gfiste" to="Gäste" />
+    <Word from="Gfitter" to="Götter" />
+    <Word from="Ghrchen" to="Ă–hrchen" />
+    <Word from="gibtjede" to="gibt jede" />
+    <Word from="gibtk" to="gibt's" />
+    <Word from="gibts" to="gibt's" />
+    <Word from="gieBen" to="gieĂźen" />
+    <Word from="GieBkanne" to="GieĂźkanne" />
+    <Word from="gief$t" to="gieĂźt" />
+    <Word from="giefit" to="gieĂźt" />
+    <Word from="gielit" to="gieĂźt" />
+    <Word from="gignalton" to="Signalton" />
+    <Word from="giinstiger" to="gĂĽnstiger" />
+    <Word from="Giire" to="Göre" />
+    <Word from="Giite" to="GĂĽte" />
+    <Word from="giitiger" to="gĂĽtiger" />
+    <Word from="Giitter" to="Götter" />
+    <Word from="Giittliche" to="Göttliche" />
+    <Word from="giittlichen" to="göttlichen" />
+    <Word from="Gijte" to="GĂĽte" />
+    <Word from="Gijtel" to="GĂĽte!" />
+    <Word from="Gilrtel" to="GĂĽrtel" />
+    <Word from="Gilte" to="GĂĽte" />
+    <Word from="Giltiger" to="GĂĽtiger" />
+    <Word from="Gitarrenklénge" to="Gitarrenklänge" />
+    <Word from="Gite" to="GĂĽte" />
+    <Word from="GIUck" to="GlĂĽck" />
+    <Word from="GIUCKliCl'1" to="GlĂĽcklich" />
+    <Word from="GL'lte" to="GĂĽte" />
+    <Word from="Glaubwurdigkeit" to="GlaubwĂĽrdigkeit" />
+    <Word from="Glaubwurdigkeitl" to="GlaubwĂĽrdigkeit!" />
+    <Word from="glaubwflrdig" to="glaubwürdig" />
+    <Word from="glb" to="gib" />
+    <Word from="glbt" to="gibt" />
+    <Word from="Gle/ch" to="Gleich" />
+    <Word from="gleichgiiltig" to="gleichgĂĽltig" />
+    <Word from="gleichmémig" to="gleichmäßig" />
+    <Word from="Glfick" to="GlĂĽck" />
+    <Word from="glficklich" to="glĂĽcklich" />
+    <Word from="Glfickspilz" to="GlĂĽckspilz" />
+    <Word from="Gliick" to="GlĂĽck" />
+    <Word from="Gliickchen" to="Glöckchen" />
+    <Word from="gliicklich" to="glĂĽcklich" />
+    <Word from="gliicklicher" to="glĂĽcklicher" />
+    <Word from="Gliicksbringer" to="GlĂĽcksbringer" />
+    <Word from="Gliickssfréhne" to="Glückssträhne" />
+    <Word from="Gliickwunsch" to="GlĂĽckwunsch" />
+    <Word from="gliilcklich" to="glĂĽcklich" />
+    <Word from="Glijck" to="GlĂĽck" />
+    <Word from="glijcklich" to="glĂĽcklich" />
+    <Word from="Glilck" to="GlĂĽck" />
+    <Word from="glilcklich" to="glĂĽcklich" />
+    <Word from="Glilckwunsch" to="GlĂĽckwunsch" />
+    <Word from="Glillck" to="GlĂĽck" />
+    <Word from="gllinstig" to="gĂĽnstig" />
+    <Word from="gllinstigem" to="gĂĽnstigem" />
+    <Word from="gllinstigen" to="gĂĽnstigen" />
+    <Word from="glljcklich" to="glĂĽcklich" />
+    <Word from="glllicklich" to="glĂĽcklich" />
+    <Word from="glllickliche" to="glĂĽckliche" />
+    <Word from="Glllte" to="GĂĽte" />
+    <Word from="Glorifiziertl" to="Glorifiziert!" />
+    <Word from="glticklich" to="glĂĽcklich" />
+    <Word from="Gltickszahlen" to="GlĂĽckszahlen" />
+    <Word from="gltlckliohes" to="glĂĽckliches" />
+    <Word from="Gluck" to="GlĂĽck" />
+    <Word from="glucklich" to="glĂĽcklich" />
+    <Word from="gluckliche" to="glĂĽckliche" />
+    <Word from="GLUCKSELIGKEIT" to="GLĂśCKSELIGKEIT" />
+    <Word from="Gluckwunsch" to="GlĂĽckwunsch" />
+    <Word from="Gluok" to="GlĂĽck" />
+    <Word from="gluoklich" to="glĂĽcklich" />
+    <Word from="Glupschéugige" to="Glupschäugige" />
+    <Word from="glutheilie" to="glutheiĂźe" />
+    <Word from="gléinzende" to="glänzende" />
+    <Word from="glénzende" to="glänzende" />
+    <Word from="glénzte" to="glänzte" />
+    <Word from="Gléser" to="Gläser" />
+    <Word from="gléubige" to="gläubige" />
+    <Word from="Gléubigen" to="Gläubigen" />
+    <Word from="Glflck" to="Glück" />
+    <Word from="Glflcklich" to="Glücklich" />
+    <Word from="Glflckstag" to="Glückstag" />
+    <Word from="Glflckwilnsche" to="Glückwünsche" />
+    <Word from="gnidig" to="gnädig" />
+    <Word from="Gnllnden" to="GrĂĽnden" />
+    <Word from="gnédig" to="gnädig" />
+    <Word from="gnédige" to="gnädige" />
+    <Word from="gnédigen" to="gnädigen" />
+    <Word from="Gnédigste" to="Gnädigste" />
+    <Word from="gnéidig" to="gnädig" />
+    <Word from="Goff" to="Gott" />
+    <Word from="Golfballweili" to="GolfballweiĂź" />
+    <Word from="gonnst" to="gönnst" />
+    <Word from="gottesfllirchtiger" to="gottesfĂĽrchtiger" />
+    <Word from="Gottverdammt" to="Gott verdammt" />
+    <Word from="Gofl" to="Gott" />
+    <Word from="Gr6Be" to="Größe" />
+    <Word from="gr6Ber" to="größer" />
+    <Word from="gr6Bere" to="größere" />
+    <Word from="gr6Beren" to="größeren" />
+    <Word from="Gr6Bte" to="Größte" />
+    <Word from="Gr6Bten" to="Größten" />
+    <Word from="gr6Bter" to="größter" />
+    <Word from="gr6Btes" to="größtes" />
+    <Word from="gr6f$te" to="größte" />
+    <Word from="gr6f$ten" to="größten" />
+    <Word from="gr6f5ten" to="größten" />
+    <Word from="gr6I3ter" to="größter" />
+    <Word from="gr6ISten" to="größten" />
+    <Word from="Gr6l3e" to="Größe" />
+    <Word from="gr6l3ter" to="größter" />
+    <Word from="Grabstétte" to="Grabstätte" />
+    <Word from="gratulierel" to="gratuliere!" />
+    <Word from="grClf$en" to="grĂĽĂźen" />
+    <Word from="grfilieren" to="größeren" />
+    <Word from="Grfiner" to="GrĂĽner" />
+    <Word from="griil3e" to="grĂĽĂźe" />
+    <Word from="griiliere" to="größere" />
+    <Word from="griiliten" to="größten" />
+    <Word from="griin" to="grĂĽn" />
+    <Word from="Griinde" to="GrĂĽnde" />
+    <Word from="Griinden" to="GrĂĽnden" />
+    <Word from="griindlich" to="grĂĽndlich" />
+    <Word from="Griine" to="GrĂĽne" />
+    <Word from="griinen" to="grĂĽnen" />
+    <Word from="Griiner" to="GrĂĽner" />
+    <Word from="griinéiugige" to="grünäugige" />
+    <Word from="griinéiugiges" to="grünäugiges" />
+    <Word from="griiflte" to="größte" />
+    <Word from="Grijbeln" to="GrĂĽbeln" />
+    <Word from="griJBen" to="grĂĽĂźen" />
+    <Word from="grijn" to="grĂĽn" />
+    <Word from="Grijnde" to="GrĂĽnde" />
+    <Word from="grijnden" to="grĂĽnden" />
+    <Word from="grijndlich" to="grĂĽndlich" />
+    <Word from="grijnes" to="grĂĽnes" />
+    <Word from="Grijnfutter" to="GrĂĽnfutter" />
+    <Word from="Grilbelt" to="GrĂĽbelt" />
+    <Word from="grilfken" to="grĂĽĂźen" />
+    <Word from="Grillhéhnchen" to="Grillhähnchen" />
+    <Word from="Grilnde" to="GrĂĽnde" />
+    <Word from="Grilnden" to="GrĂĽnden" />
+    <Word from="grilndet" to="grĂĽndet" />
+    <Word from="grilndlich" to="grĂĽndlich" />
+    <Word from="grilndlicherf" to="grĂĽndlicher!" />
+    <Word from="grilndlichl" to="grĂĽndlich!" />
+    <Word from="grilne" to="grĂĽne" />
+    <Word from="Grilnschnébel" to="Grünschnäbel" />
+    <Word from="grim" to="grĂĽn" />
+    <Word from="Grime" to="Größe" />
+    <Word from="grinco" to="gringo" />
+    <Word from="Grllinde" to="GrĂĽnde" />
+    <Word from="grllinden" to="grĂĽnden" />
+    <Word from="grllindlich" to="grĂĽndlich" />
+    <Word from="grlllnes" to="grĂĽnes" />
+    <Word from="Gro/3artig" to="GroĂźartig" />
+    <Word from="gro/3es" to="groĂźes" />
+    <Word from="gro/3zUgig" to="groĂźzĂĽgig" />
+    <Word from="Gro/Bstadt" to="GroĂźstadt" />
+    <Word from="gro/Ken" to="groĂźen" />
+    <Word from="groB" to="groĂź" />
+    <Word from="groBartig" to="groĂźartig" />
+    <Word from="GroBe" to="GroĂźe" />
+    <Word from="GroBes" to="GroĂźes" />
+    <Word from="GroBmutter" to="GroĂźmutter" />
+    <Word from="GroBteil" to="GroĂźteil" />
+    <Word from="groBziJgiger" to="groĂźzĂĽgiger" />
+    <Word from="grof$" to="groĂź" />
+    <Word from="grof$artig" to="groĂźartig" />
+    <Word from="grof$artigen" to="groĂźartigen" />
+    <Word from="grof$e" to="groĂźe" />
+    <Word from="grof$er" to="groĂźer" />
+    <Word from="grof$es" to="groĂźes" />
+    <Word from="grof3" to="groĂź" />
+    <Word from="grof3&gt;artige" to="groĂźartige" />
+    <Word from="Grof3e" to="GroĂźe" />
+    <Word from="grof3en" to="groĂźen" />
+    <Word from="grof3erAlien" to="groĂźer Alien" />
+    <Word from="grof5es" to="groĂźes" />
+    <Word from="Grofbvaters" to="GroĂźvaters" />
+    <Word from="grofi" to="groĂź" />
+    <Word from="Grofiangriffs" to="GroĂźangriffs" />
+    <Word from="Grofiartig" to="GroĂźartig" />
+    <Word from="grofiartige" to="groĂźartige" />
+    <Word from="grofiartigen" to="groĂźartigen" />
+    <Word from="grofiartiger" to="groĂźartiger" />
+    <Word from="Grofiartiges" to="GroĂźartiges" />
+    <Word from="Grofibritannien" to="GroĂźbritannien" />
+    <Word from="Grofidiebstahl" to="GroĂźdiebstahl" />
+    <Word from="Grofie" to="GroĂźe" />
+    <Word from="grofier" to="groĂźer" />
+    <Word from="grofies" to="groĂźes" />
+    <Word from="grofiten" to="größten" />
+    <Word from="grofk" to="groĂź" />
+    <Word from="Grofkartig" to="GroĂźartig" />
+    <Word from="grofke" to="groĂźe" />
+    <Word from="Grofken" to="GroĂźen" />
+    <Word from="Grofker" to="GroĂźer" />
+    <Word from="Grofkvater" to="GroĂźvater" />
+    <Word from="grofLe" to="groĂźe" />
+    <Word from="grofler" to="groĂźer" />
+    <Word from="groflsartig" to="groĂźartig" />
+    <Word from="groflsartige" to="groĂźartige" />
+    <Word from="Groflse" to="GroĂźe" />
+    <Word from="groflsen" to="groĂźen" />
+    <Word from="Grofser" to="GroĂźer" />
+    <Word from="grol" to="groĂź" />
+    <Word from="grol'3&gt;en" to="groĂźen" />
+    <Word from="grol2&gt;" to="groĂź" />
+    <Word from="grol2&gt;en" to="groĂźen" />
+    <Word from="grol3&gt;es" to="groĂźes" />
+    <Word from="grol3e" to="groĂźe" />
+    <Word from="grol3er" to="groĂźer" />
+    <Word from="Grol3raum" to="GroĂźraum" />
+    <Word from="groli" to="groĂź" />
+    <Word from="Groliartig" to="GroĂźartig" />
+    <Word from="groliartige" to="groĂźartige" />
+    <Word from="groliartigen" to="groĂźartigen" />
+    <Word from="grolie" to="groĂźe" />
+    <Word from="grolien" to="groĂźen" />
+    <Word from="groliherzig" to="groĂźherzig" />
+    <Word from="Grolimutter" to="GroĂźmutter" />
+    <Word from="Grolisegel" to="GroĂźsegel" />
+    <Word from="Grolkvater" to="GroĂźvater" />
+    <Word from="groller" to="groĂźer" />
+    <Word from="Grollser" to="GroĂźer" />
+    <Word from="grollzugig" to="groĂźzĂĽgig" />
+    <Word from="grolS" to="groĂź" />
+    <Word from="grolSe" to="groĂźe" />
+    <Word from="GrolSeltern" to="GroĂźeltern" />
+    <Word from="grolSer" to="groĂźer" />
+    <Word from="GrolSvater" to="GroĂźvater" />
+    <Word from="grolZ~" to="groĂźe" />
+    <Word from="gror$er" to="groĂźer" />
+    <Word from="grorker" to="groĂźer" />
+    <Word from="grosses" to="groĂźes" />
+    <Word from="GROSSTE" to="GRĂ–SSTE" />
+    <Word from="grofl" to="groß" />
+    <Word from="grofle" to="große" />
+    <Word from="Groflstadtkind" to="Großstadtkind" />
+    <Word from="Groflvater" to="Großvater" />
+    <Word from="Grtin" to="GrĂĽn" />
+    <Word from="Grtmde" to="GrĂĽnde" />
+    <Word from="GruB" to="GruĂź" />
+    <Word from="Grubenausgénge" to="Grubenausgänge" />
+    <Word from="Gruf$" to="GruĂź" />
+    <Word from="grUf$en" to="grĂĽĂźen" />
+    <Word from="grufit" to="grĂĽĂźt" />
+    <Word from="Gruli" to="GruĂź" />
+    <Word from="Grulikarte" to="GruĂźkarte" />
+    <Word from="Grulikarten" to="GruĂźkarten" />
+    <Word from="Grun" to="GrĂĽn" />
+    <Word from="grundlich" to="grĂĽndlich" />
+    <Word from="Grundstiick" to="GrundstĂĽck" />
+    <Word from="grundsétzlich" to="grundsätzlich" />
+    <Word from="grune" to="grĂĽne" />
+    <Word from="grunen" to="grĂĽnen" />
+    <Word from="Grében" to="Gräben" />
+    <Word from="grébst" to="gräbst" />
+    <Word from="gréfier" to="größer" />
+    <Word from="gréfkte" to="größte" />
+    <Word from="gréflserer" to="größerer" />
+    <Word from="Gréifite" to="Größte" />
+    <Word from="gréillten" to="größten" />
+    <Word from="grésslich" to="grässlich" />
+    <Word from="Gréuel" to="Gräuel" />
+    <Word from="grflndlich" to="gründlich" />
+    <Word from="grflne" to="grüne" />
+    <Word from="gull" to="gut!" />
+    <Word from="Gummistépsel" to="Gummistöpsel" />
+    <Word from="Gumml" to="Gummi" />
+    <Word from="GUNSTIGSTEN" to="GĂśNSTIGSTEN" />
+    <Word from="Gurtell" to="GĂĽrtel!" />
+    <Word from="gutaussehend" to="gut aussehend" />
+    <Word from="gutaussehender" to="gut aussehender" />
+    <Word from="GUte" to="GĂĽte" />
+    <Word from="gutgebaut" to="gut gebaut" />
+    <Word from="gutgehen" to="gut gehen" />
+    <Word from="Gutmijtigkeit" to="GutmĂĽtigkeit" />
+    <Word from="gébe" to="gäbe" />
+    <Word from="gében" to="gäben" />
+    <Word from="géibe" to="gäbe" />
+    <Word from="Géittern" to="Göttern" />
+    <Word from="Gélisch" to="Gälisch" />
+    <Word from="Gélische" to="Gälische" />
+    <Word from="gélisches" to="gälisches" />
+    <Word from="Génsehaut" to="Gänsehaut" />
+    <Word from="Génsen" to="Gänsen" />
+    <Word from="Génze" to="Gänze" />
+    <Word from="Gérfen" to="Gärten" />
+    <Word from="Gértnern" to="Gärtnern" />
+    <Word from="Géste" to="Gäste" />
+    <Word from="Géstezimmer" to="Gästezimmer" />
+    <Word from="Gétter" to="Götter" />
+    <Word from="Gétterspeise" to="Götterspeise" />
+    <Word from="Géttin" to="Göttin" />
+    <Word from="Géttliche" to="Göttliche" />
+    <Word from="géttlichen" to="göttlichen" />
+    <Word from="Gétze" to="Götze" />
+    <Word from="G€fUhl6" to="Gefühle" />
+    <Word from="G€StFUpp" to="Gestrüpp" />
+    <Word from="h&lt;'&gt;'r't" to="hört" />
+    <Word from="h&lt;'5r" to="hör" />
+    <Word from="h'a'lt" to="hält" />
+    <Word from="H'a'nde" to="Hände" />
+    <Word from="H'a'nden" to="Händen" />
+    <Word from="H'a'ttest" to="Hättest" />
+    <Word from="H/" to="Hi" />
+    <Word from="H/er" to="Hier" />
+    <Word from="h/nfer" to="hinter" />
+    <Word from="h5tte" to="hätte" />
+    <Word from="H6fe" to="Höfe" />
+    <Word from="h6flich" to="höflich" />
+    <Word from="H6fling" to="Höfling" />
+    <Word from="H6hen" to="Höhen" />
+    <Word from="h6her" to="höher" />
+    <Word from="h6here" to="höhere" />
+    <Word from="H6HERER" to="HĂ–HERER" />
+    <Word from="H6hle" to="Höhle" />
+    <Word from="H6l1e" to="Hörte" />
+    <Word from="H6lle" to="Hölle" />
+    <Word from="H6llen" to="Höllen" />
+    <Word from="h6lte" to="hörte" />
+    <Word from="H6r" to="Hör" />
+    <Word from="h6re" to="höre" />
+    <Word from="h6ren" to="hören" />
+    <Word from="H6rer" to="Hörer" />
+    <Word from="H6rner" to="Hörner" />
+    <Word from="h6rst" to="hörst" />
+    <Word from="h6rt" to="hört" />
+    <Word from="h6rte" to="hörte" />
+    <Word from="Ha/s" to="Hals" />
+    <Word from="Haarbijrstel" to="HaarbĂĽrste!" />
+    <Word from="Haarhfirste" to="HaarbĂĽrste" />
+    <Word from="Haarl" to="Haar!" />
+    <Word from="Haarstréhne" to="Haarsträhne" />
+    <Word from="hab'jemanden" to="hab' jemanden" />
+    <Word from="Hah" to="Häh" />
+    <Word from="halbstlllndiges" to="halbstĂĽndiges" />
+    <Word from="halbvervvandelt" to="halbverwandelt" />
+    <Word from="halfef" to="haltet" />
+    <Word from="Hallfjchen" to="Hallöchen" />
+    <Word from="hallol" to="hallo!" />
+    <Word from="Halsbénder" to="Halsbänder" />
+    <Word from="Halsl" to="Hals!" />
+    <Word from="haltenl" to="halten!" />
+    <Word from="Haltjohnny" to="Halt Johnny" />
+    <Word from="Hammerschédel" to="Hammerschädel" />
+    <Word from="Handfléche" to="Handfläche" />
+    <Word from="Handlungsstrénge" to="Handlungsstränge" />
+    <Word from="harfe" to="harte" />
+    <Word from="hartnéickig" to="hartnäckig" />
+    <Word from="Hasenful" to="HasenfuĂź" />
+    <Word from="Hasenfull" to="HasenfuĂź" />
+    <Word from="hassq" to="hasse" />
+    <Word from="Hastja" to="Hast ja" />
+    <Word from="hatjetzt" to="hat jetzt" />
+    <Word from="hatta" to="hatte" />
+    <Word from="Haupfbus" to="Hauptbus" />
+    <Word from="Hauptaktionéire" to="Hauptaktionäre" />
+    <Word from="Hauptaktionéirinnen" to="Hauptaktionärinnen" />
+    <Word from="Hauptkabell" to="Hauptkabel!" />
+    <Word from="hauptséchlich" to="hauptsächlich" />
+    <Word from="hauptséichlich" to="hauptsächlich" />
+    <Word from="Haupttribflne" to="Haupttribüne" />
+    <Word from="Hauptverschwiirer" to="Hauptverschwörer" />
+    <Word from="Hauptwasserrohrwar" to="Hauptwasserrohr war" />
+    <Word from="Hausfirzte" to="Hausärzte" />
+    <Word from="Haushélterin" to="Haushälterin" />
+    <Word from="Hausschlilssel" to="HausschlĂĽssel" />
+    <Word from="Haustilr" to="HaustĂĽr" />
+    <Word from="Hausubervvachung" to="HausĂĽberwachung" />
+    <Word from="haĂźt" to="hasst" />
+    <Word from="Hbr" to="Hör" />
+    <Word from="hc'5ren" to="hören" />
+    <Word from="hc'§r" to="hör" />
+    <Word from="hdchsfens" to="höchstens" />
+    <Word from="Hdchstleistung" to="Höchstleistung" />
+    <Word from="hdher" to="höher" />
+    <Word from="Hdlle" to="Hölle" />
+    <Word from="Hdllenfeuer" to="Höllenfeuer" />
+    <Word from="hdre" to="höre" />
+    <Word from="hdren" to="hören" />
+    <Word from="hdrsf" to="hörst" />
+    <Word from="hdrten" to="horten" />
+    <Word from="He/nr/ch" to="Heinrich" />
+    <Word from="hedeutest" to="bedeutest" />
+    <Word from="hegrfille" to="begrĂĽĂźe" />
+    <Word from="heiB" to="heiĂź" />
+    <Word from="heiBe" to="heiĂźe" />
+    <Word from="heiBen" to="heiĂźen" />
+    <Word from="HeiBer" to="HeiĂźer" />
+    <Word from="heiBes" to="heiĂźes" />
+    <Word from="heiBt" to="heiĂźt" />
+    <Word from="heif$" to="heiĂź" />
+    <Word from="heif$e" to="heiĂźe" />
+    <Word from="heif$es" to="heiĂźes" />
+    <Word from="Heif$t" to="HeiĂźt" />
+    <Word from="heif3&gt;en" to="heiĂźen" />
+    <Word from="heif3t" to="heiĂźt" />
+    <Word from="heif5en" to="heiĂźen" />
+    <Word from="heifie" to="heiĂźe" />
+    <Word from="heifiem" to="heiĂźem" />
+    <Word from="heifien" to="heiĂźen" />
+    <Word from="heifit" to="heiĂźt" />
+    <Word from="heifkt" to="heiĂźt" />
+    <Word from="heifLt" to="heiĂźt" />
+    <Word from="heifZ&gt;e" to="heiĂźe" />
+    <Word from="heil'$" to="heiĂź" />
+    <Word from="heil'$en" to="heiĂźen" />
+    <Word from="heil'$t" to="heiĂźt" />
+    <Word from="heil'Se" to="heiĂźe" />
+    <Word from="heil2&gt;en" to="heiĂźen" />
+    <Word from="heil2&gt;t" to="heiĂźt" />
+    <Word from="heil3en" to="heiĂźen" />
+    <Word from="heil3t" to="heiĂźt" />
+    <Word from="heil5e" to="heiĂźe" />
+    <Word from="heil5t" to="heiĂźt" />
+    <Word from="heili" to="heiĂź" />
+    <Word from="heilies" to="heiĂźes" />
+    <Word from="heilit" to="heiĂźt" />
+    <Word from="heillst" to="heiĂźt" />
+    <Word from="heilZ~" to="heiĂźt" />
+    <Word from="heir$" to="heiĂź" />
+    <Word from="heisst" to="heiĂźt" />
+    <Word from="Helllger" to="Heiliger" />
+    <Word from="Helzlichen" to="Herzlichen" />
+    <Word from="Hen'je" to="Herrje" />
+    <Word from="herabstofien" to="herabstoĂźen" />
+    <Word from="heransttlrmtet" to="heranstĂĽrmtet" />
+    <Word from="heraushéngendem" to="heraushängendem" />
+    <Word from="herhfiren" to="herhören" />
+    <Word from="herhéren" to="herhören" />
+    <Word from="heriiber" to="herĂĽber" />
+    <Word from="HerrSchmidt" to="Herr Schmidt" />
+    <Word from="herumféhrt" to="herumfährt" />
+    <Word from="herumkehren" to="herum kehren" />
+    <Word from="herumlluft" to="herumläuft" />
+    <Word from="herumzuwijhlen" to="herumzuwĂĽhlen" />
+    <Word from="Herzrhythmusstérungen" to="Herzrhythmusstörungen" />
+    <Word from="Herzschlielierei" to="HerzschlieĂźerei" />
+    <Word from="Herzstlllck" to="HerzstĂĽck" />
+    <Word from="Heuta" to="Heute" />
+    <Word from="Hexenhtltte" to="HexenhĂĽtte" />
+    <Word from="HeY·" to="Hey." />
+    <Word from="Hfibscheste" to="HĂĽbscheste" />
+    <Word from="hfiherer" to="höherer" />
+    <Word from="hfihsch" to="hĂĽbsch" />
+    <Word from="Hfilfte" to="Häfte" />
+    <Word from="Hfille" to="Hölle" />
+    <Word from="hfilt" to="hält" />
+    <Word from="hfiltst" to="hältst" />
+    <Word from="Hfin" to="Hört" />
+    <Word from="hfipft" to="hĂĽpft" />
+    <Word from="Hfir" to="Hör" />
+    <Word from="hfiren" to="hören" />
+    <Word from="hfirst" to="hörst" />
+    <Word from="hfirt" to="hört" />
+    <Word from="hfitte" to="hätte" />
+    <Word from="hfitten" to="hätten" />
+    <Word from="hie/3" to="hieĂź" />
+    <Word from="hieB" to="hieĂź" />
+    <Word from="hiefL" to="hieĂź" />
+    <Word from="hiel3" to="hieĂź" />
+    <Word from="hiells" to="hieĂź" />
+    <Word from="hierhergereist" to="hierher gereist" />
+    <Word from="hierherzuriick" to="hierher zurĂĽck" />
+    <Word from="hierijber" to="hierĂĽber" />
+    <Word from="hierjede" to="hier jede" />
+    <Word from="hierjeder" to="hier jeder" />
+    <Word from="hierl" to="hier!" />
+    <Word from="hierL" to="hieĂź" />
+    <Word from="hierwar" to="hier war" />
+    <Word from="hierzum" to="hier zum" />
+    <Word from="hierzum" to="hier-zum" />
+    <Word from="hiefl" to="hieß" />
+    <Word from="Hiibsch" to="HĂĽbsch" />
+    <Word from="Hiibsche" to="HĂĽbsche" />
+    <Word from="Hiibscher" to="HĂĽbscher" />
+    <Word from="hiibschl" to="hĂĽbsch!" />
+    <Word from="hiichst" to="höchst" />
+    <Word from="hiichstens" to="höchstens" />
+    <Word from="hiichster" to="höchster" />
+    <Word from="hiichstpersiinlich" to="höchstpersönlich" />
+    <Word from="Hiifen" to="Höfen" />
+    <Word from="hiifischen" to="höfischen" />
+    <Word from="Hiifling" to="Höfling" />
+    <Word from="Hiigel" to="HĂĽgel" />
+    <Word from="Hiihe" to="Höhe" />
+    <Word from="Hiihepunkt" to="Höhepunkt" />
+    <Word from="hiiher" to="höher" />
+    <Word from="hiihere" to="höhere" />
+    <Word from="Hiihlen" to="Höhlen" />
+    <Word from="Hiihnchen" to="HĂĽhnchen" />
+    <Word from="Hiihner" to="HĂĽhner" />
+    <Word from="Hiihnerkléfkchen" to="Hühnerklößchen" />
+    <Word from="Hiilfte" to="Hälfte" />
+    <Word from="Hiille" to="Hölle" />
+    <Word from="Hiillenstreitmacht" to="Höllenstreitmacht" />
+    <Word from="hiillischen" to="höllischen" />
+    <Word from="hiipfen" to="hĂĽpfen" />
+    <Word from="Hiir" to="Hör" />
+    <Word from="hiire" to="höre" />
+    <Word from="Hiiren" to="Hören" />
+    <Word from="Hiirer" to="Hörer" />
+    <Word from="Hiiret" to="Höret" />
+    <Word from="Hiirjetzt" to="Hör jetzt" />
+    <Word from="Hiirt" to="Hört" />
+    <Word from="hiirte" to="hörte" />
+    <Word from="hiirtest" to="hörtest" />
+    <Word from="Hiissliches" to="Hässliches" />
+    <Word from="Hiite" to="HĂĽte" />
+    <Word from="Hiiten" to="HĂĽten" />
+    <Word from="hiitet" to="hĂĽtet" />
+    <Word from="Hiitte" to="Hätte" />
+    <Word from="hiitten" to="hätten" />
+    <Word from="Hiitten" to="HĂĽtten" />
+    <Word from="hijbsch" to="hĂĽbsch" />
+    <Word from="hijbschen" to="hĂĽbschen" />
+    <Word from="hijbsches" to="hĂĽbsches" />
+    <Word from="Hijfte" to="HĂĽfte" />
+    <Word from="Hijften" to="HĂĽften" />
+    <Word from="Hijgel" to="HĂĽgel" />
+    <Word from="Hijgels" to="HĂĽgels" />
+    <Word from="Hijpfburgl" to="HĂĽpfburg!" />
+    <Word from="hijpfe" to="hĂĽpfe" />
+    <Word from="hijpfen" to="hĂĽpfen" />
+    <Word from="hijre" to="höre" />
+    <Word from="Hijren" to="Hören" />
+    <Word from="Hijrer" to="Hörer" />
+    <Word from="hilbsch" to="hĂĽbsch" />
+    <Word from="hilbsche" to="hĂĽbsche" />
+    <Word from="hilbschen" to="hĂĽbschen" />
+    <Word from="hilbscher" to="hĂĽbscher" />
+    <Word from="Hilfel" to="Hilfe!" />
+    <Word from="HILFSPERSONALI" to="HILFSPERSONAL:" />
+    <Word from="Hilgel" to="HĂĽgel" />
+    <Word from="hillig" to="billig" />
+    <Word from="Hilt" to="Hält" />
+    <Word from="hilfl" to="hilft" />
+    <Word from="Him" to="Hirn" />
+    <Word from="Himmell" to="Himmel!" />
+    <Word from="hineintréumen" to="hineinträumen" />
+    <Word from="hinfijhrt" to="hinfĂĽhrt" />
+    <Word from="hingefiihrt" to="hingefĂĽhrt" />
+    <Word from="hingehdren" to="hingehören" />
+    <Word from="hingehiiren" to="hingehören" />
+    <Word from="hinilber" to="hinĂĽber" />
+    <Word from="hinreiliend" to="hinreiĂźend" />
+    <Word from="hinschmeifit" to="hinschmeiĂźt" />
+    <Word from="HintenNäldler" to="Hinterwäldler" />
+    <Word from="Hintergrundlérm" to="Hintergrundlärm" />
+    <Word from="hinterhfiltig" to="hinterhältig" />
+    <Word from="hinterhéiltiger" to="hinterhältiger" />
+    <Word from="Hinterhéiltigl" to="Hinterhältig!" />
+    <Word from="hinterhéltige" to="hinterhältige" />
+    <Word from="hinterhéltiger" to="hinterhältiger" />
+    <Word from="Hinterképfen" to="Hinterköpfen" />
+    <Word from="hinterlieBe" to="hinterlieĂźe" />
+    <Word from="hinterlésst" to="hinterlässt" />
+    <Word from="Hintersttlbchen" to="HinterstĂĽbchen" />
+    <Word from="Hintertur" to="HintertĂĽr" />
+    <Word from="hinwollen" to="hin wollen" />
+    <Word from="hinzufuhren" to="hinzufĂĽhren" />
+    <Word from="hinzufflgten" to="hinzufügten" />
+    <Word from="Hirnrnel" to="Himmel" />
+    <Word from="hirteste" to="härteste" />
+    <Word from="hisslich" to="hässlich" />
+    <Word from="Hiétte" to="Hätte" />
+    <Word from="Hler" to="Her" />
+    <Word from="hler" to="hier" />
+    <Word from="hllf" to="hilf" />
+    <Word from="hllibsch" to="hĂĽbsch" />
+    <Word from="Hllindinnen" to="HĂĽndinnen" />
+    <Word from="Hlllpf" to="HĂĽpf" />
+    <Word from="hln" to="hin" />
+    <Word from="Hlnbllck" to="Hinblick" />
+    <Word from="hltte" to="hätte" />
+    <Word from="Hltten" to="Hätten" />
+    <Word from="Hochfrequenzstérungenl" to="Hochfrequenzstörungen!" />
+    <Word from="hochl" to="hoch!" />
+    <Word from="Hochsicherheitsgeféngnis" to="Hochsicherheitsgefängnis" />
+    <Word from="Hochstens" to="Höchstens" />
+    <Word from="Hochzeitskostiime" to="HochzeitskostĂĽme" />
+    <Word from="Hohek" to="Hoheit" />
+    <Word from="Hohepunkt" to="Höhepunkt" />
+    <Word from="hohere" to="höhere" />
+    <Word from="HoHo" to="Hoho" />
+    <Word from="Holle" to="Hölle" />
+    <Word from="Holzsttlck" to="HolzstĂĽck" />
+    <Word from="hor" to="hör" />
+    <Word from="Horen" to="Hören" />
+    <Word from="Hosenscheifker" to="HosenscheiĂźer" />
+    <Word from="Hosenscheiiker" to="HosenscheiĂźer" />
+    <Word from="Hosenscheifler" to="Hosenscheißer" />
+    <Word from="Hotelgéste" to="Hotelgäste" />
+    <Word from="HQHE" to="HĂ–HE" />
+    <Word from="htibscher" to="hĂĽbscher" />
+    <Word from="Htihnchen" to="HĂĽhnchen" />
+    <Word from="Htipfen" to="HĂĽpfen" />
+    <Word from="Htipfenl" to="HĂĽpfen!" />
+    <Word from="htiren" to="hören" />
+    <Word from="hubsch" to="hĂĽbsch" />
+    <Word from="hubsche" to="hĂĽbsche" />
+    <Word from="hubschen" to="hĂĽbschen" />
+    <Word from="Hubscher" to="HĂĽbscher" />
+    <Word from="hubscheres" to="hĂĽbscheres" />
+    <Word from="Hubsches" to="HĂĽbsches" />
+    <Word from="Huhner" to="HĂĽhner" />
+    <Word from="humon/oll" to="humorvoll" />
+    <Word from="Hundchen" to="HĂĽndchen" />
+    <Word from="Hundebullel" to="Hundebulle!" />
+    <Word from="Hundenépfe" to="Hundenäpfe" />
+    <Word from="Hundescheilie" to="HundescheiĂźe" />
+    <Word from="Hundl" to="Hund!" />
+    <Word from="HUNG" to="HĂĽlle" />
+    <Word from="hunte" to="bunte" />
+    <Word from="Hurensiihne" to="Hurensöhne" />
+    <Word from="Hurensohnl" to="Hurensohn!" />
+    <Word from="Huterin" to="HĂĽterin" />
+    <Word from="HUtte" to="HĂĽtte" />
+    <Word from="Hypoglykémie" to="Hypoglykämie" />
+    <Word from="hé" to="hä" />
+    <Word from="Héchste" to="Höchste" />
+    <Word from="héchsten" to="höchsten" />
+    <Word from="Héchstens" to="Höchstens" />
+    <Word from="Héchstpersénlich" to="Höchstpersönlich" />
+    <Word from="Héfen" to="Häfen" />
+    <Word from="héflich" to="höflich" />
+    <Word from="Héftling" to="Häftling" />
+    <Word from="Héftlinge" to="Häftlinge" />
+    <Word from="Héftlingsréte" to="Häftlingsräte" />
+    <Word from="Héhef" to="Höhe!" />
+    <Word from="Héhepunkt" to="Höhepunkt" />
+    <Word from="héher" to="höher" />
+    <Word from="héheren" to="höheren" />
+    <Word from="Héi" to="Hä" />
+    <Word from="Héifen" to="Häfen" />
+    <Word from="Héilften" to="Hälften" />
+    <Word from="héiltst" to="hältst" />
+    <Word from="Héinde" to="Hände" />
+    <Word from="héing" to="häng" />
+    <Word from="héingen" to="hängen" />
+    <Word from="héingt" to="hängt" />
+    <Word from="héir" to="hör" />
+    <Word from="héirter" to="härter" />
+    <Word from="héitt" to="hätt" />
+    <Word from="Héitte" to="Hätte" />
+    <Word from="héitten" to="hätten" />
+    <Word from="héittest" to="hättest" />
+    <Word from="héiufig" to="häufig" />
+    <Word from="Hélfte" to="Hälfte" />
+    <Word from="Hélle" to="Hölle" />
+    <Word from="Héllen" to="Höllen" />
+    <Word from="Héllenloch" to="Höllenloch" />
+    <Word from="héllisch" to="höllisch" />
+    <Word from="héllische" to="höllische" />
+    <Word from="hélt" to="hält" />
+    <Word from="Héltst" to="Hältst" />
+    <Word from="hélzernes" to="hölzernes" />
+    <Word from="hémisch" to="hämisch" />
+    <Word from="Hémmer" to="Hämmer" />
+    <Word from="hémmernde" to="hämmernde" />
+    <Word from="Hémoglobin" to="Hämoglobin" />
+    <Word from="Hémorrhoiden" to="Hämorrhoiden" />
+    <Word from="Héndchen" to="Händchen" />
+    <Word from="Hénde" to="Hände" />
+    <Word from="Héndedruck" to="Händedruck" />
+    <Word from="Hénden" to="Händen" />
+    <Word from="Héndlerin" to="Händlerin" />
+    <Word from="héng" to="häng" />
+    <Word from="héngen" to="hängen" />
+    <Word from="héngend" to="hängend" />
+    <Word from="héngst" to="hängst" />
+    <Word from="héngt" to="hängt" />
+    <Word from="Hér" to="Hör" />
+    <Word from="hére" to="höre" />
+    <Word from="héren" to="hören" />
+    <Word from="Hérgeschéidigte" to="Hörgeschädigte" />
+    <Word from="hérst" to="hörst" />
+    <Word from="hért" to="hört" />
+    <Word from="hérte" to="hörte" />
+    <Word from="hérten" to="hörten" />
+    <Word from="hérter" to="härter" />
+    <Word from="Hérzu" to="Hör zu" />
+    <Word from="HĂ©schen" to="Haschen" />
+    <Word from="hésslich" to="hässlich" />
+    <Word from="hésslicher" to="hässlicher" />
+    <Word from="hésslichl" to="hässlich" />
+    <Word from="hésslichste" to="hässlichste" />
+    <Word from="hétt" to="hätt" />
+    <Word from="Hétte" to="Hätte" />
+    <Word from="hétten" to="hätten" />
+    <Word from="hétten's" to="hätten's" />
+    <Word from="héttest" to="hättest" />
+    <Word from="Héttet" to="Hättet" />
+    <Word from="Héufi" to="Häufi" />
+    <Word from="héufig" to="häufig" />
+    <Word from="héufiger" to="häufiger" />
+    <Word from="Héufigkeit" to="Häufigkeit" />
+    <Word from="héufigsten" to="häufigsten" />
+    <Word from="Héuser" to="Häuser" />
+    <Word from="Héusern" to="Häusern" />
+    <Word from="héute" to="häute" />
+    <Word from="H€Y" to="Hey" />
+    <Word from="Hflgeln" to="Hügeln" />
+    <Word from="i'§ffne" to="Öffne" />
+    <Word from="I/egen" to="liegen" />
+    <Word from="I5sst" to="lässt" />
+    <Word from="I5stern" to="lästern" />
+    <Word from="I6sen" to="lösen" />
+    <Word from="IaĂź" to="lass" />
+    <Word from="IaĂźt" to="lasst" />
+    <Word from="Icll" to="Ich" />
+    <Word from="identifizieet" to="identifiziert" />
+    <Word from="IDENTITAT" to="IDENTITĂ„T" />
+    <Word from="IE" to="IĂź" />
+    <Word from="Iebendigl" to="lebendig!" />
+    <Word from="Iebenslinglich" to="lebensläglich" />
+    <Word from="Iebtjetzt" to="lebt jetzt" />
+    <Word from="Ieck" to="leck" />
+    <Word from="Iehn" to="lehn" />
+    <Word from="Ieid‚" to="leid‚" />
+    <Word from="Ieinenlose" to="leinenlose" />
+    <Word from="Ienistische" to="leninistische" />
+    <Word from="Ietztendlich" to="letztendlich" />
+    <Word from="Ifigt" to="lĂĽgt" />
+    <Word from="Ihrdllirft" to="Ihr dĂĽrft" />
+    <Word from="ihrja" to="ihr ja" />
+    <Word from="ihrjemals" to="ihr jemals" />
+    <Word from="ihrjetzt" to="ihr jetzt" />
+    <Word from="ihrjeweiliges" to="ihr jeweiliges" />
+    <Word from="ihrVater" to="ihr Vater" />
+    <Word from="ihrvorstrafenregister" to="ihr Vorstrafenregister" />
+    <Word from="ihrwahres" to="ihr wahres" />
+    <Word from="Ihrwerdet" to="Ihr werdet" />
+    <Word from="ihrzwei" to="ihr zwei" />
+    <Word from="iibel" to="ĂĽbel" />
+    <Word from="iibemehmen" to="ĂĽbernehmen" />
+    <Word from="iiber" to="ĂĽber" />
+    <Word from="iiberall" to="ĂĽberall" />
+    <Word from="iiberallhin" to="ĂĽberallhin" />
+    <Word from="iiberdauern" to="ĂĽberdauern" />
+    <Word from="iiberdauerte" to="ĂĽberdauerte" />
+    <Word from="iibereinstimmte" to="ĂĽbereinstimme" />
+    <Word from="iiberfallen" to="ĂĽberfallen" />
+    <Word from="iiberfiel" to="ĂĽberfiel" />
+    <Word from="iibergeben" to="ĂĽbergeben" />
+    <Word from="iiberhaupt" to="ĂĽberhaupt" />
+    <Word from="iiberhiirt" to="überhört" />
+    <Word from="iiberholt" to="ĂĽberholt" />
+    <Word from="iiberholter" to="ĂĽberholter" />
+    <Word from="iiberkam" to="ĂĽberkam" />
+    <Word from="iiberlassen" to="ĂĽberlassen" />
+    <Word from="iiberleben" to="ĂĽberleben" />
+    <Word from="iiberlebt" to="ĂĽberlebt" />
+    <Word from="iiberlegen" to="ĂĽberlegen" />
+    <Word from="iiberlegten" to="ĂĽberlegten" />
+    <Word from="iibernahmen" to="ĂĽbernahmen" />
+    <Word from="iibernehme" to="ĂĽbernehme" />
+    <Word from="iibernehmen" to="ĂĽbernehmen" />
+    <Word from="iibernimmt" to="ĂĽbernimmt" />
+    <Word from="iibernommen" to="ĂĽbernommen" />
+    <Word from="iiberpriife" to="ĂĽberprĂĽfe" />
+    <Word from="iiberpriifen" to="ĂĽberprĂĽfen" />
+    <Word from="iiberpriift" to="ĂĽberprĂĽft" />
+    <Word from="iiberpriiften" to="ĂĽberprĂĽften" />
+    <Word from="iiberqueren" to="ĂĽberqueren" />
+    <Word from="iiberragen" to="ĂĽberragen" />
+    <Word from="iiberrascht" to="ĂĽberrascht" />
+    <Word from="iiberraschte" to="ĂĽberraschte" />
+    <Word from="iiberreden" to="ĂĽberreden" />
+    <Word from="iiberschritten" to="ĂĽberschritten" />
+    <Word from="iibersetzen" to="ĂĽbersetzen" />
+    <Word from="iibersetzt" to="ĂĽbersetzt" />
+    <Word from="iibersteigt" to="ĂĽbersteigt" />
+    <Word from="iibertragen" to="ĂĽbertragen" />
+    <Word from="iibertreffen" to="ĂĽbertreffen" />
+    <Word from="iibertreib" to="ĂĽbertreib" />
+    <Word from="iibertreiben" to="ĂĽbertreiben" />
+    <Word from="iibertrieben" to="ĂĽbertrieben" />
+    <Word from="iiberzeugen" to="ĂĽberzeugen" />
+    <Word from="iiberzeugt" to="ĂĽberzeugt" />
+    <Word from="iiblich" to="ĂĽblich" />
+    <Word from="iibliche" to="ĂĽbliche" />
+    <Word from="iibrig" to="ĂĽbrig" />
+    <Word from="IieB" to="lieĂź" />
+    <Word from="Iiebte" to="liebte" />
+    <Word from="Iief's" to="lief's" />
+    <Word from="Iiehe" to="liebe" />
+    <Word from="Iieflest" to="ließest" />
+    <Word from="iiffentlichen" to="öffentlichen" />
+    <Word from="iiffentliches" to="öffentliches" />
+    <Word from="iiffnest" to="öffnest" />
+    <Word from="iifter" to="öfter" />
+    <Word from="iihnllchkelt" to="Ă„hnllchkelt" />
+    <Word from="Iisst" to="lässt" />
+    <Word from="ijbel" to="ĂĽbel" />
+    <Word from="ijben" to="ĂĽben" />
+    <Word from="ijberall" to="ĂĽberall" />
+    <Word from="ijberhaupt" to="ĂĽberhaupt" />
+    <Word from="ijberlegene" to="ĂĽberlegene" />
+    <Word from="ijbernehme" to="ĂĽbernehme" />
+    <Word from="ijbernimmst" to="ĂĽbernimmst" />
+    <Word from="ijberprijfen" to="ĂĽberprĂĽfen" />
+    <Word from="ijberreden" to="ĂĽberreden" />
+    <Word from="ijbertrage" to="ĂĽbertrage" />
+    <Word from="ijberwunden" to="ĂĽberwunden" />
+    <Word from="ijberzeugen" to="ĂĽberzeugen" />
+    <Word from="ijberzogen" to="ĂĽberzogen" />
+    <Word from="Il6her" to="höher" />
+    <Word from="IleiB" to="heiĂź" />
+    <Word from="Ill" to="III" />
+    <Word from="Illfie" to="Wie" />
+    <Word from="Ilrger" to="Ă„rger" />
+    <Word from="Ilufierste" to="Ă„uĂźerste" />
+    <Word from="immerja" to="immer ja" />
+    <Word from="immerjung" to="immer jung" />
+    <Word from="immerweinen" to="immer weinen" />
+    <Word from="immerwährende" to="immer währende" />
+    <Word from="immerwéhrende" to="immerwährende" />
+    <Word from="Improvisiation" to="Improvisation" />
+    <Word from="Impulswellengeschutz" to="ImpulswellengeschĂĽtz" />
+    <Word from="INBRUNSTIGE" to="INBRĂśNSTIGE" />
+    <Word from="instfindig" to="inständig" />
+    <Word from="intramuskulér" to="intramuskulär" />
+    <Word from="INVASIONSFLOTFE" to="INVASIONSFLOTTE" />
+    <Word from="Iosgeliist" to="losgelöst" />
+    <Word from="Iosgelést" to="losgelöst" />
+    <Word from="Ioszuliisen" to="loszulösen" />
+    <Word from="ip" to="in" />
+    <Word from="irn" to="im" />
+    <Word from="irrefuhren" to="irrefĂĽhren" />
+    <Word from="irrefuhrende" to="irrefĂĽhrende" />
+    <Word from="istja" to="ist ja" />
+    <Word from="istjedoch" to="ist jedoch" />
+    <Word from="istjemand" to="ist jemand" />
+    <Word from="istjetzt" to="ist jetzt" />
+    <Word from="istJohnny" to="ist Johnny" />
+    <Word from="istjung" to="ist jung" />
+    <Word from="istweg" to="ist weg" />
+    <Word from="ITIUSSEFI" to="mĂĽssen" />
+    <Word from="ITIUSSGI7" to="mĂĽssen" />
+    <Word from="ITTITTRZ" to="Danke." />
+    <Word from="Ivlégliche" to="Mögliche" />
+    <Word from="Iécheln" to="lächeln" />
+    <Word from="Iécherlich" to="lächerlich" />
+    <Word from="Iécherlichen" to="lächerlichen" />
+    <Word from="Iéhmt" to="lähmt" />
+    <Word from="Iéiuft" to="läuft" />
+    <Word from="Iénger" to="länger" />
+    <Word from="Iésst" to="lässt" />
+    <Word from="Iésste" to="lässte" />
+    <Word from="Iéuft" to="läuft" />
+    <Word from="J0Shua" to="Joshua" />
+    <Word from="Jackettkaufen" to="Jackett kaufen" />
+    <Word from="jahr" to="Jahr" />
+    <Word from="jahre" to="Jahre" />
+    <Word from="jahren" to="Jahren" />
+    <Word from="JAHRIGE" to="JĂ„HRIGE" />
+    <Word from="jal" to="ja!" />
+    <Word from="jemandenl" to="jemanden!" />
+    <Word from="jetztl" to="jetzt!" />
+    <Word from="jiidisch" to="jĂĽdisch" />
+    <Word from="Jiingem" to="JĂĽngern" />
+    <Word from="jiingerwar" to="jĂĽnger war" />
+    <Word from="Jiingste" to="JĂĽngste" />
+    <Word from="jilnger" to="jĂĽnger" />
+    <Word from="Jlllngling" to="JĂĽngling" />
+    <Word from="job" to="Job" />
+    <Word from="Jogglng" to="Jogging" />
+    <Word from="john" to="John" />
+    <Word from="johnny" to="Johnny" />
+    <Word from="journalisten" to="Journalisten" />
+    <Word from="Jullo" to="Julie" />
+    <Word from="JUNGFRAULICHE" to="JUNGFRĂ„ULICHE" />
+    <Word from="jungfréuliche" to="jungfräuliche" />
+    <Word from="jungfréulichen" to="jungfräulichen" />
+    <Word from="jungfréulicher" to="jungfräulicher" />
+    <Word from="Jungfréulichkeit" to="Jungfräulichkeit" />
+    <Word from="Jungsl" to="Jungs!" />
+    <Word from="Jungste" to="JĂĽngste" />
+    <Word from="Jurlgs" to="Jungs" />
+    <Word from="Justitzministeriums" to="Justizministeriums" />
+    <Word from="Jéger" to="Jäger" />
+    <Word from="Jéhrige" to="Jährige" />
+    <Word from="jéhrigen" to="jährigen" />
+    <Word from="jéhriger" to="jähriger" />
+    <Word from="jéhrlich" to="jährlich" />
+    <Word from="Jéiger" to="Jäger" />
+    <Word from="jéihrigen" to="jährigen" />
+    <Word from="jémmerlich" to="jämmerlich" />
+    <Word from="k'a'mpfen" to="kämpfen" />
+    <Word from="K/no" to="Kino" />
+    <Word from="K/Varte" to="Warte" />
+    <Word from="K/Velle" to="Welle" />
+    <Word from="K5NIGIN" to="KĂ–NIGIN" />
+    <Word from="K6der" to="Köder" />
+    <Word from="K6ln" to="Köln" />
+    <Word from="K6nig" to="König" />
+    <Word from="K6nige" to="Könige" />
+    <Word from="K6nigin" to="Königin" />
+    <Word from="k6nnen" to="können" />
+    <Word from="k6nnen's" to="können's" />
+    <Word from="k6nnest" to="könntest" />
+    <Word from="k6nnt" to="könnt" />
+    <Word from="K6nnte" to="Könnte" />
+    <Word from="k6nnte's" to="könnte's" />
+    <Word from="k6nnten" to="könnten" />
+    <Word from="k6nntest" to="könntest" />
+    <Word from="K6pfe" to="Köpfe" />
+    <Word from="K6rper" to="Körper" />
+    <Word from="K6rpers" to="Körpers" />
+    <Word from="K6stlich" to="Köstlich" />
+    <Word from="Kabelménner" to="Kabelmänner" />
+    <Word from="kalf" to="kalt" />
+    <Word from="kaltblijtig" to="kaltblĂĽtig" />
+    <Word from="kampfen" to="kämpfen" />
+    <Word from="Kampfjéger" to="Kampfjäger" />
+    <Word from="Kanarienviigeln" to="Kanarienvögeln" />
+    <Word from="kann'sja" to="kann's ja" />
+    <Word from="kannstja" to="kannst ja" />
+    <Word from="Kanélen" to="Kanälen" />
+    <Word from="Kapitan" to="Kapitän" />
+    <Word from="Kapitln" to="Kapitän" />
+    <Word from="Kapitlnen" to="Kapitänen" />
+    <Word from="Kapitlns" to="Kapitäns" />
+    <Word from="Kapitéin" to="Kapitän" />
+    <Word from="Kapitéinleutnant" to="Kapitänleutnant" />
+    <Word from="Kapitéins" to="Kapitäns" />
+    <Word from="Kapitén" to="Kapitän" />
+    <Word from="Kapiténleutnant" to="Kapitänleutnant" />
+    <Word from="Kapiténs" to="Kapitäns" />
+    <Word from="Kapt'n" to="Käpt'n" />
+    <Word from="kaputthaust" to="kaputt haust" />
+    <Word from="Kartoffelschélen" to="Kartoffelschälen" />
+    <Word from="Kassettengeréit" to="Kassettengerät" />
+    <Word from="kbnnen" to="können" />
+    <Word from="kbnnten" to="könnten" />
+    <Word from="kdnnen" to="können" />
+    <Word from="kdnnfe" to="könnte" />
+    <Word from="kdnnte" to="könnte" />
+    <Word from="ke/ne" to="keine" />
+    <Word from="Kefn" to="Kein" />
+    <Word from="Keh/1" to="Kehrt" />
+    <Word from="Keithl" to="Keith!" />
+    <Word from="keln" to="kein" />
+    <Word from="kelne" to="keine" />
+    <Word from="Keri" to="Kerl" />
+    <Word from="kfime" to="käme" />
+    <Word from="Kfimmer" to="KĂĽmmer" />
+    <Word from="kfimmere" to="kĂĽmmere" />
+    <Word from="kfimmern" to="kĂĽmmern" />
+    <Word from="kfimmert" to="kĂĽmmert" />
+    <Word from="kfimpft" to="kämpft" />
+    <Word from="kfimpften" to="kämpften" />
+    <Word from="Kfinig" to="König" />
+    <Word from="Kfinnen" to="Können" />
+    <Word from="kfinnte" to="könnte" />
+    <Word from="Kfinnten" to="Könnten" />
+    <Word from="Kfinntest" to="Könntest" />
+    <Word from="Kfiss" to="KĂĽss" />
+    <Word from="Kfisschen" to="KĂĽsschen" />
+    <Word from="Kfissen" to="KĂĽssen" />
+    <Word from="Kfjnnte" to="Könnte" />
+    <Word from="Khnlichkeit" to="Ă„hnlichkeit" />
+    <Word from="KIar" to="Klar" />
+    <Word from="Kifig" to="Käfig" />
+    <Word from="Kiiche" to="KĂĽche" />
+    <Word from="Kiichenhelfer" to="KĂĽchenhelfer" />
+    <Word from="Kiichln" to="Köchin" />
+    <Word from="Kiihe" to="KĂĽhe" />
+    <Word from="Kiihlbox" to="KĂĽhlbox" />
+    <Word from="kiihler" to="kĂĽhler" />
+    <Word from="Kiihlschrank" to="KĂĽhlschrank" />
+    <Word from="kiimmem" to="kĂĽmmern" />
+    <Word from="kiimmer" to="kĂĽmmer" />
+    <Word from="kiimmere" to="kĂĽmmere" />
+    <Word from="Kiimmern" to="KĂĽmmern" />
+    <Word from="kiindigen" to="kĂĽndigen" />
+    <Word from="Kiinig" to="König" />
+    <Word from="Kiinige" to="Könige" />
+    <Word from="Kiinigen" to="Königen" />
+    <Word from="Kiinigin" to="Königin" />
+    <Word from="Kiiniginnen" to="Königinnen" />
+    <Word from="kiinigliche" to="königliche" />
+    <Word from="kiiniglichen" to="königlichen" />
+    <Word from="kiiniglicher" to="königlicher" />
+    <Word from="Kiinigreichs" to="Königreichs" />
+    <Word from="Kiinigs" to="Königs" />
+    <Word from="Kiinigtum" to="Königtum" />
+    <Word from="kiinne" to="könne" />
+    <Word from="kiinnen" to="können" />
+    <Word from="kiinnt" to="könnt" />
+    <Word from="Kiinnte" to="Könnte" />
+    <Word from="kiinnten" to="könnten" />
+    <Word from="kiinntest" to="könntest" />
+    <Word from="kiinntet" to="könntet" />
+    <Word from="Kiinstler" to="KĂĽnstler" />
+    <Word from="kiinstlerischen" to="kĂĽnstlerischen" />
+    <Word from="kiipfen" to="köpfen" />
+    <Word from="Kiirper" to="Körper" />
+    <Word from="Kiirperfunktionen" to="Körperfunktionen" />
+    <Word from="Kiirperhaltung" to="Körperhaltung" />
+    <Word from="kiirperliche" to="körperliche" />
+    <Word from="Kiirperliches" to="Körperliches" />
+    <Word from="Kiirpersprache" to="Körpersprache" />
+    <Word from="Kiirperverletzung" to="Körperverletzung" />
+    <Word from="kiirzen" to="kĂĽrzen" />
+    <Word from="kiirzerzutreten" to="kĂĽrzerzutreten" />
+    <Word from="kiirzeste" to="kĂĽrzeste" />
+    <Word from="Kiisschen" to="KĂĽsschen" />
+    <Word from="Kiissen" to="KĂĽssen" />
+    <Word from="Kiisst" to="KĂĽsst" />
+    <Word from="Kiiste" to="KĂĽste" />
+    <Word from="kiistlich" to="köstlich" />
+    <Word from="Kijche" to="KĂĽche" />
+    <Word from="Kijhlschrank" to="KĂĽhlschrank" />
+    <Word from="Kijmmere" to="KĂĽmmere" />
+    <Word from="kijmmern" to="kĂĽmmern" />
+    <Word from="kijmmernl" to="kĂĽmmern!" />
+    <Word from="kijmmerst" to="kĂĽmmerst" />
+    <Word from="kijmmerten" to="kĂĽmmerten" />
+    <Word from="kijndigt" to="kĂĽndigt" />
+    <Word from="kijnnen" to="können" />
+    <Word from="kijnnt" to="könnt" />
+    <Word from="kijnnte" to="könnte" />
+    <Word from="kijnnten" to="könnten" />
+    <Word from="Kijnstler" to="KĂĽnstler" />
+    <Word from="Kijrbis" to="KĂĽrbis" />
+    <Word from="kijrzlich" to="kĂĽrzlich" />
+    <Word from="kijrzliche" to="kĂĽrzliche" />
+    <Word from="Kijrzungen" to="KĂĽrzungen" />
+    <Word from="kijsst" to="kĂĽsst" />
+    <Word from="Kijste" to="KĂĽste" />
+    <Word from="Kilche" to="KĂĽche" />
+    <Word from="Kilchlein" to="KĂĽchlein" />
+    <Word from="kilhlen" to="kĂĽhlen" />
+    <Word from="kilhler" to="kĂĽhler" />
+    <Word from="Kilhlkreislauf" to="KĂĽhlkreislauf" />
+    <Word from="Kilhlschrank" to="KĂĽhlschrank" />
+    <Word from="Kilmmern" to="KĂĽmmern" />
+    <Word from="Kilmmert" to="KĂĽmmert" />
+    <Word from="kilndigen" to="kĂĽndigen" />
+    <Word from="kilnstliche" to="kĂĽnstliche" />
+    <Word from="kilss" to="kĂĽss" />
+    <Word from="kilsse" to="kĂĽsse" />
+    <Word from="kilssen" to="kĂĽssen" />
+    <Word from="Kindermédchen" to="Kindermädchen" />
+    <Word from="Kinderspiell" to="Kinderspiel!" />
+    <Word from="Kindsképfe" to="Kindsköpfe" />
+    <Word from="kiokflip" to="kickflip" />
+    <Word from="KIotz" to="Klotz" />
+    <Word from="KL'lr" to="KĂĽr" />
+    <Word from="KL'lste" to="KĂĽste" />
+    <Word from="Klapsmiihle" to="KlapsmĂĽhle" />
+    <Word from="Klassemédchen" to="Klassemädchen" />
+    <Word from="kle/ne" to="kleine" />
+    <Word from="Kleidergr6Be" to="Kleidergröße" />
+    <Word from="Kleidergrfilie" to="Kleidergröße" />
+    <Word from="Kleinerl" to="Kleiner!" />
+    <Word from="kleinwiichsige" to="kleinwĂĽchsige" />
+    <Word from="kleinwilchsiges" to="kleinwĂĽchsiges" />
+    <Word from="klijger" to="klĂĽger" />
+    <Word from="klijgsten" to="klĂĽgsten" />
+    <Word from="klilger" to="klĂĽger" />
+    <Word from="kLinft'gen" to="kĂĽnft'gen" />
+    <Word from="klirst" to="klärst" />
+    <Word from="kljmmere" to="kĂĽmmere" />
+    <Word from="Kllirze" to="KĂĽrze" />
+    <Word from="kllissen" to="kĂĽssen" />
+    <Word from="Klliste" to="KĂĽste" />
+    <Word from="Klllche" to="KĂĽche" />
+    <Word from="klllhnsten" to="kĂĽhnsten" />
+    <Word from="kllllger" to="klĂĽger" />
+    <Word from="Klobtlrsten" to="KlobĂĽrsten" />
+    <Word from="klopfll" to="klopft!" />
+    <Word from="Klpt'n" to="Käpt'n" />
+    <Word from="Klpt'nl" to="Käpt'n!" />
+    <Word from="Klpt'ns" to="Käpt'ns" />
+    <Word from="Klse" to="Käse" />
+    <Word from="Klseschnuffelei" to="Käseschnüffelei" />
+    <Word from="Kltigste" to="KlĂĽgste" />
+    <Word from="Klugscheifler" to="Klugscheißer" />
+    <Word from="kléffen" to="kläffen" />
+    <Word from="Kléiren" to="Klären" />
+    <Word from="Kléranlage" to="Kläranlage" />
+    <Word from="Klére" to="Kläre" />
+    <Word from="kléren" to="klären" />
+    <Word from="Kn6pf" to="Knöpf" />
+    <Word from="Knallttite" to="KnalltĂĽte" />
+    <Word from="Knastwill" to="Knast will" />
+    <Word from="Knderung" to="Ă„nderung" />
+    <Word from="Knochengrfinde" to="KnochengrĂĽnde" />
+    <Word from="Knofen" to="Knoten" />
+    <Word from="Knuller" to="KnĂĽller" />
+    <Word from="Knupf" to="KnĂĽpf" />
+    <Word from="Knupfe" to="KnĂĽpfe" />
+    <Word from="knupfen" to="knĂĽpfen" />
+    <Word from="knzjipfe" to="knĂĽpfe" />
+    <Word from="Knédell" to="Knödel!" />
+    <Word from="knépf" to="knöpf" />
+    <Word from="Knépfe" to="Knöpfe" />
+    <Word from="Knésten" to="Knästen" />
+    <Word from="Kofferraumschliissel" to="KofferraumschlĂĽssel" />
+    <Word from="Kohlenséure" to="Kohlensäure" />
+    <Word from="Komafélle" to="Komafälle" />
+    <Word from="Komaféllen" to="Komafällen" />
+    <Word from="Kombiise" to="KombĂĽse" />
+    <Word from="Kombuse" to="KombĂĽse" />
+    <Word from="Komiidie" to="Komödie" />
+    <Word from="kommerz/ellen" to="kommerziellen" />
+    <Word from="kommjetzt" to="komm jetzt" />
+    <Word from="Kompatibilitfits" to="Kompatibilitäts" />
+    <Word from="Kompatibilitéits" to="Kompatibilitäts" />
+    <Word from="Kompatiblit5ts" to="Kompatiblitäts" />
+    <Word from="Komédie" to="Komödie" />
+    <Word from="KONIGIN" to="KĂ–NIGIN" />
+    <Word from="konne" to="könne" />
+    <Word from="konnen" to="können" />
+    <Word from="konnt" to="könnt" />
+    <Word from="konsen/ativ" to="konservativ" />
+    <Word from="Kopfabreifimann" to="KopfabreiĂźmann" />
+    <Word from="Kopfgeldjéger" to="Kopfgeldjäger" />
+    <Word from="Kopfgeldjégern" to="Kopfgeldjägern" />
+    <Word from="Kopfméfiig" to="Kopfmäßig" />
+    <Word from="Kopfnijsse" to="KopfnĂĽsse" />
+    <Word from="kostengtlnstige" to="kostengĂĽnstige" />
+    <Word from="Kostiim" to="KostĂĽm" />
+    <Word from="Kostiimdesigner" to="KostĂĽmdesigner" />
+    <Word from="Kostiimdesignerin" to="KostĂĽmdesignerin" />
+    <Word from="Kostiimdrama" to="KostĂĽmdrama" />
+    <Word from="Kostiime" to="KostĂĽme" />
+    <Word from="Kostiims" to="KostĂĽms" />
+    <Word from="Kostume" to="KostĂĽme" />
+    <Word from="Kostflm" to="Kostüm" />
+    <Word from="kr/egen" to="kriegen" />
+    <Word from="kr6ne" to="kröne" />
+    <Word from="kr6nen" to="krönen" />
+    <Word from="Kr6ten" to="Kröten" />
+    <Word from="Krafte" to="Kräfte" />
+    <Word from="Kraftwfirfel" to="KraftwĂĽrfel" />
+    <Word from="Kranfflhrer" to="Kranführer" />
+    <Word from="Kreativitét" to="Kreativität" />
+    <Word from="Kreuzverhor" to="Kreuzverhör" />
+    <Word from="krfiftiger" to="kräftiger" />
+    <Word from="Krfiutertee" to="Kräutertee" />
+    <Word from="Kriegserklérungen" to="Kriegserklärungen" />
+    <Word from="Kriegsfuhrung" to="KriegsfĂĽhrung" />
+    <Word from="Kriegsschauplatze" to="Kriegsschauplätze" />
+    <Word from="Kriifte" to="Kräfte" />
+    <Word from="Kriinung" to="Krönung" />
+    <Word from="Kriinungsfeier" to="Krönungsfeier" />
+    <Word from="Krijppel" to="KrĂĽppel" />
+    <Word from="Krijte" to="Kröte" />
+    <Word from="Kronjuwell" to="Kronjuwel!" />
+    <Word from="KROTE" to="KRĂ–TE" />
+    <Word from="Krsche" to="Ă„rsche" />
+    <Word from="Kréfte" to="Kräfte" />
+    <Word from="Kréften" to="Kräften" />
+    <Word from="Kréftigsten" to="Kräftigsten" />
+    <Word from="Kréhe" to="Krähe" />
+    <Word from="kréht" to="kräht" />
+    <Word from="kréichzt" to="krächzt" />
+    <Word from="Kréifte" to="Kräfte" />
+    <Word from="Kréiutertee" to="Kräutertee" />
+    <Word from="Krémpfe" to="Krämpfe" />
+    <Word from="krénte" to="krönte" />
+    <Word from="Kréte" to="Kröte" />
+    <Word from="Krétes" to="Krötes" />
+    <Word from="Kréutern" to="Kräutern" />
+    <Word from="Kréutersenf" to="Kräutersenf" />
+    <Word from="Ktiche" to="KĂĽche" />
+    <Word from="Ktinige" to="Könige" />
+    <Word from="ktinntest" to="könntest" />
+    <Word from="Ktisschen" to="KĂĽsschen" />
+    <Word from="ktlmmere" to="kĂĽmmere" />
+    <Word from="ktznnen" to="können" />
+    <Word from="Kuche" to="KĂĽche" />
+    <Word from="KUCHE" to="KĂśCHE" />
+    <Word from="Kuckucksgeréusch" to="Kuckucksgeräusch" />
+    <Word from="KUl'ZSCl'1lUSS9" to="KĂĽrzschlĂĽsse" />
+    <Word from="kulz" to="kurz" />
+    <Word from="kummer" to="kĂĽmmer" />
+    <Word from="Kummere" to="KĂĽmmere" />
+    <Word from="kummern" to="kĂĽmmern" />
+    <Word from="kummert" to="kĂĽmmert" />
+    <Word from="Kumpell" to="Kumpel!" />
+    <Word from="Kunststficke" to="KunststĂĽcke" />
+    <Word from="Kunststticke" to="KunststĂĽcke" />
+    <Word from="Kuriositéten" to="Kuriositäten" />
+    <Word from="kurzeste" to="kĂĽrzeste" />
+    <Word from="kurzte" to="kĂĽrzte" />
+    <Word from="Kurzwellenfunkgeréte" to="Kurzwellenfunkgeräte" />
+    <Word from="Kurzzeitgediichtnis" to="Kurzzeitgedächtnis" />
+    <Word from="Kurzzeitgedéchtnis" to="Kurzzeitgedächtnis" />
+    <Word from="KUS1I€" to="Küste" />
+    <Word from="Kuschelhengstl" to="Kuschelhengst!" />
+    <Word from="KUSSE" to="KĂśSSE" />
+    <Word from="KUSSGH" to="kĂĽssen" />
+    <Word from="kusste" to="kĂĽsste" />
+    <Word from="KUSTE" to="KĂśSTE" />
+    <Word from="Kuste" to="KĂĽste" />
+    <Word from="Kéfer" to="Käfer" />
+    <Word from="Kéfig" to="Käfig" />
+    <Word from="kéime" to="käme" />
+    <Word from="kéimpfen" to="kämpfen" />
+    <Word from="kéimpfend" to="kämpfend" />
+    <Word from="kéimpft" to="kämpft" />
+    <Word from="kéimpfte" to="kämpfte" />
+    <Word from="kéimpften" to="kämpften" />
+    <Word from="kéimpftest" to="kämpftest" />
+    <Word from="kéimpfwie" to="kämpf wie" />
+    <Word from="Kéinguru" to="Känguru" />
+    <Word from="kéinnen" to="können" />
+    <Word from="kéinnte" to="könnte" />
+    <Word from="Kéirper" to="Körper" />
+    <Word from="Kéise" to="Käse" />
+    <Word from="Kéisebrunnen" to="Käsebrunnen" />
+    <Word from="Kélte" to="Kälte" />
+    <Word from="kélter" to="kälter" />
+    <Word from="kélteste" to="kälteste" />
+    <Word from="kéme" to="käme" />
+    <Word from="kémen" to="kämen" />
+    <Word from="kémpfe" to="kämpfe" />
+    <Word from="Kémpfen" to="Kämpfen" />
+    <Word from="Kémpfer" to="Kämpfer" />
+    <Word from="kémpferische" to="kämpferische" />
+    <Word from="kémpfst" to="kämpfst" />
+    <Word from="kémpft" to="kämpft" />
+    <Word from="kémpfte" to="kämpfte" />
+    <Word from="kémpften" to="kämpften" />
+    <Word from="kémt" to="kämt" />
+    <Word from="Kénig" to="König" />
+    <Word from="Kénige" to="Könige" />
+    <Word from="Kénigin" to="Königin" />
+    <Word from="Kéniginl" to="Königin!" />
+    <Word from="Kéniginnen" to="Königinnen" />
+    <Word from="kéniglich" to="königlich" />
+    <Word from="kénigliche" to="königliche" />
+    <Word from="kéniglichen" to="königlichen" />
+    <Word from="kénigliches" to="königliches" />
+    <Word from="Kénigreich" to="Königreich" />
+    <Word from="Kénigreichs" to="Königreichs" />
+    <Word from="Kénigs" to="Königs" />
+    <Word from="Kénigsfamilie" to="Königsfamilie" />
+    <Word from="kénne" to="könne" />
+    <Word from="kénnen" to="können" />
+    <Word from="kénnt" to="könnt" />
+    <Word from="kénnte" to="könnte" />
+    <Word from="Kénnten" to="Könnten" />
+    <Word from="Kénntest" to="Könntest" />
+    <Word from="Kénntet" to="Könntet" />
+    <Word from="Képfchen" to="Köpfchen" />
+    <Word from="Képfe" to="Köpfe" />
+    <Word from="Képfen" to="Köpfen" />
+    <Word from="képft" to="köpft" />
+    <Word from="Képt'n" to="Käpt'n" />
+    <Word from="Kérbchen" to="Körbchen" />
+    <Word from="Kérbchengréfie" to="Körbchengröße" />
+    <Word from="Kérben" to="Körben" />
+    <Word from="Kérper" to="Körper" />
+    <Word from="Kérperfunktionen" to="Körperfunktionen" />
+    <Word from="kérperlich" to="körperlich" />
+    <Word from="kérperliche" to="körperliche" />
+    <Word from="Kérperproportionen" to="Körperproportionen" />
+    <Word from="Kérpersprache" to="Körpersprache" />
+    <Word from="Kérpertyp" to="Körpertyp" />
+    <Word from="Kérperverletzung" to="Körperverletzung" />
+    <Word from="Kérperéffnungen" to="Körperöffnungen" />
+    <Word from="Kése" to="Käse" />
+    <Word from="Késebrett" to="Käsebrett" />
+    <Word from="Késecracker" to="Käsecracker" />
+    <Word from="késtlich" to="köstlich" />
+    <Word from="Kéter" to="Köter" />
+    <Word from="Kétern" to="Kötern" />
+    <Word from="Kflmmere" to="Kümmere" />
+    <Word from="kflmmern" to="kümmern" />
+    <Word from="L'a'cherlich" to="Lächerlich" />
+    <Word from="L'a'ndern" to="Ländern" />
+    <Word from="l'a'sst" to="lässt" />
+    <Word from="l'a'uft" to="läuft" />
+    <Word from="l/chtes" to="lichtes" />
+    <Word from="l/Vings" to="Wings" />
+    <Word from="L5cheln" to="Lächeln" />
+    <Word from="L6ffel" to="Löffel" />
+    <Word from="L6schen" to="Löschen" />
+    <Word from="L6se" to="Löse" />
+    <Word from="l6sen" to="lösen" />
+    <Word from="L6wen" to="Löwen" />
+    <Word from="L6win" to="Löwin" />
+    <Word from="LADIESMANZ17" to="LADIESMAN217" />
+    <Word from="Landhéuser" to="Landhäuser" />
+    <Word from="Landstrafle" to="Landstraße" />
+    <Word from="Landséiugetier" to="Landsäugetier" />
+    <Word from="langl" to="lang!" />
+    <Word from="langweiligl" to="langweilig!" />
+    <Word from="Lasergestutzte" to="LasergestĂĽtzte" />
+    <Word from="Laserzielgerét" to="Laserzielgerät" />
+    <Word from="Lattenzaunweifl" to="Lattenzaunweiß" />
+    <Word from="Laudal" to="Lauda!" />
+    <Word from="laufl" to="lauf!" />
+    <Word from="Laufl" to="Lauf!" />
+    <Word from="LaĂź" to="Lass" />
+    <Word from="lch" to="Ich" />
+    <Word from="ldee" to="Idee" />
+    <Word from="ldeen" to="Ideen" />
+    <Word from="ldelia" to="Idelia" />
+    <Word from="ldentifikation" to="Identifikation" />
+    <Word from="ldentifikationsnummer" to="Identifikationsnummer" />
+    <Word from="ldentifikationssignal" to="Identifikationssignal" />
+    <Word from="ldentifizierung" to="Identifizierung" />
+    <Word from="ldentit'a'tsscheibe" to="ldentitätsscheibe" />
+    <Word from="ldioten" to="Idioten" />
+    <Word from="ldloten" to="Idioten" />
+    <Word from="Le/d" to="Leid" />
+    <Word from="Lebenl" to="Leben!" />
+    <Word from="lebensféhig" to="lebensfähig" />
+    <Word from="lebenslénglich" to="lebenslänglich" />
+    <Word from="lebensmijlde" to="lebensmĂĽde" />
+    <Word from="Leberschéden" to="Leberschäden" />
+    <Word from="leergegessen" to="leer gegessen" />
+    <Word from="legendére" to="legendäre" />
+    <Word from="legendéren" to="legendären" />
+    <Word from="Legionér" to="Legionär" />
+    <Word from="Legionére" to="Legionäre" />
+    <Word from="Lehe" to="Lebe" />
+    <Word from="Leichenschéndung" to="Leichenschändung" />
+    <Word from="leichtjemanden" to="leicht jemanden" />
+    <Word from="leidl" to="leid!" />
+    <Word from="Leistuljg" to="Leistung" />
+    <Word from="Lelbwfichter" to="Leibwächter" />
+    <Word from="Leld" to="Leid" />
+    <Word from="lemen" to="lernen" />
+    <Word from="Lenkséule" to="Lenksäule" />
+    <Word from="lfidt" to="lädt" />
+    <Word from="lfigt" to="lĂĽgt" />
+    <Word from="lfinger" to="länger" />
+    <Word from="lfiuft" to="läuft" />
+    <Word from="Lfiuterung" to="Läuterung" />
+    <Word from="lgitt" to="Igitt" />
+    <Word from="lgnorier" to="Ignorier" />
+    <Word from="lhm" to="Ihm" />
+    <Word from="lhn" to="Ihn" />
+    <Word from="lhnen" to="Ihnen" />
+    <Word from="lhnenl" to="Ihnen!" />
+    <Word from="lhr" to="Ihr" />
+    <Word from="lhre" to="Ihre" />
+    <Word from="lhrem" to="Ihrem" />
+    <Word from="lhren" to="Ihren" />
+    <Word from="lhrer" to="Ihrer" />
+    <Word from="lhrerverffigung" to="Ihrer VerfĂĽgung" />
+    <Word from="lhres" to="Ihres" />
+    <Word from="lhrfehlt" to="Ihr fehlt" />
+    <Word from="lhrjemalsjemanden" to="lhr jemals jemanden" />
+    <Word from="lhrVerteidiger" to="lhr Verteidiger" />
+    <Word from="Libel" to="ĂĽbel" />
+    <Word from="Libelwollen" to="ĂĽbelwollen" />
+    <Word from="Liben" to="ĂĽben" />
+    <Word from="Liber" to="ĂĽber" />
+    <Word from="Liberall" to="ĂĽberall" />
+    <Word from="Liberdenken" to="ĂĽberdenken" />
+    <Word from="Liberdrllissig" to="ĂĽberdrĂĽssig" />
+    <Word from="Liberfallen" to="ĂĽberfallen" />
+    <Word from="Libergebrannt" to="ĂĽbergebrannt" />
+    <Word from="Liberhaupt" to="ĂĽberhaupt" />
+    <Word from="Liberlasst" to="ĂĽberlasst" />
+    <Word from="Liberleben" to="Ăśberleben" />
+    <Word from="Liberlegen" to="ĂĽberlegen" />
+    <Word from="Liberlegt" to="ĂĽberlegt" />
+    <Word from="Libernimmt" to="ĂĽbernimmt" />
+    <Word from="Liberpriift" to="ĂĽberprĂĽft" />
+    <Word from="Liberreden" to="ĂĽberreden" />
+    <Word from="Libersteht" to="ĂĽbersteht" />
+    <Word from="Liberstllirzen" to="ĂĽberstĂĽrzen" />
+    <Word from="Liberwachen" to="ĂĽberwachen" />
+    <Word from="Liberwacht" to="ĂĽberwacht" />
+    <Word from="Liberwinden" to="ĂĽberwinden" />
+    <Word from="Liberwéltigen" to="überwältigen" />
+    <Word from="Liberwéltigt" to="überwältigt" />
+    <Word from="Liberzeugt" to="ĂĽberzeugt" />
+    <Word from="Lible" to="ĂĽble" />
+    <Word from="Liblich" to="ĂĽblich" />
+    <Word from="Libliche" to="Ăśbliche" />
+    <Word from="Librig" to="ĂĽbrig" />
+    <Word from="lie/3" to="lieĂź" />
+    <Word from="lie/Se" to="lieĂźe" />
+    <Word from="lieB" to="lieĂź" />
+    <Word from="lieBe" to="lieĂźe" />
+    <Word from="liebenswilrdig" to="liebenswĂĽrdig" />
+    <Word from="liebenswurdiger" to="liebenswĂĽrdiger" />
+    <Word from="Liebesgestiindnis" to="Liebesgeständnis" />
+    <Word from="Lieblingsbeschéftigung" to="Lieblingsbeschäftigung" />
+    <Word from="Lieblingsrockerl" to="Lieblingsrocker!" />
+    <Word from="Lieblingssétze" to="Lieblingssätze" />
+    <Word from="lief2&gt;en" to="lieĂźen" />
+    <Word from="Liefergebiihren" to="LiefergebĂĽhren" />
+    <Word from="lieflsen" to="lieĂźen" />
+    <Word from="liegenlassen" to="liegen lassen" />
+    <Word from="Liehe" to="Liebe" />
+    <Word from="lieli" to="lieĂź" />
+    <Word from="lielien" to="lieĂźen" />
+    <Word from="Liellen" to="LieĂźen" />
+    <Word from="liells" to="lieĂź" />
+    <Word from="lien" to="lieĂź" />
+    <Word from="Liicher" to="Löcher" />
+    <Word from="Liige" to="LĂĽge" />
+    <Word from="Liigner" to="LĂĽgner" />
+    <Word from="liinger" to="länger" />
+    <Word from="liischen" to="löschen" />
+    <Word from="liischt" to="löscht" />
+    <Word from="Liisst" to="Lässt" />
+    <Word from="liist" to="löst" />
+    <Word from="Liisung" to="Lösung" />
+    <Word from="Liisungen" to="Lösungen" />
+    <Word from="Liiwen" to="Löwen" />
+    <Word from="Liiflung" to="Lüftung" />
+    <Word from="lijgen" to="lĂĽgen" />
+    <Word from="Lijgner" to="LĂĽgner" />
+    <Word from="Lilgner" to="LĂĽgner" />
+    <Word from="lilgst" to="lĂĽgst" />
+    <Word from="lilgt" to="lĂĽgt" />
+    <Word from="Lilterer" to="Ă„lterer" />
+    <Word from="LIMOUSINENSERVICE10I06" to="LIMOUSINENSERVICE 10:06" />
+    <Word from="linger" to="länger" />
+    <Word from="lke's" to="Ike's" />
+    <Word from="lkone" to="Ikone" />
+    <Word from="lL'lgt" to="lĂĽgt" />
+    <Word from="Llberstehen" to="ĂĽberstehen" />
+    <Word from="Llebe" to="Liebe" />
+    <Word from="llebt" to="liebt" />
+    <Word from="lllfie" to="Wie" />
+    <Word from="lllfillensstark" to="Willensstark" />
+    <Word from="lllfillie's" to="Willie's" />
+    <Word from="lllfir" to="Wir" />
+    <Word from="Lllignerl" to="LĂĽgner!" />
+    <Word from="llligtl" to="lĂĽgt!" />
+    <Word from="lllusionen" to="Illusionen" />
+    <Word from="llngst" to="längst" />
+    <Word from="llztlicher" to="ärztlicher" />
+    <Word from="lm" to="Im" />
+    <Word from="lmbiss" to="Imbiss" />
+    <Word from="lmmer" to="Immer" />
+    <Word from="lmmigranten" to="Immigranten" />
+    <Word from="lmpuls" to="Impuls" />
+    <Word from="lmpulsantrieb" to="Impulsantrieb" />
+    <Word from="lndianer" to="Indianer" />
+    <Word from="lndianerin" to="Indianerin" />
+    <Word from="lndianermédchen" to="Indianermädchen" />
+    <Word from="lndianertanz" to="Indianertanz" />
+    <Word from="lndikation" to="Indikation" />
+    <Word from="lndividualitét" to="Individualität" />
+    <Word from="lndividuen" to="Individuen" />
+    <Word from="lndividuum" to="Individuum" />
+    <Word from="lnduktion" to="Induktion" />
+    <Word from="lneffizienz" to="Ineffizienz" />
+    <Word from="lnformationen" to="Informationen" />
+    <Word from="lnfos" to="Infos" />
+    <Word from="lngenieur" to="Ingenieur" />
+    <Word from="lngenieure" to="Ingenieure" />
+    <Word from="lnhalt" to="Inhalt" />
+    <Word from="lnhalte" to="Inhalte" />
+    <Word from="lnnenraum" to="Innenraum" />
+    <Word from="lnnenréume" to="Innenräume" />
+    <Word from="lnsekt" to="Insekt" />
+    <Word from="lnsekten" to="Insekten" />
+    <Word from="lnsel" to="Insel" />
+    <Word from="lnserat" to="Inserat" />
+    <Word from="lnspektion" to="Inspektion" />
+    <Word from="lnstinkt" to="Instinkt" />
+    <Word from="lnstinkte" to="Instinkte" />
+    <Word from="lnstitut" to="Institut" />
+    <Word from="lnstrumente" to="Instrumente" />
+    <Word from="lnstrumentenwagen" to="Instrumentenwagen" />
+    <Word from="lnsubordination" to="Insubordination" />
+    <Word from="lntellektuellste" to="Intellektuellste" />
+    <Word from="lntelligenz" to="Intelligenz" />
+    <Word from="lntensivstation" to="Intensivstation" />
+    <Word from="lnteraktion" to="Interaktion" />
+    <Word from="lnteresse" to="Interesse" />
+    <Word from="lnteressen" to="Interessen" />
+    <Word from="lnternat" to="Internat" />
+    <Word from="lntrigantin" to="Intrigantin" />
+    <Word from="lntrigantl" to="Intrigant!" />
+    <Word from="lntrigen" to="Intrigen" />
+    <Word from="lnverness" to="Inverness" />
+    <Word from="lnvestition" to="Investition" />
+    <Word from="lnvestoren" to="Investoren" />
+    <Word from="lnzucht" to="Inzucht" />
+    <Word from="lo" to="Io" />
+    <Word from="Lordkémmerer" to="Lordkämmerer" />
+    <Word from="losf" to="los!" />
+    <Word from="losl" to="los!" />
+    <Word from="loswflrde" to="loswürde" />
+    <Word from="Lou/e" to="Louie" />
+    <Word from="Loyalitét" to="Loyalität" />
+    <Word from="lrak" to="Irak" />
+    <Word from="lraner" to="Iraner" />
+    <Word from="lren" to="Iren" />
+    <Word from="Lrgendetvvas" to="Irgendetwas" />
+    <Word from="lrland" to="Irland" />
+    <Word from="lronhide" to="Ironhide" />
+    <Word from="lronie" to="Ironie" />
+    <Word from="lrre" to="Irre" />
+    <Word from="lrren" to="Irren" />
+    <Word from="lrrenanstalt" to="Irrenanstalt" />
+    <Word from="lrrenhaus" to="Irrenhaus" />
+    <Word from="lrrer" to="Irrer" />
+    <Word from="lrrgarten" to="Irrgarten" />
+    <Word from="lrrlicht" to="Irrlicht" />
+    <Word from="lrrlichter" to="Irrlichter" />
+    <Word from="lrrsinn" to="Irrsinn" />
+    <Word from="lrrsinns" to="Irrsinns" />
+    <Word from="lrrtum" to="Irrtum" />
+    <Word from="lscandar" to="Iscandar" />
+    <Word from="lscandars" to="Iscandars" />
+    <Word from="lsolierband" to="Isolierband" />
+    <Word from="lss" to="Iss" />
+    <Word from="lstja" to="Ist ja" />
+    <Word from="ltaker" to="Itaker" />
+    <Word from="ltakerflossen" to="Itakerflossen" />
+    <Word from="ltalo" to="Italo" />
+    <Word from="Ltiffel" to="Löffel" />
+    <Word from="ltlgen" to="lĂĽgen" />
+    <Word from="Lufijagen" to="Luft jagen" />
+    <Word from="Luftballonsl" to="Luftballons!" />
+    <Word from="Luftjagen" to="Luft jagen" />
+    <Word from="Luftunterstfltzung" to="Luftunterstützung" />
+    <Word from="LUgen" to="LĂĽgen" />
+    <Word from="lvléidchen" to="Mädchen" />
+    <Word from="lwan" to="Iwan" />
+    <Word from="l§uft's" to="läuft's" />
+    <Word from="Léchelmfinderl" to="Lächelmünder!" />
+    <Word from="lécheln" to="lächeln" />
+    <Word from="léchelt" to="lächelt" />
+    <Word from="Lécher" to="Löcher" />
+    <Word from="Lécherlich" to="Lächerlich" />
+    <Word from="lécherliches" to="lächerliches" />
+    <Word from="Léchle" to="Lächle" />
+    <Word from="lédt" to="lädt" />
+    <Word from="Léffel" to="Löffel" />
+    <Word from="lége" to="läge" />
+    <Word from="Léicheln" to="Lächeln" />
+    <Word from="Léicherlich" to="Lächerlich" />
+    <Word from="léichle" to="lächle" />
+    <Word from="Léindchen" to="Ländchen" />
+    <Word from="léingst" to="längst" />
+    <Word from="léisen" to="lösen" />
+    <Word from="léissig" to="lässig" />
+    <Word from="léisst" to="lässt" />
+    <Word from="Léiuft" to="Läuft" />
+    <Word from="Léjsung" to="Lösung" />
+    <Word from="Lémmchen" to="Lämmchen" />
+    <Word from="Lémmer" to="Lämmer" />
+    <Word from="Lénder" to="Länder" />
+    <Word from="Léndern" to="Ländern" />
+    <Word from="Lénge" to="Länge" />
+    <Word from="Léngen" to="Längen" />
+    <Word from="lénger" to="länger" />
+    <Word from="léngst" to="längst" />
+    <Word from="léngste" to="längste" />
+    <Word from="Lérm" to="Lärm" />
+    <Word from="Lérmbeschwerden" to="Lärmbeschwerden" />
+    <Word from="léschen" to="löschen" />
+    <Word from="Lése" to="Löse" />
+    <Word from="Lésegeld" to="Lösegeld" />
+    <Word from="lésst" to="lässt" />
+    <Word from="lést" to="löst" />
+    <Word from="léste" to="löste" />
+    <Word from="lésten" to="lösten" />
+    <Word from="léstig" to="listig" />
+    <Word from="Lésung" to="Lösung" />
+    <Word from="léufig" to="läufig" />
+    <Word from="léufst" to="läufst" />
+    <Word from="Léuft" to="Läuft" />
+    <Word from="léuten" to="läuten" />
+    <Word from="léutet" to="läutet" />
+    <Word from="Léwe" to="Löwe" />
+    <Word from="Lflgner" to="Lügner" />
+    <Word from="M'a'dchen" to="Mädchen" />
+    <Word from="m/ese" to="miese" />
+    <Word from="M/ffsommernachfsfraum" to="Mittsommernachtstraum" />
+    <Word from="M/r" to="Mir" />
+    <Word from="M0I8KUI" to="MolekĂĽl" />
+    <Word from="m6belt" to="möbelt" />
+    <Word from="m6chte" to="möchte" />
+    <Word from="m6chtest" to="möchtest" />
+    <Word from="m6gen" to="mögen" />
+    <Word from="m6glich" to="möglich" />
+    <Word from="m6glichen" to="möglichen" />
+    <Word from="m6glicher" to="möglicher" />
+    <Word from="m6gt" to="mögt" />
+    <Word from="M6rder" to="Mörder" />
+    <Word from="MaB" to="MaĂź" />
+    <Word from="MaBgabe" to="MaĂźgabe" />
+    <Word from="mac/1e" to="mache" />
+    <Word from="mac/7" to="nach" />
+    <Word from="machs" to="mach's" />
+    <Word from="Machtiibernahme" to="MachtĂĽbernahme" />
+    <Word from="madenschwéinziger" to="madenschwänziger" />
+    <Word from="Mafinahme" to="MaĂźnahme" />
+    <Word from="Magengeschwiire" to="MagengeschwĂĽre" />
+    <Word from="Magengeschwilr" to="MagengeschwĂĽr" />
+    <Word from="Magengeschwtir" to="MagengeschwĂĽr" />
+    <Word from="Magnolienbliiten" to="MagnolienblĂĽten" />
+    <Word from="Majesfait" to="Majestät" />
+    <Word from="Majestéit" to="Majestät" />
+    <Word from="Majestét" to="Majestät" />
+    <Word from="Majestéten" to="Majestäten" />
+    <Word from="Mal2&gt;en" to="MaĂźen" />
+    <Word from="Mal3en" to="MaĂźen" />
+    <Word from="malf" to="mal!" />
+    <Word from="Malinahme" to="MaĂźnahme" />
+    <Word from="mall" to="mal!" />
+    <Word from="Mallregelten" to="MaĂźregelten" />
+    <Word from="Mandverstation" to="Manöverstation" />
+    <Word from="Manfiver" to="Manöver" />
+    <Word from="Maniiver" to="Manöver" />
+    <Word from="Manikfire" to="ManikĂĽre" />
+    <Word from="Mannschafl" to="Mannschaft" />
+    <Word from="Manscllefl'enkm'5pfe" to="Manschettenknöpfe" />
+    <Word from="Manéiver" to="Manöver" />
+    <Word from="Manéver" to="Manöver" />
+    <Word from="manévrieren" to="manövrieren" />
+    <Word from="manévrierféhig" to="manövrierfähig" />
+    <Word from="Manévriermodus" to="Manövriermodus" />
+    <Word from="Margoliserklfirung" to="Margoliserklärung" />
+    <Word from="Margoliserklérung" to="Margoliserklärung" />
+    <Word from="marschéhnliche" to="marschähnliche" />
+    <Word from="Massagestllihlen" to="MassagestĂĽhlen" />
+    <Word from="Massenzerstérung" to="Massenzerstörung" />
+    <Word from="Massenzerstérungswaffen" to="Massenzerstörungswaffen" />
+    <Word from="Mater/al" to="Material" />
+    <Word from="Maxiriicke" to="Maxiröcke" />
+    <Word from="Mayonaise" to="Mayonnaise" />
+    <Word from="mbglichst" to="möglichst" />
+    <Word from="Mdge" to="Möge" />
+    <Word from="mdglichen/veise" to="möglicherweise" />
+    <Word from="mdglicherweise" to="möglicherweise" />
+    <Word from="Mdglichkeit" to="Möglichkeit" />
+    <Word from="me/n" to="mein" />
+    <Word from="mehrZeit" to="mehr Zeit" />
+    <Word from="mein'ja" to="mein' ja" />
+    <Word from="meinerjetzigen" to="meiner jetzigen" />
+    <Word from="Meinungséufierung" to="Meinungsäußerung" />
+    <Word from="Meisterbréu" to="Meisterbräu" />
+    <Word from="Meisterstijck" to="MeisterstĂĽck" />
+    <Word from="meistgehasste" to="meist gehasste" />
+    <Word from="meln" to="mein" />
+    <Word from="melne" to="meine" />
+    <Word from="Mend" to="Mond" />
+    <Word from="Menschenhéindler" to="Menschenhändler" />
+    <Word from="Menstruationsstérungen" to="Menstruationsstörungen" />
+    <Word from="Merkwiirdig" to="MerkwĂĽrdig" />
+    <Word from="Merkwiirdige" to="MerkwĂĽrdige" />
+    <Word from="merkwiirdiger" to="merkwĂĽrdiger" />
+    <Word from="merkwilrdig" to="merkwĂĽrdig" />
+    <Word from="merkwlllrdige" to="merkwĂĽrdige" />
+    <Word from="merkwurdig" to="merkwĂĽrdig" />
+    <Word from="merkwurolig" to="merkwĂĽrdig" />
+    <Word from="merkwflrdig" to="merkwürdig" />
+    <Word from="Messgerét" to="Messgerät" />
+    <Word from="mfichte" to="möchte" />
+    <Word from="Mfichten" to="Möchten" />
+    <Word from="Mfidchen" to="Mädchen" />
+    <Word from="Mfidchenl" to="Mädchen!" />
+    <Word from="Mfidels" to="Mädels" />
+    <Word from="mfigen" to="mögen" />
+    <Word from="Mfigliche" to="Mögliche" />
+    <Word from="mfiglichen" to="möglichen" />
+    <Word from="mfiglicherweise" to="möglicherweise" />
+    <Word from="Mfill" to="MĂĽll" />
+    <Word from="Mfillhalde" to="MĂĽllhalde" />
+    <Word from="Mfinchen" to="MĂĽnchen" />
+    <Word from="Mfinder" to="MĂĽnder" />
+    <Word from="Mfinnern" to="Männern" />
+    <Word from="Mfissen" to="MĂĽssen" />
+    <Word from="mfisst" to="mĂĽsst" />
+    <Word from="mfisste" to="mĂĽsste" />
+    <Word from="Mfjrder" to="Mörder" />
+    <Word from="Midchen" to="Mädchen" />
+    <Word from="Migrane" to="Migräne" />
+    <Word from="Migréne" to="Migräne" />
+    <Word from="Migrflne" to="Migräne" />
+    <Word from="miichte" to="möchte" />
+    <Word from="Miichtegern" to="Möchtegern" />
+    <Word from="Miichten" to="Möchten" />
+    <Word from="miichtest" to="möchtest" />
+    <Word from="miide" to="mĂĽde" />
+    <Word from="Miidels" to="Mädels" />
+    <Word from="miides" to="mĂĽdes" />
+    <Word from="miige" to="möge" />
+    <Word from="miigen" to="mögen" />
+    <Word from="miiglich" to="möglich" />
+    <Word from="miigliche" to="mögliche" />
+    <Word from="miiglichen" to="möglichen" />
+    <Word from="miigliches" to="mögliches" />
+    <Word from="Miiglichkeit" to="Möglichkeit" />
+    <Word from="Miiglichkeiten" to="Möglichkeiten" />
+    <Word from="miigt" to="mögt" />
+    <Word from="Miill" to="MĂĽll" />
+    <Word from="Miillhalde" to="MĂĽllhalde" />
+    <Word from="Miilltonnen" to="MĂĽlltonnen" />
+    <Word from="miilssen" to="mĂĽssen" />
+    <Word from="miirderisch" to="mörderisch" />
+    <Word from="miisse" to="mĂĽsse" />
+    <Word from="Miissen" to="MĂĽssen" />
+    <Word from="miisst" to="mĂĽsst" />
+    <Word from="miisste" to="mĂĽsste" />
+    <Word from="Miiuse" to="Mäuse" />
+    <Word from="mijchte" to="möchte" />
+    <Word from="Mijcken" to="MĂĽcken" />
+    <Word from="Mijhe" to="MĂĽhe" />
+    <Word from="Mijnzen" to="MĂĽnzen" />
+    <Word from="mijssen" to="mĂĽssen" />
+    <Word from="mijsst" to="mĂĽsst" />
+    <Word from="mijsste" to="mĂĽsste" />
+    <Word from="mijsstest" to="mĂĽsstest" />
+    <Word from="Milchstrafie" to="MilchstraĂźe" />
+    <Word from="Milhe" to="MĂĽhe" />
+    <Word from="Milhle" to="MĂĽhle" />
+    <Word from="MILITAR" to="MILITĂ„R" />
+    <Word from="Militiirprogramme" to="Militärprogramme" />
+    <Word from="Militir" to="Militär" />
+    <Word from="militlrische" to="militärische" />
+    <Word from="Militéirkodex" to="Militärkodex" />
+    <Word from="Militér" to="Militär" />
+    <Word from="Militérakademie" to="Militärakademie" />
+    <Word from="Militérdienst" to="Militärdienst" />
+    <Word from="militérischen" to="militärischen" />
+    <Word from="Militérkodex" to="Militärkodex" />
+    <Word from="Militérluftraum" to="Militärluftraum" />
+    <Word from="Militérnetzwerk" to="Militärnetzwerk" />
+    <Word from="Militérs" to="Militärs" />
+    <Word from="Militérsystem" to="Militärsystem" />
+    <Word from="Millbilligung" to="Missbilligung" />
+    <Word from="Millefs" to="Miller's" />
+    <Word from="Millgeburt" to="Missgeburt" />
+    <Word from="Milliardéiren" to="Milliardären" />
+    <Word from="Millionérssohn" to="Millionärssohn" />
+    <Word from="Milliéquivalent" to="Milliäquivalent" />
+    <Word from="Millltonne" to="MĂĽlltonne" />
+    <Word from="millverstanden" to="missverstanden" />
+    <Word from="milssen" to="mĂĽssen" />
+    <Word from="milsst" to="mĂĽsst" />
+    <Word from="milsste" to="mĂĽsste" />
+    <Word from="milssten" to="mĂĽssten" />
+    <Word from="Miltter" to="MĂĽtter" />
+    <Word from="Minenraumen" to="Minenräumen" />
+    <Word from="Miniriicke" to="Miniröcke" />
+    <Word from="mirglauben" to="mir glauben" />
+    <Word from="mirja" to="mir ja" />
+    <Word from="mirje" to="mir je" />
+    <Word from="mirjeglichen" to="mir jeglichen" />
+    <Word from="mirjemals" to="mir jemals" />
+    <Word from="mirjemand" to="mir jemand" />
+    <Word from="mirjetzt" to="mir jetzt" />
+    <Word from="mirso" to="mir so" />
+    <Word from="mirvon" to="mir von" />
+    <Word from="mirzu" to="mir zu" />
+    <Word from="Miserabell" to="Miserabel!" />
+    <Word from="missféllt" to="missfällt" />
+    <Word from="Missverstfindnisl" to="Missverständnis!" />
+    <Word from="Missverstiindnis" to="Missverständnis" />
+    <Word from="Missversténdnis" to="Missverständnis" />
+    <Word from="Missversténdnissen" to="Missverständnissen" />
+    <Word from="Mistkerlel" to="Mistkerle!" />
+    <Word from="Mistkiiter" to="Mistköter" />
+    <Word from="Miststiick" to="MiststĂĽck" />
+    <Word from="Miststflcke" to="Miststücke" />
+    <Word from="Mitbijrger" to="MitbĂĽrger" />
+    <Word from="Mitbilrger" to="MitbĂĽrger" />
+    <Word from="mitfiihlend" to="mitfĂĽhlend" />
+    <Word from="mitfiihlender" to="mitfĂĽhlender" />
+    <Word from="mitfuhlend" to="mitfĂĽhlend" />
+    <Word from="Mitgefiihl" to="MitgefĂĽhl" />
+    <Word from="Mitgefuhl" to="MitgefĂĽhl" />
+    <Word from="mitgehiirt" to="mitgehört" />
+    <Word from="mitgezéhlt" to="mitgezählt" />
+    <Word from="mitjedem" to="mit jedem" />
+    <Word from="mitjemandem" to="mit jemandem" />
+    <Word from="mittlen/veile" to="mittlerweile" />
+    <Word from="ML'1nze" to="MĂĽnze" />
+    <Word from="mlch" to="mich" />
+    <Word from="Mldchen" to="Mädchen" />
+    <Word from="mLissen" to="mĂĽssen" />
+    <Word from="Mljnder" to="MĂĽnder" />
+    <Word from="Mllillschlucker" to="MĂĽllschlucker" />
+    <Word from="Mllindel" to="MĂĽndel" />
+    <Word from="Mllindung" to="MĂĽndung" />
+    <Word from="mllissen" to="mĂĽssen" />
+    <Word from="mllisst" to="mĂĽsst" />
+    <Word from="Mlllhe" to="MĂĽhe" />
+    <Word from="Mllllon" to="Million" />
+    <Word from="Mllllonen" to="Millionen" />
+    <Word from="mlllsst" to="mĂĽsst" />
+    <Word from="Mllltterjedoch" to="MĂĽtter jedoch" />
+    <Word from="Mlnnern" to="Männern" />
+    <Word from="mlr" to="mir" />
+    <Word from="mlrl" to="mir!" />
+    <Word from="mlt" to="mit" />
+    <Word from="moglich" to="möglich" />
+    <Word from="Moglichkeit" to="Möglichkeit" />
+    <Word from="Moglichkeiten" to="Möglichkeiten" />
+    <Word from="Molekijle" to="MolekĂĽle" />
+    <Word from="MolekL'lle" to="MolekĂĽle" />
+    <Word from="Mondeinhiirner" to="Mondeinhörner" />
+    <Word from="Mondeinhiirnerl" to="Mondeinhörner!" />
+    <Word from="Mondeinhéirner" to="Mondeinhörner" />
+    <Word from="Mondkéilber" to="Mondkälber" />
+    <Word from="Monl" to="Mom" />
+    <Word from="MONTONEI" to="MONTONE:" />
+    <Word from="Mordsiiberraschung" to="MordsĂĽberraschung" />
+    <Word from="Mordverdéchtiger" to="Mordverdächtiger" />
+    <Word from="Morsealphabetl" to="Morsealphabet!" />
+    <Word from="Motorgeréusch" to="Motorgeräusch" />
+    <Word from="Motorgeréusche" to="Motorgeräusche" />
+    <Word from="Moussetfle's" to="Moussette's" />
+    <Word from="Mowen" to="Möwen" />
+    <Word from="Mtihe" to="MĂĽhe" />
+    <Word from="Mtillschlucker" to="MĂĽllschlucker" />
+    <Word from="mtissen" to="mĂĽssen" />
+    <Word from="mtissenl" to="mĂĽssen!" />
+    <Word from="Mtitzel" to="MĂĽtze!" />
+    <Word from="mtlde" to="mĂĽde" />
+    <Word from="mtlsste" to="mĂĽsste" />
+    <Word from="muBt" to="musst" />
+    <Word from="Mucken" to="MĂĽcken" />
+    <Word from="mucksméuschenstill" to="mucksmäuschenstill" />
+    <Word from="mude" to="mĂĽde" />
+    <Word from="Muhe" to="MĂĽhe" />
+    <Word from="MUII" to="MĂĽll" />
+    <Word from="mull" to="muss" />
+    <Word from="MULL" to="MĂśLL" />
+    <Word from="mullte" to="musste" />
+    <Word from="Mundl" to="Mund!" />
+    <Word from="Mundung" to="MĂĽndung" />
+    <Word from="Munzfernsprecher" to="MĂĽnzfernsprecher" />
+    <Word from="Muskatnijsse" to="MuskatnĂĽsse" />
+    <Word from="Muskelkumpelsl" to="Muskelkumpels!" />
+    <Word from="muskuléren" to="muskulären" />
+    <Word from="mussen" to="mĂĽssen" />
+    <Word from="MUSSEN" to="MĂśSSEN" />
+    <Word from="mUssen's" to="mĂĽssen's" />
+    <Word from="muss_'§e" to="musste" />
+    <Word from="Musterschuler" to="MusterschĂĽler" />
+    <Word from="Mutterja" to="Mutter ja" />
+    <Word from="mutterlich" to="mĂĽtterlich" />
+    <Word from="Mutze" to="MĂĽtze" />
+    <Word from="muĂź" to="muss" />
+    <Word from="muĂźt" to="musst" />
+    <Word from="muĂźte" to="musste" />
+    <Word from="mx't" to="mit" />
+    <Word from="Mzlinnern" to="Männern" />
+    <Word from="Mébel" to="Möbel" />
+    <Word from="mécht" to="möcht" />
+    <Word from="Méchte" to="Mächte" />
+    <Word from="méchte" to="möchte" />
+    <Word from="Méchtegern" to="Möchtegern" />
+    <Word from="méchten" to="möchten" />
+    <Word from="méchtest" to="möchtest" />
+    <Word from="méchtet" to="möchtet" />
+    <Word from="méchtig" to="mächtig" />
+    <Word from="méchtige" to="mächtige" />
+    <Word from="méchtigen" to="mächtigen" />
+    <Word from="méchtiger" to="mächtiger" />
+    <Word from="méchtiges" to="mächtiges" />
+    <Word from="méchtigste" to="mächtigste" />
+    <Word from="méchtigsten" to="mächtigsten" />
+    <Word from="Médchen" to="Mädchen" />
+    <Word from="Médchenhénden" to="Mädchenhänden" />
+    <Word from="Médchens" to="Mädchens" />
+    <Word from="Médel" to="Mädel" />
+    <Word from="Médels" to="Mädels" />
+    <Word from="Médelsl" to="Mädels!" />
+    <Word from="Méfiigung" to="Mäßigung" />
+    <Word from="mége" to="möge" />
+    <Word from="Mégen" to="Mögen" />
+    <Word from="Méglich" to="Möglich" />
+    <Word from="mégliche" to="mögliche" />
+    <Word from="Méglichen" to="Möglichen" />
+    <Word from="Mégliches" to="Mögliches" />
+    <Word from="Méglichkeit" to="Möglichkeit" />
+    <Word from="Méglichkeiten" to="Möglichkeiten" />
+    <Word from="méglichst" to="möglichst" />
+    <Word from="mégt" to="mögt" />
+    <Word from="méichtig" to="mächtig" />
+    <Word from="méichtige" to="mächtige" />
+    <Word from="méichtigen" to="mächtigen" />
+    <Word from="méichtiger" to="mächtiger" />
+    <Word from="Méidchen" to="Mädchen" />
+    <Word from="Méidel" to="Mädel" />
+    <Word from="Méinner" to="Männer" />
+    <Word from="Méinnl" to="Männl" />
+    <Word from="méinnlicher" to="männlicher" />
+    <Word from="Méirder" to="Mörder" />
+    <Word from="Méirz" to="März" />
+    <Word from="Ménnchen" to="Männchen" />
+    <Word from="Ménnchens" to="Männchens" />
+    <Word from="Ménner" to="Männer" />
+    <Word from="Ménnerfreundschaft" to="Männerfreundschaft" />
+    <Word from="Ménnern" to="Männern" />
+    <Word from="Ménnersache" to="Männersache" />
+    <Word from="ménnlich" to="männlich" />
+    <Word from="ménnliche" to="männliche" />
+    <Word from="Méntel" to="Mäntel" />
+    <Word from="Méolel" to="Mädel" />
+    <Word from="Méolels" to="Mädels" />
+    <Word from="Mérchen" to="Märchen" />
+    <Word from="Mérchenl" to="Märchen!" />
+    <Word from="Mérchenprinzen" to="Märchenprinzen" />
+    <Word from="Mérder" to="Mörder" />
+    <Word from="Mértyrer" to="Märtyrer" />
+    <Word from="Mérz" to="März" />
+    <Word from="Métresse" to="Mätresse" />
+    <Word from="Méuschen" to="Mäuschen" />
+    <Word from="Méuse" to="Mäuse" />
+    <Word from="Méusehtipfer" to="Mäusehüpfer" />
+    <Word from="Méusen" to="Mäusen" />
+    <Word from="Méuserennen" to="Mäuserennen" />
+    <Word from="mĂĽĂźt" to="mĂĽsst" />
+    <Word from="mflde" to="müde" />
+    <Word from="mflssen" to="müssen" />
+    <Word from="n'a'chste" to="nächste" />
+    <Word from="n'a'hert" to="nähert" />
+    <Word from="n/chfs" to="nichts" />
+    <Word from="n/chi" to="nicht" />
+    <Word from="N/ck" to="Nick" />
+    <Word from="n/e" to="nie" />
+    <Word from="N6" to="Nö" />
+    <Word from="n6tig" to="nötig" />
+    <Word from="nac/1" to="nach" />
+    <Word from="Nachf" to="Nacht" />
+    <Word from="nachllssig" to="nachlässig" />
+    <Word from="nachléssig" to="nachlässig" />
+    <Word from="nachlésst" to="nachlässt" />
+    <Word from="nachprufen" to="nachprĂĽfen" />
+    <Word from="Nachschlussel" to="NachschlĂĽssel" />
+    <Word from="Nachste" to="Nächste" />
+    <Word from="NAHERT" to="NĂ„HERT" />
+    <Word from="NAHERTE" to="NĂ„HERTE" />
+    <Word from="Nat/on" to="Nation" />
+    <Word from="natfirlich" to="natĂĽrlich" />
+    <Word from="Natiilrlich" to="NatĂĽrlich" />
+    <Word from="Natiirlich" to="NatĂĽrlich" />
+    <Word from="Natiirllch" to="NatĂĽrlich" />
+    <Word from="natijrlich" to="natĂĽrlich" />
+    <Word from="natijrlichen" to="natĂĽrlichen" />
+    <Word from="natilrlich" to="natĂĽrlich" />
+    <Word from="natilrliche" to="natĂĽrliche" />
+    <Word from="natL'lrlich" to="natĂĽrlich" />
+    <Word from="Natllirlich" to="NatĂĽrlich" />
+    <Word from="Nattirlich" to="NatĂĽrlich" />
+    <Word from="Nattlrlich" to="NatĂĽrlich" />
+    <Word from="Nattlrliohl" to="NatĂĽrlich!" />
+    <Word from="Naturlich" to="Naturloch" />
+    <Word from="naturlich" to="natĂĽrlich" />
+    <Word from="naturlichen" to="natĂĽrlichen" />
+    <Word from="naturlichsten" to="natĂĽrlichsten" />
+    <Word from="Navajoweifi" to="NavajoweiĂź" />
+    <Word from="ndtige" to="nötige" />
+    <Word from="ne/n" to="nein" />
+    <Word from="Nebengebéude" to="Nebengebäude" />
+    <Word from="Nebengeschéift" to="Nebengeschäft" />
+    <Word from="neffes" to="nettes" />
+    <Word from="Nehmf" to="Nehmt" />
+    <Word from="neinl" to="nein!" />
+    <Word from="Neln" to="Nein" />
+    <Word from="nerv6s" to="nervös" />
+    <Word from="Nervensége" to="Nervensäge" />
+    <Word from="Nervenséige" to="Nervensäge" />
+    <Word from="nerviis" to="nervös" />
+    <Word from="Nervés" to="Nervös" />
+    <Word from="ner\/t" to="nervt" />
+    <Word from="Neuankiimmlinge" to="Neuankömmlinge" />
+    <Word from="neuromuskuléren" to="neuromuskulären" />
+    <Word from="Neuzugéinge" to="Neuzugänge" />
+    <Word from="Nfichster" to="Nächster" />
+    <Word from="NIANN" to="MANN" />
+    <Word from="nichsten" to="nächsten" />
+    <Word from="nichtim" to="nicht im" />
+    <Word from="nichtjemand" to="nicht jemand" />
+    <Word from="Nichtjetzt" to="Nicht jetzt" />
+    <Word from="Nichtsl" to="Nichts!" />
+    <Word from="nichtzurilckgelassen" to="nicht zurĂĽckgelassen" />
+    <Word from="nic_l_1t" to="nicht" />
+    <Word from="niederkémpfen" to="niederkämpfen" />
+    <Word from="niederliells" to="niederlieĂź" />
+    <Word from="niedlichl" to="niedlich!" />
+    <Word from="niher" to="näher" />
+    <Word from="niichsten" to="nächsten" />
+    <Word from="niichstes" to="nächstes" />
+    <Word from="niirgeln" to="nörgeln" />
+    <Word from="niitig" to="nötig" />
+    <Word from="niitige" to="nötige" />
+    <Word from="Nijssen" to="NĂĽssen" />
+    <Word from="Nijsternl" to="NĂĽstern!" />
+    <Word from="nijtzlich" to="nĂĽtzlich" />
+    <Word from="nilchtern" to="nĂĽchtern" />
+    <Word from="niltzen" to="nĂĽtzen" />
+    <Word from="Nlagnaten" to="Magnaten" />
+    <Word from="Nlannern" to="Männern" />
+    <Word from="nlchste" to="nächste" />
+    <Word from="nlchsthoheren" to="nächsthöheren" />
+    <Word from="nlcht" to="nicht" />
+    <Word from="nle" to="nie" />
+    <Word from="Nlemalsl" to="Niemals!" />
+    <Word from="Nlhe" to="Nähe" />
+    <Word from="nlir" to="mir" />
+    <Word from="nllitzen" to="nĂĽtzen" />
+    <Word from="Nléinner" to="Männer" />
+    <Word from="noc/1" to="noch" />
+    <Word from="Not/'all" to="Notfall" />
+    <Word from="Notfalll" to="Notfall!" />
+    <Word from="notig" to="nötig" />
+    <Word from="notigen" to="nötigen" />
+    <Word from="Notliige" to="NotlĂĽge" />
+    <Word from="Notziindung" to="NotzĂĽndung" />
+    <Word from="NUFI" to="Nur:" />
+    <Word from="Nunja" to="Nun ja" />
+    <Word from="Nurdich" to="Nur dich" />
+    <Word from="nureins" to="nur eins" />
+    <Word from="nurflustern" to="nur flĂĽstern" />
+    <Word from="Nurjetzt" to="Nur jetzt" />
+    <Word from="nurl" to="nur 1" />
+    <Word from="nurwunscht" to="nur wĂĽnscht" />
+    <Word from="Nurzu" to="Nur zu" />
+    <Word from="nus" to="aus" />
+    <Word from="NUSSS" to="NĂĽsse" />
+    <Word from="nutzlich" to="nĂĽtzlich" />
+    <Word from="Nx'emand" to="Niemand" />
+    <Word from="Néchste" to="Nächste" />
+    <Word from="néchsten" to="nächsten" />
+    <Word from="Néchster" to="Nächster" />
+    <Word from="néchstes" to="nächstes" />
+    <Word from="Néchte" to="Nächte" />
+    <Word from="Néchten" to="Nächten" />
+    <Word from="néchtlichen" to="nächtlichen" />
+    <Word from="Négel" to="Nägel" />
+    <Word from="Néh" to="Näh" />
+    <Word from="Néhe" to="Nähe" />
+    <Word from="néhenf" to="nähert" />
+    <Word from="néher" to="näher" />
+    <Word from="néhere" to="nähere" />
+    <Word from="Néhern" to="Nähern" />
+    <Word from="néhernde" to="nähernde" />
+    <Word from="néhert" to="nähert" />
+    <Word from="néherte" to="näherte" />
+    <Word from="néhren" to="nähren" />
+    <Word from="néht" to="näht" />
+    <Word from="Néhten" to="Nähten" />
+    <Word from="Néichste" to="Nächste" />
+    <Word from="néichsten" to="nächsten" />
+    <Word from="Néichstes" to="Nächstes" />
+    <Word from="Néihe" to="Nähe" />
+    <Word from="néiher" to="näher" />
+    <Word from="néihern" to="nähern" />
+    <Word from="néihert" to="nähert" />
+    <Word from="Néihten" to="Nähten" />
+    <Word from="néimlich" to="nämlich" />
+    <Word from="némlich" to="nämlich" />
+    <Word from="Népfe" to="Näpfe" />
+    <Word from="nérdlich" to="nördlich" />
+    <Word from="nérgelnde" to="nörgelnde" />
+    <Word from="Nérrin" to="Närrin" />
+    <Word from="Néschen" to="Näschen" />
+    <Word from="nétig" to="nötig" />
+    <Word from="nétige" to="nötige" />
+    <Word from="nétiges" to="nötiges" />
+    <Word from="O8" to="08" />
+    <Word from="obdachlosl" to="obdachlos!" />
+    <Word from="Obefiléiche" to="Oberfläche" />
+    <Word from="OBERFLACHENSCHWERKRAFT" to="OBERFLĂ„CHENSCHWERKRAFT" />
+    <Word from="Oberfléche" to="Oberfläche" />
+    <Word from="Oberfléchen" to="Oberflächen" />
+    <Word from="oberfléchlich" to="oberflächlich" />
+    <Word from="oberfléchliche" to="oberflächliche" />
+    <Word from="Oberméinner" to="Obermänner" />
+    <Word from="Oberflfiche" to="Oberfläche" />
+    <Word from="of/'en" to="offen" />
+    <Word from="Offenslchtllch" to="Offensichtlich" />
+    <Word from="Offentliches" to="Ă–ffentliches" />
+    <Word from="Offentlichkeit" to="Ă–ffentlichkeit" />
+    <Word from="Offne" to="Ă–ffne" />
+    <Word from="Offnen" to="Ă–ffnen" />
+    <Word from="Offnet" to="Ă–ffnet" />
+    <Word from="ofi" to="oft" />
+    <Word from="Ofiiziere" to="Offiziere" />
+    <Word from="Ofiiziers" to="Offiziers" />
+    <Word from="Oftweg" to="Oft weg" />
+    <Word from="Offlcer" to="Officer" />
+    <Word from="Ohnejede" to="Ohne jede" />
+    <Word from="ohnméchtig" to="ohnmächtig" />
+    <Word from="ohnméichtig" to="ohnmächtig" />
+    <Word from="OI" to="Ă–l" />
+    <Word from="olas" to="das" />
+    <Word from="oles" to="des" />
+    <Word from="Oltanks" to="Ă–ltanks" />
+    <Word from="OO" to="00" />
+    <Word from="Orgelténe" to="Orgeltöne" />
+    <Word from="ORTI" to="ORT:" />
+    <Word from="Ortl" to="Ort!" />
+    <Word from="Ostfltlgel" to="OstflĂĽgel" />
+    <Word from="Paliontologie" to="Paläontologie" />
+    <Word from="pallt" to="passt" />
+    <Word from="Palésten" to="Palästen" />
+    <Word from="Panfike/chen" to="Partikelchen" />
+    <Word from="Papierblétter" to="Papierblätter" />
+    <Word from="Papiertiite" to="PapiertĂĽte" />
+    <Word from="Papiertilcher" to="PapiertĂĽcher" />
+    <Word from="Parfyknaller" to="Partyknaller" />
+    <Word from="Partyhiite" to="PartyhĂĽte" />
+    <Word from="Partyhijte" to="PartyhĂĽte" />
+    <Word from="Passendervveise" to="Passenderweise" />
+    <Word from="Paulgenauso" to="Paul genauso" />
+    <Word from="paĂź" to="pass" />
+    <Word from="paĂźt" to="passt" />
+    <Word from="peinliohl" to="peinlich" />
+    <Word from="persdnlich" to="persönlich" />
+    <Word from="persfinlich" to="persönlich" />
+    <Word from="persiinlich" to="persönlich" />
+    <Word from="persiinliche" to="persönliche" />
+    <Word from="persiinlicher" to="persönlicher" />
+    <Word from="Persiinllchkeltsspaltun" to="Persönllchkeltsspaltung" />
+    <Word from="persijnliche" to="persönliche" />
+    <Word from="personlich" to="persönlich" />
+    <Word from="Personlichkeit" to="Persönlichkeit" />
+    <Word from="persénlich" to="persönlich" />
+    <Word from="persénliche" to="persönliche" />
+    <Word from="persénlicher" to="persönlicher" />
+    <Word from="Persénliches" to="Persönliches" />
+    <Word from="Persénlichkeit" to="Persönlichkeit" />
+    <Word from="peflg" to="peng" />
+    <Word from="Pfadfindervvappen" to="Pfadfinderwappen" />
+    <Word from="Pfadflndeml" to="Pfadflndern!" />
+    <Word from="Pffitzen" to="PfĂĽtzen" />
+    <Word from="Pfiitchen" to="Pfötchen" />
+    <Word from="Pfippchen" to="PĂĽppchen" />
+    <Word from="pflL'lgen" to="pflĂĽgen" />
+    <Word from="Pfllitze" to="PfĂĽtze" />
+    <Word from="pflugte" to="pflĂĽgte" />
+    <Word from="Pfundbijro" to="PfundbĂĽro" />
+    <Word from="phénomenal" to="phänomenal" />
+    <Word from="PIatz" to="Platz" />
+    <Word from="Piimpel" to="Pömpel" />
+    <Word from="Piinlttchenltrawatte" to="PĂĽnktchenkrawatte" />
+    <Word from="Pijppchen" to="PĂĽppchen" />
+    <Word from="Pijppchenl" to="PĂĽppchen!" />
+    <Word from="Planetenf" to="Planeten!" />
+    <Word from="planméfiigen" to="planmäßigen" />
+    <Word from="Plastikfréiuleinl" to="Plastikfräulein!" />
+    <Word from="plattmachen" to="platt machen" />
+    <Word from="Plfitzchen" to="Plätzchen" />
+    <Word from="plfitzlich" to="plötzlich" />
+    <Word from="pliitzlich" to="plötzlich" />
+    <Word from="pliitzllch" to="plötzlich" />
+    <Word from="Pllllnderer" to="PlĂĽnderer" />
+    <Word from="plotzlich" to="plötzlich" />
+    <Word from="plédieren" to="plädieren" />
+    <Word from="Pléine" to="Pläne" />
+    <Word from="Pléinen" to="Plänen" />
+    <Word from="Pléitzchen" to="Plätzchen" />
+    <Word from="Pléitze" to="Plätze" />
+    <Word from="Pléne" to="Pläne" />
+    <Word from="Plétzchen" to="Plätzchen" />
+    <Word from="Plétze" to="Platze" />
+    <Word from="Plétzel" to="Plätze!" />
+    <Word from="plétzlich" to="plötzlich" />
+    <Word from="plétzliche" to="plötzliche" />
+    <Word from="Pofkawoche" to="Polkawoche" />
+    <Word from="Polizistl" to="Polizist!" />
+    <Word from="pompiise" to="pompöse" />
+    <Word from="populér" to="populär" />
+    <Word from="potthésslich" to="potthässlich" />
+    <Word from="prasentleren" to="präsentieren" />
+    <Word from="prfignant" to="prägnant" />
+    <Word from="Prfisentation" to="Präsentation" />
+    <Word from="Prfisi" to="Präsi" />
+    <Word from="priide" to="prĂĽde" />
+    <Word from="Priife" to="PrĂĽfe" />
+    <Word from="priifen" to="prĂĽfen" />
+    <Word from="prijfen" to="prĂĽfen" />
+    <Word from="Priorit2a't" to="Priorität" />
+    <Word from="PRIORITKT" to="PRIORITĂ„T" />
+    <Word from="PRIORITKTSZUGANG" to="PRIORITĂ„TSZUGANG" />
+    <Word from="Prioritéitszugang" to="Prioritätszugang" />
+    <Word from="Prioritét" to="Priorität" />
+    <Word from="Prisident" to="Präsident" />
+    <Word from="Privatgeméchern" to="Privatgemächern" />
+    <Word from="Privatsphére" to="Privatsphäre" />
+    <Word from="Probfeme" to="Probleme" />
+    <Word from="Profitinzerinnen" to="Profitänzerinnen" />
+    <Word from="Protege" to="Protégé" />
+    <Word from="prude" to="prĂĽde" />
+    <Word from="Pruf" to="PrĂĽf" />
+    <Word from="prufen" to="prĂĽfen" />
+    <Word from="Prugelei" to="PrĂĽgelei" />
+    <Word from="prugeln" to="prĂĽgeln" />
+    <Word from="préchtig" to="prächtig" />
+    <Word from="Préfekt" to="Präfekt" />
+    <Word from="préhistorischer" to="prähistorischer" />
+    <Word from="préichtiger" to="prächtiger" />
+    <Word from="préichtiges" to="prächtiges" />
+    <Word from="Préimie" to="Prämie" />
+    <Word from="préipotente" to="präpotente" />
+    <Word from="préisentiert" to="präsentiert" />
+    <Word from="Préisidenten" to="Präsidenten" />
+    <Word from="Préitorianer" to="Prätorianer" />
+    <Word from="Prémie" to="Prämie" />
+    <Word from="Préoperative" to="Präoperative" />
+    <Word from="présentiere" to="präsentiere" />
+    <Word from="présentieren" to="präsentieren" />
+    <Word from="Présentiert" to="Präsentiert" />
+    <Word from="Présenz" to="Präsenz" />
+    <Word from="Président" to="Präsident" />
+    <Word from="Présidenten" to="Präsidenten" />
+    <Word from="Présidentin" to="Präsidentin" />
+    <Word from="Présidentschaft" to="Präsidentschaft" />
+    <Word from="Prétorianer" to="Prätorianer" />
+    <Word from="prézise" to="präzise" />
+    <Word from="préziser" to="präziser" />
+    <Word from="Prflfungen" to="Prüfungen" />
+    <Word from="Pubertéit" to="Pubertät" />
+    <Word from="Publlkuml" to="Publlkum!" />
+    <Word from="PUPPCHEN" to="PĂśPPCHEN" />
+    <Word from="PUpst" to="Pupst" />
+    <Word from="Purzelbéume" to="Purzelbäume" />
+    <Word from="Péckchen" to="Päckchen" />
+    <Word from="péidagogisch" to="pädagogisch" />
+    <Word from="Péirchen" to="Pärchen" />
+    <Word from="Pérchen" to="Pärchen" />
+    <Word from="pflegen" to="pflegen" />
+    <Word from="Pflicht" to="Pflicht" />
+    <Word from="pflichtbewullt" to="pflichtbewusst" />
+    <Word from="Qas" to="Das" />
+    <Word from="Qualitétskontrolle" to="Qualitätskontrolle" />
+    <Word from="Quten" to="guten" />
+    <Word from="quéilen" to="quälen" />
+    <Word from="quéilt" to="quält" />
+    <Word from="Quél" to="Quäl" />
+    <Word from="Quélt" to="Quält" />
+    <Word from="R'a'che" to="Räche" />
+    <Word from="R/ck" to="Rick" />
+    <Word from="R/nge" to="Ringe" />
+    <Word from="R6mer" to="Römer" />
+    <Word from="rachsiichtiger" to="rachsĂĽchtiger" />
+    <Word from="ranghfiheren" to="ranghöheren" />
+    <Word from="ranghéheren" to="ranghöheren" />
+    <Word from="ranzukommen" to="ran zukommen" />
+    <Word from="ranzukommen" to="ran-zukommen" />
+    <Word from="Rasenméherunfall" to="Rasenmäherunfall" />
+    <Word from="Rasterllibertragung" to="RasterĂĽbertragung" />
+    <Word from="Rasterubertragung" to="RasterĂĽbertragung" />
+    <Word from="Ratschléige" to="Ratschläge" />
+    <Word from="Rattenfénger" to="Rattenfänger" />
+    <Word from="Rauc/7" to="Rauch" />
+    <Word from="Rauc/vender" to="Rauchender" />
+    <Word from="rauhen" to="rauen" />
+    <Word from="RAUMFAHRE" to="RAUMFĂ„HRE" />
+    <Word from="Raumféhre" to="Raumfähre" />
+    <Word from="Raumsschiff" to="Raumschiff" />
+    <Word from="rausféhrt" to="rausfährt" />
+    <Word from="rausgeprtigeltl" to="rausgeprĂĽgelt!" />
+    <Word from="rausliefien" to="rauslieĂźen" />
+    <Word from="rauszuschmeifien" to="rauszuschmeiĂźen" />
+    <Word from="raufl" to="rau!" />
+    <Word from="Re/se" to="Reise" />
+    <Word from="Realitéit" to="Realität" />
+    <Word from="Realitét" to="Realität" />
+    <Word from="Rechtgléubige" to="Rechtgläubige" />
+    <Word from="rechtméfkigen" to="rechtmäßigen" />
+    <Word from="RECHTSANWALTE" to="RECHTSANWĂ„LTE" />
+    <Word from="rechtsl" to="rechts!" />
+    <Word from="Reffer" to="Retter" />
+    <Word from="regelméfiige" to="regelmäßige" />
+    <Word from="Regenhéigen" to="Regenbögen" />
+    <Word from="Regenméntel" to="Regenmäntel" />
+    <Word from="Regierungsgehirnwéischesignal" to="Regierungsgehirnwäschesignal" />
+    <Word from="regulére" to="reguläre" />
+    <Word from="reiB" to="reiĂź" />
+    <Word from="reiBt" to="reiĂźt" />
+    <Word from="Reichtfimer" to="ReichtĂĽmer" />
+    <Word from="Reichtllimern" to="ReichtĂĽmern" />
+    <Word from="reif$" to="reiĂź" />
+    <Word from="reif$en" to="reiĂźen" />
+    <Word from="Reifiverschluss" to="ReiĂźverschluss" />
+    <Word from="Reil3t" to="ReiĂźt" />
+    <Word from="reil5" to="reiĂź" />
+    <Word from="Reili" to="ReiĂź" />
+    <Word from="reilien" to="reiĂźen" />
+    <Word from="Reilinégel" to="Reißnägel" />
+    <Word from="Reillt" to="ReiĂźt" />
+    <Word from="reilZ&gt;" to="reiĂź" />
+    <Word from="reingehéngt" to="reingehängt" />
+    <Word from="Reingelegtl" to="Reingelegt!" />
+    <Word from="reinhupft" to="reinhĂĽpft" />
+    <Word from="reinl" to="rein!" />
+    <Word from="reinstilrmen" to="reinstĂĽrmen" />
+    <Word from="reiohen" to="reichen" />
+    <Word from="REISSVERSCHLUSSGERAUSCH" to="REISSVERSCHLUSSGERĂ„USCH" />
+    <Word from="reifl" to="reiß" />
+    <Word from="reiflen" to="reißen" />
+    <Word from="relch" to="reich" />
+    <Word from="religi6s" to="religiös" />
+    <Word from="religiiiser" to="religiöser" />
+    <Word from="religiés" to="religiös" />
+    <Word from="Rels" to="Reis" />
+    <Word from="Rentenbezuge" to="RentenbezĂĽge" />
+    <Word from="Représentantin" to="Repräsentantin" />
+    <Word from="Rettungsflofi" to="RettungsfloĂź" />
+    <Word from="Rev/er" to="Revier" />
+    <Word from="rfiber" to="rĂĽber" />
+    <Word from="rfiberwachsen" to="rĂĽberwachsen" />
+    <Word from="Rfickseite" to="RĂĽckseite" />
+    <Word from="rfihrselige" to="rĂĽhrselige" />
+    <Word from="rfilpse" to="rĂĽlpse" />
+    <Word from="Rfissel" to="RĂĽssel" />
+    <Word from="RGMISCHE" to="RĂ–MISCHE" />
+    <Word from="Richer" to="Rächer" />
+    <Word from="Riesenhfipfer" to="RiesenhĂĽpfer" />
+    <Word from="Riesenspafi" to="RiesenspaĂź" />
+    <Word from="Riesentijr" to="RiesentĂĽr" />
+    <Word from="riiber" to="rĂĽber" />
+    <Word from="Riicheln" to="Röcheln" />
+    <Word from="riichelt" to="röchelt" />
+    <Word from="Riick" to="RĂĽck" />
+    <Word from="Riickblickend" to="RĂĽckblickend" />
+    <Word from="Riicken" to="RĂĽcken" />
+    <Word from="Riickenlage" to="RĂĽckenlage" />
+    <Word from="Riickenwind" to="RĂĽckenwind" />
+    <Word from="riicksichtslos" to="rĂĽcksichtslos" />
+    <Word from="Riicksichtslosigkeit" to="RĂĽcksichtslosigkeit" />
+    <Word from="Riicksitz" to="RĂĽcksitz" />
+    <Word from="Riickwéirts" to="Rückwärts" />
+    <Word from="Riickzug" to="RĂĽckzug" />
+    <Word from="Riickflug" to="Rückflug" />
+    <Word from="riihrt" to="rĂĽhrt" />
+    <Word from="Riilpsen" to="RĂĽlpsen" />
+    <Word from="riilpst" to="rĂĽlpst" />
+    <Word from="Riimischen" to="Römischen" />
+    <Word from="Riistung" to="RĂĽstung" />
+    <Word from="Riiumlichkeiten" to="Räumlichkeiten" />
+    <Word from="Rijbe" to="RĂĽbe" />
+    <Word from="rijber" to="rĂĽber" />
+    <Word from="rijckgfingig" to="rückgängig" />
+    <Word from="rijckwéirts" to="rückwärts" />
+    <Word from="Rijsseltierl" to="RĂĽsseltier!" />
+    <Word from="Rilbe" to="RĂĽbe" />
+    <Word from="rilber" to="rĂĽber" />
+    <Word from="rilberkommen" to="rĂĽberkommen" />
+    <Word from="Rilckkehr" to="RĂĽckkehr" />
+    <Word from="rilcksichtsloses" to="rĂĽcksichtsloses" />
+    <Word from="rilckwérts" to="rückwärts" />
+    <Word from="Rillpsen" to="RĂĽlpsen" />
+    <Word from="Riol" to="Rio!" />
+    <Word from="Rivalitét" to="Rivalität" />
+    <Word from="rL'lber" to="rĂĽber" />
+    <Word from="RL'lhr" to="RĂĽhr" />
+    <Word from="rllicken" to="rĂĽcken" />
+    <Word from="rllickt" to="rĂĽckt" />
+    <Word from="Rlllckgrat" to="RĂĽckgrat" />
+    <Word from="Rlnge" to="Ringe" />
+    <Word from="Rlumgerate" to="Räumgeräte" />
+    <Word from="ROMISCHE" to="RĂ–MISCHE" />
+    <Word from="ROMISCHEN" to="RĂ–MISCHEN" />
+    <Word from="rosaéugiges" to="rosaäugiges" />
+    <Word from="rotiugiger" to="rotäugiger" />
+    <Word from="Rotképpchen" to="Rotkäppchen" />
+    <Word from="Rotténen" to="Rottönen" />
+    <Word from="Routinetlberprijfung" to="RoutineĂĽberprĂĽfung" />
+    <Word from="Rticken" to="RĂĽcken" />
+    <Word from="rticksichtslos" to="rĂĽcksichtslos" />
+    <Word from="rtlber" to="rĂĽber" />
+    <Word from="Rtlckseite" to="RĂĽckseite" />
+    <Word from="ruber" to="rĂĽber" />
+    <Word from="Ruberrutschen" to="RĂĽberrutschen" />
+    <Word from="Ruckblende" to="RĂĽckblende" />
+    <Word from="Ruckblick" to="RĂĽckblick" />
+    <Word from="Rucken" to="RĂĽcken" />
+    <Word from="Ruckenlage" to="RĂĽckenlage" />
+    <Word from="Ruckenwind" to="RĂĽckenwind" />
+    <Word from="Ruckfall" to="RĂĽckfall" />
+    <Word from="Ruckfrage" to="RĂĽckfrage" />
+    <Word from="Ruckgriff" to="RĂĽckgriff" />
+    <Word from="Ruckkehr" to="RĂĽckkehr" />
+    <Word from="Rucksitz" to="RĂĽcksitz" />
+    <Word from="Ruckzugl" to="RĂĽckzug!" />
+    <Word from="ruhlg" to="ruhig" />
+    <Word from="ruhrenl" to="rĂĽhren!" />
+    <Word from="Ruhrt" to="RĂĽhrt" />
+    <Word from="Rul3" to="RuĂź" />
+    <Word from="Rumgebrfillel" to="RumgebrĂĽlle!" />
+    <Word from="rumhingen" to="rumhängen" />
+    <Word from="rumhéngen" to="rumhängen" />
+    <Word from="rumhéngst" to="rumhängst" />
+    <Word from="rumléuft" to="rumläuft" />
+    <Word from="rumwuhlen" to="rumwĂĽhlen" />
+    <Word from="rumzufflhren" to="rumzuführen" />
+    <Word from="rumérgern" to="rumärgern" />
+    <Word from="runterffihrt" to="runterfährt" />
+    <Word from="runtergespillt" to="runtergespĂĽlt" />
+    <Word from="runtergespfllt" to="runtergespült" />
+    <Word from="Runterl" to="Runter!" />
+    <Word from="runterspillen" to="runterspĂĽlen" />
+    <Word from="runterspllllen" to="runterspĂĽlen" />
+    <Word from="runterspĂĽlt" to="runter spĂĽlt" />
+    <Word from="runterspĂĽlt" to="runter-spĂĽlt" />
+    <Word from="runtervverfen" to="runterwerfen" />
+    <Word from="Rupem" to="Rupert!" />
+    <Word from="Rustung" to="RĂĽstung" />
+    <Word from="réche" to="räche" />
+    <Word from="réchen" to="rächen" />
+    <Word from="Récher" to="Rächer" />
+    <Word from="récht" to="rächt" />
+    <Word from="Réder" to="Räder" />
+    <Word from="Rédern" to="Rädern" />
+    <Word from="Réhre" to="Röhre" />
+    <Word from="Réidern" to="Rädern" />
+    <Word from="Réitsel" to="Rätsel" />
+    <Word from="réitseln" to="rätseln" />
+    <Word from="réitst" to="rätst" />
+    <Word from="Réiume" to="Räume" />
+    <Word from="Rémern" to="Römern" />
+    <Word from="rémische" to="römische" />
+    <Word from="rémischen" to="römischen" />
+    <Word from="rémischer" to="römischer" />
+    <Word from="Rénder" to="Ränder" />
+    <Word from="Rénke" to="Ränke" />
+    <Word from="Rénken" to="Ränken" />
+    <Word from="Réntgenaufnahme" to="Röntgenaufnahme" />
+    <Word from="Réntgenbild" to="Röntgenbild" />
+    <Word from="Réson" to="Räson" />
+    <Word from="rét" to="rät" />
+    <Word from="Rétsel" to="Rätsel" />
+    <Word from="rétselhaft" to="rätselhaft" />
+    <Word from="Rétselhaftes" to="Rätselhaftes" />
+    <Word from="Réume" to="Räume" />
+    <Word from="Réumen" to="Räumen" />
+    <Word from="Réumlichkeiten" to="Räumlichkeiten" />
+    <Word from="Réumt" to="Räumt" />
+    <Word from="réuspert" to="räuspert" />
+    <Word from="Rflbe" to="Rübe" />
+    <Word from="rflbergeguckt" to="rübergekuckt" />
+    <Word from="Rflckkehr" to="Rückkehr" />
+    <Word from="S/e" to="Sie" />
+    <Word from="s/nd" to="sind" />
+    <Word from="S5tze" to="Sätze" />
+    <Word from="S6hne" to="Söhne" />
+    <Word from="saB" to="saĂź" />
+    <Word from="Sachverstlndiger" to="Sachverständiger" />
+    <Word from="sagf" to="sagt" />
+    <Word from="sagfen" to="sagten" />
+    <Word from="Sammlerstiicken" to="SammlerstĂĽcken" />
+    <Word from="Sandsécke" to="Sandsäcke" />
+    <Word from="Sanftmiltigen" to="SanftmĂĽtigen" />
+    <Word from="Sanierungsbehérde" to="Sanierungsbehörde" />
+    <Word from="Sanitéter" to="Sanitäter" />
+    <Word from="Sargnégel" to="Sargnägel" />
+    <Word from="sari" to="saĂź" />
+    <Word from="Satellitenschijssel" to="SatellitenschĂĽssel" />
+    <Word from="Satellitenschusseln" to="SatellitenschĂĽsseln" />
+    <Word from="Satellitenuberwachung" to="SatellitenĂĽberwachung" />
+    <Word from="Saugfflflsen" to="Saugfüßen" />
+    <Word from="sc/10/1" to="schon" />
+    <Word from="sc/16/1" to="schön" />
+    <Word from="sch/cken" to="schicken" />
+    <Word from="Sch/ffe" to="Schiffe" />
+    <Word from="sch6n" to="schön" />
+    <Word from="Schadeniiberpriifung" to="SchadenĂĽberprĂĽfung" />
+    <Word from="Schadenuberprtlfung" to="SchadenĂĽberprĂĽfung" />
+    <Word from="Scharfschijtze" to="ScharfschĂĽtze" />
+    <Word from="schbn" to="schön" />
+    <Word from="schc'§n" to="schön" />
+    <Word from="Schdn" to="Schön" />
+    <Word from="schdnen" to="schönen" />
+    <Word from="Schecksl" to="Schecks!" />
+    <Word from="ScheiB" to="ScheiĂź" />
+    <Word from="ScheiBe" to="ScheiĂźe" />
+    <Word from="scheiBegal" to="scheiĂźegal" />
+    <Word from="Scheif$e" to="ScheiĂźe" />
+    <Word from="scheiffsel" to="scheiĂźe!" />
+    <Word from="Scheifi" to="ScheiĂź" />
+    <Word from="Scheifiding" to="ScheiĂźding" />
+    <Word from="scheifie" to="scheiĂźe" />
+    <Word from="Scheifiel" to="ScheiĂźe!" />
+    <Word from="Scheifier" to="ScheiĂźer" />
+    <Word from="Scheifihelm" to="ScheiĂźhelm" />
+    <Word from="Scheifiloch" to="ScheiĂźloch" />
+    <Word from="Scheifipascha" to="ScheiĂźpascha" />
+    <Word from="Scheifisofa" to="ScheiĂźsofa" />
+    <Word from="Scheifiweiber" to="ScheiĂźweiber" />
+    <Word from="Scheifle" to="ScheiĂźe" />
+    <Word from="Scheiiislangweilig" to="ScheiĂźlangweilig" />
+    <Word from="Scheil'$e" to="ScheiĂźe" />
+    <Word from="Scheil3&gt;er" to="ScheiĂźer" />
+    <Word from="Scheil3e" to="ScheiĂźe" />
+    <Word from="Scheili" to="ScheiĂź" />
+    <Word from="Scheilie" to="ScheiĂźe" />
+    <Word from="scheilien" to="scheiĂźen" />
+    <Word from="Scheille" to="ScheiĂźe" />
+    <Word from="Scheillel" to="ScheiĂźe!" />
+    <Word from="ScheilSe" to="ScheiĂźe" />
+    <Word from="ScheilZ&gt;" to="ScheiĂź" />
+    <Word from="Scheir$oling" to="ScheiĂźding" />
+    <Word from="scheissegal" to="scheiĂźegal" />
+    <Word from="Scheisskarre" to="ScheiĂźkarre" />
+    <Word from="Scheifle" to="Scheiße" />
+    <Word from="scheme" to="scheiĂźe" />
+    <Word from="scheuf$lich" to="scheuĂźlich" />
+    <Word from="Scheulilich" to="ScheuĂźlich" />
+    <Word from="schfichtern" to="schĂĽchtern" />
+    <Word from="schfimen" to="schämen" />
+    <Word from="schfin" to="schön" />
+    <Word from="Schfine" to="Schöne" />
+    <Word from="schfinen" to="schönen" />
+    <Word from="Schfines" to="Schönes" />
+    <Word from="schfirfer" to="schärfer" />
+    <Word from="Schfissel" to="SchĂĽssel" />
+    <Word from="Schfitzchen" to="Schätzchen" />
+    <Word from="schfjnes" to="schönes" />
+    <Word from="Schideln" to="Schädeln" />
+    <Word from="schief$en" to="schieĂźen" />
+    <Word from="Schief3&gt;en" to="SchieĂźen" />
+    <Word from="Schiefien" to="SchieĂźen" />
+    <Word from="schiefit" to="schieĂźt" />
+    <Word from="schiefZ&gt;t" to="schieĂźt" />
+    <Word from="schiel'5" to="schieĂź" />
+    <Word from="Schiel3t" to="SchieĂźt" />
+    <Word from="schiellen" to="schieĂźen" />
+    <Word from="Schielmbung" to="Schießübung" />
+    <Word from="schieflen" to="schießen" />
+    <Word from="schieflt" to="schießt" />
+    <Word from="Schiffsérzte" to="Schiffsärzte" />
+    <Word from="Schiffzerstfiren" to="Schiff zerstören" />
+    <Word from="Schifies" to="Schiffes" />
+    <Word from="Schiidel" to="Schädel" />
+    <Word from="schiilzen" to="schätzen" />
+    <Word from="schiin" to="schön" />
+    <Word from="schiine" to="schöne" />
+    <Word from="Schiinen" to="Schönen" />
+    <Word from="Schiiner" to="Schöner" />
+    <Word from="schiines" to="schönes" />
+    <Word from="Schiinheit" to="Schönheit" />
+    <Word from="Schiipfer" to="Schöpfer" />
+    <Word from="Schiipfung" to="Schöpfung" />
+    <Word from="Schiisse" to="SchĂĽsse" />
+    <Word from="Schiitt" to="SchĂĽtt" />
+    <Word from="Schiittelfrost" to="SchĂĽttelfrost" />
+    <Word from="schiitten" to="schĂĽtten" />
+    <Word from="schiittet" to="schĂĽttet" />
+    <Word from="schiitze" to="schätze" />
+    <Word from="schiitzen" to="schĂĽtzen" />
+    <Word from="schiitzt" to="schĂĽtzt" />
+    <Word from="schijn" to="schön" />
+    <Word from="Schijnes" to="Schönes" />
+    <Word from="schijng" to="schön!" />
+    <Word from="Schijssel" to="SchĂĽssel" />
+    <Word from="schijttelt" to="schĂĽttelt" />
+    <Word from="Schijtze" to="SchĂĽtze" />
+    <Word from="schijtzen" to="schĂĽtzen" />
+    <Word from="Schildkréte" to="Schildkröte" />
+    <Word from="Schilrze" to="SchĂĽrze" />
+    <Word from="Schilsse" to="SchĂĽsse" />
+    <Word from="schiltten" to="schĂĽtten" />
+    <Word from="schiltzen" to="schĂĽtzen" />
+    <Word from="schimte" to="schämte" />
+    <Word from="Schizophrenia" to="Schizophrenie" />
+    <Word from="Schiétze" to="Schätze" />
+    <Word from="Schlachtgetllimmels" to="SchlachtgetĂĽmmels" />
+    <Word from="Schlachtschifl" to="Schlachtschiff" />
+    <Word from="schlafenl" to="schlafen!" />
+    <Word from="Schlafkéfern" to="Schlafkäfern" />
+    <Word from="Schlafmiitzenl" to="SchlafmĂĽtzen!" />
+    <Word from="Schlafmfltzel" to="Schlafmütze!" />
+    <Word from="Schlangengéttin" to="Schlangengöttin" />
+    <Word from="Schlappschwénze" to="Schlappschwänze" />
+    <Word from="Schlaumeierl" to="Schlaumeier!" />
+    <Word from="schlechf" to="schlecht" />
+    <Word from="Schlelistiinde" to="Schießstände" />
+    <Word from="Schlellen" to="SchieĂźen" />
+    <Word from="Schleflt" to="Schießt" />
+    <Word from="Schlfilsselparty" to="SchlĂĽsselparty" />
+    <Word from="Schlfisse" to="SchlĂĽsse" />
+    <Word from="SchlieBe" to="SchlieĂźe" />
+    <Word from="schlieBen" to="schlieĂźen" />
+    <Word from="schlieBIich" to="schlieĂźlich" />
+    <Word from="schlieBlich" to="schlieĂźlich" />
+    <Word from="SchlieBt" to="SchlieĂźt" />
+    <Word from="schlief$en" to="schlieĂźen" />
+    <Word from="Schlief$lich" to="SchlieĂźlich" />
+    <Word from="schlief2&gt;lich" to="schlieĂźlich" />
+    <Word from="schlief3t" to="schlieĂźt" />
+    <Word from="Schliefie" to="SchlieĂźe" />
+    <Word from="schliefien" to="schlieĂźen" />
+    <Word from="Schliefilich" to="SchlieĂźlich" />
+    <Word from="schlieflslich" to="schlieĂźlich" />
+    <Word from="schliel3en" to="schlieĂźen" />
+    <Word from="schliel3lich" to="schlieĂźlich" />
+    <Word from="Schliel5t" to="SchlieĂźt" />
+    <Word from="schlielie" to="schlieĂźe" />
+    <Word from="schlielien" to="schlieĂźen" />
+    <Word from="schlielilich" to="schlieĂźlich" />
+    <Word from="schliellsen" to="schlieĂźen" />
+    <Word from="SchlielSt" to="SchlieĂźt" />
+    <Word from="Schliissel" to="SchlĂĽssel" />
+    <Word from="Schliissell" to="SchlĂĽssel!" />
+    <Word from="Schliisselmoment" to="SchlĂĽsselmoment" />
+    <Word from="Schliisseln" to="SchlĂĽsseln" />
+    <Word from="Schlijsse" to="SchlĂĽsse" />
+    <Word from="Schlijssel" to="SchlĂĽssel" />
+    <Word from="Schlijsselloch" to="SchlĂĽsselloch" />
+    <Word from="Schlilssel" to="SchlĂĽssel" />
+    <Word from="Schlilssell" to="SchlĂĽssel" />
+    <Word from="Schlilsselparty" to="SchlĂĽsselparty" />
+    <Word from="schlimmsterAlbtraum" to="schlimmster Albtraum" />
+    <Word from="Schlleflen" to="Schließen" />
+    <Word from="Schllisse" to="SchĂĽsse" />
+    <Word from="schllitze" to="schĂĽtze" />
+    <Word from="schllitzen" to="schĂĽtzen" />
+    <Word from="Schlllissell" to="SchlĂĽssel!" />
+    <Word from="Schlull" to="Schluss" />
+    <Word from="Schlupfern" to="SchlĂĽpfern" />
+    <Word from="Schlusselmoment" to="SchlĂĽsselmoment" />
+    <Word from="Schlusselszenen" to="SchlĂĽsselszenen" />
+    <Word from="Schlusselwérter" to="Schlusselwörter" />
+    <Word from="Schlussl" to="Schluss!" />
+    <Word from="SchluĂź" to="Schluss" />
+    <Word from="Schléchter" to="Schlächter" />
+    <Word from="schléfst" to="schläfst" />
+    <Word from="Schléft" to="Schläft" />
+    <Word from="Schlége" to="Schläge" />
+    <Word from="Schléger" to="Schläger" />
+    <Word from="Schlégerei" to="Schlägerei" />
+    <Word from="schlégt" to="schlägt" />
+    <Word from="schléift" to="schläft" />
+    <Word from="schléigst" to="schlägst" />
+    <Word from="Schlflssel" to="Schlüssel" />
+    <Word from="Schmatzgeréusche" to="Schmatzgeräusche" />
+    <Word from="SchmeiBt" to="SchmeiĂźt" />
+    <Word from="Schmeif$" to="SchmeiĂź" />
+    <Word from="Schmeif$t" to="SchmeiĂźt" />
+    <Word from="Schmeifien" to="SchmeiĂźen" />
+    <Word from="schmeifit" to="schmeiĂźt" />
+    <Word from="Schmeilit" to="SchmeiĂźt" />
+    <Word from="Schmeifl" to="Schmeiß" />
+    <Word from="Schmierél" to="Schmieröl" />
+    <Word from="schmiicken" to="schmĂĽcken" />
+    <Word from="schmilztl" to="schmilzt!" />
+    <Word from="schmifl" to="schmiss" />
+    <Word from="Schmuckkéstchen" to="Schmuckkästchen" />
+    <Word from="Schmuckstiick" to="SchmuckstĂĽck" />
+    <Word from="Schnappschijsse" to="SchnappschĂĽsse" />
+    <Word from="Schnauzel" to="Schnauze!" />
+    <Word from="Schneegestéber" to="Schneegestöber" />
+    <Word from="Schneidezéhnen" to="Schneidezähnen" />
+    <Word from="Schneidezéihne" to="Schneidezähne" />
+    <Word from="schnellf" to="schnell!" />
+    <Word from="Schnfiffeln" to="SchnĂĽffeln" />
+    <Word from="schnfiffelnl" to="schnĂĽffeln!" />
+    <Word from="schnfiffelst" to="schnĂĽffelst" />
+    <Word from="Schnfirsenkel" to="SchnĂĽrsenkel" />
+    <Word from="schniiffele" to="schnĂĽffele" />
+    <Word from="schnijffelt" to="schnĂĽffelt" />
+    <Word from="Schnilffeln" to="SchnĂĽffeln" />
+    <Word from="schnilrt" to="schnĂĽrt" />
+    <Word from="Schnitzereigeschéft" to="Schnitzereigeschäft" />
+    <Word from="Schniuzer" to="Schnäuzer" />
+    <Word from="Schnuoki" to="Schnucki" />
+    <Word from="Schnéppchen" to="Schnäppchen" />
+    <Word from="SchoB" to="SchoĂź" />
+    <Word from="Schofk" to="SchoĂź" />
+    <Word from="ScholShund" to="SchoĂźhund" />
+    <Word from="Schones" to="Schönes" />
+    <Word from="schonl" to="schon!" />
+    <Word from="schopferische" to="schöpferische" />
+    <Word from="schoĂź" to="schoss" />
+    <Word from="Schrankwénde" to="Schrankwände" />
+    <Word from="Schraubenschlijssel" to="SchraubenschlĂĽssel" />
+    <Word from="schrecklichl" to="schrecklich!" />
+    <Word from="Schriftist" to="Schrift ist" />
+    <Word from="Schriftstijcks" to="SchriftstĂĽcks" />
+    <Word from="schrége" to="schräge" />
+    <Word from="Schréges" to="Schräges" />
+    <Word from="Schrénke" to="Schränke" />
+    <Word from="Schrénken" to="Schränken" />
+    <Word from="schtin" to="schön" />
+    <Word from="schtine" to="schöne" />
+    <Word from="Schtisse" to="SchĂĽsse" />
+    <Word from="schuchtern" to="schĂĽchtern" />
+    <Word from="Schuchterne" to="SchĂĽchterne" />
+    <Word from="Schuhl" to="Schuh!" />
+    <Word from="Schuldgeftihlen" to="SchuldgefĂĽhlen" />
+    <Word from="Schulterl" to="Schulter!" />
+    <Word from="Schutzen" to="SchĂĽtzen" />
+    <Word from="Schutzréume" to="Schutzräume" />
+    <Word from="SCHUTZT" to="SCHĂśTZT" />
+    <Word from="Schw6r's" to="Schwör's" />
+    <Word from="Schwachkopfl" to="Schwachkop!" />
+    <Word from="Schwanzlutscherl" to="Schwanzlutscher!" />
+    <Word from="Schwarzhéndler" to="Schwarzhändler" />
+    <Word from="Schwarzweills" to="SchwarzweiĂź" />
+    <Word from="schweifldurchnisst" to="schweißdurchnässt" />
+    <Word from="schwerhérig" to="schwerhörig" />
+    <Word from="schwiicht" to="schwächt" />
+    <Word from="schwiire" to="schwöre" />
+    <Word from="schwiiren" to="schwören" />
+    <Word from="Schwimmanziige" to="SchwimmanzĂĽge" />
+    <Word from="schwiérmten" to="schwärmten" />
+    <Word from="schwnre" to="schwöre" />
+    <Word from="Schwéche" to="Schwäche" />
+    <Word from="Schwéchen" to="Schwächen" />
+    <Word from="schwécher" to="schwächer" />
+    <Word from="schwécheren" to="schwächeren" />
+    <Word from="schwéchsten" to="schwächsten" />
+    <Word from="Schwéicheanfall" to="Schwächeanfall" />
+    <Word from="Schwéichen" to="Schwächen" />
+    <Word from="schwéicher" to="schwächer" />
+    <Word from="Schwéichling" to="Schwächling" />
+    <Word from="Schwéirmerei" to="Schwärmerei" />
+    <Word from="schwéirzeste" to="schwärzeste" />
+    <Word from="Schwémme" to="Schwämme" />
+    <Word from="schwére" to="schwöre" />
+    <Word from="schwéren" to="schwören" />
+    <Word from="Schwérme" to="Schwärme" />
+    <Word from="schwérmt" to="schwärmt" />
+    <Word from="schwérmte" to="schwärmte" />
+    <Word from="Schwétzer" to="Schwätzer" />
+    <Word from="schébiger" to="schäbiger" />
+    <Word from="Schédel" to="Schädel" />
+    <Word from="Schéden" to="Schäden" />
+    <Word from="Schéinder" to="Schänder" />
+    <Word from="schéine" to="schöne" />
+    <Word from="schéinen" to="schönen" />
+    <Word from="Schéiner" to="Schöner" />
+    <Word from="schéirfen" to="schärfen" />
+    <Word from="schéle" to="schäle" />
+    <Word from="schéme" to="schäme" />
+    <Word from="Schén" to="Schön" />
+    <Word from="schéne" to="schöne" />
+    <Word from="Schénen" to="Schönen" />
+    <Word from="Schéner" to="Schöner" />
+    <Word from="Schénes" to="Schönes" />
+    <Word from="Schénheit" to="Schönheit" />
+    <Word from="schénl" to="schön!" />
+    <Word from="schénste" to="schönste" />
+    <Word from="schénsten" to="schönsten" />
+    <Word from="schénstes" to="schönstes" />
+    <Word from="Schétzchen" to="Schätzchen" />
+    <Word from="Schétze" to="Schätze" />
+    <Word from="schétzen" to="schätzen" />
+    <Word from="schétzt" to="schätzt" />
+    <Word from="Schétzung" to="Schätzung" />
+    <Word from="Schéumen" to="Schäumen" />
+    <Word from="schflchtern" to="schüchtern" />
+    <Word from="SCl'1lUSS6l" to="SchlĂĽssel" />
+    <Word from="Scllrift" to="Schrift" />
+    <Word from="scmoss" to="SCHLOSS" />
+    <Word from="se/n" to="sein" />
+    <Word from="Se/wen" to="Sehen" />
+    <Word from="sehenl" to="sehen!" />
+    <Word from="Sehenswlllrdigkeiten" to="SehenswĂĽrdigkeiten" />
+    <Word from="Sehnsilchte" to="SehnsĂĽchte" />
+    <Word from="sehrangespannt" to="sehr angespannt" />
+    <Word from="sehrjung" to="sehr jung" />
+    <Word from="Sehrwohl" to="Sehr wohl" />
+    <Word from="sehrzufrieden" to="sehr zufrieden" />
+    <Word from="sehtjetzt" to="seht jetzt" />
+    <Word from="Seidenglattl" to="Seidenglatt!" />
+    <Word from="seidjetzt" to="seid jetzt" />
+    <Word from="Seitwann" to="Seit wann" />
+    <Word from="SEKRETARIN" to="SEKRETĂ„RIN" />
+    <Word from="Sekretiir" to="Sekretär" />
+    <Word from="Sekretir" to="Sekretär" />
+    <Word from="Sekretéirin" to="Sekretärin" />
+    <Word from="Sekretérin" to="Sekretärin" />
+    <Word from="sel/g" to="selig" />
+    <Word from="selbstl" to="selbst!" />
+    <Word from="selbststiindig" to="selbstständig" />
+    <Word from="selbstsuchtige" to="selbstsĂĽchtige" />
+    <Word from="selbstverstindlich" to="selbstverständlich" />
+    <Word from="Selbstverstlndlich" to="Selbstverständlich" />
+    <Word from="Selbstverstéindlich" to="Selbstverständlich" />
+    <Word from="Selbstversténdlich" to="Selbstverständlich" />
+    <Word from="seld" to="seid" />
+    <Word from="selhst" to="selbst" />
+    <Word from="SeligerVater" to="Seliger Vater" />
+    <Word from="seln" to="sein" />
+    <Word from="Selt" to="Seit" />
+    <Word from="sentimalen" to="sentimentalen" />
+    <Word from="seriéser" to="seriöser" />
+    <Word from="Sexualitét" to="Sexualität" />
+    <Word from="Sfe" to="Sie" />
+    <Word from="Sfidamerikas" to="SĂĽdamerikas" />
+    <Word from="Sfidwind" to="SĂĽdwind" />
+    <Word from="Sfifies" to="SĂĽĂźes" />
+    <Word from="Sfihne" to="Söhne" />
+    <Word from="Sfildner" to="Söldner" />
+    <Word from="Sfilie" to="SĂĽĂźe" />
+    <Word from="Sfilieste" to="SĂĽĂźeste" />
+    <Word from="Sfifligkeiten" to="Süßigkeiten" />
+    <Word from="sfnd" to="sind" />
+    <Word from="SICHERHEITSBEHORDE" to="SICHERHEITSBEHĂ–RDE" />
+    <Word from="Sicherheitsgrijnden" to="SicherheitsgrĂĽnden" />
+    <Word from="Sichtubervvachung" to="SichtĂĽberwachung" />
+    <Word from="Sichtunterstutzung" to="SichtunterstĂĽtzung" />
+    <Word from="Sieja" to="Sie ja" />
+    <Word from="Sifihnchen" to="Söhnchen" />
+    <Word from="Signalstérke" to="Signalstärke" />
+    <Word from="Siiden" to="SĂĽden" />
+    <Word from="Siidfrankreich" to="SĂĽdfrankreich" />
+    <Word from="siidliche" to="sĂĽdliche" />
+    <Word from="siil$" to="sĂĽĂź" />
+    <Word from="siili" to="sĂĽĂź" />
+    <Word from="Siilie" to="SĂĽĂźe" />
+    <Word from="siilier" to="sĂĽĂźer" />
+    <Word from="SIim's" to="Slim's" />
+    <Word from="Siinde" to="SĂĽnde" />
+    <Word from="Siinden" to="SĂĽnden" />
+    <Word from="Siinder" to="SĂĽnder" />
+    <Word from="siindigen" to="sĂĽndigen" />
+    <Word from="siiflen" to="süßen" />
+    <Word from="siJB" to="sĂĽĂź" />
+    <Word from="SiJBe" to="SĂĽĂźe" />
+    <Word from="siJchtige" to="sĂĽchtige" />
+    <Word from="sijlien" to="siĂĽĂźen" />
+    <Word from="sijliesten" to="sĂĽĂźesten" />
+    <Word from="Sijsser" to="SĂĽĂźer" />
+    <Word from="Sildtunnel" to="SĂĽdtunnel" />
+    <Word from="Silfie" to="SĂĽĂźe" />
+    <Word from="Silfier" to="SĂĽĂźer" />
+    <Word from="Silfies" to="SĂĽĂźes" />
+    <Word from="silfker" to="sĂĽĂźer" />
+    <Word from="Silnden" to="SĂĽnden" />
+    <Word from="Silndenbock" to="SĂĽndenbock" />
+    <Word from="sindja" to="sind ja" />
+    <Word from="Sirl" to="Sir!" />
+    <Word from="Sj_r" to="Sir" />
+    <Word from="Skilaufen" to="Ski laufen" />
+    <Word from="skrupelloserAnwélte" to="skrupelloser Anwälte" />
+    <Word from="sL'lf$e" to="sĂĽĂźe" />
+    <Word from="sL1B" to="sĂĽĂź" />
+    <Word from="slch" to="sich" />
+    <Word from="sle" to="sie" />
+    <Word from="slebe" to="siebe" />
+    <Word from="sLif$" to="sĂĽĂź" />
+    <Word from="SLif$e" to="SĂĽĂźe" />
+    <Word from="SLif$er" to="SĂĽĂźer" />
+    <Word from="sLif$es" to="sĂĽĂźes" />
+    <Word from="SLilSe" to="SĂĽĂźe" />
+    <Word from="Slliden" to="SĂĽden" />
+    <Word from="Sllinde" to="SĂĽnde" />
+    <Word from="sllindigen" to="sĂĽndigen" />
+    <Word from="Slnd" to="Sind" />
+    <Word from="Slr" to="Sir" />
+    <Word from="Slrs" to="Sirs" />
+    <Word from="SoBen" to="SoĂźen" />
+    <Word from="sofortl" to="sofort!" />
+    <Word from="sohénen" to="schönen" />
+    <Word from="Solien" to="SoĂźen" />
+    <Word from="sollenl" to="sollen!" />
+    <Word from="SONDERMULL" to="SONDERMĂśLL" />
+    <Word from="sorgféiltig" to="sorgfältig" />
+    <Word from="sorgféltig" to="sorgfältig" />
+    <Word from="souveréine" to="souveräne" />
+    <Word from="souveréinen" to="souveränen" />
+    <Word from="souveréner" to="souveräner" />
+    <Word from="sp'a'ter" to="später" />
+    <Word from="sp/elen" to="spielen" />
+    <Word from="SpaB" to="SpaĂź" />
+    <Word from="Spaf$" to="SpaĂź" />
+    <Word from="Spaf2&gt;" to="SpaĂź" />
+    <Word from="Spaffs" to="SpaĂź" />
+    <Word from="Spafi" to="SpaĂź" />
+    <Word from="Spafls" to="SpaĂź" />
+    <Word from="SpafS" to="SpaĂź" />
+    <Word from="Spal'5" to="SpaĂź" />
+    <Word from="Spal2&gt;" to="SpaĂź" />
+    <Word from="Spal3" to="SpaĂź" />
+    <Word from="Spali" to="SpaĂź" />
+    <Word from="Spall" to="SpaĂź" />
+    <Word from="Spass" to="SpaĂź" />
+    <Word from="spat" to="spät" />
+    <Word from="spektakular" to="spektakulär" />
+    <Word from="Spell" to="Späß" />
+    <Word from="Spells" to="Späß" />
+    <Word from="Spell»" to="Spaß" />
+    <Word from="Spezialitét" to="Spezialität" />
+    <Word from="spfit" to="spät" />
+    <Word from="SpieB" to="SpieĂź" />
+    <Word from="spief$ig" to="spieĂźig" />
+    <Word from="Spielzeuggeschfiftn" to="Spielzeuggeschäft" />
+    <Word from="Spielzeuggeschfiftn" to="Spielzeuggeschäft--" />
+    <Word from="spiilte" to="spĂĽlte" />
+    <Word from="spiiren" to="spĂĽren" />
+    <Word from="spiirt" to="spĂĽrt" />
+    <Word from="spiit" to="spät" />
+    <Word from="spijre" to="spĂĽre" />
+    <Word from="spijren" to="spĂĽren" />
+    <Word from="spijrt" to="spĂĽrt" />
+    <Word from="Spillmeier" to="SpĂĽlmeier" />
+    <Word from="spilre" to="spĂĽre" />
+    <Word from="spilren" to="spĂĽren" />
+    <Word from="spit" to="spät" />
+    <Word from="Spitzenfriihstiick" to="SpitzenfrĂĽhstĂĽck" />
+    <Word from="spLir's" to="spĂĽr's" />
+    <Word from="splliren" to="spĂĽren" />
+    <Word from="splter" to="später" />
+    <Word from="Sportilbertragung" to="SportĂĽbertragung" />
+    <Word from="Sportsfraund" to="Sportsfreund" />
+    <Word from="Sprachpijppchen" to="SprachpĂĽppchen" />
+    <Word from="SPRACHPUPPCHEN" to="SPRACHPĂśPPCHEN" />
+    <Word from="Spriichlein" to="SprĂĽchlein" />
+    <Word from="Sprilht" to="SprĂĽht" />
+    <Word from="spréche" to="spräche" />
+    <Word from="spréchen" to="sprächen" />
+    <Word from="spréchet" to="sprächet" />
+    <Word from="Sprflche" to="Sprüche" />
+    <Word from="sprflht" to="sprüht" />
+    <Word from="spUl" to="spĂĽl" />
+    <Word from="spUr" to="spĂĽr" />
+    <Word from="spurbare" to="spĂĽrbare" />
+    <Word from="spUrt" to="spĂĽrt" />
+    <Word from="sp§ter" to="später" />
+    <Word from="Späß" to="Spaß" />
+    <Word from="spéit" to="spät" />
+    <Word from="spéiter" to="später" />
+    <Word from="spét" to="spät" />
+    <Word from="Spéter" to="Später" />
+    <Word from="Spétzchen" to="Spätzchen" />
+    <Word from="Spétzchenl" to="Spätzchen!" />
+    <Word from="ssh" to="sah" />
+    <Word from="st6Bt" to="stößt" />
+    <Word from="st6hnt" to="stöhnt" />
+    <Word from="st6lSt" to="stößt" />
+    <Word from="St6rt" to="Stört" />
+    <Word from="ST@HNT" to="STĂ–HNT" />
+    <Word from="Staatsafféren" to="Staatsaffären" />
+    <Word from="staatsbllirgerliches" to="staatsbĂĽrgerliches" />
+    <Word from="Staatsgeschéfte" to="Staatsgeschäfte" />
+    <Word from="Standardanésthesie" to="Standardanästhesie" />
+    <Word from="standig" to="ständig" />
+    <Word from="STARSCREAMI" to="STARSCREAM:" />
+    <Word from="stationér" to="stationär" />
+    <Word from="Statusmeldungl" to="Statusmeldung!" />
+    <Word from="stdrte" to="störte" />
+    <Word from="stecktjede" to="steckt jede" />
+    <Word from="Stehenbleiben" to="Stehen bleiben" />
+    <Word from="Stehvermiigen" to="Stehvermögen" />
+    <Word from="Steigbilgeldinger" to="SteigbĂĽgeldinger" />
+    <Word from="Steinhéuser" to="Steinhäuser" />
+    <Word from="Sternenkijsse" to="SternenkĂĽsse" />
+    <Word from="Steuererklérung" to="Steuererklärung" />
+    <Word from="Steuererklérungen" to="Steuererklärungen" />
+    <Word from="Steuerprtifer" to="SteuerprĂĽfer" />
+    <Word from="Steuerprtifung" to="SteuerprĂĽfung" />
+    <Word from="Steuersiitzen" to="Steuersätzen" />
+    <Word from="stfipseln" to="stöpseln" />
+    <Word from="stfiren" to="stören" />
+    <Word from="stfirker" to="stärker" />
+    <Word from="Stfirt" to="Stört" />
+    <Word from="stfirzt" to="stĂĽrzt" />
+    <Word from="stieB" to="stieĂź" />
+    <Word from="Stiefbriider" to="StiefbrĂĽder" />
+    <Word from="Stiicke" to="StĂĽcke" />
+    <Word from="Stiihle" to="StĂĽhle" />
+    <Word from="Stiihlen" to="StĂĽhlen" />
+    <Word from="stiihnt" to="stöhnt" />
+    <Word from="Stiillen" to="Ställen" />
+    <Word from="Stiire" to="Störe" />
+    <Word from="stiiren" to="stören" />
+    <Word from="Stiirme" to="StĂĽrme" />
+    <Word from="stiirmischen" to="stĂĽrmischen" />
+    <Word from="Stiirsignale" to="Störsignale" />
+    <Word from="stiirt" to="stört" />
+    <Word from="Stiirung" to="Störung" />
+    <Word from="stiirzen" to="stĂĽrzen" />
+    <Word from="Stiitzpunkt" to="StĂĽtzpunkt" />
+    <Word from="Stijck" to="StĂĽck" />
+    <Word from="Stijckchen" to="StĂĽckchen" />
+    <Word from="Stijcke" to="StĂĽcke" />
+    <Word from="stijhle" to="stĂĽhle" />
+    <Word from="stijrme" to="stĂĽrme" />
+    <Word from="stijrzen" to="stĂĽrzen" />
+    <Word from="Stilck" to="StĂĽck" />
+    <Word from="Stilcke" to="StĂĽcke" />
+    <Word from="Stillckchen" to="StĂĽckchen" />
+    <Word from="Stillsténde" to="Stillstände" />
+    <Word from="Stilvolll" to="Stilvoll!" />
+    <Word from="stinden" to="ständen" />
+    <Word from="Stldseite" to="SĂĽdseite" />
+    <Word from="stleg" to="stieg" />
+    <Word from="Stllihle" to="StĂĽhle" />
+    <Word from="Stllirmen" to="StĂĽrmen" />
+    <Word from="stllirzt" to="stĂĽrzt" />
+    <Word from="stlllrzen" to="stĂĽrzen" />
+    <Word from="Stlfl" to="Stift" />
+    <Word from="sto/3en" to="stoĂźen" />
+    <Word from="StoB" to="StoĂź" />
+    <Word from="stoBe" to="stoĂźe" />
+    <Word from="stof$en" to="stoĂźen" />
+    <Word from="Stofi" to="StoĂź" />
+    <Word from="STOHNT" to="STĂ–HNT" />
+    <Word from="Stol3zahn" to="StoĂźzahn" />
+    <Word from="Stol3zeit" to="StoĂźzeit" />
+    <Word from="stolie" to="stoĂźe" />
+    <Word from="Storung" to="Störung" />
+    <Word from="Str6men" to="Strömen" />
+    <Word from="str6mt" to="strömt" />
+    <Word from="StraBe" to="StraĂźe" />
+    <Word from="StraBen" to="StraĂźen" />
+    <Word from="StraBenk6tern" to="Straßenkötern" />
+    <Word from="Straf$e" to="StraĂźe" />
+    <Word from="Strafiengang" to="StraĂźengang" />
+    <Word from="Strafienratten" to="StraĂźenratten" />
+    <Word from="Strafienschlacht" to="StraĂźenschlacht" />
+    <Word from="Straflsenecke" to="StraĂźenecke" />
+    <Word from="Straflsenmaler" to="StraĂźenmaler" />
+    <Word from="Straflsenschilder" to="StraĂźenschilder" />
+    <Word from="Straftéter" to="Straftäter" />
+    <Word from="Strahlenschutzgerét" to="Strahlenschutzgerät" />
+    <Word from="Strahlungsintensitét" to="Strahlungsintensität" />
+    <Word from="Stral3en" to="StraĂźen" />
+    <Word from="Stral5e" to="StraĂźe" />
+    <Word from="Stralie" to="StraĂźe" />
+    <Word from="Straliengang" to="StraĂźengang" />
+    <Word from="Stralienkéter" to="Straßenköter" />
+    <Word from="Straliensperre" to="StraĂźensperre" />
+    <Word from="Streitkréfte" to="Streitkräfte" />
+    <Word from="Streitkréften" to="Streitkräften" />
+    <Word from="Streitéxte" to="Streitäxte" />
+    <Word from="strfimten" to="strömten" />
+    <Word from="Striimen" to="Strömen" />
+    <Word from="Striimungen" to="Strömungen" />
+    <Word from="Stromschliige" to="Stromschläge" />
+    <Word from="Stromschnellenl" to="Stromschnellen!" />
+    <Word from="Stromung" to="Strömung" />
+    <Word from="Strullerl" to="Struller!" />
+    <Word from="Strémung" to="Strömung" />
+    <Word from="Strémungen" to="Strömungen" />
+    <Word from="sturzte" to="stĂĽrzte" />
+    <Word from="STUTZPUNKT" to="STĂśTZPUNKT" />
+    <Word from="Stébe" to="Stäbe" />
+    <Word from="stéhnt" to="stöhnt" />
+    <Word from="stéhnte" to="stöhnte" />
+    <Word from="Stéidtchen" to="Städtchen" />
+    <Word from="Stéidte" to="Städte" />
+    <Word from="stéindig" to="ständig" />
+    <Word from="Stéirke" to="Stärke" />
+    <Word from="stéirker" to="stärker" />
+    <Word from="Stéirkeres" to="Stärkeres" />
+    <Word from="stéllst" to="stößt" />
+    <Word from="Sténdchen" to="Ständchen" />
+    <Word from="Sténder" to="Ständer" />
+    <Word from="Sténdig" to="Ständig" />
+    <Word from="stépseln" to="stöpseln" />
+    <Word from="stéren" to="stören" />
+    <Word from="Stérke" to="Stärke" />
+    <Word from="Stérken" to="Stärken" />
+    <Word from="stérker" to="stärker" />
+    <Word from="Stérkere" to="Stärkere" />
+    <Word from="stérkeres" to="stärkeres" />
+    <Word from="stérkste" to="stärkste" />
+    <Word from="stérst" to="störst" />
+    <Word from="stért" to="stört" />
+    <Word from="Stérung" to="Störung" />
+    <Word from="Stétten" to="Stätten" />
+    <Word from="Stflck" to="Stück" />
+    <Word from="Stflhlen" to="Stühlen" />
+    <Word from="sUB" to="sĂĽĂź" />
+    <Word from="sUBe" to="sĂĽĂźe" />
+    <Word from="Suchfeam" to="Suchteam" />
+    <Word from="SUden" to="SĂĽden" />
+    <Word from="Sudseite" to="SĂĽdseite" />
+    <Word from="Sudwest" to="SĂĽdwest" />
+    <Word from="sUf$" to="sĂĽĂź" />
+    <Word from="SUf$e" to="SĂĽĂźe" />
+    <Word from="suMM†" to="SUMMT" />
+    <Word from="Suohet" to="Suchet" />
+    <Word from="Superkréfte" to="Superkräfte" />
+    <Word from="superlécherlich" to="superlächerlich" />
+    <Word from="s¢'il3" to="süß" />
+    <Word from="Sécke" to="Säcke" />
+    <Word from="Sége" to="Säge" />
+    <Word from="séhe" to="sähe" />
+    <Word from="Séhne" to="Söhne" />
+    <Word from="Séhnen" to="Söhnen" />
+    <Word from="Séicke" to="Säcke" />
+    <Word from="Séinger" to="Sänger" />
+    <Word from="Séiulen" to="Säulen" />
+    <Word from="Séldner" to="Söldner" />
+    <Word from="sémfl/che" to="sämtliche" />
+    <Word from="sémtliche" to="sämtliche" />
+    <Word from="sémtlichen" to="sämtlichen" />
+    <Word from="Sénger" to="Sänger" />
+    <Word from="Séngerin" to="Sängerin" />
+    <Word from="séubern" to="säubern" />
+    <Word from="séuft" to="säuft" />
+    <Word from="séugen" to="säugen" />
+    <Word from="Séulen" to="Säulen" />
+    <Word from="Séurewannen" to="Säurewannen" />
+    <Word from="Sfldhéingen" to="Südhängen" />
+    <Word from="T6chter" to="Töchter" />
+    <Word from="T6pfchen" to="Töpfchen" />
+    <Word from="T6rn" to="Törn" />
+    <Word from="T6rtchen" to="Törtchen" />
+    <Word from="t6te" to="töte" />
+    <Word from="T6ten" to="Töten" />
+    <Word from="t6tet" to="tötet" />
+    <Word from="TANZERINNEN" to="TĂ„NZERINNEN" />
+    <Word from="Tater" to="Täter" />
+    <Word from="tatséchlich" to="tatsächlich" />
+    <Word from="tatséchliche" to="tatsächliche" />
+    <Word from="tatséichlich" to="tatsächlich" />
+    <Word from="Tatverdéichtigen" to="Tatverdächtigen" />
+    <Word from="Tauchgéinge" to="Tauchgänge" />
+    <Word from="Tauchgénge" to="Tauchgänge" />
+    <Word from="Tauschgeschéfte" to="Tauschgeschäfte" />
+    <Word from="Tauschgeschéfle" to="Tauschgeschäfte" />
+    <Word from="Tbrn" to="Törn" />
+    <Word from="tbten" to="töten" />
+    <Word from="tdten" to="töten" />
+    <Word from="tdtete" to="tötete" />
+    <Word from="Telefongespréche" to="Telefongespräche" />
+    <Word from="Tempelschénderf" to="Tempelschänder!" />
+    <Word from="TemPO" to="Tempo" />
+    <Word from="TESTGELANDE" to="TESTGELĂ„NDE" />
+    <Word from="Testvorfflhrungen" to="Testvorführungen" />
+    <Word from="tfidlich" to="tödlich" />
+    <Word from="tfiitet" to="tötet" />
+    <Word from="Tfir" to="TĂĽr" />
+    <Word from="tfirkischen" to="tĂĽrkischen" />
+    <Word from="Tfite" to="TĂĽte" />
+    <Word from="Theaterstfick" to="TheaterstĂĽck" />
+    <Word from="Therapiel" to="Therapie!" />
+    <Word from="Thermalgerét" to="Thermalgerät" />
+    <Word from="Thronréuber" to="Thronräuber" />
+    <Word from="Thronréuberin" to="Thronräuberin" />
+    <Word from="Tiefkilhlung" to="TiefkĂĽhlung" />
+    <Word from="Tiefktih/system" to="TiefkĂĽhlsystem" />
+    <Word from="Tiefktihleindémmung" to="Tiefkühleindämmung" />
+    <Word from="TIEFKUHL" to="TIEFKĂśHL" />
+    <Word from="Tiefkuhlstasis" to="TiefkĂĽhlstasis" />
+    <Word from="Tiefkuhlung" to="TiefkĂĽhlung" />
+    <Word from="tiglich" to="täglich" />
+    <Word from="tiichtige" to="tĂĽchtige" />
+    <Word from="tiint" to="tönt" />
+    <Word from="Tiipfchen" to="Töpfchen" />
+    <Word from="Tiipfchennummer" to="Töpfchennummer" />
+    <Word from="Tiir" to="TĂĽr" />
+    <Word from="Tiiren" to="TĂĽren" />
+    <Word from="Tiirl" to="TĂĽr!" />
+    <Word from="Tiirme" to="TĂĽrme" />
+    <Word from="tiite" to="töte" />
+    <Word from="Tiite" to="TĂĽte" />
+    <Word from="tiiten" to="töten" />
+    <Word from="tiitet" to="tötet" />
+    <Word from="tiitete" to="tötete" />
+    <Word from="TiJr" to="TĂĽr" />
+    <Word from="Tijrme" to="TĂĽrme" />
+    <Word from="Tilr" to="TĂĽr" />
+    <Word from="Tilrglocke" to="TĂĽrglocke" />
+    <Word from="Tilrklingel" to="TĂĽrklingel" />
+    <Word from="Tilréffner" to="Türöffner" />
+    <Word from="Tippgeréusch" to="Tippgeräusch" />
+    <Word from="Tischlenuerkstatt" to="Tischlerwerkstatt" />
+    <Word from="TL'lr" to="TĂĽr" />
+    <Word from="tlglich" to="täglich" />
+    <Word from="Tllir" to="TĂĽr" />
+    <Word from="Tllirkei" to="TĂĽrkei" />
+    <Word from="Tlllpfelchen" to="TĂĽpfelchen" />
+    <Word from="TOILETTENSPULUNG" to="TOILETTENSPĂśLUNG" />
+    <Word from="Tonl" to="Ton" />
+    <Word from="Toreroabsétze" to="Toreroabsätze" />
+    <Word from="Tortenbéickerin" to="Tortenbäckerin" />
+    <Word from="Tragfidie" to="Tragödie" />
+    <Word from="Tragiidie" to="Tragödie" />
+    <Word from="Tragédie" to="Tragödie" />
+    <Word from="Trainingsijbung" to="TrainingsĂĽbung" />
+    <Word from="TRAUMKCRPER" to="TRAUMKĂ–RPER" />
+    <Word from="treffan" to="treffen" />
+    <Word from="trfiumen" to="träumen" />
+    <Word from="Tribiinen" to="TribĂĽnen" />
+    <Word from="trif'f't" to="trifft" />
+    <Word from="trigt" to="trägt" />
+    <Word from="Triibsal" to="TrĂĽbsal" />
+    <Word from="Triimmem" to="TrĂĽmmern" />
+    <Word from="triistllch" to="tröstlich" />
+    <Word from="Triistungen" to="Tröstungen" />
+    <Word from="Triiume" to="Träume" />
+    <Word from="Trilmmer" to="TrĂĽmmer" />
+    <Word from="triume" to="träume" />
+    <Word from="Trockengeréite" to="Trockengeräte" />
+    <Word from="Trockengeréte" to="Trockengeräte" />
+    <Word from="Tropfsteinhiihle" to="Tropfsteinhöhle" />
+    <Word from="Trottell" to="Trottel!" />
+    <Word from="Trubsal" to="TrĂĽbsal" />
+    <Word from="trége" to="träge" />
+    <Word from="Trégerschiff" to="Trägerschiff" />
+    <Word from="trégt" to="trägt" />
+    <Word from="Tréigerschiff" to="Trägerschiff" />
+    <Word from="tréigt" to="trägt" />
+    <Word from="tréium" to="träum" />
+    <Word from="tréiume" to="träume" />
+    <Word from="tréiumen" to="träumen" />
+    <Word from="tréiumt" to="träumt" />
+    <Word from="tréllert" to="trällert" />
+    <Word from="Tréne" to="Träne" />
+    <Word from="Trénen" to="Tränen" />
+    <Word from="Tréum" to="Träum" />
+    <Word from="tréume" to="träume" />
+    <Word from="Tréumen" to="Träumen" />
+    <Word from="Tréumer" to="Träumer" />
+    <Word from="tréumst" to="träumst" />
+    <Word from="Tréumt" to="Träumt" />
+    <Word from="Tschiiss" to="TschĂĽss" />
+    <Word from="Tschiissl" to="TschĂĽss!" />
+    <Word from="tschijss" to="tschĂĽss" />
+    <Word from="Tschtiss" to="TschĂĽss" />
+    <Word from="tschĂĽĂź" to="tschĂĽss" />
+    <Word from="Tschfls" to="Tschüs" />
+    <Word from="Ttir" to="TĂĽr" />
+    <Word from="ttlckisch" to="tĂĽckisch" />
+    <Word from="Ttlte" to="TĂĽte" />
+    <Word from="tubulére" to="tubuläre" />
+    <Word from="Tupperschiissel" to="TupperschĂĽssel" />
+    <Word from="TUR" to="TĂśR" />
+    <Word from="TUr" to="TĂĽr" />
+    <Word from="Turen" to="TĂĽren" />
+    <Word from="TURKEI" to="TĂśRKEI" />
+    <Word from="Turmwiichter" to="Turmwächter" />
+    <Word from="tutjetzt" to="tut jetzt" />
+    <Word from="typlschl" to="typlsch!" />
+    <Word from="Téchter" to="Töchter" />
+    <Word from="téd/ichen" to="tödlichen" />
+    <Word from="tédlich" to="tödlich" />
+    <Word from="tédliche" to="tödliche" />
+    <Word from="tédlichen" to="tödlichen" />
+    <Word from="téglich" to="täglich" />
+    <Word from="téglichen" to="täglichen" />
+    <Word from="téiglich" to="täglich" />
+    <Word from="téitowieren" to="tätowieren" />
+    <Word from="téitowierte" to="tätowierte" />
+    <Word from="Téitowierung" to="Tätowierung" />
+    <Word from="téiuschen" to="täuschen" />
+    <Word from="Téler" to="Täler" />
+    <Word from="Télpell" to="Tölpel!" />
+    <Word from="Ténze" to="Tänze" />
+    <Word from="Ténzerin" to="Tänzerin" />
+    <Word from="Tépfchen" to="Töpfchen" />
+    <Word from="Tépfchenquatsch" to="Töpfchenquatsch" />
+    <Word from="Tépfchensache" to="Töpfchensache" />
+    <Word from="téte" to="töte" />
+    <Word from="Téten" to="Töten" />
+    <Word from="tétest" to="tätest" />
+    <Word from="tétet" to="tötet" />
+    <Word from="tétete" to="tötete" />
+    <Word from="tétowieren" to="tätowieren" />
+    <Word from="tétowierte" to="tätowierte" />
+    <Word from="Tétowierung" to="Tätowierung" />
+    <Word from="Tétowierungen" to="Tätowierungen" />
+    <Word from="téuschen" to="täuschen" />
+    <Word from="téuscht" to="täuscht" />
+    <Word from="Téuschung" to="Täuschung" />
+    <Word from="Téuschungsmanéver" to="Täuschungsmanöver" />
+    <Word from="Ub6FpFUfl'T1al" to="ĂĽberprĂĽf" />
+    <Word from="Ub6l'pl'Uf€" to="Überprüfe" />
+    <Word from="Ube" to="Ăśbe" />
+    <Word from="Ubel" to="ĂĽbel" />
+    <Word from="Ubelkeit" to="Ăśbelkeit" />
+    <Word from="Ubeltéter" to="Übeltäter" />
+    <Word from="Uben" to="Ăśben" />
+    <Word from="Uben/vachen" to="Ăśberwachen" />
+    <Word from="Uben/vacher" to="Ăśberwacher" />
+    <Word from="Uben/vacht" to="Ăśberwacht" />
+    <Word from="Uben/vachungen" to="Ăśberwachungen" />
+    <Word from="Uben/vachungsgesetz" to="Ăśberwachungsgesetz" />
+    <Word from="Uben/vinden" to="ĂĽberwinden" />
+    <Word from="Uber" to="ĂĽber" />
+    <Word from="UBER" to="ĂśBER" />
+    <Word from="Uberall" to="ĂĽberall" />
+    <Word from="Uberanstrenge" to="ĂĽberanstrenge" />
+    <Word from="Uberanstrengung" to="Ăśberanstrengung" />
+    <Word from="Uberarbeiten" to="Ăśberarbeiten" />
+    <Word from="UberAuf$erirdische" to="ĂĽber AuĂźerirdische" />
+    <Word from="Uberaus" to="ĂĽberaus" />
+    <Word from="Uberbleibsel" to="Ăśberbleibsel" />
+    <Word from="Uberblick" to="Ăśberblick" />
+    <Word from="Uberbringe" to="ĂĽberbringe" />
+    <Word from="Uberdauern" to="ĂĽberdauern" />
+    <Word from="Uberdecken" to="ĂĽberdecken" />
+    <Word from="Ubereinstimmung" to="Ăśbereinstimmung" />
+    <Word from="Uberfahren" to="ĂĽberfahren" />
+    <Word from="Uberfall" to="Ăśberfall" />
+    <Word from="Uberflilssig" to="ĂĽberflĂĽssig" />
+    <Word from="Ubergabe" to="Ăśbergabe" />
+    <Word from="Ubergaben" to="Ăśbergaben" />
+    <Word from="Ubergabepunkt" to="Ăśbergabepunkt" />
+    <Word from="Ubergangen" to="ĂĽbergangen" />
+    <Word from="Ubergangsweise" to="ĂĽbergangsweise" />
+    <Word from="Ubergeben" to="ĂĽbergeben" />
+    <Word from="Ubergehen" to="ĂĽbergehen" />
+    <Word from="Uberhaupt" to="Ăśberhaupt" />
+    <Word from="Uberholt" to="Ăśberholt" />
+    <Word from="Uberholter" to="ĂĽberholter" />
+    <Word from="Uberhért" to="überhört" />
+    <Word from="Uberjemanden" to="ĂĽber jemanden" />
+    <Word from="Uberlagerungs" to="Ăśberlagerungs" />
+    <Word from="Uberlandleitungen" to="Ăśberlandleitungen" />
+    <Word from="Uberlass" to="Ăśberlass" />
+    <Word from="Uberlasse" to="ĂĽberlasse" />
+    <Word from="Uberlassen" to="ĂĽberlassen" />
+    <Word from="Uberlassenl" to="ĂĽberlassen!" />
+    <Word from="Uberlasteten" to="Ăśberlasteten" />
+    <Word from="Uberleben" to="Ăśberleben" />
+    <Word from="Uberlebende" to="Ăśberlebende" />
+    <Word from="Uberlebenden" to="Ăśberlebenden" />
+    <Word from="Uberlebenschancen" to="Ăśberlebenschancen" />
+    <Word from="Uberlebenswichtigen" to="ĂĽberlebenswichtigen" />
+    <Word from="Uberlebt" to="ĂĽberlebt" />
+    <Word from="Uberleg" to="ĂĽberleg" />
+    <Word from="Uberlegen" to="Ăśberlegen" />
+    <Word from="Uberlegenheit" to="Ăśberlegenheit" />
+    <Word from="uberlegt" to="ĂĽberlegt" />
+    <Word from="Uberlegten" to="ĂĽberlegten" />
+    <Word from="Uberleiten" to="ĂĽberleiten" />
+    <Word from="Uberleitung" to="Ăśberleitung" />
+    <Word from="Uberlieferungen" to="Ăśberlieferungen" />
+    <Word from="Uberlésst" to="überlässt" />
+    <Word from="Uberm" to="ĂĽberm" />
+    <Word from="Ubermorgen" to="Ăśbermorgen" />
+    <Word from="Ubernachtungsgast" to="Ăśbernachtungsgast" />
+    <Word from="Ubernahm" to="ĂĽbernahm" />
+    <Word from="Ubernahme" to="Ăśbernahme" />
+    <Word from="Ubernahmen" to="ĂĽbernahmen" />
+    <Word from="Ubernehme" to="ĂĽbernehme" />
+    <Word from="Ubernehmen" to="ĂĽbernehmen" />
+    <Word from="Ubernimmst" to="ĂĽbernimmst" />
+    <Word from="ubernimmt" to="ĂĽbernimmt" />
+    <Word from="Ubernommen" to="ĂĽbernommen" />
+    <Word from="Uberpriifen" to="ĂĽberprĂĽfen" />
+    <Word from="Uberprilfen" to="ĂĽberprĂĽfen" />
+    <Word from="Uberprliifen" to="ĂśberprĂĽfen" />
+    <Word from="Uberprufe" to="ĂĽberprĂĽfe" />
+    <Word from="Uberprufen" to="ĂĽberprĂĽfen" />
+    <Word from="Uberpruft" to="ĂĽberprĂĽft" />
+    <Word from="Uberraschend" to="Ăśberraschend" />
+    <Word from="Uberrascht" to="Ăśberrascht" />
+    <Word from="Uberraschte" to="Ăśberraschte" />
+    <Word from="Uberraschter" to="ĂĽberraschter" />
+    <Word from="Uberraschung" to="Ăśberraschung" />
+    <Word from="Uberraschungen" to="Ăśberraschungen" />
+    <Word from="Uberraschungl" to="Ăśberraschung!" />
+    <Word from="Uberreagiert" to="ĂĽberreagiert" />
+    <Word from="Uberreden" to="ĂĽberreden" />
+    <Word from="Uberredet" to="Ăśberredet" />
+    <Word from="Uberreste" to="Ăśberreste" />
+    <Word from="Uberrumpeln" to="ĂĽberrumpeln" />
+    <Word from="Uberrumple" to="Ăśberrumple" />
+    <Word from="Ubers" to="ĂĽbers" />
+    <Word from="Uberschlégt" to="Überschlägt" />
+    <Word from="Uberschreiten" to="Ăśberschreiten" />
+    <Word from="Uberschritten" to="ĂĽberschritten" />
+    <Word from="Uberschwemmung" to="Ăśberschwemmung" />
+    <Word from="Ubersehen" to="ĂĽbersehen" />
+    <Word from="Ubersensibilitét" to="Übersensibilität" />
+    <Word from="Ubersetzung" to="Ăśbersetzung" />
+    <Word from="Uberspannte" to="ĂĽberspannte" />
+    <Word from="Uberspielt" to="ĂĽberspielt" />
+    <Word from="Uberstehen" to="Ăśberstehen" />
+    <Word from="Ubersteigerten" to="ĂĽbersteigerten" />
+    <Word from="Ubersteigt" to="ĂĽbersteigt" />
+    <Word from="Uberstunden" to="Ăśberstunden" />
+    <Word from="Ubertraf" to="ĂĽbertraf" />
+    <Word from="UBERTRAGEN" to="ĂśBERTRAGEN" />
+    <Word from="Ubertragen" to="ĂĽbertragen" />
+    <Word from="UBERTRAGUNG" to="ĂśBERTRAGUNG" />
+    <Word from="ubertreibe" to="ĂĽbertreibe" />
+    <Word from="Ubertreiben" to="ĂĽbertreiben" />
+    <Word from="Ubertrieben" to="ĂĽbertrieben" />
+    <Word from="Ubertriebene" to="Ăśbertriebene" />
+    <Word from="ubertriebener" to="ĂĽbertriebener" />
+    <Word from="Ubertrifft" to="Ăśbertrifft" />
+    <Word from="Ubervvachen" to="ĂĽberwachen" />
+    <Word from="Ubervvacht" to="ĂĽberwacht" />
+    <Word from="Ubervvachung" to="Ăśberwachung" />
+    <Word from="Ubervvachungs" to="Ăśberwachungs" />
+    <Word from="Ubervvachungsstaat" to="Ăśberwachungsstaat" />
+    <Word from="Ubervvachungsstaats" to="Ăśberwachungsstaats" />
+    <Word from="Ubervvachungsvideos" to="Ăśberwachungsvideos" />
+    <Word from="Ubervvéiltigend" to="überwältigend" />
+    <Word from="Uberwachen" to="ĂĽberwachen" />
+    <Word from="Uberwacher" to="Ăśberwacher" />
+    <Word from="Uberwachung" to="Ăśberwachung" />
+    <Word from="Uberzeuge" to="ĂĽberzeuge" />
+    <Word from="Uberzeugen" to="ĂĽberzeugen" />
+    <Word from="Uberzeugend" to="ĂĽberzeugend" />
+    <Word from="Uberzeugt" to="ĂĽberzeugt" />
+    <Word from="Uberzeugung" to="Ăśberzeugung" />
+    <Word from="Uberzeugungen" to="Ăśberzeugungen" />
+    <Word from="Uberziehen" to="ĂĽberziehen" />
+    <Word from="Uberzuleiten" to="ĂĽberzuleiten" />
+    <Word from="ublem" to="ĂĽblem" />
+    <Word from="Ubler" to="Ăśbler" />
+    <Word from="Ubles" to="Ăśbles" />
+    <Word from="Ublich" to="ĂĽblich" />
+    <Word from="Ubliche" to="Ăśbliche" />
+    <Word from="ublichen" to="ĂĽblichen" />
+    <Word from="Ubrig" to="ĂĽbrig" />
+    <Word from="Ubrige" to="Ăśbrige" />
+    <Word from="Ubrigen" to="Ăśbrigen" />
+    <Word from="Ubrigens" to="ĂĽbrigens" />
+    <Word from="Ubrlgens" to="Ăśbrigens" />
+    <Word from="Ubrllccol" to="Ubriacco!" />
+    <Word from="Ubung" to="Ăśbung" />
+    <Word from="Ubungsbedingungen" to="Ăśbungsbedingungen" />
+    <Word from="Ubungsschiisse" to="ĂśbungsschĂĽsse" />
+    <Word from="Ubungsschusse" to="ĂśbungsschĂĽsse" />
+    <Word from="Ub€f'pf'Uf€l'1" to="überprüfen" />
+    <Word from="Uher" to="Ăśber" />
+    <Word from="ultrakiistlichl" to="ultraköstlich!" />
+    <Word from="umgeriistet" to="umgerĂĽstet" />
+    <Word from="umgénglich" to="umgänglich" />
+    <Word from="umhdren" to="umhören" />
+    <Word from="umhéngt" to="umhängt" />
+    <Word from="Umschlfigen" to="Umschlägen" />
+    <Word from="umschlieBt" to="umschlieĂźt" />
+    <Word from="Umstéinden" to="Umständen" />
+    <Word from="Umsténde" to="Umstände" />
+    <Word from="Umsténden" to="Umständen" />
+    <Word from="umsténdlich" to="umständlich" />
+    <Word from="umweltschédlich" to="umweltschädlich" />
+    <Word from="unabhiingiges" to="unabhängiges" />
+    <Word from="unabhéingig" to="unabhängig" />
+    <Word from="unabhéngig" to="unabhängig" />
+    <Word from="unabléssig" to="unablässig" />
+    <Word from="Unauffélligeres" to="Unauffälligeres" />
+    <Word from="unaufhalfsam" to="unaufhaltsam" />
+    <Word from="unaufhiirlich" to="unaufhörlich" />
+    <Word from="unaufhérlich" to="unaufhörlich" />
+    <Word from="unaufiéllig" to="unauffällig" />
+    <Word from="unberijhrbar" to="unberĂĽhrbar" />
+    <Word from="unberllihrten" to="unberĂĽhrten" />
+    <Word from="unbeschédigt" to="unbeschädigt" />
+    <Word from="Uncl" to="Und" />
+    <Word from="undja" to="und ja" />
+    <Word from="undjeder" to="und jeder" />
+    <Word from="undjemand" to="und jemand" />
+    <Word from="undjetzt" to="und jetzt" />
+    <Word from="undlassenihn" to="und lassen ihn" />
+    <Word from="undlhnen" to="und Ihnen" />
+    <Word from="undurchfuhrbar" to="undurchfĂĽhrbar" />
+    <Word from="uneingeschrénkten" to="uneingeschränkten" />
+    <Word from="unergrilndliche" to="unergrĂĽndliche" />
+    <Word from="unerhort" to="unerhört" />
+    <Word from="unerhorte" to="unerhörte" />
+    <Word from="unerklérliche" to="unerklärliche" />
+    <Word from="unerklérlichen" to="unerklärlichen" />
+    <Word from="unertréglich" to="unerträglich" />
+    <Word from="unf'a'hig" to="unfähig" />
+    <Word from="Unfahigkeit" to="Unfähigkeit" />
+    <Word from="unfersfellen" to="unterstellen" />
+    <Word from="unfiirmigen" to="unförmigen" />
+    <Word from="unféhig" to="unfähig" />
+    <Word from="unféhigste" to="unfähigste" />
+    <Word from="unféihigste" to="unfähigste" />
+    <Word from="Unféille" to="Unfälle" />
+    <Word from="Unfélle" to="Unfälle" />
+    <Word from="ungeféhr" to="ungefähr" />
+    <Word from="ungeféhre" to="ungefähre" />
+    <Word from="Ungeféihr" to="Ungefähr" />
+    <Word from="ungeféihrlich" to="ungefährlich" />
+    <Word from="ungemutlich" to="ungemĂĽtlich" />
+    <Word from="ungenugend" to="ungenĂĽgend" />
+    <Word from="ungestbrt" to="ungestört" />
+    <Word from="ungewfihnliche" to="ungewöhnliche" />
+    <Word from="Ungewfjhnliches" to="Ungewöhnliches" />
+    <Word from="ungewiihnlich" to="ungewöhnlich" />
+    <Word from="Ungewijhnliches" to="Ungewöhnliches" />
+    <Word from="ungewéhnlich" to="ungewöhnlich" />
+    <Word from="ungewéhnliche" to="ungewöhnliche" />
+    <Word from="ungewéhnlichste" to="ungewöhnlichste" />
+    <Word from="ungfinstigen" to="ungĂĽnstigen" />
+    <Word from="ungiiltig" to="ungĂĽltig" />
+    <Word from="ungilnstig" to="ungĂĽnstig" />
+    <Word from="Unglaubliohl" to="Unglaublich!" />
+    <Word from="unglaubwurdig" to="unglaubwĂĽrdig" />
+    <Word from="Unglfiubige" to="Ungläubige" />
+    <Word from="Ungliicklicherweise" to="UnglĂĽcklicherweise" />
+    <Word from="Unglilck" to="UnglĂĽck" />
+    <Word from="Ungll'Jcklichervveise" to="UnglĂĽcklicherweise" />
+    <Word from="Unglllick" to="UnglĂĽck" />
+    <Word from="unglllicklich" to="unglĂĽcklich" />
+    <Word from="ungllllckliche" to="unglĂĽckliche" />
+    <Word from="unglucklich" to="unglĂĽcklich" />
+    <Word from="Ungléubiger" to="Ungläubiger" />
+    <Word from="ungultig" to="ungĂĽltig" />
+    <Word from="ungunstigen" to="ungĂĽnstigen" />
+    <Word from="unheimlichl" to="unheimlich!" />
+    <Word from="UNHORBARES" to="UNHĂ–RBARES" />
+    <Word from="unhéflich" to="unhöflich" />
+    <Word from="Universitlt" to="Universität" />
+    <Word from="Universitét" to="Universität" />
+    <Word from="unlfisbare" to="unlösbare" />
+    <Word from="unm6glich" to="unmöglich" />
+    <Word from="unmfiglich" to="unmöglich" />
+    <Word from="Unmiiglich" to="Unmöglich" />
+    <Word from="Unmiigliche" to="Unmögliche" />
+    <Word from="unmijglich" to="unmöglich" />
+    <Word from="unmissversténdlich" to="unmissverständlich" />
+    <Word from="unmoglich" to="unmöglich" />
+    <Word from="Unmtioglich" to="Unmöglich" />
+    <Word from="Unméglich" to="Unmöglich" />
+    <Word from="unméglioh" to="unmöglich" />
+    <Word from="unnatiirliche" to="unnatĂĽrliche" />
+    <Word from="unnaturliche" to="unnatĂĽrliche" />
+    <Word from="unnfitigen" to="unnötigen" />
+    <Word from="unniitig" to="unnötig" />
+    <Word from="unnllitz" to="unnĂĽtz" />
+    <Word from="unnétig" to="unnötig" />
+    <Word from="unnétigen" to="unnötigen" />
+    <Word from="unol" to="und" />
+    <Word from="unpésslich" to="unpässlich" />
+    <Word from="UNREGELMASSIG" to="UNREGELMĂ„SSIG" />
+    <Word from="Unregelméfiigkeiten" to="Unregelmäßigkeiten" />
+    <Word from="unschliissig" to="unschlĂĽssig" />
+    <Word from="unserejungen" to="unsere jungen" />
+    <Word from="unsererAnwélte" to="unserer Anwälte" />
+    <Word from="unsererjungfréulichen" to="unserer jungfräulichen" />
+    <Word from="unsjede" to="uns jede" />
+    <Word from="unséglich" to="unsäglich" />
+    <Word from="Untenuelt" to="Unterwelt" />
+    <Word from="unterdriickten" to="unterdrĂĽckten" />
+    <Word from="Unterdrilckung" to="ĂśnterdrĂĽckung" />
+    <Word from="unterdrtlckte" to="unterdrĂĽckte" />
+    <Word from="Unterdrflckung" to="Unterdrückung" />
+    <Word from="Unterhaltskostenl" to="Unterhaltskosten!" />
+    <Word from="Unterhaltungsméfiig" to="Unterhaltungsmäßig" />
+    <Word from="unterhfilt" to="unterhält" />
+    <Word from="unterhélt" to="unterhält" />
+    <Word from="unterschitzt" to="unterschätzt" />
+    <Word from="unterschétzte" to="unterschätzte" />
+    <Word from="unterstiitzt" to="unterstĂĽtzt" />
+    <Word from="Unterstiitzung" to="UnterstĂĽtzung" />
+    <Word from="unterstijtzt" to="unterstĂĽtzt" />
+    <Word from="Unterstiltzung" to="UnterstĂĽtzung" />
+    <Word from="Unterstllitzung" to="UnterstĂĽtzung" />
+    <Word from="unterstutzen" to="unterstĂĽtzen" />
+    <Word from="unterstutzt" to="unterstĂĽtzt" />
+    <Word from="Unterstutzten" to="UnterstĂĽtzten" />
+    <Word from="Unterstutzung" to="UnterstĂĽtzung" />
+    <Word from="Untersuchungsausschijsse" to="UntersuchungsausschĂĽsse" />
+    <Word from="Unterwésche" to="Unterwäsche" />
+    <Word from="untréstlich" to="untröstlich" />
+    <Word from="Untétigkeit" to="Untätigkeit" />
+    <Word from="unumgénglich" to="unumgänglich" />
+    <Word from="unverméhlt" to="unvermählt" />
+    <Word from="Unverschfimtheitl" to="Unverschämtheit" />
+    <Word from="unverschémte" to="unverschämte" />
+    <Word from="Unverschémtheitl" to="Unverschämtheit" />
+    <Word from="UNVERSTANDLICH" to="UNVERSTĂ„NDLICH" />
+    <Word from="UNVERSTANDLICHE" to="UNVERSTĂ„NDLICHE" />
+    <Word from="UNVERSTANDLICHER" to="UNVERSTĂ„NDLICHER" />
+    <Word from="UNVERSTANDLICHES" to="UNVERSTĂ„NDLICHES" />
+    <Word from="Unversténdliche" to="Unverständliche" />
+    <Word from="unversténdlichen" to="unverständlichen" />
+    <Word from="unversténdliches" to="unverständliches" />
+    <Word from="unverzlliglich" to="unverzĂĽglich" />
+    <Word from="unveréndert" to="unverändert" />
+    <Word from="Unzerbrechliohen" to="Unzerbrechlichen" />
+    <Word from="unzurechnungsfahig" to="unzurechnungsfähig" />
+    <Word from="unzuverlassiger" to="unzuverlässiger" />
+    <Word from="Unzuverléssiger" to="Unzuverlässiger" />
+    <Word from="unzuverléssiges" to="unzuverlässiges" />
+    <Word from="unzéhlige" to="unzählige" />
+    <Word from="unzéhligen" to="unzähligen" />
+    <Word from="unzéihlige" to="unzählige" />
+    <Word from="Urgrofivaters" to="UrgroĂźvaters" />
+    <Word from="Urlaubsuberschreitung" to="UrlaubsĂĽberschreitung" />
+    <Word from="Ursprijnglich" to="UrsprĂĽnglich" />
+    <Word from="ursprtmglich" to="ursprĂĽnglich" />
+    <Word from="Ursprunglich" to="UrsprĂĽnglich" />
+    <Word from="Ururgrofivater" to="UrurgroĂźvater" />
+    <Word from="v/el" to="viel" />
+    <Word from="v/er" to="vier" />
+    <Word from="v/erfe" to="vierte" />
+    <Word from="v/erfes" to="viertes" />
+    <Word from="V6gel" to="Vögel" />
+    <Word from="v6IIig" to="völlig" />
+    <Word from="V6lker" to="Völker" />
+    <Word from="V6llig" to="Völlig" />
+    <Word from="v6lllg" to="völlig" />
+    <Word from="vdllig" to="völlig" />
+    <Word from="Ve/Teidigungskréfte" to="Verteidigungskräfte" />
+    <Word from="Velzeih" to="Verzeih" />
+    <Word from="Velzeihung" to="Verzeihung" />
+    <Word from="velzichte" to="verzichte" />
+    <Word from="Ven/vandter" to="Verwandter" />
+    <Word from="ven/véhntl" to="verwöhnt!" />
+    <Word from="Ventilationsfiffnung" to="Ventilationsöffnung" />
+    <Word from="Ventilatorschéchte" to="Ventilatorschächte" />
+    <Word from="VERACHTLICH" to="VERĂ„CHTLICH" />
+    <Word from="verandert" to="verändert" />
+    <Word from="Verbiindeten" to="VerbĂĽndeten" />
+    <Word from="Verbilndeter" to="VerbĂĽndeter" />
+    <Word from="verbliidet" to="verblödet" />
+    <Word from="Verbliidung" to="Verblödung" />
+    <Word from="verbllirgen" to="verbĂĽrgen" />
+    <Word from="verbrachfe" to="verbrachte" />
+    <Word from="Verbrec/ver" to="Verbrecher" />
+    <Word from="Verbtmdeter" to="VerbĂĽndeter" />
+    <Word from="Verbundeten" to="VerbĂĽndeten" />
+    <Word from="Verbflnolete" to="Verbündete" />
+    <Word from="verdiichtigen" to="verdächtigen" />
+    <Word from="verdiinnt" to="verdĂĽnnt" />
+    <Word from="verdllistern" to="verdĂĽstern" />
+    <Word from="verdrflckt" to="verdrückt" />
+    <Word from="verdunnt" to="verdĂĽnnt" />
+    <Word from="verdéchtig" to="verdächtig" />
+    <Word from="Verdéchtigen" to="Verdächtigen" />
+    <Word from="verdéchtiger" to="verdächtiger" />
+    <Word from="verffilgbares" to="verfĂĽgbares" />
+    <Word from="Verfiigung" to="VerfĂĽgung" />
+    <Word from="verfiihren" to="verfĂĽhren" />
+    <Word from="verfiihrt" to="verfĂĽhrt" />
+    <Word from="verfiittem" to="verfĂĽttern" />
+    <Word from="Verfijgung" to="VerfĂĽgung" />
+    <Word from="verfilgst" to="verfĂĽgst" />
+    <Word from="verfilgte" to="verfĂĽgte" />
+    <Word from="Verfilgung" to="VerfĂĽgung" />
+    <Word from="Verfilhrungskilnste" to="VerfĂĽhrungskĂĽnste" />
+    <Word from="verflligen" to="verfĂĽgen" />
+    <Word from="verfllihrt" to="verfĂĽhrt" />
+    <Word from="Verflllgung" to="VerfĂĽgung" />
+    <Word from="verfolgf" to="verfolgt" />
+    <Word from="verfolgtl" to="verfolgt!" />
+    <Word from="VERFUGBAR" to="VERFĂśGBAR" />
+    <Word from="verfugt" to="verfĂĽgt" />
+    <Word from="vergafk" to="vergaĂź" />
+    <Word from="Vergniigen" to="VergnĂĽgen" />
+    <Word from="Vergniigens" to="VergnĂĽgens" />
+    <Word from="Vergniigungsausflug" to="VergnĂĽgungsausflug" />
+    <Word from="Vergnijgen" to="VergnĂĽgen" />
+    <Word from="Vergnilgen" to="VergnĂĽgen" />
+    <Word from="Vergnlligen" to="VergnĂĽgen" />
+    <Word from="Vergntigen" to="VergnĂĽgen" />
+    <Word from="Vergnugen" to="VergnĂĽgen" />
+    <Word from="vergnugt" to="vergnĂĽgt" />
+    <Word from="vergnugte" to="vergnĂĽgte" />
+    <Word from="Vergnugungsausflug" to="VergnĂĽgungsausflug" />
+    <Word from="vergr6Bern" to="vergrößern" />
+    <Word from="vergréfiern" to="vergrößern" />
+    <Word from="Vergréfierung" to="Vergrößerung" />
+    <Word from="vergénglich" to="vergänglich" />
+    <Word from="verhiirt" to="verhört" />
+    <Word from="Verhiitung" to="VerhĂĽtung" />
+    <Word from="Verhor" to="Verhör" />
+    <Word from="verhort" to="verhört" />
+    <Word from="verhorten" to="verhörten" />
+    <Word from="verhéilt" to="verhält" />
+    <Word from="verhélt" to="verhält" />
+    <Word from="Verhéltnis" to="Verhältnis" />
+    <Word from="Verhéltnisse" to="Verhältnisse" />
+    <Word from="verhéltst" to="verhältst" />
+    <Word from="veriindert" to="verändert" />
+    <Word from="Verinderungen" to="Veränderungen" />
+    <Word from="verkilnden" to="verkĂĽnden" />
+    <Word from="verkilndet" to="verkĂĽndet" />
+    <Word from="verkniipft" to="verknĂĽpft" />
+    <Word from="verknUpf't" to="verknĂĽpft" />
+    <Word from="verkunde" to="verkĂĽnde" />
+    <Word from="verkunden" to="verkĂĽnden" />
+    <Word from="verkundet" to="verkĂĽndet" />
+    <Word from="VERKUNDIGUNG" to="VERKĂśNDIGUNG" />
+    <Word from="Verkéufer" to="Verkäufer" />
+    <Word from="verletztl" to="verletzt!" />
+    <Word from="verlieB" to="verlieĂź" />
+    <Word from="verlielien" to="verlieĂźen" />
+    <Word from="verlorenl" to="verloren!" />
+    <Word from="verléingert" to="verlängert" />
+    <Word from="Verléingerungskabel" to="Verlängerungskabel" />
+    <Word from="verléisst" to="verlässt" />
+    <Word from="verlésst" to="verlässt" />
+    <Word from="verléuft" to="verläuft" />
+    <Word from="verm'aihlen" to="vermählen" />
+    <Word from="verm/ssf" to="vermisst" />
+    <Word from="vermiibelt" to="vermöbelt" />
+    <Word from="Vermiigt" to="Vermögt" />
+    <Word from="Vermégen" to="Vermögen" />
+    <Word from="verméhle" to="vermähle" />
+    <Word from="verméhlen" to="vermählen" />
+    <Word from="verméhlt" to="vermählt" />
+    <Word from="Verméihlung" to="Vermählung" />
+    <Word from="vernachléssigt" to="vernachlässigt" />
+    <Word from="Vernachléssigung" to="Vernachlässigung" />
+    <Word from="vernfinftig" to="vernĂĽnftig" />
+    <Word from="vernfinftige" to="vernĂĽnftige" />
+    <Word from="vernilnftig" to="vernĂĽnftig" />
+    <Word from="vernllmftigsten" to="vernĂĽnftigsten" />
+    <Word from="verntmftige" to="vernĂĽnftige" />
+    <Word from="vernunftig" to="vernĂĽnftig" />
+    <Word from="vernunftigsten" to="vernĂĽnftigsten" />
+    <Word from="vernflnftig" to="vernünftig" />
+    <Word from="verpaĂźt" to="verpasst" />
+    <Word from="verpesfefe" to="verpestete" />
+    <Word from="verprilgle" to="verprĂĽgle" />
+    <Word from="verprugeln" to="verprĂĽgeln" />
+    <Word from="Verpflichtungen" to="Verpflichtungen" />
+    <Word from="verrat" to="verrät" />
+    <Word from="verrfickter" to="verrĂĽckter" />
+    <Word from="verriickt" to="verrĂĽckt" />
+    <Word from="Verriickte" to="VerrĂĽckte" />
+    <Word from="Verriickten" to="VerrĂĽckten" />
+    <Word from="Verriickter" to="VerrĂĽckter" />
+    <Word from="verriicktes" to="verrĂĽcktes" />
+    <Word from="verrijckt" to="verrĂĽckt" />
+    <Word from="verrijckte" to="verrĂĽckte" />
+    <Word from="verrilckt" to="verrĂĽckt" />
+    <Word from="Verrilckte" to="VerrĂĽckte" />
+    <Word from="Verrilckter" to="VerrĂĽckter" />
+    <Word from="Verrilcktes" to="VerrĂĽcktes" />
+    <Word from="verrL'lckt" to="verrĂĽckt" />
+    <Word from="verrljckt" to="verrĂĽckt" />
+    <Word from="verrllickt" to="verrĂĽckt" />
+    <Word from="Verrllickte" to="VerrĂĽckte" />
+    <Word from="Verrllickter" to="VerrĂĽckter" />
+    <Word from="verrlllckte" to="verrĂĽckte" />
+    <Word from="verrtickt" to="verrĂĽckt" />
+    <Word from="verrUckt" to="verrĂĽckt" />
+    <Word from="Verruckte" to="VerrĂĽckte" />
+    <Word from="verruckten" to="verrĂĽckten" />
+    <Word from="Verruckter" to="VerrĂĽckter" />
+    <Word from="Verréiter" to="Verräter" />
+    <Word from="verréitst" to="verräitst" />
+    <Word from="verrét" to="verrät" />
+    <Word from="Verréter" to="Verräter" />
+    <Word from="Verréterin" to="Verräterin" />
+    <Word from="verréterisch" to="verräterisch" />
+    <Word from="verréterischen" to="verräterischen" />
+    <Word from="verrflckt" to="verrückt" />
+    <Word from="versaumt" to="versäumt" />
+    <Word from="Verscheifier" to="VerscheiĂźer" />
+    <Word from="verschiichtert" to="verschĂĽchtert" />
+    <Word from="verschiitten" to="verschĂĽtten" />
+    <Word from="verschlucktl" to="verschluckt!" />
+    <Word from="VERSCHLUSSELN" to="VERSCHLĂśSSELN" />
+    <Word from="VERSCHLUSSELT" to="VERSCHLĂśSSELT" />
+    <Word from="Verschlusselung" to="VerschlĂĽsselung" />
+    <Word from="Verschnauferst" to="Verschnauf erst" />
+    <Word from="Verschwdrung" to="Verschwörung" />
+    <Word from="verschweilit" to="verschweiĂźt" />
+    <Word from="Verschwiirer" to="Verschwörer" />
+    <Word from="verschwiirerisch" to="verschwörerisch" />
+    <Word from="Verschwiirern" to="Verschwörern" />
+    <Word from="Verschwiirung" to="Verschwörung" />
+    <Word from="Verschwiirungen" to="Verschwörungen" />
+    <Word from="Verschwérer" to="Verschwörer" />
+    <Word from="Verschwérung" to="Verschwörung" />
+    <Word from="Verschwérungstheoretiker" to="Verschwörungstheoretiker" />
+    <Word from="verschérft" to="verschärft" />
+    <Word from="versfanden" to="verstanden" />
+    <Word from="Versfehen" to="Verstehen" />
+    <Word from="versiihnlich" to="versöhnlich" />
+    <Word from="Versiihnung" to="Versöhnung" />
+    <Word from="verslumte" to="versäumte" />
+    <Word from="Verspfitung" to="Verspätung" />
+    <Word from="verspiire" to="verspĂĽre" />
+    <Word from="verspilre" to="verspĂĽre" />
+    <Word from="verspiten" to="verspäten" />
+    <Word from="versprijht" to="versprĂĽht" />
+    <Word from="verst0I3en" to="verstoĂźen" />
+    <Word from="verst6Bt" to="verstößt" />
+    <Word from="Verst6ISt" to="Verstößt" />
+    <Word from="verst6l3t" to="verstößt" />
+    <Word from="verstehejetzt" to="verstehe jetzt" />
+    <Word from="Verstiindnis" to="Verständnis" />
+    <Word from="verstiirkt" to="verstärkt" />
+    <Word from="Verstiirkung" to="Verstärkung" />
+    <Word from="verstilmmelst" to="verstĂĽmmelst" />
+    <Word from="verstoBen" to="VerstoĂźen" />
+    <Word from="verstofken" to="verstoĂźen" />
+    <Word from="verstolien" to="verstoĂźen" />
+    <Word from="verstummelt" to="verstĂĽmmelt" />
+    <Word from="verstunde" to="verstĂĽnde" />
+    <Word from="verstundest" to="verstĂĽndest" />
+    <Word from="verstéfkt" to="verstößt" />
+    <Word from="verstéindlich" to="verständlich" />
+    <Word from="Verstéirkung" to="Verstärkung" />
+    <Word from="Versténdigen" to="Verständigen" />
+    <Word from="Versténdigt" to="Verständigt" />
+    <Word from="versténdlich" to="verständlich" />
+    <Word from="Versténdnis" to="Verständnis" />
+    <Word from="verstérken" to="verstärken" />
+    <Word from="verstérkt" to="verstärkt" />
+    <Word from="verstérkte" to="verstärkte" />
+    <Word from="verstérkter" to="verstärkter" />
+    <Word from="Verstérkung" to="Verstärkung" />
+    <Word from="verstért" to="verstört" />
+    <Word from="verséhnen" to="versöhnen" />
+    <Word from="verséhnt" to="versöhnt" />
+    <Word from="verséumen" to="versäumen" />
+    <Word from="verséumt" to="versäumt" />
+    <Word from="VERTRAGSLANGE" to="VERTRAGSLĂ„NGE" />
+    <Word from="vertrauenswiirdig" to="vertrauenswĂĽrdig" />
+    <Word from="vertrauenswtlrdig" to="vertrauenswĂĽrdig" />
+    <Word from="vertrauenswtlrdigen" to="vertrauenswĂĽrdigen" />
+    <Word from="vertréumte" to="verträumte" />
+    <Word from="vervvanzt" to="verwanzt" />
+    <Word from="verwiistete" to="verwĂĽstete" />
+    <Word from="verwllisten" to="verwĂĽsten" />
+    <Word from="verwustet" to="verwĂĽstet" />
+    <Word from="verwéhnten" to="verwöhnten" />
+    <Word from="verwéihnen" to="verwöhnen" />
+    <Word from="verwéssert" to="verwässert" />
+    <Word from="verzégere" to="verzögere" />
+    <Word from="Verzégerte" to="Verzögerte" />
+    <Word from="Verzégerung" to="Verzögerung" />
+    <Word from="veréffentliche" to="veröffentliche" />
+    <Word from="veréffentlichen" to="veröffentlichen" />
+    <Word from="veréffentlicht" to="veröffentlicht" />
+    <Word from="veréindert" to="verändert" />
+    <Word from="Veréinderung" to="Veränderung" />
+    <Word from="veréndern" to="verändern" />
+    <Word from="veréndert" to="verändert" />
+    <Word from="verénderte" to="veränderte" />
+    <Word from="verénderten" to="veränderten" />
+    <Word from="Verénderung" to="Veränderung" />
+    <Word from="Verénderungen" to="Veränderungen" />
+    <Word from="veréngstigtes" to="verängstigtes" />
+    <Word from="veréppelt" to="veräppelt" />
+    <Word from="verérgert" to="verärgert" />
+    <Word from="vewvendet" to="verwendet" />
+    <Word from="vfillig" to="völlig" />
+    <Word from="VGFKUFZGH" to="verkĂĽrzen" />
+    <Word from="VI/illkommen" to="Willkommen" />
+    <Word from="VI/itwicky" to="Witwicky" />
+    <Word from="vial" to="viel" />
+    <Word from="Videoiiben/vachung" to="VideoĂĽberwachung" />
+    <Word from="Vie/e" to="Viele" />
+    <Word from="Vielfrafi" to="VielfraĂź" />
+    <Word from="vielféltig" to="vielfältig" />
+    <Word from="Vielleichtja" to="Vielleicht ja" />
+    <Word from="vielversprechend" to="viel versprechend" />
+    <Word from="Vieraugengespréch" to="Vieraugengespräch" />
+    <Word from="vieriunge" to="vier junge" />
+    <Word from="vierjéhriges" to="vierjähriges" />
+    <Word from="vierképfige" to="vierköpfige" />
+    <Word from="Viigel" to="Vögel" />
+    <Word from="viillig" to="völlig" />
+    <Word from="viilliges" to="völliges" />
+    <Word from="Viterchen" to="Väterchen" />
+    <Word from="Vizepréisident" to="Vizepräsident" />
+    <Word from="vlel" to="viel" />
+    <Word from="Vlellelcht" to="Vielleicht" />
+    <Word from="Vogelscheifke" to="VogelscheiĂźe" />
+    <Word from="Vogelscheilie" to="VogelscheiĂźe" />
+    <Word from="Volksmérchen" to="Volksmärchen" />
+    <Word from="vollerjeder" to="voller jeder" />
+    <Word from="vollmachen" to="voll machen" />
+    <Word from="vollsténdig" to="vollständig" />
+    <Word from="vollsténdige" to="vollständige" />
+    <Word from="Volltrefferl" to="Volltreffer!" />
+    <Word from="vollzéhlig" to="vollzählig" />
+    <Word from="Volumenl" to="Volumen!" />
+    <Word from="von/vagten" to="vorwagten" />
+    <Word from="von/véirts" to="vorwärts" />
+    <Word from="vonn6ten" to="vonnöten" />
+    <Word from="Vonnéirts" to="Vorwärts" />
+    <Word from="Vordertiir" to="VordertĂĽr" />
+    <Word from="Vorderturl" to="VordertĂĽr!" />
+    <Word from="vordréngelnl" to="vordrängeln!" />
+    <Word from="vorfibergehend" to="vorĂĽbergehend" />
+    <Word from="Vorfuhrungen" to="VorfĂĽhrungen" />
+    <Word from="vorgefflhrt" to="vorgeführt" />
+    <Word from="Vorgiinge" to="Vorgänge" />
+    <Word from="Vorgénger" to="Vorgänger" />
+    <Word from="Vorgéngern" to="Vorgängern" />
+    <Word from="Vorhénge" to="Vorhänge" />
+    <Word from="vorijbergehend" to="vorĂĽbergehend" />
+    <Word from="vorilber" to="vorĂĽber" />
+    <Word from="vorilbergehende" to="vorĂĽbergehende" />
+    <Word from="vorkniipfen" to="vorknöpfen" />
+    <Word from="Vorléufer" to="Vorläufer" />
+    <Word from="Vorléufig" to="Vorläufig" />
+    <Word from="Vorraus" to="Voraus" />
+    <Word from="Vorschlége" to="Vorschläge" />
+    <Word from="vorschriftsméfiig" to="vorschriftsmäßig" />
+    <Word from="vorschriftsméiliig" to="vorschriftsmäßig" />
+    <Word from="Vorsichtsmaflnahme" to="VorsichtsmaĂźnahme" />
+    <Word from="Vorstellungsgespréch" to="Vorstellungsgespräch" />
+    <Word from="Vorstellungsgespréche" to="Vorstellungsgespräche" />
+    <Word from="Vorstof$" to="VorstoĂź" />
+    <Word from="Vortlbergehende" to="VorĂĽbergehende" />
+    <Word from="vortéuschen" to="vortäuschen" />
+    <Word from="vorubergehend" to="vorĂĽbergehend" />
+    <Word from="vorvvérts" to="vorwärts" />
+    <Word from="Vorwfirts" to="Vorwärts" />
+    <Word from="vorwérts" to="vorwärts" />
+    <Word from="vorzfiglichl" to="vorzĂĽglich!" />
+    <Word from="vorflber" to="vorüber" />
+    <Word from="Vorflbergehend" to="Vorübergehend" />
+    <Word from="VVACHMANN" to="WACHMANN" />
+    <Word from="Vvaffen" to="Waffen" />
+    <Word from="Vvagen" to="Wagen" />
+    <Word from="VVarte" to="Warte" />
+    <Word from="VVeif3&gt;t" to="WeiĂźt" />
+    <Word from="VVeil'2&gt;t" to="WeiĂźt" />
+    <Word from="VVir" to="Wir" />
+    <Word from="VVM" to="WM" />
+    <Word from="v\/as" to="was" />
+    <Word from="V\/e" to="We" />
+    <Word from="Végel" to="Vögel" />
+    <Word from="végeln" to="vögeln" />
+    <Word from="végelt" to="vögelt" />
+    <Word from="véllig" to="völlig" />
+    <Word from="w/'r" to="wir" />
+    <Word from="W/e" to="Wie" />
+    <Word from="w/eder" to="wieder" />
+    <Word from="W/nkel" to="Winkel" />
+    <Word from="w/r" to="wir" />
+    <Word from="w/rd" to="wird" />
+    <Word from="w/rkl/ch" to="wirklich" />
+    <Word from="W0" to="Wo" />
+    <Word from="w5r" to="wär" />
+    <Word from="w5r's" to="wär's" />
+    <Word from="W6lfe" to="Wölfe" />
+    <Word from="W6lfen" to="Wölfen" />
+    <Word from="W99" to="Weg" />
+    <Word from="Waffenschrénke" to="Waffenschränke" />
+    <Word from="wafs" to="wär's" />
+    <Word from="wahrend" to="während" />
+    <Word from="WAHRENDDESSEN" to="WĂ„HRENDDESSEN" />
+    <Word from="Wahrheitl" to="Wahrheit!" />
+    <Word from="wail" to="weil" />
+    <Word from="Walbl" to="Walöl" />
+    <Word from="Walsinghaml" to="Walsingham!" />
+    <Word from="wankelmiltig" to="wankelmĂĽtig" />
+    <Word from="ware" to="wäre" />
+    <Word from="WAREST" to="WĂ„REST" />
+    <Word from="Warfe" to="Warte" />
+    <Word from="warja" to="war ja" />
+    <Word from="Waschbrettbéuche" to="Waschbrettbäuche" />
+    <Word from="Waschbéir" to="Waschbär" />
+    <Word from="Waschbéiren" to="Waschbären" />
+    <Word from="Wasseranschlljssen" to="WasseranschlĂĽssen" />
+    <Word from="Watteknéuel" to="Watteknäuel" />
+    <Word from="Wattestébchen" to="Wattestäbchen" />
+    <Word from="we're" to="wäre" />
+    <Word from="We'ro" to="We're" />
+    <Word from="we/B" to="weiĂź" />
+    <Word from="We/Bf" to="WeiĂźt" />
+    <Word from="we/fere" to="weitere" />
+    <Word from="Wechsell" to="Wechsel!" />
+    <Word from="weggebfirstet" to="weggebĂĽrstet" />
+    <Word from="weggespllllt" to="weggespĂĽlt" />
+    <Word from="weggesplllltl" to="weggespĂĽlt!" />
+    <Word from="weggespfllt" to="weggespült" />
+    <Word from="wegl" to="weg!" />
+    <Word from="wegreiflsen" to="wegreiĂźen" />
+    <Word from="wegschieBen" to="wegschieĂźen" />
+    <Word from="Wegtratan" to="Wegtreten" />
+    <Word from="wegzuwefien" to="wegzuwerfen" />
+    <Word from="wei/3" to="weiĂź" />
+    <Word from="WeiB" to="WeiĂź" />
+    <Word from="weiBe" to="weiĂźe" />
+    <Word from="weiBen" to="weiĂźen" />
+    <Word from="weiBer" to="weiĂźer" />
+    <Word from="weiBes" to="weiĂźes" />
+    <Word from="WeiBfresse" to="WeiĂźfresse" />
+    <Word from="weiBt" to="weiĂźt" />
+    <Word from="Weif$" to="WeiĂź" />
+    <Word from="Weif$t" to="WeiĂźt" />
+    <Word from="weif2&gt;" to="weiĂź" />
+    <Word from="weif3" to="weiĂź" />
+    <Word from="weif3&gt;" to="weiĂź" />
+    <Word from="Weif3t" to="WeiĂźt" />
+    <Word from="weif5" to="weiĂź" />
+    <Word from="Weifbe" to="WeiĂźe" />
+    <Word from="weifbt" to="weiĂźt" />
+    <Word from="Weifi" to="WeiĂź" />
+    <Word from="Weifie" to="WeiĂźe" />
+    <Word from="weifies" to="weiĂźes" />
+    <Word from="Weifist" to="WeiĂźt" />
+    <Word from="Weifit" to="WeiĂźt" />
+    <Word from="weifk" to="weiĂź" />
+    <Word from="weifken" to="weiĂźen" />
+    <Word from="Weifker" to="WeiĂźer" />
+    <Word from="weifkes" to="weiĂźes" />
+    <Word from="weifkt" to="weiĂźt" />
+    <Word from="weifL" to="weiĂź" />
+    <Word from="weifLt" to="weiĂźt" />
+    <Word from="weifl»" to="weiß" />
+    <Word from="weifS" to="weiĂź" />
+    <Word from="WeifSt" to="WeiĂźt" />
+    <Word from="weifZ&gt;" to="weiĂź" />
+    <Word from="WeifZ&gt;t" to="WeiĂźt" />
+    <Word from="weifét" to="weißt" />
+    <Word from="Weihnachtseinkéufe" to="Weihnachtseinkäufe" />
+    <Word from="Weihnachtsménner" to="Weihnachtsmänner" />
+    <Word from="weil'5" to="weiĂź" />
+    <Word from="weil'5t" to="weiĂźt" />
+    <Word from="weil3" to="weiĂź" />
+    <Word from="Weil3t" to="WeiĂźt" />
+    <Word from="weil5" to="weiĂź" />
+    <Word from="Weil5t" to="WeiĂźt" />
+    <Word from="weili" to="weiĂź" />
+    <Word from="weilit" to="weiĂźt" />
+    <Word from="weilke" to="weiĂźe" />
+    <Word from="Weill" to="WeiĂź" />
+    <Word from="weills" to="weiĂź" />
+    <Word from="weillst" to="weiĂźt" />
+    <Word from="weillt" to="weisst" />
+    <Word from="weilS" to="weiĂź" />
+    <Word from="weilSe" to="weiĂźe" />
+    <Word from="WeilSglut" to="WeiĂźglut" />
+    <Word from="weilZ&gt;" to="weiĂź" />
+    <Word from="weilZ~" to="weiĂź" />
+    <Word from="weiss" to="weiĂź" />
+    <Word from="weissen" to="weiĂźen" />
+    <Word from="weisst" to="weiĂźt" />
+    <Word from="weiterhiipfen" to="weiterhĂĽpfen" />
+    <Word from="Weiterpessen" to="Weiterpressen" />
+    <Word from="weitléufige" to="weitläufige" />
+    <Word from="weitweg" to="weit weg" />
+    <Word from="WelBt" to="WeiĂźt" />
+    <Word from="well" to="weil" />
+    <Word from="Well" to="Welt" />
+    <Word from="Wellit" to="WeiĂźt" />
+    <Word from="welllt" to="weiĂźt" />
+    <Word from="welt" to="weit" />
+    <Word from="WELTBEVOLKERUNG" to="WELTBEVĂ–LKERUNG" />
+    <Word from="Welflt" to="Weißt" />
+    <Word from="Werdja" to="Werd ja" />
+    <Word from="Werkstétten" to="Werkstätten" />
+    <Word from="Werkzeuggflrtel" to="Werkzeuggürtel" />
+    <Word from="wertschfitzen" to="wertschätzen" />
+    <Word from="Westflilgel" to="WestflĂĽgel" />
+    <Word from="Westkilste" to="WestkĂĽste" />
+    <Word from="Wettkémpfe" to="Wettkämpfe" />
+    <Word from="Wettkémpfen" to="Wettkämpfen" />
+    <Word from="Wettkémpfer" to="Wettkämpfer" />
+    <Word from="Wfinsche" to="WĂĽnsche" />
+    <Word from="wfinschen" to="wĂĽnschen" />
+    <Word from="Wfird" to="WĂĽrd" />
+    <Word from="wfirde" to="wĂĽrde" />
+    <Word from="Wfirden" to="WĂĽrden" />
+    <Word from="wfirdest" to="wĂĽrdest" />
+    <Word from="wfire" to="wäre" />
+    <Word from="Wfirme" to="Wärme" />
+    <Word from="Wfisste" to="WĂĽsste" />
+    <Word from="wfitete" to="wĂĽtete" />
+    <Word from="wfssen" to="wissen" />
+    <Word from="Widen/vértig" to="Widerwärtig" />
+    <Word from="widerf'a'hrt" to="widerfährt" />
+    <Word from="widerspriichliche" to="widersprĂĽchliche" />
+    <Word from="Widerwéirtig" to="Widerwärtig" />
+    <Word from="wiedergewéihltl" to="wiedergewählt" />
+    <Word from="wiederhaben" to="wieder haben" />
+    <Word from="wiederhaben" to="wieder-haben" />
+    <Word from="Wiederhéren" to="Wiederhören" />
+    <Word from="Wieheifiternoch" to="WieheiĂźternoch" />
+    <Word from="Wieheiliternoch" to="WieheiĂźternoch" />
+    <Word from="wihlerisch" to="wählerisch" />
+    <Word from="wihlerlsch" to="wählerisch" />
+    <Word from="wiihlen" to="wĂĽhlen" />
+    <Word from="wiihlte" to="wählte" />
+    <Word from="wiihrend" to="während" />
+    <Word from="wiilrdest" to="wĂĽrdest" />
+    <Word from="Wiinde" to="Wände" />
+    <Word from="wiinsch" to="wĂĽnsch" />
+    <Word from="Wiinsche" to="WĂĽnsche" />
+    <Word from="Wiinschen" to="WĂĽnschen" />
+    <Word from="wiinschst" to="wĂĽnschst" />
+    <Word from="wiinscht" to="wĂĽnscht" />
+    <Word from="wiinschte" to="wĂĽnschte" />
+    <Word from="wiirde" to="wĂĽrde" />
+    <Word from="Wiirden" to="WĂĽrden" />
+    <Word from="Wiirdest" to="WĂĽrdest" />
+    <Word from="wiirdet" to="wĂĽrdet" />
+    <Word from="wiirdigst" to="wĂĽrdigst" />
+    <Word from="Wiire" to="Wäre" />
+    <Word from="wiiren" to="wären" />
+    <Word from="Wiirfel" to="WĂĽrfel" />
+    <Word from="wiirfeln" to="wĂĽrfeln" />
+    <Word from="Wiirfels" to="WĂĽrfels" />
+    <Word from="wiirs" to="wär's" />
+    <Word from="Wiirstchen" to="WĂĽrstchen" />
+    <Word from="wiischt" to="wäscht" />
+    <Word from="Wiisste" to="WĂĽsste" />
+    <Word from="wiissten" to="wĂĽssten" />
+    <Word from="wiisstest" to="wĂĽsstest" />
+    <Word from="Wiiste" to="WĂĽste" />
+    <Word from="wiitenden" to="wĂĽtenden" />
+    <Word from="wijnsche" to="wĂĽnsche" />
+    <Word from="wijnschen" to="wĂĽnschen" />
+    <Word from="wijnschte" to="wĂĽnschte" />
+    <Word from="wijrd" to="wĂĽrd" />
+    <Word from="wijrde" to="wĂĽrde" />
+    <Word from="wijrden" to="wĂĽrden" />
+    <Word from="wijrdest" to="wĂĽrdest" />
+    <Word from="wijrdiger" to="wĂĽrdiger" />
+    <Word from="Wijrg" to="WĂĽrg" />
+    <Word from="wijsste" to="wĂĽsste" />
+    <Word from="wijtend" to="wĂĽtend" />
+    <Word from="wildl" to="wild!" />
+    <Word from="wilnsch" to="wĂĽnsch" />
+    <Word from="wilnsche" to="wĂĽnsche" />
+    <Word from="wilnschen" to="wĂĽnschen" />
+    <Word from="wilnscht" to="wĂĽnscht" />
+    <Word from="wilnschte" to="wĂĽnschte" />
+    <Word from="wilrd" to="wĂĽrd" />
+    <Word from="Wilrde" to="WĂĽrde" />
+    <Word from="Wilrden" to="WĂĽrden" />
+    <Word from="Wilrdest" to="WĂĽrdest" />
+    <Word from="wilrdig" to="wĂĽrdig" />
+    <Word from="Wilrfel" to="WĂĽrfel" />
+    <Word from="Wilrfelenergie" to="WĂĽrfelenergie" />
+    <Word from="wilsste" to="wĂĽsste" />
+    <Word from="wilssten" to="wĂĽssten" />
+    <Word from="Wilstling" to="WĂĽstling" />
+    <Word from="wiltend" to="wĂĽtend" />
+    <Word from="Windelhundl" to="Windelhund!" />
+    <Word from="Windhundkérper" to="Windhundkörper" />
+    <Word from="winner" to="wärmer" />
+    <Word from="Wire" to="Wäre" />
+    <Word from="wires" to="wir es" />
+    <Word from="Wirfangen" to="Wir fangen" />
+    <Word from="wirja" to="wir ja" />
+    <Word from="wirje" to="wir je" />
+    <Word from="wirjede" to="wir jede" />
+    <Word from="wirjeden" to="wir jeden" />
+    <Word from="wirjetzt" to="wir jetzt" />
+    <Word from="Wirnisse" to="Wirrnisse" />
+    <Word from="Wirsind" to="Wir sind" />
+    <Word from="wirtragen" to="wir tragen" />
+    <Word from="Wirtschaftspriifer" to="WirtschaftsprĂĽfer" />
+    <Word from="Wirverfolgen" to="Wir verfolgen" />
+    <Word from="wirvom" to="wir vom" />
+    <Word from="Wirwaren" to="Wir waren" />
+    <Word from="Wirwarten" to="Wir warten" />
+    <Word from="Wirwerden" to="Wir werden" />
+    <Word from="Wirwissen" to="Wir wissen" />
+    <Word from="Wirwollen" to="Wir wollen" />
+    <Word from="Wirwollten" to="Wir wollten" />
+    <Word from="Wirzeigten" to="Wir zeigten" />
+    <Word from="wirzu" to="wir zu" />
+    <Word from="Witzl" to="Witz!" />
+    <Word from="WKHRENDDESSEN" to="WĂ„HRENDDESSEN" />
+    <Word from="wL'lrden" to="wĂĽrden" />
+    <Word from="wle" to="wie" />
+    <Word from="Wleso" to="Wieso" />
+    <Word from="Wlhlen" to="Wählen" />
+    <Word from="wllinsch" to="wĂĽnsch" />
+    <Word from="wllinschst" to="wĂĽnschst" />
+    <Word from="wllinscht" to="wĂĽnscht" />
+    <Word from="wllirde" to="wĂĽrde" />
+    <Word from="wllirden" to="wĂĽrden" />
+    <Word from="wllirdest" to="wĂĽrdest" />
+    <Word from="wllirdet" to="wĂĽrdet" />
+    <Word from="Wllirgegriff" to="WĂĽrgegriff" />
+    <Word from="wllirgen" to="wĂĽrgen" />
+    <Word from="wllisste" to="wĂĽsste" />
+    <Word from="wlr" to="wir" />
+    <Word from="wlrd" to="wird" />
+    <Word from="wlrkllch" to="wirklich" />
+    <Word from="Wlrkllchkelt" to="Wirklichkeit" />
+    <Word from="wlrst" to="wirst" />
+    <Word from="Wlrwarten" to="Wir warten" />
+    <Word from="wlrwollen" to="wir wollen" />
+    <Word from="Wo/f" to="Wolf" />
+    <Word from="Wochenféhre" to="Wochenfähre" />
+    <Word from="woffir" to="wofĂĽr" />
+    <Word from="Wofiir" to="WofĂĽr" />
+    <Word from="Wofijr" to="WofĂĽr" />
+    <Word from="wofilr" to="wofĂĽr" />
+    <Word from="Wofur" to="WofĂĽr" />
+    <Word from="WoherweiB" to="Woher weiĂź" />
+    <Word from="WoherweiBt" to="Woher weiĂźt" />
+    <Word from="Woherweif$t" to="Woher weiĂźt" />
+    <Word from="wohlfilhlen" to="wohlfĂĽhlen" />
+    <Word from="Wollknéuel" to="Wollknäuel" />
+    <Word from="womiiglich" to="womöglich" />
+    <Word from="woméglich" to="womöglich" />
+    <Word from="woméiglich" to="womöglich" />
+    <Word from="Worfiber" to="WorĂĽber" />
+    <Word from="woriiber" to="worĂĽber" />
+    <Word from="Worijber" to="WorĂĽber" />
+    <Word from="Wortgeplénkel" to="Wortgeplänkel" />
+    <Word from="Woruber" to="WorĂĽber" />
+    <Word from="wt/'rden" to="wĂĽrden" />
+    <Word from="wtinsche" to="wĂĽnsche" />
+    <Word from="wtinschst" to="wĂĽnschst" />
+    <Word from="wtirde" to="wĂĽrde" />
+    <Word from="Wtirdest" to="WĂĽrdest" />
+    <Word from="Wtirfel" to="WĂĽrfel" />
+    <Word from="Wtmschen" to="WĂĽnschen" />
+    <Word from="WUl'd€" to="würde" />
+    <Word from="WUlfelbecher" to="WĂĽrfelbecher" />
+    <Word from="wullte" to="wusste" />
+    <Word from="Wundersch6n" to="Wunderschön" />
+    <Word from="wunderschfin" to="wunderschön" />
+    <Word from="Wunderschiin" to="Wunderschön" />
+    <Word from="wunderschiinen" to="wunderschönen" />
+    <Word from="wunderschén" to="wunderschön" />
+    <Word from="wunderschéne" to="wunderschöne" />
+    <Word from="Wunderschénel" to="Wunderschöne!" />
+    <Word from="wunderschénen" to="wunderschönen" />
+    <Word from="wunderschénes" to="wunderschönes" />
+    <Word from="wundersohén" to="wunderschön" />
+    <Word from="wunsche" to="wĂĽnsche" />
+    <Word from="Wunschen" to="WĂĽnschen" />
+    <Word from="wunscht" to="wĂĽnscht" />
+    <Word from="wunschte" to="wĂĽnschte" />
+    <Word from="WUNSCHTE" to="WĂśNSCHTE" />
+    <Word from="wurcle" to="wurde" />
+    <Word from="wUrde" to="wĂĽrde" />
+    <Word from="Wurdige" to="WĂĽrdige" />
+    <Word from="WURGT" to="WĂśRGT" />
+    <Word from="Wurmer" to="WĂĽrmer" />
+    <Word from="Wursfsfulle" to="Wurststulle" />
+    <Word from="Wuste" to="WĂĽste" />
+    <Word from="WUSTEN" to="WĂśSTEN" />
+    <Word from="wutend" to="wĂĽtend" />
+    <Word from="wuĂźte" to="wusste" />
+    <Word from="wuĂźtest" to="wusstest" />
+    <Word from="w§r's" to="wär's" />
+    <Word from="w§re" to="wäre" />
+    <Word from="W§ren's" to="Wären's" />
+    <Word from="wé'hrend" to="während" />
+    <Word from="wéchst" to="wächst" />
+    <Word from="Wéchter" to="Wächter" />
+    <Word from="wéfs" to="wär's" />
+    <Word from="WĂ©g" to="Weg" />
+    <Word from="wéhle" to="wähle" />
+    <Word from="wéhlejetzt" to="wähle jetzt" />
+    <Word from="wéhlen" to="wählen" />
+    <Word from="Wéhler" to="Wähler" />
+    <Word from="Wéhlern" to="Wählern" />
+    <Word from="wéhlt" to="wählt" />
+    <Word from="wéhlte" to="wählte" />
+    <Word from="wéhrend" to="während" />
+    <Word from="Wéhrung" to="Währung" />
+    <Word from="Wéichter" to="Wächter" />
+    <Word from="wéihlen" to="wählen" />
+    <Word from="wéihrend" to="während" />
+    <Word from="wéir" to="wär" />
+    <Word from="wéir's" to="wär's" />
+    <Word from="wéirde" to="würde" />
+    <Word from="Wéire" to="Wäre" />
+    <Word from="wéiren" to="wären" />
+    <Word from="wéirmen" to="wärmen" />
+    <Word from="wéirst" to="wärst" />
+    <Word from="Wélder" to="Wälder" />
+    <Word from="Wéldern" to="Wäldern" />
+    <Word from="Wélfen" to="Wölfen" />
+    <Word from="Wélkchen" to="Wölkchen" />
+    <Word from="Wénde" to="Wände" />
+    <Word from="Wénden" to="Wänden" />
+    <Word from="wér" to="wär" />
+    <Word from="wér's" to="wär's" />
+    <Word from="Wére" to="Wäre" />
+    <Word from="Wéren" to="Wären" />
+    <Word from="wéret" to="wäret" />
+    <Word from="wérja" to="wär ja" />
+    <Word from="Wérm" to="Wärm" />
+    <Word from="Wérme" to="Wärme" />
+    <Word from="wérmt" to="wärmt" />
+    <Word from="Wérst" to="Wärst" />
+    <Word from="wért" to="wärt" />
+    <Word from="Wérter" to="Wörter" />
+    <Word from="Wérterbuch" to="Wörterbuch" />
+    <Word from="wértliche" to="wörtliche" />
+    <Word from="Wésche" to="Wäsche" />
+    <Word from="Wéscheklammer" to="Wäscheklammer" />
+    <Word from="Wéschst" to="Wäschst" />
+    <Word from="wéscht" to="wäscht" />
+    <Word from="wflrde" to="würde" />
+    <Word from="wflrden" to="würden" />
+    <Word from="Wflrfel" to="Würfel" />
+    <Word from="z'a'h" to="zäh" />
+    <Word from="Z/egf" to="liegt" />
+    <Word from="Z/yarettenbäume" to="Zigarettenbäume" />
+    <Word from="Z05" to="los" />
+    <Word from="z6gel1e" to="zögerte" />
+    <Word from="z6gern" to="zögern" />
+    <Word from="zahlenméflig" to="zahlenmäßig" />
+    <Word from="zappelnl" to="zappeln!" />
+    <Word from="Zauberspruchen" to="ZaubersprĂĽchen" />
+    <Word from="Zaubervoodookréfte" to="Zaubervoodookräfte" />
+    <Word from="Zauherpfippchen" to="ZauberpĂĽppchen" />
+    <Word from="Zefietzende" to="Zerfetzende" />
+    <Word from="zeitgem5B" to="zeitgemäß" />
+    <Word from="Zeitgeméfle" to="Zeitgemäße" />
+    <Word from="Zeitgeniissische" to="Zeitgenössische" />
+    <Word from="zeitgeniissischen" to="zeitgenössischen" />
+    <Word from="Zellenschliissel" to="ZellenschlĂĽssel" />
+    <Word from="zerbeif$en" to="zerbeiĂźen" />
+    <Word from="zerbeif$t" to="zerbeiĂźt" />
+    <Word from="zerféllt" to="zerfällt" />
+    <Word from="Zermatschgeréusch" to="Zermatschgeräusch" />
+    <Word from="zermflrben" to="zermürben" />
+    <Word from="zerreifien" to="zerreiĂźen" />
+    <Word from="zerreilit" to="zerreiĂźt" />
+    <Word from="zersfdren" to="zerstören" />
+    <Word from="zerst6rst" to="zerstörst" />
+    <Word from="zerst6rt" to="zerstört" />
+    <Word from="zerstdren" to="zerstören" />
+    <Word from="Zerstfiren" to="Zerstören" />
+    <Word from="Zerstfirer" to="Zerstörer" />
+    <Word from="Zerstfirungskraft" to="Zerstörungskraft" />
+    <Word from="Zerstiickelung" to="ZerstĂĽckelung" />
+    <Word from="zerstiire" to="zerstöre" />
+    <Word from="zerstiiren" to="zerstören" />
+    <Word from="Zerstiirer" to="Zerstörer" />
+    <Word from="zerstiirt" to="zerstört" />
+    <Word from="zerstiirten" to="zerstörten" />
+    <Word from="zerstiirtl" to="zerstört!" />
+    <Word from="Zerstiirungl" to="Zerstörung!" />
+    <Word from="zerstoren" to="zerstören" />
+    <Word from="zerstére" to="zerstöre" />
+    <Word from="zerstéren" to="zerstören" />
+    <Word from="Zerstérer" to="Zerstörer" />
+    <Word from="zerstért" to="zerstört" />
+    <Word from="Zerstérung" to="Zerstörung" />
+    <Word from="Zerstérungsfeldzug" to="Zerstörungsfeldzug" />
+    <Word from="zertrlllmmert" to="zertrĂĽmmert" />
+    <Word from="zfihlt" to="zählt" />
+    <Word from="Ziel160m" to="Ziel 160 m" />
+    <Word from="Zihnelt" to="ähnelt" />
+    <Word from="ziichtiger" to="zĂĽchtiger" />
+    <Word from="Ziige" to="ZĂĽge" />
+    <Word from="Ziindkapseln" to="ZĂĽndkapseln" />
+    <Word from="Zilnd" to="ZĂĽnd" />
+    <Word from="Zilnden" to="ZĂĽnden" />
+    <Word from="Zilndungsenergie" to="ZĂĽndungsenergie" />
+    <Word from="Zilrich" to="ZĂĽrich" />
+    <Word from="Zindern" to="ändern" />
+    <Word from="Zingstlich" to="ängstlich" />
+    <Word from="Ziufierst" to="äußerst" />
+    <Word from="zleht" to="zieht" />
+    <Word from="ZLIFUCK" to="zurĂĽck" />
+    <Word from="Zooschlieliung" to="ZooschlieĂźung" />
+    <Word from="Zuckerschnfltchen" to="Zuckerschnütchen" />
+    <Word from="zuerstvor" to="zuerst vor" />
+    <Word from="zuffillig" to="zufällig" />
+    <Word from="zuflligen" to="zufĂĽgen" />
+    <Word from="ZUFUCK" to="zurĂĽck" />
+    <Word from="Zuféillig" to="Zufällig" />
+    <Word from="Zuféilligerweise" to="Zufälligerweise" />
+    <Word from="zuféllig" to="zufällig" />
+    <Word from="Zufélligerweise" to="Zufälligerweise" />
+    <Word from="zug'a'nglichen" to="zugänglichen" />
+    <Word from="ZUGANGSPRIORITKT" to="ZUGANGSPRIORITĂ„T" />
+    <Word from="zugehdrt" to="zugehört" />
+    <Word from="zugehért" to="zugehört" />
+    <Word from="zugestofien" to="zugestoĂźen" />
+    <Word from="Zugesténdnis" to="Zugeständnis" />
+    <Word from="Zugesténdnisse" to="Zugeständnisse" />
+    <Word from="Zugiinge" to="Zugänge" />
+    <Word from="zuh6ren" to="zuhören" />
+    <Word from="zuh6rt" to="zuhört" />
+    <Word from="zuhiiren" to="zuhören" />
+    <Word from="zuhiirt" to="zuhört" />
+    <Word from="Zuhélter" to="Zuhälter" />
+    <Word from="Zuhéren" to="Zuhören" />
+    <Word from="Zuhérer" to="Zuhörer" />
+    <Word from="zukilnftiges" to="zukĂĽnftiges" />
+    <Word from="zul" to="zu!" />
+    <Word from="zundete" to="zĂĽndete" />
+    <Word from="Zundverteilerkappe" to="ZĂĽndverteilerkappe" />
+    <Word from="zunjick" to="zurĂĽck" />
+    <Word from="zunéchst" to="zunächst" />
+    <Word from="zunéhen" to="zunähen" />
+    <Word from="zunéihen" to="zunähen" />
+    <Word from="Zuokerschntltchen" to="ZuckerschnĂĽtchen" />
+    <Word from="zurfick" to="zurĂĽck" />
+    <Word from="zurfickblicken" to="zurĂĽckblicken" />
+    <Word from="zurfickgekommen" to="zurĂĽckgekommen" />
+    <Word from="zurfickgezogen" to="zurĂĽckgezogen" />
+    <Word from="zurfickkehren" to="zurĂĽckkehren" />
+    <Word from="zurfickzufuhren" to="zurĂĽckzufĂĽhren" />
+    <Word from="zuriick" to="zurĂĽck" />
+    <Word from="zuriickbleiben" to="zurĂĽckbleiben" />
+    <Word from="zuriickgeben" to="zurĂĽckgeben" />
+    <Word from="zuriickgehen" to="zurĂĽckgehen" />
+    <Word from="zuriickgekommen" to="zurĂĽckgekommen" />
+    <Word from="zuriickgezogen" to="zurĂĽckgezogen" />
+    <Word from="zuriickhaben" to="zurĂĽckhaben" />
+    <Word from="zuriickkehre" to="zurĂĽckkehre" />
+    <Word from="zuriickkehren" to="zurĂĽckkehren" />
+    <Word from="zuriickkehrst" to="zurĂĽckkehrst" />
+    <Word from="zuriickziehen" to="zurĂĽckziehen" />
+    <Word from="Zurijck" to="ZurĂĽck" />
+    <Word from="zurijckbringen" to="zurĂĽckbringen" />
+    <Word from="zurijckfordem" to="zurĂĽckfordern" />
+    <Word from="zurijckgeholt" to="zurĂĽckgeholt" />
+    <Word from="zurijckgekehrt" to="zurĂĽckgekehrt" />
+    <Word from="zurijckgekommen" to="zurĂĽckgekommen" />
+    <Word from="zurijckgelassen" to="zurĂĽckgelassen" />
+    <Word from="zurijckgerufen" to="zurĂĽckgerufen" />
+    <Word from="zurijckkehren" to="zurĂĽckkehren" />
+    <Word from="zurijcknehmen" to="zurĂĽcknehmen" />
+    <Word from="zurijckstolpern" to="zurĂĽckstolpern" />
+    <Word from="Zurilck" to="ZurĂĽck" />
+    <Word from="Zurilckf" to="ZurĂĽck!" />
+    <Word from="zurilckgeblieben" to="zurĂĽckgeblieben" />
+    <Word from="zurilckgeholt" to="zurĂĽckgeholt" />
+    <Word from="zurilckgekehrt" to="zurĂĽckgekehrt" />
+    <Word from="zurilckhalten" to="zurĂĽckhalten" />
+    <Word from="zurilckholen" to="zurĂĽckholen" />
+    <Word from="zurilckkehre" to="zurĂĽckkehre" />
+    <Word from="zurilckkehren" to="zurĂĽckkehren" />
+    <Word from="zurilckkehrt" to="zurĂĽckkehrt" />
+    <Word from="zurilckkommen" to="zurĂĽckkommen" />
+    <Word from="zurilckkommt" to="zurĂĽckkommt" />
+    <Word from="zurilcklassen" to="zurĂĽcklassen" />
+    <Word from="zurilckziehen" to="zurĂĽckziehen" />
+    <Word from="Zurilckziehenl" to="ZurĂĽckziehen!" />
+    <Word from="zurilckzugeben" to="zurĂĽckzugeben" />
+    <Word from="zurl'Jck" to="zurĂĽck!" />
+    <Word from="zurL'lck" to="zurĂĽck" />
+    <Word from="zurLick" to="zurĂĽck" />
+    <Word from="zurljckgeben" to="zurĂĽckgeben" />
+    <Word from="zurllickfallen" to="zurĂĽckfallen" />
+    <Word from="zurllickgekehrt" to="zurĂĽckgekehrt" />
+    <Word from="zurllickkehrt" to="zurĂĽckkehrt" />
+    <Word from="zurllickzukehren" to="zurĂĽckzukehren" />
+    <Word from="zurlllckgehen" to="zurĂĽckgehen" />
+    <Word from="zurlllckkomme" to="zurĂĽckkomme" />
+    <Word from="zurtick" to="zurĂĽck" />
+    <Word from="zurtickbringe" to="zurĂĽckbringe" />
+    <Word from="zurtickgezogen" to="zurĂĽckgezogen" />
+    <Word from="zurtlckgekommen" to="zurĂĽckgekommen" />
+    <Word from="zurtlckvervvandeln" to="zurĂĽckverwandeln" />
+    <Word from="Zuruck" to="ZurĂĽck" />
+    <Word from="ZURUCK" to="ZURĂśCK" />
+    <Word from="zuruckbleiben" to="zurĂĽckbleiben" />
+    <Word from="zuruckblicken" to="zurĂĽckblicken" />
+    <Word from="zuruckdenke" to="zurĂĽckdenke" />
+    <Word from="zuruckfeuern" to="zurĂĽckfeuern" />
+    <Word from="zuruckgehen" to="zurĂĽckgehen" />
+    <Word from="zuruckgelegt" to="zurĂĽckgelegt" />
+    <Word from="zuruckgewiesen" to="zurĂĽckgewiesen" />
+    <Word from="zuruckgreifen" to="zurĂĽckgreifen" />
+    <Word from="zuruckhaben" to="zurĂĽckhaben" />
+    <Word from="zuruckkehren" to="zurĂĽckkehren" />
+    <Word from="zuruckkehrten" to="zurĂĽckkehrten" />
+    <Word from="zuruckkomme" to="zurĂĽckkomme" />
+    <Word from="zuruckkommen" to="zurĂĽckkommen" />
+    <Word from="zuruckkémst" to="zurückkämst" />
+    <Word from="zuruckl" to="zurĂĽck!" />
+    <Word from="zurucklassen" to="zurĂĽcklassen" />
+    <Word from="zurUcklieB" to="zurĂĽcklieĂź" />
+    <Word from="zurucklécheln" to="zurücklächeln" />
+    <Word from="zurucknehmen" to="zurĂĽcknehmen" />
+    <Word from="zuruckverwandeln" to="zurĂĽckverwandeln" />
+    <Word from="zuruckverwandelt" to="zurĂĽckverwandelt" />
+    <Word from="zuruckziehen" to="zurĂĽckziehen" />
+    <Word from="zuruckzukommen" to="zurĂĽckzukommen" />
+    <Word from="zurverfilgung" to="zur VerfĂĽgung" />
+    <Word from="zuréickrufen" to="zurückrufen" />
+    <Word from="zurflck" to="zurück" />
+    <Word from="Zurflckbleiben" to="Zurückbleiben" />
+    <Word from="zurflckfliegen" to="zurückfliegen" />
+    <Word from="zurflckgeschickt" to="zurückgeschickt" />
+    <Word from="zurflckgibst" to="zurückgibst" />
+    <Word from="zus'a'tzliche" to="zusätzliche" />
+    <Word from="zusammenbeilien" to="zusammenbeiĂźen" />
+    <Word from="zusammenffigen" to="zusammenfĂĽgen" />
+    <Word from="zusammenfugen" to="zusammenfĂĽgen" />
+    <Word from="zusammenfuhren" to="zusammenfĂĽhren" />
+    <Word from="zusammenféillt" to="zusammenfällt" />
+    <Word from="zusammenhéilt" to="zusammenhält" />
+    <Word from="zusammenhélt" to="zusammenhält" />
+    <Word from="zusammenhéngen" to="zusammenhängen" />
+    <Word from="zusammenreifien" to="zusammenreiĂźen" />
+    <Word from="zusammenzuschweifien" to="zusammenzuschweiĂźen" />
+    <Word from="zuschlégst" to="zuschlägst" />
+    <Word from="zust6Bt" to="zustößt" />
+    <Word from="zustofken" to="zustoĂźen" />
+    <Word from="zustéindig" to="zuständig" />
+    <Word from="zusténcligen" to="zuständigen" />
+    <Word from="zusténdig" to="zuständig" />
+    <Word from="zusténdigen" to="zuständigen" />
+    <Word from="zusétzlich" to="zusätzlich" />
+    <Word from="zusétzliche" to="zusätzliche" />
+    <Word from="zuverlfissig" to="zuverlässig" />
+    <Word from="zuverllssig" to="zuverlässig" />
+    <Word from="zuverléssig" to="zuverlässig" />
+    <Word from="zuverléssiger" to="zuverlässiger" />
+    <Word from="zuviel" to="zu viel" />
+    <Word from="zuviele" to="zu viele" />
+    <Word from="zuzuflligen" to="zuzufĂĽgen" />
+    <Word from="Zuflucht" to="Zuflucht" />
+    <Word from="zvvei" to="zwei" />
+    <Word from="Zw6If" to="Zwölf" />
+    <Word from="zw6lfmal" to="zwölfmal" />
+    <Word from="Zwel" to="Zwei" />
+    <Word from="Zwickmfihle" to="ZwickmĂĽhle" />
+    <Word from="Zwillingstiichter" to="Zwillingstöchter" />
+    <Word from="Zwischenfélle" to="Zwischenfälle" />
+    <Word from="zwnlf" to="zwölf" />
+    <Word from="Zwéilften" to="Zwölften" />
+    <Word from="zwélf" to="zwölf" />
+    <Word from="zégerlich" to="zögerlich" />
+    <Word from="zégern" to="zögern" />
+    <Word from="Zégerns" to="Zögerns" />
+    <Word from="zéh" to="zäh" />
+    <Word from="zéhe" to="zähe" />
+    <Word from="zéher" to="zäher" />
+    <Word from="zéhl" to="zähl" />
+    <Word from="zéhle" to="zähle" />
+    <Word from="zéhlen" to="zählen" />
+    <Word from="Zéhlerei" to="Zählerei" />
+    <Word from="zéhlt" to="zählt" />
+    <Word from="zéhltl" to="zählt!" />
+    <Word from="Zéhlung" to="Zählung" />
+    <Word from="Zéhne" to="Zähne" />
+    <Word from="Zéhnen" to="Zähnen" />
+    <Word from="Zéhneputzen" to="Zähneputzen" />
+    <Word from="zéihle" to="zähle" />
+    <Word from="zéihlen" to="zählen" />
+    <Word from="zéihlt" to="zählt" />
+    <Word from="Zéihlungen" to="Zählungen" />
+    <Word from="Zéihne" to="Zähne" />
+    <Word from="Zélibat" to="Zölibat" />
+    <Word from="\/GFQHUQGH" to="VergnĂĽgen" />
+    <Word from="\/OFVVUFf€" to="Vorwürfe" />
+    <Word from="\/Vahrheit" to="Wahrheit" />
+    <Word from="\/Vir" to="Wir" />
+    <Word from="\/\/i6fUl'1l€fi" to="Wie fühlen" />
+    <Word from="\/\/il'fUl'1I'€l'1" to="Wir führen" />
+    <Word from="\Nynn" to="Wynn" />
+    <Word from="_" to="-" />
+    <Word from="Ă„u" to="Au" />
+    <Word from="Ă©" to="Ă " />
+    <Word from="échzt" to="ächzt" />
+    <Word from="éffentlich" to="öffentlich" />
+    <Word from="éffne" to="öffne" />
+    <Word from="éffnen" to="öffnen" />
+    <Word from="éffnet" to="öffnet" />
+    <Word from="éfft" to="äfft" />
+    <Word from="éfter" to="öfter" />
+    <Word from="éfters" to="öfters" />
+    <Word from="éh" to="äh" />
+    <Word from="éhnlich" to="ähnlich" />
+    <Word from="éhnliche" to="ähnliche" />
+    <Word from="éhnlicher" to="ähnlicher" />
+    <Word from="éih" to="äh" />
+    <Word from="éihnlich" to="ähnlich" />
+    <Word from="éindern" to="ändern" />
+    <Word from="éitzend" to="ätzend" />
+    <Word from="élter" to="älter" />
+    <Word from="élteste" to="älteste" />
+    <Word from="éltesten" to="ältesten" />
+    <Word from="éndere" to="ändere" />
+    <Word from="éndern" to="ändern" />
+    <Word from="éndert" to="ändert" />
+    <Word from="énderte" to="änderte" />
+    <Word from="énderten" to="änderten" />
+    <Word from="éngstlich" to="ängstlich" />
+    <Word from="érgere" to="ärgere" />
+    <Word from="érgern" to="ärgern" />
+    <Word from="érztliche" to="ärztliche" />
+    <Word from="érztlichen" to="ärztlichen" />
+    <Word from="érztlicher" to="ärztlicher" />
+    <Word from="ésthetisch" to="ästhetisch" />
+    <Word from="étzend" to="ätzend" />
+    <Word from="éufierst" to="äußerst" />
+    <Word from="éufiersten" to="äußersten" />
+    <Word from="éuflserst" to="äußerst" />
+    <Word from="flatterndem" to="flatterndem" />
+    <Word from="flel" to="fiel" />
+    <Word from="fliehen" to="fliehen" />
+    <Word from="fljr" to="für" />
+    <Word from="fllhlen" to="fühlen" />
+    <Word from="fllllen" to="füllen" />
+    <Word from="fllr" to="für" />
+    <Word from="fllrchterlich" to="fürchterlich" />
+    <Word from="flndet" to="findet" />
+    <Word from="AIle" to="Alle" />
+    <Word from="AIter" to="Alter" />
+    <Word from="GIĂĽck" to="GlĂĽck" />
+    <Word from="PIaystation" to="Playstation" />
+    <Word from="AIIes" to="Alles" />
+    <Word from="AIso" to="Also" />
+    <Word from="Ouatsch" to="Quatsch" />
+    <Word from="AIles" to="Alles" />
+    <Word from="BIeib" to="Bleib" />
+    <Word from="KIaut" to="Klaut" />
+    <Word from="AIlah" to="Allah" />
+    <Word from="PIan" to="Plan" />
+    <Word from="oderjemand" to="oder jemand" />
+    <Word from="liestjetzt" to="liest jetzt" />
+  </WholeWords>
+  <PartialWordsAlways>
+    <!-- Will be replaced always -->
+    <WordPart from="IVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="I\/I" to="M" />
+    <WordPart from="I\/l" to="M" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="lVl" to="M" />
+    <WordPart from="l\/I" to="M" />
+    <WordPart from="l\/l" to="M" />
+    <WordPart from="¤" to="o" />
+  </PartialWordsAlways>
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary -->
+    <!-- If new word(s) exists in spelling dictionary, it (they) is accepted -->
+    <WordPart from="/" to="l" />
+    <WordPart from="B" to="Ăź" />
+    <WordPart from="c" to="e" />
+    <WordPart from="c" to="o" />
+    <WordPart from="cc" to="oo" />
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="I" to="l" />
+    <WordPart from="i" to="t" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="ii" to="ĂĽ" />
+    <WordPart from="IVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="l" to="i" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="lVl" to="M" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="n" to="o" />
+    <WordPart from="n/" to="rv" />
+    <WordPart from="n/" to="ry" />
+    <WordPart from="o" to="e" />
+    <WordPart from="s" to="e" />
+    <WordPart from="VV" to="W" />
+    <WordPart from="\A" to="Vi" />
+    <WordPart from="¤" to="o" />
+    <WordPart from="é" to="ä" />
+    <WordPart from="Ă­" to="i" />
+    <WordPart from="ı=" to="f" />
+    <WordPart from="€" to="e" />
+    <WordPart from="ď¬" to="fi" />
+    <WordPart from="fl" to="fl" />
+  </PartialWords>
+  <PartialLines>
+    <!-- Partial lines - but whole words only -->
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml
new file mode 100644
index 000000000..05adb1d9c
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/eng_OCRFixReplaceList.xml
@@ -0,0 +1,2416 @@
+<?xml version="1.0" encoding="utf-8"?>
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="$COff$" to="scoffs" />
+    <Word from="$ergei" to="Sergei" />
+    <Word from="$'llOp" to="Stop" />
+    <Word from="/'//" to="I'll" />
+    <Word from="/'/I" to="I'll" />
+    <Word from="/ennifer" to="Jennifer" />
+    <Word from="/got" to="I got" />
+    <Word from="/have" to="I have" />
+    <Word from="/hope" to="I hope" />
+    <Word from="/just" to="I just" />
+    <Word from="/love" to="I love" />
+    <Word from="/'m" to="I'm" />
+    <Word from="/mmerse" to="immerse" />
+    <Word from="/nsu/ts" to="Insults" />
+    <Word from="/ong" to="long" />
+    <Word from="/ook" to="look" />
+    <Word from="/t's" to="It's" />
+    <Word from="/'ve" to="I've" />
+    <Word from="\/\/e'd" to="We'd" />
+    <Word from="\/\/e're" to="We're" />
+    <Word from="\/\/e've" to="We've" />
+    <Word from="\/\/hat" to="What" />
+    <Word from="\/\/here'd" to="Where'd" />
+    <Word from="\/\/hoo" to="Whoo" />
+    <Word from="\/\/hy" to="Why" />
+    <Word from="\/\/hy'd" to="Why'd" />
+    <Word from="\/\le're" to="We're" />
+    <Word from="\/Ve" to="We" />
+    <Word from="\Ne're" to="We're" />
+    <Word from="\Nhat's" to="What's" />
+    <Word from="\Nhere's" to="Where's" />
+    <Word from="|'mjust" to="I'm just" />
+    <Word from="¤ff" to="off" />
+    <Word from="¤Id" to="old" />
+    <Word from="¤Ids" to="olds" />
+    <Word from="¤n" to="on" />
+    <Word from="¤ne" to="one" />
+    <Word from="¤nly" to="only" />
+    <Word from="¤pen" to="open" />
+    <Word from="¤r" to="or" />
+    <Word from="¤rder" to="order" />
+    <Word from="¤ther" to="other" />
+    <Word from="¤ur" to="our" />
+    <Word from="¤ut" to="out" />
+    <Word from="¤ver" to="over" />
+    <Word from="¤wn" to="own" />
+    <Word from="€V€I'y" to="every" />
+    <Word from="0'clock" to="o'clock" />
+    <Word from="0f" to="of" />
+    <Word from="0fEngland" to="of England" />
+    <Word from="0fft0" to="off to" />
+    <Word from="0l/er" to="over" />
+    <Word from="0n" to="on" />
+    <Word from="0ne" to="one" />
+    <Word from="0ne's" to="one's" />
+    <Word from="0r" to="or" />
+    <Word from="0rders" to="orders" />
+    <Word from="0thers'" to="others'" />
+    <Word from="0ut" to="out" />
+    <Word from="0utlaw's" to="outlaw's" />
+    <Word from="0utlaws'" to="outlaws'" />
+    <Word from="0ver" to="over" />
+    <Word from="13oos" to="1300s" />
+    <Word from="18oos" to="1800s" />
+    <Word from="195os" to="1950s" />
+    <Word from="1et's" to="let's" />
+    <Word from="1o" to="10" />
+    <Word from="1oo" to="100" />
+    <Word from="1ooth" to="100th" />
+    <Word from="1oth" to="10th" />
+    <Word from="2E_" to="2E." />
+    <Word from="2'IST" to="21ST" />
+    <Word from="2'Ist_" to="2'1st." />
+    <Word from="2o" to="20" />
+    <Word from="2oth" to="20th" />
+    <Word from="3o" to="30" />
+    <Word from="3oth" to="30th" />
+    <Word from="4o" to="40" />
+    <Word from="4os" to="40s" />
+    <Word from="4oth" to="40th" />
+    <Word from="50rry" to="sorry" />
+    <Word from="5o" to="50" />
+    <Word from="5oth" to="50th" />
+    <Word from="6o" to="60" />
+    <Word from="6os" to="60s" />
+    <Word from="'6os" to="'60s" />
+    <Word from="6oth" to="60th" />
+    <Word from="7o" to="70" />
+    <Word from="'7os" to="'70s" />
+    <Word from="7oth" to="70th" />
+    <Word from="8o" to="80" />
+    <Word from="'8os" to="'80s" />
+    <Word from="8oth" to="80th" />
+    <Word from="9/aim" to="alarm" />
+    <Word from="9o" to="90" />
+    <Word from="9oth" to="90th" />
+    <Word from="9UnShQt" to="gunshot" />
+    <Word from="a//" to="all" />
+    <Word from="a/bum" to="album" />
+    <Word from="a/so" to="also" />
+    <Word from="A/ways" to="Always" />
+    <Word from="abcut" to="about" />
+    <Word from="aboutjoining" to="about joining" />
+    <Word from="aboutposh" to="about posh" />
+    <Word from="aboutus" to="about us" />
+    <Word from="aboutyou" to="about you" />
+    <Word from="accldent" to="accident" />
+    <Word from="Acool" to="A cool" />
+    <Word from="afier" to="after" />
+    <Word from="affraid" to="afraid" />
+    <Word from="Afriend" to="A friend" />
+    <Word from="afterall" to="after all" />
+    <Word from="afterthe" to="after the" />
+    <Word from="afulcrum" to="a fulcrum" />
+    <Word from="Afunny" to="A funny" />
+    <Word from="aga/nst" to="against" />
+    <Word from="ahsolutes" to="absolutes" />
+    <Word from="AI_I_" to="ALL" />
+    <Word from="AIien" to="Alien" />
+    <Word from="AIex" to="Alex" />
+    <Word from="AII" to="All" />
+    <Word from="AIIan" to="Allan" />
+    <Word from="AIIow" to="Allow" />
+    <Word from="AIive" to="Alive" />
+    <Word from="ain'tgotno" to="ain't got no" />
+    <Word from="Ain'tgotno" to="Ain't got no" />
+    <Word from="airstrike" to="air strike" />
+    <Word from="AIVIBULANCE" to="AMBULANCE" />
+    <Word from="ajob" to="a job" />
+    <Word from="ajockey_" to="a jockey." />
+    <Word from="ajoke" to="a joke" />
+    <Word from="Ajoke" to="A joke" />
+    <Word from="ajoking" to="a joking" />
+    <Word from="al/" to="all" />
+    <Word from="al/en" to="alien" />
+    <Word from="alittle" to="a little" />
+    <Word from="allgasp" to="all gasp" />
+    <Word from="alljustforshow" to="all just for show" />
+    <Word from="aln't" to="ain't" />
+    <Word from="alot" to="a lot" />
+    <Word from="Alot" to="A lot" />
+    <Word from="An5wer" to="Answer" />
+    <Word from="Andit" to="And it" />
+    <Word from="Andit's" to="And it's" />
+    <Word from="andl" to="and I" />
+    <Word from="andlaughs" to="and laughs" />
+    <Word from="andleave" to="and leave" />
+    <Word from="andthe" to="and the" />
+    <Word from="andyou" to="and you" />
+    <Word from="Andyou" to="And you" />
+    <Word from="ANNOUNC/NG" to="ANNOUNCING" />
+    <Word from="anotherstep" to="another step" />
+    <Word from="ANSWER/NG" to="ANSWERING" />
+    <Word from="answerwhat" to="answer what" />
+    <Word from="antiquejoke" to="antique joke" />
+    <Word from="anyhcdy's" to="anybody's" />
+    <Word from="Anyidea" to="Any idea" />
+    <Word from="anyone's_" to="anyone's." />
+    <Word from="apejust" to="ape just" />
+    <Word from="ARABlc" to="ARABIC" />
+    <Word from="aren't_" to="aren't." />
+    <Word from="arerl't" to="aren't" />
+    <Word from="Arnsteln's" to="Arnstein's" />
+    <Word from="atleast" to="at least" />
+    <Word from="Atough" to="A tough" />
+    <Word from="Awhole" to="A whole" />
+    <Word from="awoman" to="a woman" />
+    <Word from="Awoman" to="A woman" />
+    <Word from="barelytalked" to="barely talked" />
+    <Word from="bcat" to="boat" />
+    <Word from="Bcllvla" to="Bolivia" />
+    <Word from="bcmb" to="bomb" />
+    <Word from="bcmbs" to="bombs" />
+    <Word from="be//y" to="belly" />
+    <Word from="becuase" to="because" />
+    <Word from="Beep/'ng" to="Beeping" />
+    <Word from="bejumpy" to="be jumpy" />
+    <Word from="besldes" to="besides" />
+    <Word from="bestfriend" to="best friend" />
+    <Word from="bestguy" to="best guy" />
+    <Word from="bestjob" to="best job" />
+    <Word from="BIack" to="Black" />
+    <Word from="BIess" to="Bless" />
+    <Word from="bigos___" to="bigos..." />
+    <Word from="BIame" to="Blame" />
+    <Word from="BIind" to="Blind" />
+    <Word from="BIood" to="Blood" />
+    <Word from="BIue" to="Blue" />
+    <Word from="BLOVVS" to="BLOWS" />
+    <Word from="blowholel" to="blowhole!" />
+    <Word from="blt" to="bit" />
+    <Word from="Bo99" to="Bogg" />
+    <Word from="bodiedyoung" to="bodied young" />
+    <Word from="breakféwtl" to="breakfast!" />
+    <Word from="bulldozlng" to="bulldozing" />
+    <Word from="butjust" to="but just" />
+    <Word from="butl" to="but I" />
+    <Word from="Butl" to="But I" />
+    <Word from="butljust" to="but I just" />
+    <Word from="Butljustcan'tgetenough" to="But I just can't get enough" />
+    <Word from="Butyou're" to="But you're" />
+    <Word from="buythem" to="buy them" />
+    <Word from="buyyou" to="buy you" />
+    <Word from="byjust" to="by just" />
+    <Word from="bythe" to="by the" />
+    <Word from="C/latter/'/7g" to="Chattering" />
+    <Word from="ca///ng" to="calling" />
+    <Word from="ca/I" to="call" />
+    <Word from="call/ng" to="calling" />
+    <Word from="callyou" to="call you" />
+    <Word from="can*t" to="can't" />
+    <Word from="can'i" to="can't" />
+    <Word from="can'I" to="can't" />
+    <Word from="canlgetyou" to="canI get you" />
+    <Word from="cannotchange" to="cannot change" />
+    <Word from="cannut" to="cannot" />
+    <Word from="can'T" to="can't" />
+    <Word from="can't_" to="Crucially" />
+    <Word from="can'tjust" to="can't just" />
+    <Word from="can'tletgo" to="can't let go" />
+    <Word from="Car0l" to="Carol" />
+    <Word from="Carhorn" to="Car horn" />
+    <Word from="carrled" to="carried" />
+    <Word from="Ccug" to="Coug" />
+    <Word from="Ccugs" to="Cougs" />
+    <Word from="Ccver" to="Cover" />
+    <Word from="cellularchange" to="cellular change" />
+    <Word from="cff" to="off" />
+    <Word from="cfycu" to="of you" />
+    <Word from="cfycur" to="of your" />
+    <Word from="Ch/rping" to="Chirping" />
+    <Word from="chaletgirl" to="chalet girl" />
+    <Word from="changejobs" to="change jobs" />
+    <Word from="Charliejust" to="Charlie just" />
+    <Word from="Chatter/'rtg" to="Chattering" />
+    <Word from="CHATTERWG" to="CHATTERING" />
+    <Word from="Chequeredlove" to="Chequered love" />
+    <Word from="cHIRPINcs" to="CHIRPING" />
+    <Word from="chjldishness" to="childishness" />
+    <Word from="chlldrcn" to="children" />
+    <Word from="chlldren" to="children" />
+    <Word from="chocolatte" to="chocolate" />
+    <Word from="Cho/r" to="Choir" />
+    <Word from="cHucKl_Es" to="CHUCKLES" />
+    <Word from="CIark" to="Clark" />
+    <Word from="CIear" to="Clear" />
+    <Word from="circumcised_" to="circumcised." />
+    <Word from="ckay" to="okay" />
+    <Word from="cl_osEs" to="CLOSES" />
+    <Word from="CLATTERWG" to="CLATTERING" />
+    <Word from="cn" to="on" />
+    <Word from="cne" to="one" />
+    <Word from="cnes" to="ones" />
+    <Word from="Coincidenta//y" to="Coincidentally" />
+    <Word from="COm€" to="Come" />
+    <Word from="comp/etey" to="completely" />
+    <Word from="complainingabout" to="complaining about" />
+    <Word from="coms" to="come" />
+    <Word from="cond/lion" to="condition" />
+    <Word from="confdence" to="confidence" />
+    <Word from="conhrmed" to="confirmed" />
+    <Word from="connrm" to="confirm" />
+    <Word from="Consecutivelyl" to="Consecutively!" />
+    <Word from="COUGH5" to="COUGHS" />
+    <Word from="CouGHING" to="COUGHING" />
+    <Word from="couIdn't" to="couldn't" />
+    <Word from="couldjust" to="could just" />
+    <Word from="couldn'T" to="couldn't" />
+    <Word from="couldn'tjust" to="couldn't just" />
+    <Word from="Couldyou" to="Could you" />
+    <Word from="crappyjob" to="crappy job" />
+    <Word from="CRAsHING" to="CRASHING" />
+    <Word from="crder" to="order" />
+    <Word from="Crowdcheers" to="Crowd cheers" />
+    <Word from="Cruoially" to="Crucially" />
+    <Word from="cther" to="other" />
+    <Word from="cuuld" to="could" />
+    <Word from="cver" to="over" />
+    <Word from="d/'dn't" to="didn't" />
+    <Word from="d/squietude" to="disquietude" />
+    <Word from="D¤esn't" to="Doesn't" />
+    <Word from="d¤n'i" to="don't" />
+    <Word from="d¤n't" to="don't" />
+    <Word from="d°9" to="dog" />
+    <Word from="d0" to="do" />
+    <Word from="D0" to="Do" />
+    <Word from="D0asn't" to="Doesn't" />
+    <Word from="Dad'//" to="Dad'll" />
+    <Word from="dairyjust" to="dairy just" />
+    <Word from="Dar//ng" to="Darling" />
+    <Word from="dc" to="do" />
+    <Word from="Dcbby" to="Dobby" />
+    <Word from="dccsn't" to="doesn't" />
+    <Word from="dcctcr" to="doctor" />
+    <Word from="Dces" to="Does" />
+    <Word from="dcgs" to="dogs" />
+    <Word from="dcing" to="doing" />
+    <Word from="dcn'I" to="don't" />
+    <Word from="dcn't" to="don't" />
+    <Word from="Dcn't" to="Don't" />
+    <Word from="dcughnut" to="doughnut" />
+    <Word from="declslons" to="decisions" />
+    <Word from="deedhas" to="deed has" />
+    <Word from="Dehnitely" to="Definitely" />
+    <Word from="desewes" to="deserves" />
+    <Word from="desperate/»y" to="desperately" />
+    <Word from="Dflnk" to="Drink" />
+    <Word from="DIAl_lNcs" to="DIALING" />
+    <Word from="didn'!" to="didn't" />
+    <Word from="didnt" to="didn't" />
+    <Word from="didn'T" to="didn't" />
+    <Word from="dIdn't" to="didn't" />
+    <Word from="didn't_" to="didn't." />
+    <Word from="didrft" to="didn't" />
+    <Word from="didrl't" to="didn't" />
+    <Word from="didyou" to="did you" />
+    <Word from="divorcing_" to="divorcing." />
+    <Word from="dld" to="did" />
+    <Word from="dldn't" to="didn't" />
+    <Word from="dlfflcull" to="difficult" />
+    <Word from="dlg" to="dig" />
+    <Word from="dlsobeyed" to="disobeyed" />
+    <Word from="doasn't" to="doesn't" />
+    <Word from="Doasn't" to="Doesn't" />
+    <Word from="doctoh" to="doctor" />
+    <Word from="Doctor___tell" to="Doctor... tell" />
+    <Word from="doesnt" to="doesn't" />
+    <Word from="doesn'T" to="doesn't" />
+    <Word from="doesri't" to="doesnt't" />
+    <Word from="doesrt" to="doesn't" />
+    <Word from="Doesrt" to="Doesn't" />
+    <Word from="doit" to="do it" />
+    <Word from="dojust" to="do just" />
+    <Word from="don*t" to="don't" />
+    <Word from="donejobs" to="done jobs" />
+    <Word from="don'i" to="don't" />
+    <Word from="don'l" to="don't" />
+    <Word from="Don'l" to="Don't" />
+    <Word from="Donllook" to="Don't look" />
+    <Word from="dont" to="don't" />
+    <Word from="don'T" to="don't" />
+    <Word from="don'tcare" to="don't care" />
+    <Word from="don'tjoke" to="don't joke" />
+    <Word from="Don'tjudge" to="Don't judge" />
+    <Word from="don'tjust" to="don't just" />
+    <Word from="Don'tjust" to="Don't just" />
+    <Word from="Don'tlet" to="Don't let" />
+    <Word from="don'tlhink" to="don't think" />
+    <Word from="don'tpush" to="don't push" />
+    <Word from="Don'tyou" to="Don't you" />
+    <Word from="DonWlook" to="Don't look" />
+    <Word from="Dooropens" to="Door opens" />
+    <Word from="doorshuts" to="door shuts" />
+    <Word from="dothat" to="do that" />
+    <Word from="dothis" to="do this" />
+    <Word from="Drinkthis" to="Drink this" />
+    <Word from="dumbass" to="dumb-ass" />
+    <Word from="dumbto" to="dumb to" />
+    <Word from="dun't" to="don't" />
+    <Word from="E//e" to="Elle" />
+    <Word from="E9YPt" to="Egypt" />
+    <Word from="ea/'t/7" to="earth" />
+    <Word from="eart/7" to="earth" />
+    <Word from="efi'/'c/'ent" to="efficient" />
+    <Word from="EN&lt;3LlsH" to="ENGLISH" />
+    <Word from="Enjoythe" to="Enjoy the" />
+    <Word from="Erv\/an" to="Erwan" />
+    <Word from="Erv\/an's" to="Erwan's" />
+    <Word from="etemity" to="eternity" />
+    <Word from="ev/I" to="evil" />
+    <Word from="eve/yone" to="everyone" />
+    <Word from="even/body's" to="everybody's" />
+    <Word from="eversay" to="ever say" />
+    <Word from="Everymonth" to="Every month" />
+    <Word from="everythings" to="everything's" />
+    <Word from="Everythirlg's" to="Everything’s" />
+    <Word from="Everythlng's" to="Everything's" />
+    <Word from="Everytime" to="Every time" />
+    <Word from="Exacfly" to="Exactly" />
+    <Word from="ExacUy_" to="Exactly." />
+    <Word from="excitedshrieking" to="excited shrieking" />
+    <Word from="ExcLAllvls" to="EXCLAIMS" />
+    <Word from="exploatation" to="exploitation" />
+    <Word from="expreusion" to="expression" />
+    <Word from="fairthat" to="fair that" />
+    <Word from="Fathef" to="Father" />
+    <Word from="fatherfigure" to="father figure" />
+    <Word from="FBl" to="FBI" />
+    <Word from="fcrebcdlng" to="foreboding" />
+    <Word from="fcreverjudges" to="forever judges" />
+    <Word from="fcund" to="found" />
+    <Word from="feeleverything" to="feel everything" />
+    <Word from="feelsweet" to="feel sweet" />
+    <Word from="fiam/'/y" to="family" />
+    <Word from="ď¬ngernail" to="fingernail" />
+    <Word from="finishedjunior" to="finished junior" />
+    <Word from="FIynn" to="Flynn" />
+    <Word from="flll" to="fill" />
+    <Word from="flra" to="fira" />
+    <Word from="Flylng" to="Flying" />
+    <Word from="Fnends" to="Fiends" />
+    <Word from="fo/low" to="follow" />
+    <Word from="fonzvard" to="forward" />
+    <Word from="fora" to="for a" />
+    <Word from="Fora" to="For a" />
+    <Word from="forajob" to="for a job" />
+    <Word from="forAmerica" to="for America" />
+    <Word from="forNew" to="for New" />
+    <Word from="forone" to="for one" />
+    <Word from="forso" to="for so" />
+    <Word from="Forsuch" to="For such" />
+    <Word from="forsunburns" to="for sunburns" />
+    <Word from="forthe" to="for the" />
+    <Word from="Foryears" to="For years" />
+    <Word from="foryou" to="for you" />
+    <Word from="Foudeen" to="Fouteen" />
+    <Word from="Foufleen" to="Fourteen" />
+    <Word from="FourSeasons" to="Four Seasons" />
+    <Word from="fr/ends" to="friends" />
+    <Word from="freezerfood" to="freezer food" />
+    <Word from="FĂĽhrerfeels" to="FĂĽhrer feels" />
+    <Word from="furthernotice" to="further notice" />
+    <Word from="furyou" to="for you" />
+    <Word from="G0" to="Go" />
+    <Word from="g0in9" to="going" />
+    <Word from="gamlenias" to="gardenias" />
+    <Word from="GAsPING" to="GASPING" />
+    <Word from="gc" to="go" />
+    <Word from="gcing" to="going" />
+    <Word from="gcnna" to="gonna" />
+    <Word from="Gcnna" to="Gonna" />
+    <Word from="gct" to="get" />
+    <Word from="Gct" to="Got" />
+    <Word from="genercsity" to="generosity" />
+    <Word from="generosityn" to="generosity&quot;" />
+    <Word from="getjust" to="get just" />
+    <Word from="gfling" to="going" />
+    <Word from="giflfriend" to="girlfriend" />
+    <Word from="gir/" to="girl" />
+    <Word from="gir/s'boarding" to="girls' boarding" />
+    <Word from="giris" to="girls" />
+    <Word from="gLlyS" to="guys" />
+    <Word from="glum_" to="glum." />
+    <Word from="gnyone" to="anyone" />
+    <Word from="golng" to="going" />
+    <Word from="goodboyand" to="good boy and" />
+    <Word from="goodjob" to="good job" />
+    <Word from="gOt" to="got" />
+    <Word from="gotjumped" to="got jumped" />
+    <Word from="gotmyfirstinterview" to="got my first interview" />
+    <Word from="grandjury" to="grand jury" />
+    <Word from="greatjob" to="great job" />
+    <Word from="Greatjobl" to="Great job!" />
+    <Word from="grinco" to="gringo" />
+    <Word from="GRoANING" to="GROANING" />
+    <Word from="GRUNUNG" to="GRUNTING" />
+    <Word from="gu" to="go" />
+    <Word from="gunna" to="gonna" />
+    <Word from="guyjumped" to="guy jumped" />
+    <Word from="guyjust" to="guy just" />
+    <Word from="gUyS" to="guys" />
+    <Word from="_H6Y-" to="- Hey!" />
+    <Word from="H€Y" to="Hey" />
+    <Word from="H0we·ver" to="However" />
+    <Word from="halftheir" to="half their" />
+    <Word from="hapPY" to="happy" />
+    <Word from="hasrt" to="hasn't" />
+    <Word from="Hasrt" to="Hasn't" />
+    <Word from="haven'tspokerl" to="haven't spoken" />
+    <Word from="hcle" to="hole" />
+    <Word from="hcme" to="home" />
+    <Word from="hcmes" to="homes" />
+    <Word from="hcpe" to="hope" />
+    <Word from="hctel" to="hotel" />
+    <Word from="hcurs" to="hours" />
+    <Word from="Hcw" to="How" />
+    <Word from="he/ps" to="helps" />
+    <Word from="hearjokestonight" to="hear jokes tonight" />
+    <Word from="hearme" to="hear me" />
+    <Word from="Hefell" to="He fell" />
+    <Word from="he'II" to="he'll" />
+    <Word from="He'II" to="He'll" />
+    <Word from="HeII0" to="Hello" />
+    <Word from="He'Il" to="He'll" />
+    <Word from="Hejust" to="He just" />
+    <Word from="He'lI" to="He'll" />
+    <Word from="HelIo" to="Hello" />
+    <Word from="hellc" to="hello" />
+    <Word from="HellO" to="Hello" />
+    <Word from="herboyfr/end" to="her boyfriend" />
+    <Word from="herflesh" to="her flesh" />
+    <Word from="herfollov\/ed" to="her followed" />
+    <Word from="herjob_" to="her job." />
+    <Word from="HerrSchmidt" to="Herr Schmidt" />
+    <Word from="herwith" to="her with" />
+    <Word from="HeY·" to="Hey." />
+    <Word from="HeyJennifer" to="Hey Jennifer" />
+    <Word from="hiddsn" to="hidden" />
+    <Word from="hisjunk" to="his junk" />
+    <Word from="Hitlershare" to="Hitler share" />
+    <Word from="Hlneed" to="I'll need" />
+    <Word from="Hnally" to="finally" />
+    <Word from="Hnishing" to="finishing" />
+    <Word from="HOId" to="Hold" />
+    <Word from="hOIes" to="holes" />
+    <Word from="HONMNG" to="HONKING" />
+    <Word from="honorthe" to="honor the" />
+    <Word from="honoryou" to="honor you" />
+    <Word from="honoryour" to="honor your" />
+    <Word from="Hov\/'s" to="How's" />
+    <Word from="Hov\/'S" to="How's" />
+    <Word from="HovvLING" to="HOWLING" />
+    <Word from="howit" to="how it" />
+    <Word from="HoW's" to="How's" />
+    <Word from="howto" to="how to" />
+    <Word from="Hs's" to="He's" />
+    <Word from="hurtyou" to="hurt you" />
+    <Word from="I/erilj/" to="verify" />
+    <Word from="I/fe" to="life" />
+    <Word from="I\/I" to="M" />
+    <Word from="I\/Ian" to="Man" />
+    <Word from="I\/Iathies" to="Mathies" />
+    <Word from="I\/Ie" to="Me" />
+    <Word from="I\/Iommy" to="Mommy" />
+    <Word from="I\/Ir" to="Mr" />
+    <Word from="I\/Ir." to="Mr." />
+    <Word from="I\/ly" to="My" />
+    <Word from="I3EEPING" to="BEEPING" />
+    <Word from="I3LARING" to="BLARING" />
+    <Word from="Iacings" to="lacings" />
+    <Word from="Iaid" to="laid" />
+    <Word from="Iam" to="I am" />
+    <Word from="Iand" to="land" />
+    <Word from="Ianding" to="landing" />
+    <Word from="Iast" to="last" />
+    <Word from="Iate" to="late" />
+    <Word from="Icad" to="load" />
+    <Word from="Icading" to="loading" />
+    <Word from="Ican" to="I can" />
+    <Word from="Iccked" to="locked" />
+    <Word from="Icng" to="long" />
+    <Word from="Icsing" to="losing" />
+    <Word from="Icslng" to="losing" />
+    <Word from="Idid" to="I did" />
+    <Word from="Ididn't" to="I didn't" />
+    <Word from="Ido" to="I do" />
+    <Word from="Idon'i" to="I don't" />
+    <Word from="Idon't" to="I don't" />
+    <Word from="Idon'tthink" to="I don't think" />
+    <Word from="I'E'$" to="It's" />
+    <Word from="Ieamed" to="learned" />
+    <Word from="Ieapt" to="leapt" />
+    <Word from="Iearned" to="learned" />
+    <Word from="Ieast" to="least" />
+    <Word from="Ieave" to="leave" />
+    <Word from="Ied" to="led" />
+    <Word from="Ieft" to="left" />
+    <Word from="Ieg's" to="leg's" />
+    <Word from="Iess" to="less" />
+    <Word from="Iet" to="let" />
+    <Word from="Iet's" to="let's" />
+    <Word from="Iet'sjust" to="let's just" />
+    <Word from="if/just" to="if I just" />
+    <Word from="Ifear" to="I fear" />
+    <Word from="Ifeared" to="I feared" />
+    <Word from="Ifeel" to="I feel" />
+    <Word from="ifI'||" to="if I'll" />
+    <Word from="ifI'd" to="if I'd" />
+    <Word from="ifI'II" to="if I'll" />
+    <Word from="ifI'll" to="if I'll" />
+    <Word from="ifI'm" to="if I'm" />
+    <Word from="Ifinally" to="I finally" />
+    <Word from="ifI've" to="if I've" />
+    <Word from="ifl" to="if I" />
+    <Word from="Iforgot" to="I forgot" />
+    <Word from="Ifound" to="I found" />
+    <Word from="ifshe" to="if she" />
+    <Word from="ifthat's" to="if that's" />
+    <Word from="ifthe" to="if the" />
+    <Word from="Ifthe" to="If the" />
+    <Word from="ifthere's" to="if there's" />
+    <Word from="Ifthey" to="If they" />
+    <Word from="ifwe" to="if we" />
+    <Word from="Ifwe" to="If we" />
+    <Word from="Ifycu" to="If you" />
+    <Word from="ifyou" to="if you" />
+    <Word from="Ifyou" to="If you" />
+    <Word from="ifyuu" to="if you" />
+    <Word from="Iget" to="I get" />
+    <Word from="Igot" to="I got" />
+    <Word from="Igotta" to="I gotta" />
+    <Word from="Igotyou" to="I got you" />
+    <Word from="Iguess" to="I guess" />
+    <Word from="Iguessljust" to="I guess I just" />
+    <Word from="Ihad" to="I had" />
+    <Word from="Ihat's" to="that's" />
+    <Word from="Ihave" to="I have" />
+    <Word from="Iheard" to="I heard" />
+    <Word from="ihere's" to="there's" />
+    <Word from="ihey've" to="they've" />
+    <Word from="Ihope" to="I hope" />
+    <Word from="ii/Iary" to="Mary" />
+    <Word from="ii/Ir" to="Mr" />
+    <Word from="ii/Ir." to="Mr." />
+    <Word from="ii/love" to="Move" />
+    <Word from="Iife" to="life" />
+    <Word from="I'II" to="I'll" />
+    <Word from="Iike" to="like" />
+    <Word from="I'Il" to="I'll" />
+    <Word from="Iine" to="line" />
+    <Word from="iirst" to="first" />
+    <Word from="ii's" to="it's" />
+    <Word from="Ii's" to="It's" />
+    <Word from="Iiterallyjumped" to="literally jumped" />
+    <Word from="Ijoined" to="I joined" />
+    <Word from="Ijust" to="I just" />
+    <Word from="Iknew" to="I knew" />
+    <Word from="Iknow" to="I know" />
+    <Word from="Ile" to="lie" />
+    <Word from="Ileft" to="I left" />
+    <Word from="I'lldo" to="I'll do" />
+    <Word from="I'llmake" to="I'll make" />
+    <Word from="Ilons" to="lions" />
+    <Word from="Ilove" to="I love" />
+    <Word from="I'mjust" to="I'm just" />
+    <Word from="Inconceivablel" to="Inconceivable!" />
+    <Word from="infact" to="in fact" />
+    <Word from="Infact" to="In fact" />
+    <Word from="influence" to="influence" />
+    <Word from="infront" to="in front" />
+    <Word from="injust" to="in just" />
+    <Word from="inscď¬pď¬ons" to="inscriptions" />
+    <Word from="insolencel" to="insolence!" />
+    <Word from="intc" to="into" />
+    <Word from="internationaljudges" to="international judges" />
+    <Word from="inthe" to="in the" />
+    <Word from="Iockdown" to="lockdown" />
+    <Word from="Iong" to="long" />
+    <Word from="Iongships" to="longships" />
+    <Word from="Iook" to="look" />
+    <Word from="Iookjust" to="look just" />
+    <Word from="Iooklng" to="looking" />
+    <Word from="Iooks" to="looks" />
+    <Word from="Ioose" to="loose" />
+    <Word from="Iord's" to="lord's" />
+    <Word from="Iose" to="lose" />
+    <Word from="Ioser" to="loser" />
+    <Word from="Ioss" to="loss" />
+    <Word from="Iost" to="lost" />
+    <Word from="Iot" to="lot" />
+    <Word from="Iot's" to="lot's" />
+    <Word from="Iousyjob" to="lousy job" />
+    <Word from="Iove" to="love" />
+    <Word from="Ioves" to="loves" />
+    <Word from="Iowlife" to="lowlife" />
+    <Word from="Ipaid" to="I paid" />
+    <Word from="Iquit" to="I quit" />
+    <Word from="Ireallythinkthis" to="I really think this" />
+    <Word from="I'rn" to="I'm" />
+    <Word from="Isaw" to="I saw" />
+    <Word from="Isayt/1e" to="I say the" />
+    <Word from="isjust" to="is just" />
+    <Word from="isn'i" to="isn't" />
+    <Word from="isn't_" to="isn't." />
+    <Word from="Isthis" to="Is this" />
+    <Word from="Istill" to="I still" />
+    <Word from="Istumblod" to="I stumbled" />
+    <Word from="Itake" to="I take" />
+    <Word from="itdown" to="it down" />
+    <Word from="Iteach" to="I teach" />
+    <Word from="Itfeels" to="It feels" />
+    <Word from="ithave" to="it have" />
+    <Word from="Ithink" to="I think" />
+    <Word from="Ithinkthat" to="I think that" />
+    <Word from="Ithinkthis" to="I think this" />
+    <Word from="Ithinkyou're" to="I think you're" />
+    <Word from="Ithlnk" to="I think" />
+    <Word from="Ithoguht" to="I thought" />
+    <Word from="Ithought" to="I thought" />
+    <Word from="Ithoughtl" to="I thought I" />
+    <Word from="it'II" to="it'll" />
+    <Word from="It'II" to="It'll" />
+    <Word from="it'Il" to="it'll" />
+    <Word from="It'Il" to="It'll" />
+    <Word from="itin" to="it in" />
+    <Word from="itjust" to="it just" />
+    <Word from="Itjust" to="It just" />
+    <Word from="it'lI" to="it'll" />
+    <Word from="It'lI" to="It'll" />
+    <Word from="It'llhappen" to="It'll happen" />
+    <Word from="it'lljust" to="it'll just" />
+    <Word from="Itold" to="I told" />
+    <Word from="Itook" to="I took" />
+    <Word from="itout" to="it out" />
+    <Word from="it'S" to="it's" />
+    <Word from="it'sjinxed" to="it's jinxed" />
+    <Word from="it'sjust" to="it's just" />
+    <Word from="It'sjust" to="It's just" />
+    <Word from="itso" to="it so" />
+    <Word from="Ittends" to="It tends" />
+    <Word from="Itwasn't" to="It wasn't" />
+    <Word from="Iuckier" to="luckier" />
+    <Word from="IV|oney" to="Money" />
+    <Word from="IV|oney's" to="Money's" />
+    <Word from="I'va" to="I've" />
+    <Word from="I'Ve" to="I've" />
+    <Word from="IVIan" to="Man" />
+    <Word from="IVIAN" to="MAN" />
+    <Word from="IVIarch" to="March" />
+    <Word from="IVIarci's" to="Marci's" />
+    <Word from="IVIarko" to="Marko" />
+    <Word from="IVIe" to="Me" />
+    <Word from="IVIine's" to="Mine's" />
+    <Word from="IVImm" to="Mmm" />
+    <Word from="IVIoney" to="Money" />
+    <Word from="IVIr." to="Mr." />
+    <Word from="IVIrs" to="Mrs" />
+    <Word from="IVIuch" to="Much" />
+    <Word from="IVIust" to="Must" />
+    <Word from="IVIy" to="My" />
+    <Word from="IVlacArthur" to="MacArthur" />
+    <Word from="IVlacArthur's" to="MacArthur's" />
+    <Word from="IVlcBride" to="McBride" />
+    <Word from="IVlore" to="More" />
+    <Word from="IVlotherfucker_" to="Motherfucker." />
+    <Word from="IVlr" to="Mr" />
+    <Word from="IVlr." to="Mr." />
+    <Word from="IVlr_" to="Mr." />
+    <Word from="IVlust" to="Must" />
+    <Word from="IVly" to="My" />
+    <Word from="Iwake" to="I wake" />
+    <Word from="Iwant" to="I want" />
+    <Word from="Iwanted" to="I wanted" />
+    <Word from="Iwas" to="I was" />
+    <Word from="Iwasjust" to="I was just" />
+    <Word from="Iwasjustu" to="I was just..." />
+    <Word from="Iwill" to="I will" />
+    <Word from="Iwish" to="I wish" />
+    <Word from="Iwon't" to="I won't" />
+    <Word from="Iworked" to="I worked" />
+    <Word from="Iwould" to="I would" />
+    <Word from="jalapeno" to="jalapeño" />
+    <Word from="Jaokson" to="Jackson" />
+    <Word from="Jascn" to="Jason" />
+    <Word from="jcke" to="joke" />
+    <Word from="jennifer" to="Jennifer" />
+    <Word from="joseph" to="Joseph" />
+    <Word from="jsut" to="just" />
+    <Word from="Jumpthem" to="Jump them" />
+    <Word from="jusi" to="just" />
+    <Word from="jusl" to="just" />
+    <Word from="justjudge" to="just judge" />
+    <Word from="justleave" to="just leave" />
+    <Word from="Justletgo" to="Just let go" />
+    <Word from="kidsjumped" to="kids jumped" />
+    <Word from="kiokflip" to="kickflip" />
+    <Word from="knowjust" to="know just" />
+    <Word from="knowthat" to="know that" />
+    <Word from="knowthis" to="know this" />
+    <Word from="knowwhat" to="know what" />
+    <Word from="knowyet" to="know yet" />
+    <Word from="knowyourlove" to="know your love" />
+    <Word from="korean" to="Korean" />
+    <Word from="L/ght" to="Light" />
+    <Word from="L/kes" to="Likes" />
+    <Word from="L\/Ianuela" to="Manuela" />
+    <Word from="L\/Ianuelal" to="Manuela!" />
+    <Word from="l\/Iauzard" to="Mauzard" />
+    <Word from="l\/IĂ©lanie" to="MĂ©lanie" />
+    <Word from="L\/IĂ©lanie" to="MĂ©lanie" />
+    <Word from="l\/Iom" to="Mom" />
+    <Word from="l\/Iommy" to="Mommy" />
+    <Word from="l\/Ir" to="Mr" />
+    <Word from="l\/Ir." to="Mr." />
+    <Word from="l\/Is" to="Ms" />
+    <Word from="l\/ly" to="My" />
+    <Word from="l_AuGHING" to="LAUGHING" />
+    <Word from="lâ€m" to="I'm" />
+    <Word from="Laml6" to="I am l6" />
+    <Word from="Lcad" to="Load" />
+    <Word from="lcan" to="I can" />
+    <Word from="lcan't" to="I can't" />
+    <Word from="lcarl't_" to="I can't." />
+    <Word from="Lcve" to="Love" />
+    <Word from="l'd" to="I'd" />
+    <Word from="L'd" to="I'd" />
+    <Word from="ldid" to="I did" />
+    <Word from="Ldid" to="I did" />
+    <Word from="ldiot" to="Idiot" />
+    <Word from="L'djump" to="I'd jump" />
+    <Word from="ldon't" to="I don't" />
+    <Word from="Ldon't" to="I don't" />
+    <Word from="Lefs" to="Let's" />
+    <Word from="Let'sjust" to="Let's just" />
+    <Word from="lf" to="if" />
+    <Word from="Lf" to="If" />
+    <Word from="lfeelonelung" to="I feel one lung" />
+    <Word from="lfthey" to="if they" />
+    <Word from="lfyou" to="If you" />
+    <Word from="Lfyou" to="If you" />
+    <Word from="lfyou're" to="If you're" />
+    <Word from="lget" to="I get" />
+    <Word from="lgive" to="I give" />
+    <Word from="Li/0/Academy" to="Lilly Academy" />
+    <Word from="li/lr." to="Mr." />
+    <Word from="ligature___" to="ligature..." />
+    <Word from="l'II" to="I'll" />
+    <Word from="l'Il" to="I'll" />
+    <Word from="ljust" to="I just" />
+    <Word from="Ljust" to="I just" />
+    <Word from="ll/Iommy's" to="Mommy's" />
+    <Word from="ll/lajor" to="Major" />
+    <Word from="Ll/lajor" to="Major" />
+    <Word from="ll/layans" to="Mayans" />
+    <Word from="l'lI" to="I'll" />
+    <Word from="l'll" to="I'll" />
+    <Word from="L'll" to="I'll" />
+    <Word from="l'lljust" to="I'll just" />
+    <Word from="L'lltake" to="I'll take" />
+    <Word from="llte" to="lite" />
+    <Word from="l'm" to="I'm" />
+    <Word from="L'm" to="I'm" />
+    <Word from="Lmean" to="I mean" />
+    <Word from="l'mjust" to="I'm just" />
+    <Word from="ln" to="In" />
+    <Word from="lN" to="IN" />
+    <Word from="lNAuDll3LE" to="INAUDIBLE" />
+    <Word from="LNAuDll3LE" to="INAUDIBLE" />
+    <Word from="LNDlsTINcT" to="INDISTINCT" />
+    <Word from="lneed" to="I need" />
+    <Word from="lostyou" to="lost you" />
+    <Word from="Loudmusic" to="Loud music" />
+    <Word from="lraq" to="Iraq" />
+    <Word from="lRA's" to="IRA's" />
+    <Word from="Lrenka" to="Irenka" />
+    <Word from="Lrn" to="I'm" />
+    <Word from="lRS" to="IRS" />
+    <Word from="lsabella" to="Isabella" />
+    <Word from="lsn't" to="isn't" />
+    <Word from="Lsn't" to="Isn't" />
+    <Word from="Lst's" to="Let's" />
+    <Word from="lsuppose" to="I suppose" />
+    <Word from="lt" to="It" />
+    <Word from="ltake" to="I take" />
+    <Word from="ltell" to="I tell" />
+    <Word from="lthink" to="I think" />
+    <Word from="Lthink" to="I think" />
+    <Word from="lthink___" to="I think..." />
+    <Word from="lt'II" to="It'll" />
+    <Word from="lt'Il" to="It'll" />
+    <Word from="ltjammed_" to="It jammed." />
+    <Word from="lt'll" to="It'll" />
+    <Word from="ltold" to="I told" />
+    <Word from="lt's" to="It's" />
+    <Word from="lT'S" to="IT'S" />
+    <Word from="Lt'S" to="It's" />
+    <Word from="Lt'sjust" to="It's just" />
+    <Word from="lv\/asn't" to="I wasn't" />
+    <Word from="l've" to="I've" />
+    <Word from="L've" to="I've" />
+    <Word from="lVIan" to="Man" />
+    <Word from="lVIcHenry" to="McHenry" />
+    <Word from="lVIr." to="Mr." />
+    <Word from="lVlacArthur" to="MacArthur" />
+    <Word from="LVlore" to="More" />
+    <Word from="lVlr" to="Mr" />
+    <Word from="lVlr." to="Mr." />
+    <Word from="lvluslc" to="MUSIC" />
+    <Word from="lVlust" to="Must" />
+    <Word from="LVly" to="Lily" />
+    <Word from="lwaited" to="I waited" />
+    <Word from="lwamoto" to="Iwamoto" />
+    <Word from="lwant" to="I want" />
+    <Word from="lwanted" to="I wanted" />
+    <Word from="lwas" to="I was" />
+    <Word from="lwill" to="I will" />
+    <Word from="lwon't" to="I won't" />
+    <Word from="lworked" to="I worked" />
+    <Word from="lwould" to="I would" />
+    <Word from="lwould've" to="I would've" />
+    <Word from="lx/Iorning" to="Morning" />
+    <Word from="M/dd/e" to="Middle" />
+    <Word from="m/g/7ty" to="mighty" />
+    <Word from="MACH/NE" to="MACHINE" />
+    <Word from="MacKenz/e" to="MacKenzie" />
+    <Word from="majorjackpot" to="major jackpot" />
+    <Word from="majormuscle" to="major muscle" />
+    <Word from="Manuela_" to="Manuela." />
+    <Word from="maste/y" to="mastery" />
+    <Word from="Masturhate" to="Masturbate" />
+    <Word from="Mattei_" to="Mattei." />
+    <Word from="mayjust" to="may just" />
+    <Word from="mbecause" to="&quot;because" />
+    <Word from="McCa/Iister" to="McCallister" />
+    <Word from="McCallisler" to="McCallister" />
+    <Word from="Mccallister" to="McCallister" />
+    <Word from="Mccallisters" to="McCallisters" />
+    <Word from="mcm's" to="mom's" />
+    <Word from="mcney" to="money" />
+    <Word from="mcral" to="moral" />
+    <Word from="mcre" to="more" />
+    <Word from="mcve" to="move" />
+    <Word from="mejust" to="me just" />
+    <Word from="Mexioo" to="Mexico" />
+    <Word from="mi//&lt;" to="milk" />
+    <Word from="misfartune" to="misfortune" />
+    <Word from="Ml6" to="MI6" />
+    <Word from="Mlnd" to="Mind" />
+    <Word from="Mock/'ngbl'rd" to="Mockingbird" />
+    <Word from="mOI'€" to="more" />
+    <Word from="Mom_" to="Mom." />
+    <Word from="monkeyback" to="monkey back" />
+    <Word from="move___l" to="move... I" />
+    <Word from="moveto" to="move to" />
+    <Word from="mustknock" to="must knock" />
+    <Word from="Myheart" to="My heart" />
+    <Word from="myjch" to="my job" />
+    <Word from="myjet" to="my jet" />
+    <Word from="myjob" to="my job" />
+    <Word from="Myjob" to="My job" />
+    <Word from="myjob's" to="my job's" />
+    <Word from="mylife" to="my life" />
+    <Word from="Mynew" to="My new" />
+    <Word from="myown" to="my own" />
+    <Word from="mypants" to="my pants" />
+    <Word from="myselli" to="myself" />
+    <Word from="Myshoes" to="My shoes" />
+    <Word from="mysong" to="my song" />
+    <Word from="mytemper" to="my temper" />
+    <Word from="mythumb" to="my thumb" />
+    <Word from="Myworld" to="My world" />
+    <Word from="N0" to="No" />
+    <Word from="narne" to="name" />
+    <Word from="Natians" to="Nations" />
+    <Word from="naTve" to="naive" />
+    <Word from="nc" to="no" />
+    <Word from="Nc" to="No" />
+    <Word from="ncne" to="none" />
+    <Word from="Ncrth" to="North" />
+    <Word from="ncw" to="new" />
+    <Word from="Ncw" to="Now" />
+    <Word from="needyou" to="need you" />
+    <Word from="neighboun" to="neighbour" />
+    <Word from="neverfound" to="never found" />
+    <Word from="neverthere" to="never there" />
+    <Word from="neverv\/ill_" to="never will." />
+    <Word from="NewJersey" to="New Jersey" />
+    <Word from="newjob" to="new job" />
+    <Word from="newjobs" to="new jobs" />
+    <Word from="nextdoor" to="next door" />
+    <Word from="Nighw" to="Nighty" />
+    <Word from="nilios" to="niños" />
+    <Word from="Nlagnificence" to="Magnificence" />
+    <Word from="Nlakes" to="Makes" />
+    <Word from="Nlalina" to="Malina" />
+    <Word from="Nlan" to="Man" />
+    <Word from="Nlarch" to="March" />
+    <Word from="Nlarine" to="Marine" />
+    <Word from="Nlarion" to="Marion" />
+    <Word from="Nlarry" to="Marry" />
+    <Word from="Nlars" to="Mars" />
+    <Word from="Nlarty" to="Marty" />
+    <Word from="Nle" to="Me" />
+    <Word from="Nleet" to="Meet" />
+    <Word from="Nlen" to="Men" />
+    <Word from="Nlom" to="Mom" />
+    <Word from="Nlore" to="More" />
+    <Word from="Nlornin" to="Mornin" />
+    <Word from="Nlother" to="Mother" />
+    <Word from="Nlr" to="Mr" />
+    <Word from="Nlr." to="Mr." />
+    <Word from="Nlrs" to="Mrs" />
+    <Word from="Nluch" to="Much" />
+    <Word from="nojurisdiction" to="no jurisdiction" />
+    <Word from="noone" to="no one" />
+    <Word from="Noone" to="No one" />
+    <Word from="not judging" to="not judging" />
+    <Word from="notgoing" to="not going" />
+    <Word from="notjunk" to="not junk" />
+    <Word from="Notjunk" to="Not junk" />
+    <Word from="notjust" to="not just" />
+    <Word from="notsure" to="not sure" />
+    <Word from="novv" to="now" />
+    <Word from="Nowjust" to="Now just" />
+    <Word from="Nowthat's" to="Now that's" />
+    <Word from="Numbertwo" to="Number two" />
+    <Word from="oan't" to="can't" />
+    <Word from="oan'tjust" to="can't just" />
+    <Word from="objecl" to="object" />
+    <Word from="occultpowerand" to="occult power and" />
+    <Word from="Ocps" to="Oops" />
+    <Word from="ofa" to="of a" />
+    <Word from="ofajudge" to="of a judge" />
+    <Word from="ofall" to="of all" />
+    <Word from="Ofall" to="Of all" />
+    <Word from="ofBedford" to="of Bedford" />
+    <Word from="ofcourse" to="of course" />
+    <Word from="Ofcourse" to="Of course" />
+    <Word from="ofeach" to="of each" />
+    <Word from="ofeither" to="of either" />
+    <Word from="Offioer's" to="Officer's" />
+    <Word from="ofFrance" to="of France" />
+    <Word from="offreedom" to="of freedom" />
+    <Word from="offthe" to="off the" />
+    <Word from="offthis" to="off this" />
+    <Word from="offto" to="off to" />
+    <Word from="offun" to="of fun" />
+    <Word from="ofguy" to="of guy" />
+    <Word from="Ofhce" to="Office" />
+    <Word from="ofhis" to="of his" />
+    <Word from="ofHis" to="of His" />
+    <Word from="ofhoneybees" to="of honeybees" />
+    <Word from="ofit" to="of it" />
+    <Word from="ofjam" to="of jam" />
+    <Word from="OFJOAN" to="OF JOAN" />
+    <Word from="ofjoy" to="of joy" />
+    <Word from="ofjunior" to="of junior" />
+    <Word from="ofme" to="of me" />
+    <Word from="ofmead" to="of mead" />
+    <Word from="ofmicroinjections" to="of microinjections" />
+    <Word from="ofmy" to="of my" />
+    <Word from="ofNew" to="of New" />
+    <Word from="ofNorris'" to="of Norris'" />
+    <Word from="ofopinions" to="of opinions" />
+    <Word from="ofour" to="of our" />
+    <Word from="ofpeopla" to="of people" />
+    <Word from="ofthat" to="of that" />
+    <Word from="ofthe" to="of the" />
+    <Word from="Ofthe" to="Of the" />
+    <Word from="oftheir" to="of their" />
+    <Word from="ofthem" to="of them" />
+    <Word from="ofthem's" to="of them's" />
+    <Word from="ofthemselves" to="of themselves" />
+    <Word from="ofthere" to="of there" />
+    <Word from="ofthese" to="of these" />
+    <Word from="ofthings" to="of things" />
+    <Word from="ofthis" to="of this" />
+    <Word from="ofthlngs" to="of things" />
+    <Word from="ofthose" to="of those" />
+    <Word from="ofuse" to="of use" />
+    <Word from="ofwashington" to="of Washington" />
+    <Word from="ofyou" to="of you" />
+    <Word from="ofyour" to="of your" />
+    <Word from="OId" to="Old" />
+    <Word from="OIsson" to="Olsson" />
+    <Word from="Ok3Y" to="Okay" />
+    <Word from="okaY" to="okay" />
+    <Word from="OkaY" to="Okay" />
+    <Word from="OKaY" to="Okay" />
+    <Word from="OKGY" to="Okay" />
+    <Word from="Ol&lt;" to="Ole" />
+    <Word from="oldAdolfon" to="old Adolf on" />
+    <Word from="onboard" to="on board" />
+    <Word from="onIy" to="only" />
+    <Word from="onIything" to="only thing" />
+    <Word from="onJanuaw" to="on January" />
+    <Word from="onlyjust" to="only just" />
+    <Word from="Onyinal" to="Original" />
+    <Word from="oomprise" to="comprise" />
+    <Word from="oonstitution" to="constitution" />
+    <Word from="oouldn't" to="couldn't" />
+    <Word from="oould've" to="could've" />
+    <Word from="oousin's" to="cousin's" />
+    <Word from="opiimistically" to="optimistically" />
+    <Word from="ora" to="or a" />
+    <Word from="orfall" to="or fall" />
+    <Word from="orglory" to="or glory" />
+    <Word from="orjust" to="or just" />
+    <Word from="Orjust" to="Or just" />
+    <Word from="Orthat" to="Or that" />
+    <Word from="orwould" to="or would" />
+    <Word from="Orwould" to="Or would" />
+    <Word from="Othenzvise" to="Otherwise" />
+    <Word from="our joumey" to="our journey" />
+    <Word from="ourbrave" to="our brave" />
+    <Word from="ourfathers" to="our fathers" />
+    <Word from="ourgirlon" to="our girl on" />
+    <Word from="Ourgoal" to="Our goal" />
+    <Word from="Ourguy" to="Our guy" />
+    <Word from="ourj0b's" to="our job's" />
+    <Word from="Ourj0b's" to="Our job's" />
+    <Word from="ourjobs" to="our jobs" />
+    <Word from="ourjob's" to="our job's" />
+    <Word from="Ourjob's" to="Our job's" />
+    <Word from="ourjoumey" to="our journey" />
+    <Word from="ourphotos" to="our photos" />
+    <Word from="ourv\/ay" to="our way" />
+    <Word from="outlool&lt;'s" to="outlook's" />
+    <Word from="overme" to="over me" />
+    <Word from="overthe" to="over the" />
+    <Word from="overthere" to="over there" />
+    <Word from="p/ace" to="place" />
+    <Word from="P/ease" to="Please" />
+    <Word from="p_m_" to="p.m." />
+    <Word from="P°P$" to="Pops" />
+    <Word from="PANUNG" to="PANTING" />
+    <Word from="pclnt" to="point" />
+    <Word from="pclnts" to="points" />
+    <Word from="pe0pIe" to="people" />
+    <Word from="Perrut_" to="Perrut." />
+    <Word from="Persona/4/" to="Personally" />
+    <Word from="Persona/y" to="Personally" />
+    <Word from="persors" to="person's" />
+    <Word from="PIain" to="Plain" />
+    <Word from="PIease" to="Please" />
+    <Word from="PIeasure" to="Pleasure" />
+    <Word from="PIus" to="Plus" />
+    <Word from="pleasurlng" to="pleasuring" />
+    <Word from="POIe" to="Pole" />
+    <Word from="Polynes/ans" to="Polynesians" />
+    <Word from="poorshowing" to="poor showing" />
+    <Word from="popsicle" to="Popsicle" />
+    <Word from="Presidenfs" to="President's" />
+    <Word from="probablyjust" to="probably just" />
+    <Word from="puIIing" to="pulling" />
+    <Word from="Putyourhand" to="Put your hand" />
+    <Word from="Qh" to="Oh" />
+    <Word from="QkaY" to="Okay" />
+    <Word from="Qpen" to="Open" />
+    <Word from="QUYS" to="GUYS" />
+    <Word from="_QW" to="Aw" />
+    <Word from="r/ght" to="right" />
+    <Word from="ralnbow" to="rainbow" />
+    <Word from="ratherjump" to="rather jump" />
+    <Word from="ratherjust" to="rather just" />
+    <Word from="Rcque" to="Roque" />
+    <Word from="rcscucd" to="rescued" />
+    <Word from="rea/" to="real" />
+    <Word from="readytolaunchu" to="ready to launch..." />
+    <Word from="reaHy" to="really" />
+    <Word from="ReaHy" to="Really" />
+    <Word from="reallyjust" to="really just" />
+    <Word from="reallymiss" to="really miss" />
+    <Word from="reallytalked" to="really talked" />
+    <Word from="reallythink" to="really think" />
+    <Word from="reallythinkthis" to="really think this" />
+    <Word from="rememberthem" to="remember them" />
+    <Word from="reoalibrated" to="recalibrated" />
+    <Word from="retum" to="return" />
+    <Word from="rhfluence" to="influence" />
+    <Word from="rightdown" to="right down" />
+    <Word from="roadyou" to="road you" />
+    <Word from="RUMBUNG" to="RUMBLING" />
+    <Word from="s/uggikh" to="sluggish" />
+    <Word from="S0" to="So" />
+    <Word from="S1oW1y" to="Slowly" />
+    <Word from="saidyou" to="said you" />
+    <Word from="sayeverything's" to="say everything's" />
+    <Word from="saynothing" to="say nothing" />
+    <Word from="saythat" to="say that" />
+    <Word from="sc" to="so" />
+    <Word from="scientihc" to="scientific" />
+    <Word from="SCREAIVHNG" to="SCREAMING" />
+    <Word from="sCREAlvllNG" to="SCREAMING" />
+    <Word from="SCREAlvllNG" to="SCREAMING" />
+    <Word from="scund" to="sound" />
+    <Word from="S'EOp" to="Stop" />
+    <Word from="severa/parents" to="several parents" />
+    <Word from="sfill" to="still" />
+    <Word from="Sflence" to="Silence" />
+    <Word from="shallrise" to="shall rise" />
+    <Word from="sHATTERING" to="SHATTERING" />
+    <Word from="shcws" to="shows" />
+    <Word from="Shdsjust" to="She's just" />
+    <Word from="She`s" to="She's" />
+    <Word from="Sheâ€II" to="She'll" />
+    <Word from="she'II" to="she'll" />
+    <Word from="She'II" to="She'll" />
+    <Word from="she'Il" to="she'll" />
+    <Word from="Shejust" to="She just" />
+    <Word from="she'lI" to="she'll" />
+    <Word from="Shoofing" to="Shooting" />
+    <Word from="ShOp" to="shop" />
+    <Word from="shortyears" to="short years" />
+    <Word from="shou/dn" to="shouldn’t" />
+    <Word from="shouď¬ng" to="shouting" />
+    <Word from="Shouflng" to="Shouting" />
+    <Word from="shouldnt" to="shouldn't" />
+    <Word from="Shouldrt" to="Shouldn't" />
+    <Word from="shouldrt" to="shouldn't" />
+    <Word from="Shs's" to="She's" />
+    <Word from="SHUDDERWG" to="SHUDDERING" />
+    <Word from="Shutup" to="Shut up" />
+    <Word from="SIGH$" to="SIGHS" />
+    <Word from="signifcance" to="significance" />
+    <Word from="Sincc" to="Since" />
+    <Word from="sistervvill" to="sister will" />
+    <Word from="Skarsgérd" to="Skarsgård" />
+    <Word from="slcsHs" to="SIGHS" />
+    <Word from="slGHINcs" to="SIGHING" />
+    <Word from="slGHING" to="SIGHING" />
+    <Word from="slNGING" to="SINGING" />
+    <Word from="slzzLING" to="SIZZLING" />
+    <Word from="smarfest" to="smartest" />
+    <Word from="Smiih" to="Smith" />
+    <Word from="so/id" to="solid" />
+    <Word from="SoBl3lNG" to="SOBBING" />
+    <Word from="soemtimes" to="sometimes" />
+    <Word from="Sojust" to="So just" />
+    <Word from="soldierl" to="soldier!" />
+    <Word from="somethlng" to="something" />
+    <Word from="somethlng's" to="something's" />
+    <Word from="somez'/7/ng" to="something" />
+    <Word from="somthing" to="something" />
+    <Word from="sumthing" to="something" />
+    <Word from="sou/" to="soul" />
+    <Word from="SoundofMusic" to="Sound of Music" />
+    <Word from="SP/ash" to="Splash" />
+    <Word from="SPEAK/NG" to="SPEAKING" />
+    <Word from="speII" to="spell" />
+    <Word from="speII's" to="spell's" />
+    <Word from="Spendourtime" to="Spend our time" />
+    <Word from="sQUA\/\/KING" to="SQUAWKING" />
+    <Word from="StAnton" to="St Anton" />
+    <Word from="stealsjeans" to="steals jeans" />
+    <Word from="StilI" to="Still" />
+    <Word from="Stilldesperatelyseeking" to="Still desperately seeking" />
+    <Word from="stlll" to="still" />
+    <Word from="sToPs" to="STOPS" />
+    <Word from="storyl" to="story!" />
+    <Word from="Stubbom" to="Stubborn" />
+    <Word from="su/faces" to="surfaces" />
+    <Word from="suffocaiing" to="suffocating" />
+    <Word from="summerjob" to="summer job" />
+    <Word from="Summerjust" to="Summer just" />
+    <Word from="sun/ive" to="survive" />
+    <Word from="superiorman" to="superior man" />
+    <Word from="surflaces" to="surfaces" />
+    <Word from="t/ying" to="trying" />
+    <Word from="T0" to="To" />
+    <Word from="T00" to="Too" />
+    <Word from="ta/ks" to="talks" />
+    <Word from="taiked" to="talked" />
+    <Word from="talkto" to="talk to" />
+    <Word from="Talkto" to="Talk to" />
+    <Word from="talktonight" to="talk tonight" />
+    <Word from="tampax" to="Tampax" />
+    <Word from="tc" to="to" />
+    <Word from="tcday" to="today" />
+    <Word from="tcrturing" to="torturing" />
+    <Word from="tcuch" to="touch" />
+    <Word from="te//" to="tell" />
+    <Word from="tearjust" to="tear just" />
+    <Word from="tellsjokes" to="tells jokes" />
+    <Word from="tellyou" to="tell you" />
+    <Word from="terriers_" to="terriers." />
+    <Word from="th/nk" to="think" />
+    <Word from="THEPASSION" to="THE PASSION" />
+    <Word from="thafs" to="that's" />
+    <Word from="Thafs" to="That's" />
+    <Word from="Thai's" to="That's" />
+    <Word from="Thal's" to="That's" />
+    <Word from="thankyou" to="thank you" />
+    <Word from="Thankyou" to="Thank you" />
+    <Word from="thatconverts" to="that converts" />
+    <Word from="thatgoes" to="that goes" />
+    <Word from="that'II" to="that'll" />
+    <Word from="That'II" to="That'll" />
+    <Word from="thatjob" to="that job" />
+    <Word from="thatjunk" to="that junk" />
+    <Word from="thatjust" to="that just" />
+    <Word from="thatleads" to="that leads" />
+    <Word from="Thatl'm" to="That I'm" />
+    <Word from="that's just" to="that's just" />
+    <Word from="Thatsand" to="That sand" />
+    <Word from="that'sjust" to="that's just" />
+    <Word from="That'sjust" to="That's just" />
+    <Word from="Thc" to="The" />
+    <Word from="theirface" to="their face" />
+    <Word from="theirfeet" to="their feet" />
+    <Word from="theirfury" to="their fury" />
+    <Word from="thejaw" to="the jaw" />
+    <Word from="thejoint" to="the joint" />
+    <Word from="thejudge" to="the judge" />
+    <Word from="thejudges" to="the judges" />
+    <Word from="Thejudges" to="The judges" />
+    <Word from="thejury" to="the jury" />
+    <Word from="Thelook" to="The look" />
+    <Word from="Therds" to="There's" />
+    <Word from="There'II" to="There'll" />
+    <Word from="There'Il" to="There'll" />
+    <Word from="There'lI" to="There'll" />
+    <Word from="They'/'e" to="They're" />
+    <Word from="they/'II" to="they'll" />
+    <Word from="They/re" to="They're" />
+    <Word from="They/'re" to="They're" />
+    <Word from="they'II" to="they'll" />
+    <Word from="they'Il" to="they'll" />
+    <Word from="theyjust" to="they just" />
+    <Word from="Theyjust" to="They just" />
+    <Word from="they'lI" to="they'll" />
+    <Word from="They'lI" to="They'll" />
+    <Word from="theyre" to="they're" />
+    <Word from="theysay" to="they say" />
+    <Word from="thinkthat" to="think that" />
+    <Word from="this'II" to="this'll" />
+    <Word from="thlngs" to="things" />
+    <Word from="Thlnkthls" to="Think this" />
+    <Word from="thls" to="this" />
+    <Word from="thore's" to="there's" />
+    <Word from="Thore's" to="There's" />
+    <Word from="Thorjust" to="Thor just" />
+    <Word from="thoughtl'dletyou" to="thought I'd let you" />
+    <Word from="tnatjust" to="that just" />
+    <Word from="tnat's" to="that's" />
+    <Word from="Tnat's" to="That's" />
+    <Word from="Tnere'll" to="There'll" />
+    <Word from="to//et" to="toilet" />
+    <Word from="To//S" to="Tolls" />
+    <Word from="todayl'd" to="today I'd" />
+    <Word from="togelher" to="together" />
+    <Word from="togethen" to="together" />
+    <Word from="tojoin" to="to join" />
+    <Word from="tojudge" to="to judge" />
+    <Word from="toldyou" to="told you" />
+    <Word from="tomorrovv" to="tomorrow" />
+    <Word from="Tonighfsjust" to="Tonight's just" />
+    <Word from="totake" to="to take" />
+    <Word from="totalk" to="to talk" />
+    <Word from="tothat" to="to that" />
+    <Word from="tothe" to="to the" />
+    <Word from="Towef" to="Tower" />
+    <Word from="Tr/ck/ing" to="Trickling" />
+    <Word from="Traitur" to="Traitor" />
+    <Word from="tv\/o" to="two" />
+    <Word from="tvvelve" to="twelve" />
+    <Word from="Tvvelve" to="Twelve" />
+    <Word from="tvventy" to="tvventy" />
+    <Word from="Tvventy" to="Tvventy" />
+    <Word from="tvvo" to="two" />
+    <Word from="Tvvo" to="Two" />
+    <Word from="twc" to="two" />
+    <Word from="unconhrmed" to="unconfirmed" />
+    <Word from="underthat" to="under that" />
+    <Word from="underthe" to="under the" />
+    <Word from="underthese" to="under these" />
+    <Word from="underyour" to="under your" />
+    <Word from="unfilyou" to="until you" />
+    <Word from="Unfon'unate/y" to="Unfortunately" />
+    <Word from="Uninnabited" to="Uninhabited" />
+    <Word from="untilApril" to="until April" />
+    <Word from="untilyou" to="until you" />
+    <Word from="upthinking" to="up thinking" />
+    <Word from="upto" to="up to" />
+    <Word from="V\/ait___" to="Wait..." />
+    <Word from="v\/as" to="was" />
+    <Word from="V\/as" to="Was" />
+    <Word from="V\/e" to="We" />
+    <Word from="v\/eek's" to="week's" />
+    <Word from="V\/eird_" to="Weird." />
+    <Word from="V\/ell" to="Well" />
+    <Word from="V\/hat" to="what" />
+    <Word from="V\/hen'll" to="When'll" />
+    <Word from="V\/ho" to="Who" />
+    <Word from="v\/ho'll" to="who'll" />
+    <Word from="v\/Hoops" to="Whoops" />
+    <Word from="v\/ho's" to="who's" />
+    <Word from="V\/ho's" to="Who's" />
+    <Word from="V\/hy" to="Why" />
+    <Word from="v\/ith" to="with" />
+    <Word from="v\/on't" to="won't" />
+    <Word from="V\fith" to="With" />
+    <Word from="V\fithin" to="Within" />
+    <Word from="valedictolian" to="valedictorian" />
+    <Word from="vcice" to="voice" />
+    <Word from="ve/y" to="very" />
+    <Word from="veiy" to="very" />
+    <Word from="VĂ©ry" to="Very" />
+    <Word from="versioin" to="version" />
+    <Word from="vi/ay" to="way" />
+    <Word from="visitjails" to="visit jails" />
+    <Word from="Viva/di's" to="Vivaldi's" />
+    <Word from="vlll" to="vill" />
+    <Word from="Voilá" to="Voilà" />
+    <Word from="Voilé" to="Voilà" />
+    <Word from="vvasjust" to="was just" />
+    <Word from="VVasn't" to="Wasn't" />
+    <Word from="vvay" to="way" />
+    <Word from="VVe" to="We" />
+    <Word from="VVe'II" to="We'll" />
+    <Word from="VVe'll" to="We'll" />
+    <Word from="Vvelooked" to="We looked" />
+    <Word from="VVe're" to="We're" />
+    <Word from="VVe've" to="We've" />
+    <Word from="VVhat" to="What" />
+    <Word from="VVhat's" to="What's" />
+    <Word from="VVhat'S" to="What's" />
+    <Word from="VVhen" to="When" />
+    <Word from="'v'Vhere's" to="Where's" />
+    <Word from="VVhip" to="Whip" />
+    <Word from="vvHooPING" to="WHOOPING" />
+    <Word from="VvHooPING" to="WHOOPING" />
+    <Word from="VVhy" to="Why" />
+    <Word from="VVill" to="Will" />
+    <Word from="VVinters" to="Winters" />
+    <Word from="vvlND" to="WIND" />
+    <Word from="w¤n't" to="won't" />
+    <Word from="W9" to="We" />
+    <Word from="waht" to="want" />
+    <Word from="waierfall" to="waterfall" />
+    <Word from="walkjust" to="walk just" />
+    <Word from="wallplant" to="wall plant" />
+    <Word from="wannajump" to="wanna jump" />
+    <Word from="wantyou" to="want you" />
+    <Word from="Warcontinues" to="War continues" />
+    <Word from="wasjennifer" to="was Jennifer" />
+    <Word from="wasjust" to="was just" />
+    <Word from="wasrt" to="wasn't" />
+    <Word from="Wasrt" to="Wasn't" />
+    <Word from="wayl" to="way I" />
+    <Word from="wayround" to="way round" />
+    <Word from="wclf" to="wolf" />
+    <Word from="wcman" to="woman" />
+    <Word from="wcmen" to="women" />
+    <Word from="wcn't" to="won't" />
+    <Word from="wcrse" to="worse" />
+    <Word from="wculd" to="would" />
+    <Word from="We//" to="Well" />
+    <Word from="We/came" to="Welcome" />
+    <Word from="we/come" to="welcome" />
+    <Word from="We/come" to="Welcome" />
+    <Word from="We/I" to="Well" />
+    <Word from="weekendjust" to="weekend just" />
+    <Word from="werert" to="weren't" />
+    <Word from="Werert" to="Weren't" />
+    <Word from="we'II" to="we'll" />
+    <Word from="We'II" to="We'll" />
+    <Word from="we'Il" to="we'll" />
+    <Word from="We'Il" to="We'll" />
+    <Word from="wejust" to="we just" />
+    <Word from="we'lI" to="we'll" />
+    <Word from="We'rejust" to="We're just" />
+    <Word from="We'ro" to="We're" />
+    <Word from="We'Ve" to="We've" />
+    <Word from="wh/p" to="whip" />
+    <Word from="Wh°ops" to="Whoops" />
+    <Word from="Whafs" to="What's" />
+    <Word from="Whatam" to="What am" />
+    <Word from="Whatare" to="What are" />
+    <Word from="Whateverwe" to="Whatever we" />
+    <Word from="What'II" to="What'll" />
+    <Word from="Whatis" to="What is" />
+    <Word from="whatjust" to="what just" />
+    <Word from="Whatl" to="What I" />
+    <Word from="whatshe" to="what she" />
+    <Word from="whatwe" to="what we" />
+    <Word from="Whc's" to="Who's" />
+    <Word from="Whcse" to="Whose" />
+    <Word from="wHlsPERs" to="WHISPERS" />
+    <Word from="wi//" to="will" />
+    <Word from="wil/" to="will" />
+    <Word from="Wil/" to="Will" />
+    <Word from="wilI" to="will" />
+    <Word from="willbe" to="will be" />
+    <Word from="willhire" to="will hire" />
+    <Word from="willneverknow" to="will never know" />
+    <Word from="willyou" to="will you" />
+    <Word from="wlfe" to="wife" />
+    <Word from="wlfe's" to="wife's" />
+    <Word from="wlth" to="with" />
+    <Word from="wnat's" to="what's" />
+    <Word from="Wno" to="Who" />
+    <Word from="Wo/f" to="Wolf" />
+    <Word from="wofld" to="world" />
+    <Word from="WOI'1't" to="won't" />
+    <Word from="wondernobody" to="wonder nobody" />
+    <Word from="won'T" to="won't" />
+    <Word from="won'tanswerme" to="won't answer me" />
+    <Word from="won'tforget" to="won't forget" />
+    <Word from="won'tletitbring" to="won't let it bring" />
+    <Word from="Wo're" to="We're" />
+    <Word from="worfd" to="world" />
+    <Word from="won'th" to="worth" />
+    <Word from="won'thwhile" to="worthwhile" />
+    <Word from="workyou" to="work you" />
+    <Word from="wouIdn't" to="wouldn't" />
+    <Word from="wouldn'!" to="wouldn't" />
+    <Word from="Wouldrt" to="Wouldn't" />
+    <Word from="wr/'2'/ng" to="writing" />
+    <Word from="writign" to="writing" />
+    <Word from="wrcng" to="wrong" />
+    <Word from="wuuld" to="would" />
+    <Word from="_Yay" to="Yay" />
+    <Word from="Y¤u'II" to="You'll" />
+    <Word from="Y¤u'll" to="You'll" />
+    <Word from="y¤u're" to="you're" />
+    <Word from="Y¤u're" to="You're" />
+    <Word from="y¤u've" to="you've" />
+    <Word from="Y0" to="Yo" />
+    <Word from="y0LI" to="you" />
+    <Word from="y0u'II" to="you'll" />
+    <Word from="Y0u'rc" to="You're" />
+    <Word from="Y0u're" to="You're" />
+    <Word from="Y0u've" to="You've" />
+    <Word from="yaming" to="yarning" />
+    <Word from="yaurparents" to="your parents" />
+    <Word from="ycu" to="you" />
+    <Word from="ycu'd" to="you'd" />
+    <Word from="ycur" to="your" />
+    <Word from="Ycu're" to="You're" />
+    <Word from="Ycursins" to="Your sins" />
+    <Word from="YEI_I_" to="YELL" />
+    <Word from="YELL$" to="YELLS" />
+    <Word from="yigg/mg" to="giggling" />
+    <Word from="Yigg/mg" to="giggling" />
+    <Word from="yoLI" to="you" />
+    <Word from="yOu" to="you" />
+    <Word from="yOU" to="you" />
+    <Word from="you`re" to="you're" />
+    <Word from="you'II" to="you'll" />
+    <Word from="You'II" to="You'll" />
+    <Word from="You'Il" to="You'll" />
+    <Word from="youjack" to="you jack" />
+    <Word from="youjoin" to="you join" />
+    <Word from="Youjoin" to="You join" />
+    <Word from="youjust" to="you just" />
+    <Word from="You'lI" to="You'll" />
+    <Word from="youngsterlike" to="youngster like" />
+    <Word from="youpick" to="you pick" />
+    <Word from="you'ra" to="you're" />
+    <Word from="Yourattention" to="Your attention" />
+    <Word from="yourautomobile" to="your automobile" />
+    <Word from="You'rejustjealous" to="You're just jealous" />
+    <Word from="yourextra" to="your extra" />
+    <Word from="yourfather" to="your father" />
+    <Word from="yourhand" to="your hand" />
+    <Word from="yourhusband" to="your husband" />
+    <Word from="yourjewelry" to="your jewelry" />
+    <Word from="yourjob" to="your job" />
+    <Word from="Yourjob" to="Your job" />
+    <Word from="yourjob_" to="your job." />
+    <Word from="yourjockey" to="your jockey" />
+    <Word from="yourjury" to="your jury" />
+    <Word from="yourname" to="your name" />
+    <Word from="Yourpackage" to="Your package" />
+    <Word from="yourpackage" to="your package" />
+    <Word from="you'ro" to="you're" />
+    <Word from="yourpoorleg" to="your poor leg" />
+    <Word from="yourvveak" to="your weak" />
+    <Word from="you'va" to="you've" />
+    <Word from="You'va" to="You've" />
+    <Word from="youWlneversee" to="you'll never see" />
+    <Word from="yQu" to="you" />
+    <Word from="YQu" to="You" />
+    <Word from="yQu'_7" to="you?" />
+    <Word from="yummY" to="yummy" />
+    <Word from="yuu" to="you" />
+    <Word from="Yuu" to="You" />
+    <Word from="Yuu've" to="You've" />
+    <Word from="z'housand" to="thousand" />
+    <Word from="zlPPING" to="ZIPPING" />
+    <Word from="Ifslocked" to="It's locked" />
+    <Word from="nightjust" to="night just" />
+    <Word from="dayjourney" to="day journey" />
+    <Word from="Ourjob" to="Our job" />
+    <Word from="IunCh" to="lunch" />
+    <Word from="nieCe" to="niece" />
+    <Word from="giVes" to="gives" />
+    <Word from="wantto" to="want to" />
+    <Word from="besttoday" to="best today" />
+    <Word from="NiCe" to="Nice" />
+    <Word from="oftravelling" to="of travelling" />
+    <Word from="oftwo" to="of two" />
+    <Word from="ALl" to="ALI" />
+    <Word from="afterparty" to="after-party" />
+    <Word from="welL" to="well." />
+    <Word from="theirjob" to="their job" />
+    <Word from="lfhe's" to="If he's" />
+    <Word from="babyjesus" to="baby Jesus" />
+    <Word from="shithousejohn" to="shithouse John" />
+    <Word from="jesus" to="Jesus" />
+    <Word from="withjesus" to="with Jesus" />
+    <Word from="Gojoin" to="Go join" />
+    <Word from="Adaughter" to="A daughter" />
+    <Word from="talkwith" to="talk with" />
+    <Word from="anyjournals" to="any journals" />
+    <Word from="L'mjewish" to="I'm Jewish" />
+    <Word from="arejust" to="are just" />
+    <Word from="soundjust" to="sound just" />
+    <Word from="ifl'm" to="if I'm" />
+    <Word from="askyou" to="ask you" />
+    <Word from="ordinarywoman" to="ordinary woman" />
+    <Word from="andjunkies" to="and junkies" />
+    <Word from="isjack" to="is Jack" />
+    <Word from="helpyou" to="help you" />
+    <Word from="thinkyou" to="think you" />
+    <Word from="Lordjesus" to="Lord Jesus" />
+    <Word from="injuvy" to="in juvy" />
+    <Word from="thejets" to="the jets" />
+    <Word from="ifGod" to="if God" />
+    <Word from="againstjewish" to="against Jewish" />
+    <Word from="ajunkie" to="a junkie" />
+    <Word from="dearjesus" to="dear Jesus" />
+    <Word from="hearyour" to="hear your" />
+    <Word from="takeyears" to="take years" />
+    <Word from="friendjean" to="friend Jean" />
+    <Word from="Fatherjohn" to="Father John" />
+    <Word from="youjean" to="you Jean" />
+    <Word from="hearyou" to="hear you" />
+    <Word from="Ifshe" to="If she" />
+    <Word from="didn'tjust" to="didn't just" />
+    <Word from="IfGod" to="If God" />
+    <Word from="notjudge" to="not judge" />
+    <Word from="andjudge" to="and judge" />
+    <Word from="OKBY" to="Okay" />
+    <Word from="myjourney" to="my journey" />
+    <Word from="yourpremium" to="your premium" />
+    <Word from="we'rejust" to="we're just" />
+    <Word from="Iittlejokes" to="little jokes" />
+    <Word from="Iifejust" to="life just" />
+    <Word from="Andjust" to="And just" />
+    <Word from="ofThe" to="of The" />
+    <Word from="lifejust" to="life just" />
+    <Word from="AIice" to="Alice" />
+    <Word from="lnternationalAirport" to="International Airport" />
+    <Word from="yourbody" to="your body" />
+    <Word from="DollarBaby" to="Dollar Baby" />
+    <Word from="ofjonesing" to="of jonesing" />
+    <Word from="yourpanties" to="your panties" />
+    <Word from="offforme" to="off for me" />
+    <Word from="pantyparty" to="panty party" />
+    <Word from="everhit" to="ever hit" />
+    <Word from="theirhomes" to="their homes" />
+    <Word from="AirForce" to="Air Force" />
+    <Word from="yourhead" to="your head" />
+    <Word from="betterbe" to="better be" />
+    <Word from="myparty" to="my party" />
+    <Word from="disasterlockdown" to="disaster lockdown" />
+    <Word from="Ifpot's" to="If pot's" />
+    <Word from="ifmy" to="if my" />
+    <Word from="yourmoney" to="your money" />
+    <Word from="Potterfan" to="Potter fan" />
+    <Word from="Hermionejust" to="Hermione just" />
+    <Word from="ofourshit" to="of our shit" />
+    <Word from="showyou" to="show you" />
+    <Word from="answernow" to="answer now" />
+    <Word from="theirsjust" to="theirs just" />
+    <Word from="BIackie" to="Blackie" />
+    <Word from="SIeep" to="Sleep" />
+    <Word from="foryour" to="for your" />
+    <Word from="oryour" to="or your" />
+    <Word from="forArthur" to="for Arthur" />
+    <Word from="CIamp" to="Clamp" />
+    <Word from="CIass" to="Class" />
+    <Word from="CIose" to="Close" />
+    <Word from="GIove" to="Glove" />
+    <Word from="EIIen" to="Ellen" />
+    <Word from="PIay" to="Play" />
+    <Word from="PIace" to="Place" />
+    <Word from="EIgyn" to="Elgyn" />
+    <Word from="AIert" to="Alert" />
+    <Word from="CIaus" to="Claus" />
+    <Word from="CIimb" to="Climb" />
+    <Word from="military'II" to="military'll" />
+    <Word from="anylonget" to="any longer" />
+    <Word from="yourlife" to="your life" />
+    <Word from="Yourbitch'IIgetyou" to="Your bitch'll get you" />
+    <Word from="yourdick" to="your dick" />
+    <Word from="Tellyourbitch" to="Tell your bitch" />
+    <Word from="rememberyou" to="remember you" />
+    <Word from="newface" to="new face" />
+    <Word from="Butyou" to="But you" />
+    <Word from="don'tyou" to="don't you" />
+    <Word from="yourlives" to="your lives" />
+    <Word from="Iovedher" to="loved her" />
+    <Word from="reallydid" to="really did" />
+    <Word from="firstperson" to="first person" />
+    <Word from="mybest" to="my best" />
+    <Word from="Justgive" to="Just give" />
+    <Word from="AIong" to="Along" />
+    <Word from="atyourbody" to="at your body" />
+    <Word from="myhands" to="my hands" />
+    <Word from="sayhe" to="say he" />
+    <Word from="mybooty" to="my booty" />
+    <Word from="yourbooty" to="your booty" />
+    <Word from="yourgirl" to="your girl" />
+    <Word from="yourlegs" to="your legs" />
+    <Word from="betterifthey" to="better if they" />
+    <Word from="manybeautiful" to="many beautiful" />
+    <Word from="contactpolice" to="contact police" />
+    <Word from="numberbelow" to="number below" />
+    <Word from="biggestproblem" to="biggest problem" />
+    <Word from="Itgave" to="It gave" />
+    <Word from="everybodykind" to="everybody kind" />
+    <Word from="theyhad" to="they had" />
+    <Word from="knowherlast" to="know her last" />
+    <Word from="herhearing" to="her hearing" />
+    <Word from="othermembers" to="other members" />
+    <Word from="BIing" to="Bling" />
+    <Word from="CIyde" to="Clyde" />
+    <Word from="foundguilty" to="found guilty" />
+    <Word from="fouryears" to="four years" />
+    <Word from="countyjail" to="county jail" />
+    <Word from="yearin" to="year in" />
+    <Word from="theirrole" to="their role" />
+    <Word from="manybottles" to="many bottles" />
+    <Word from="can'tpronounce" to="can't pronounce" />
+    <Word from="manybowls" to="many bowls" />
+    <Word from="ofthatgreen" to="of that green" />
+    <Word from="manyjoyrides" to="many joyrides" />
+    <Word from="Superrich" to="Super rich" />
+    <Word from="Iprefer" to="I prefer" />
+    <Word from="Theymust" to="They must" />
+    <Word from="whatyou" to="what you" />
+    <Word from="I'IIjump" to="I'll jump" />
+    <Word from="nobodyknow" to="nobody know" />
+    <Word from="neverknew" to="never knew" />
+    <Word from="EIectronica" to="Electronica" />
+    <Word from="AIarm" to="Alarm" />
+    <Word from="getyourman" to="get your man" />
+    <Word from="sayyou" to="say you" />
+    <Word from="getyour" to="get your" />
+    <Word from="Fuckyou" to="Fuck you" />
+    <Word from="Whyyou" to="Why you" />
+    <Word from="butyoujust" to="but you just" />
+    <Word from="forgetyourname" to="forget your name" />
+    <Word from="Whatyou" to="What you" />
+    <Word from="Co/'ncidenta//y" to="Coincidentally" />
+    <Word from="GIad" to="Glad" />
+    <Word from="RachelMarron" to="Rachel Marron" />
+    <Word from="She'llgive" to="She'll give" />
+    <Word from="presidentialsuite" to="presidential suite" />
+    <Word from="andgentlemen" to="and gentlemen" />
+    <Word from="willnot" to="will not" />
+    <Word from="ourproducers" to="our producers" />
+    <Word from="Ifshe's" to="If she's" />
+    <Word from="CIock" to="Clock" />
+    <Word from="Ishould" to="I should" />
+    <Word from="I'llgo" to="I'll go" />
+    <Word from="maypass" to="may pass" />
+    <Word from="andprotecting" to="and protecting" />
+    <Word from="BIessed" to="Blessed" />
+    <Word from="CIean" to="Clean" />
+    <Word from="SIave" to="Slave" />
+    <Word from="AIi" to="Ali" />
+    <Word from="AIIah" to="Allah" />
+    <Word from="AIIahu" to="Allahu" />
+    <Word from="CIick" to="Click" />
+    <Word from="BIast" to="Blast" />
+    <Word from="AIlah" to="Allah" />
+    <Word from="SIow" to="Slow" />
+    <Word from="theirpolicies" to="their policies" />
+    <Word from="Orperhaps" to="Or perhaps" />
+    <Word from="ofsex" to="of sex" />
+    <Word from="forpleasure" to="for pleasure" />
+    <Word from="ourpower" to="our power" />
+    <Word from="Yourpiece" to="Your piece" />
+    <Word from="Offioers" to="Officers" />
+    <Word from="oondesoended" to="condescended" />
+    <Word from="myseif" to="myself" />
+    <Word from="let'sjust" to="let’s just" />
+    <Word from="yourway" to="your way" />
+    <Word from="An9TY" to="Angry" />
+    <Word from="ourjourney" to="our journey" />
+    <Word from="LuCY" to="Lucy" />
+    <Word from="\'m" to="I’m" />
+    <Word from="CEDR/C" to="CEDRIC" />
+    <Word from="lsaac" to="Isaac" />
+    <Word from="FIy" to="Fly" />
+    <Word from="Ionger" to="longer" />
+    <Word from="Iousy" to="lousy" />
+    <Word from="Iosing" to="losing" />
+    <Word from="They'II" to="They'll" />
+    <Word from="yourpaws" to="your paws" />
+    <Word from="littie" to="little" />
+    <Word from="It'lljust" to="It'll just" />
+    <Word from="AIso" to="Also" />
+    <Word from="Iisten" to="listen" />
+    <Word from="suPPosed" to="supposed" />
+    <Word from="somePIace" to="someplace" />
+    <Word from="exPIain" to="explain" />
+    <Word from="Iittle" to="little" />
+    <Word from="StoP" to="Stop" />
+    <Word from="AIways" to="Always" />
+    <Word from="Iectures" to="lectures" />
+    <Word from="Iow" to="low" />
+    <Word from="Ieaving" to="leaving" />
+    <Word from="Ietting" to="letting" />
+    <Word from="Iistening" to="listening" />
+    <Word from="Iecture" to="lecture" />
+    <Word from="Iicking" to="licking" />
+    <Word from="Iosses" to="losses" />
+    <Word from="PIeased" to="Pleased" />
+    <Word from="ofburglaries" to="of burglaries" />
+    <Word from="He'sjust" to="He's just" />
+    <Word from="mytrucktoo" to="my truck too" />
+    <Word from="nowwhat" to="now what" />
+    <Word from="yourfire" to="your fire" />
+    <Word from="herwhat's" to="her what's" />
+    <Word from="hearthat" to="hear that" />
+    <Word from="oryou" to="or you" />
+    <Word from="preferjournalist" to="prefer journalist" />
+    <Word from="CIaw" to="Claw" />
+    <Word from="Ifour" to="If our" />
+    <Word from="lron" to="Iron" />
+    <Word from="It'syour" to="It's your" />
+    <Word from="lfstill" to="If still" />
+    <Word from="forjoining" to="for joining" />
+    <Word from="foryears" to="for years" />
+    <Word from="Ifit" to="If it" />
+    <Word from="notjump" to="not jump" />
+    <Word from="ourproblem" to="our problem" />
+    <Word from="yourprofile" to="your profile" />
+    <Word from="ifJanine" to="if Janine" />
+    <Word from="forpreventative" to="for preventative" />
+    <Word from="whetherprotest" to="whether protest" />
+    <Word from="Ifnot" to="If not" />
+    <Word from="ourpeople" to="our people" />
+    <Word from="offmy" to="off my" />
+    <Word from="forproviding" to="for providing" />
+    <Word from="hadjust" to="had just" />
+    <Word from="nearyou" to="near you" />
+    <Word from="whateveryou" to="whatever you" />
+    <Word from="hourputs" to="hour puts" />
+    <Word from="timejob" to="time job" />
+    <Word from="overyour" to="over your" />
+    <Word from="orpermanent" to="or permanent" />
+    <Word from="createjobs" to="create jobs" />
+    <Word from="I'vejust" to="I've just" />
+    <Word from="peoplejobs" to="people jobs" />
+    <Word from="dinnerpail" to="dinner pail" />
+    <Word from="hasjumped" to="has jumped" />
+    <Word from="theirprivacy" to="their privacy" />
+    <Word from="AIl" to="All" />
+    <Word from="ofserious" to="of serious" />
+    <Word from="yourprofessional" to="your professional" />
+    <Word from="poiitical" to="political" />
+    <Word from="tojump" to="to jump" />
+    <Word from="iives" to="lives" />
+    <Word from="eiections" to="elections" />
+    <Word from="militaryjuntas" to="military juntas" />
+    <Word from="nojoke" to="no joke" />
+    <Word from="yourpresidency" to="your presidency" />
+    <Word from="ofmilitaryjuntas" to="of military juntas" />
+    <Word from="Ourproposal" to="Our proposal" />
+    <Word from="LeBIanc" to="LeBlanc" />
+    <Word from="KIaus" to="Klaus" />
+    <Word from="yourpussy" to="your pussy" />
+    <Word from="lNTERVIEWER" to="INTERVIEWER" />
+    <Word from="lNAUDIBLE" to="INAUDIBLE" />
+    <Word from="SImpsons" to="Simpsons" />
+    <Word from="anotherjob" to="another job" />
+    <Word from="lfthere" to="If there" />
+    <Word from="descentinto" to="descent into" />
+    <Word from="ofthathere" to="of that here" />
+    <Word from="ofway" to="of way" />
+    <Word from="yourseat" to="your seat" />
+    <Word from="allyou" to="all you" />
+    <Word from="Allyou" to="All you" />
+    <Word from="yourass" to="your ass" />
+    <Word from="Yourbutt" to="Your butt" />
+    <Word from="iustiiggle" to="just jiggle" />
+    <Word from="iust" to="just" />
+    <Word from="CSi" to="CSI" />
+    <Word from="affernoon" to="afternoon" />
+    <Word from="orpersecution" to="or persecution" />
+    <Word from="theirpetty" to="their petty" />
+    <Word from="Fourpercent" to="Four percent" />
+    <Word from="fourpercent" to="four percent" />
+    <Word from="willjust" to="will just" />
+    <Word from="Ifyou're" to="If you're" />
+    <Word from="ourplanet" to="our planet" />
+    <Word from="lsolation" to="Isolation" />
+    <Word from="yourprimitive" to="your primitive" />
+    <Word from="yourplanet" to="your planet" />
+    <Word from="matteryour" to="matter your" />
+    <Word from="Yourplace" to="Your place" />
+    <Word from="andjustice" to="and justice" />
+    <Word from="anotherpart" to="another part" />
+    <Word from="confiict" to="conflict" />
+    <Word from="growingjeopardy" to="growing jeopardy" />
+    <Word from="hasjust" to="has just" />
+    <Word from="havejust" to="have just" />
+    <Word from="herselfinto" to="herself into" />
+    <Word from="ifnecessary" to="if necessary" />
+    <Word from="we'vejust" to="we've just" />
+    <Word from="tojust" to="to just" />
+    <Word from="yourjudgment" to="your judgment" />
+    <Word from="yourjeans" to="your jeans" />
+    <Word from="Youjust" to="You just" />
+    <Word from="ajanitor" to="a janitor" />
+    <Word from="FIattery" to="Flattery" />
+    <Word from="myjournal" to="my journal" />
+    <Word from="myjudgment" to="my judgment" />
+    <Word from="offofmy" to="off of my" />
+    <Word from="offyour" to="off your" />
+    <Word from="ofgood" to="of good" />
+    <Word from="ofguilty" to="of guilty" />
+    <Word from="ofhaving" to="of having" />
+    <Word from="ofheart" to="of heart" />
+    <Word from="ofhonor" to="of honor" />
+    <Word from="oflove" to="of love" />
+    <Word from="ofmankind" to="of mankind" />
+    <Word from="ofmany" to="of many" />
+    <Word from="ofnormal" to="of normal" />
+    <Word from="ofpeople" to="of people" />
+    <Word from="ofpower" to="of power" />
+    <Word from="ofsuch" to="of such" />
+    <Word from="peoplejust" to="people just" />
+    <Word from="They'rejust" to="They're just" />
+    <Word from="tojeopardize" to="to jeopardize" />
+    <Word from="Yourplaces" to="Your places" />
+    <Word from="yourposition" to="your position" />
+    <Word from="yourselfa" to="yourself a" />
+    <Word from="yourselfright" to="yourself right" />
+    <Word from="thejob" to="the job" />
+    <Word from="thejanitors" to="the janitors" />
+    <Word from="alljust" to="all just" />
+    <Word from="forAmerica's" to="for America's" />
+    <Word from="Forpencils" to="For pencils" />
+    <Word from="forpondering" to="for pondering" />
+    <Word from="handwrittenjournals" to="handwritten journals" />
+    <Word from="herpursuit" to="her pursuit" />
+    <Word from="ofjust" to="of just" />
+    <Word from="oflanding" to="of landing" />
+    <Word from="oflife" to="of life" />
+    <Word from="outjust" to="out just" />
+    <Word from="Thejoke" to="The joke" />
+    <Word from="ourpatient" to="our patient" />
+    <Word from="oryou're" to="or you're" />
+    <Word from="ofyourself" to="of yourself" />
+    <Word from="poweryour" to="power your" />
+    <Word from="Ofmy" to="Of my" />
+    <Word from="EIlen" to="Ellen" />
+    <Word from="Don'tget" to="Don't get" />
+    <Word from="tellme" to="tell me" />
+    <Word from="ofdecision" to="of decision" />
+    <Word from="itgoing" to="it going" />
+    <Word from="artificialgravity" to="artificial gravity" />
+    <Word from="shouldknow" to="should know" />
+    <Word from="Hasn'tgot" to="Hasn't got" />
+    <Word from="thirdjunction" to="third junction" />
+    <Word from="somebodypicks" to="somebody picks" />
+    <Word from="Willyou" to="Will you" />
+    <Word from="can'tget" to="can't get" />
+    <Word from="BuZZes" to="Buzzes" />
+    <Word from="wouldn'tyou" to="wouldn't you" />
+    <Word from="Wellbelow" to="Well below" />
+    <Word from="What'dyou" to="What'd you" />
+    <Word from="decipheredpart" to="deciphered part" />
+    <Word from="they'llknow" to="they'll know" />
+    <Word from="ifit's" to="if it's" />
+    <Word from="ornot" to="or not" />
+    <Word from="myposition" to="my position" />
+    <Word from="lndistinct" to="Indistinct" />
+    <Word from="anybiscuits" to="any biscuits" />
+    <Word from="Andifyou" to="And if you" />
+    <Word from="lfwe" to="If we" />
+    <Word from="yourarm" to="your arm" />
+    <Word from="lnteresting" to="Interesting" />
+    <Word from="findit" to="find it" />
+    <Word from="it'llstart" to="it'll start" />
+    <Word from="holdit" to="hold it" />
+    <Word from="ofkilling" to="of killing" />
+    <Word from="Howyou" to="How you" />
+    <Word from="lnhales" to="Inhales" />
+    <Word from="lgot" to="I got" />
+    <Word from="CIip" to="Clip" />
+    <Word from="what'II" to="what'll" />
+    <Word from="road'II" to="road'll" />
+    <Word from="girI" to="girl" />
+    <Word from="LIoyd" to="Lloyd" />
+    <Word from="BIake" to="Blake" />
+    <Word from="reaI" to="real" />
+    <Word from="Foryour" to="For your" />
+    <Word from="yourpublic" to="your public" />
+  </WholeWords>
+  <PartialWordsAlways>
+    <!-- Will be replaced always -->
+    <WordPart from="¤" to="o" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="lVl" to="M" />
+    <WordPart from="I\/I" to="M" />
+    <WordPart from="l\/I" to="M" />
+    <WordPart from="I\/l" to="M" />
+    <WordPart from="l\/l" to="M" />
+    <WordPart from="IVIa" to="Ma" />
+    <WordPart from="IVIe" to="Me" />
+    <WordPart from="IVIi" to="Mi" />
+    <WordPart from="IVIo" to="Mo" />
+    <WordPart from="IVIu" to="Mu" />
+    <WordPart from="IVIy" to="My" />
+  </PartialWordsAlways>
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary.
+          If new word(s) and longer than 5 chars and exists in spelling dictionary, it is (or they are) accepted -->
+    <WordPart from="IVI" to="M" />
+    <WordPart from="/" to="l" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="l" to="i" />
+    <WordPart from="€" to="e" />
+    <WordPart from="I" to="l" />
+    <WordPart from="c" to="o" />
+    <WordPart from="i" to="t" />
+    <WordPart from="cc" to="oo" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="ii" to="ll" />
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="c" to="e" />
+    <WordPart from="I" to="t" />
+    <WordPart from="n" to="o" />
+    <WordPart from="s" to="e" />
+    <WordPart from="l-l" to="H" />
+    <WordPart from="l_" to="L" />
+    <WordPart from="°" to="o" />
+    <WordPart from=")/" to="y" />
+    <WordPart from=")'" to="y" />
+    <WordPart from="a’" to="d" />
+  </PartialWords>
+  <PartialLines>
+    <LinePart from=" /be " to=" I be " />
+    <LinePart from=" aren '1'" to=" aren't" />
+    <LinePart from=" aren'tyou" to=" aren't you" />
+    <LinePart from=" doesn '1'" to=" doesn't" />
+    <LinePart from=" fr/eno'" to=" friend" />
+    <LinePart from=" fr/eno'." to=" friend." />
+    <LinePart from=" haven 'z' " to=" haven't " />
+    <LinePart from=" haven 'z'." to=" haven't." />
+    <LinePart from=" I ha ve " to=" I have " />
+    <LinePart from=" I']I " to=" I'll " />
+    <LinePart from=" L am" to=" I am" />
+    <LinePart from=" L can" to=" I can" />
+    <LinePart from=" L don't " to=" I don't " />
+    <LinePart from=" L hate " to=" I hate " />
+    <LinePart from=" L have " to=" I have " />
+    <LinePart from=" L like " to=" I like " />
+    <LinePart from=" L will" to=" I will" />
+    <LinePart from=" L would" to=" I would" />
+    <LinePart from=" L'll " to=" I'll " />
+    <LinePart from=" L've " to=" I've " />
+    <LinePart from=" m y family" to=" my family" />
+    <LinePart from=" 's " to="'s " />
+    <LinePart from=" shou/dn '1 " to=" shouldn't " />
+    <LinePart from=" won 'z' " to=" won't " />
+    <LinePart from=" won 'z'." to=" won't." />
+    <LinePart from=" wou/c/n 'z' " to=" wouldn't " />
+    <LinePart from=" wou/c/n 'z'." to=" wouldn't." />
+    <LinePart from=" wou/dn 'z' " to=" wouldn't " />
+    <LinePart from=" wou/dn 'z'." to=" wouldn't." />
+    <LinePart from="/ did" to="I did" />
+    <LinePart from="/ have " to="I have " />
+    <LinePart from="/ just " to="I just " />
+    <LinePart from="/ loved " to="I loved " />
+    <LinePart from="/ need" to="I need" />
+    <LinePart from="|was11" to="I was 11" />
+    <LinePart from="at Hrst" to="at first" />
+    <LinePart from="B ullshiz'" to="Bullshit" />
+    <LinePart from="big lunk" to="love you" />
+    <LinePart from="can 't" to="can't" />
+    <LinePart from="can' t " to="can't " />
+    <LinePart from="can 't " to="can't " />
+    <LinePart from="CHA TTERING" to="CHATTERING" />
+    <LinePart from="come 0n" to="come on" />
+    <LinePart from="Come 0n" to="Come on" />
+    <LinePart from="couldn 't" to="couldn't" />
+    <LinePart from="couldn' t " to="couldn't " />
+    <LinePart from="couldn 't " to="couldn't " />
+    <LinePart from="Destin y's" to="Destiny's" />
+    <LinePart from="didn 't" to="didn't" />
+    <LinePart from="didn' t " to="didn't " />
+    <LinePart from="didn 't " to="didn't " />
+    <LinePart from="Doesn '1'" to="Doesn't" />
+    <LinePart from="doesn '1' " to="doesn't " />
+    <LinePart from="doesn '1†" to="doesn't " />
+    <LinePart from="doesn 't" to="doesn't" />
+    <LinePart from="doesn'1' " to="doesn't " />
+    <LinePart from="doesn'1†" to="doesn't " />
+    <LinePart from="don '1' " to="don't " />
+    <LinePart from="don '1†" to="don't " />
+    <LinePart from="don '2' " to="don't " />
+    <LinePart from=" aren '2'" to=" aren't" />
+    <LinePart from="aren '2' " to="aren't " />
+    <LinePart from="don '2†" to="don't " />
+    <LinePart from="don 't" to="don't" />
+    <LinePart from="Don' t " to="Don't " />
+    <LinePart from="Don 't " to="Don't " />
+    <LinePart from="don'1' " to="don't " />
+    <LinePart from="don'1†" to="don't " />
+    <LinePart from="there '5 " to="there's " />
+    <LinePart from="E very" to="Every" />
+    <LinePart from="get 0n" to="get on" />
+    <LinePart from="go 0n" to="go on" />
+    <LinePart from="Go 0n" to="Go on" />
+    <LinePart from="H3993' birthday" to="Happy birthday" />
+    <LinePart from="hadn 't" to="hadn't" />
+    <LinePart from="he 's" to="he's" />
+    <LinePart from="He 's" to="He's" />
+    <LinePart from="He y" to="Hey" />
+    <LinePart from="he)/" to="hey" />
+    <LinePart from="He)/" to="Hey" />
+    <LinePart from="HEA VY" to="HEAVY" />
+    <LinePart from="Henry ll" to="Henry II" />
+    <LinePart from="Henry lll" to="Henry III" />
+    <LinePart from="Henry Vlll" to="Henry VIII" />
+    <LinePart from="Henry Vll" to="Henry VII" />
+    <LinePart from="Henry Vl" to="Henry VI" />
+    <LinePart from="Hold 0n" to="Hold on" />
+    <LinePart from="I am. ls" to="I am. Is" />
+    <LinePart from="I d0" to="I do" />
+    <LinePart from="I 'm" to="I'm" />
+    <LinePart from="I 'rn " to="I'm " />
+    <LinePart from="I 've" to="I've" />
+    <LinePart from="I0 ve her" to="love her" />
+    <LinePart from="I0 ve you" to="love you" />
+    <LinePart from="I02'" to="lot" />
+    <LinePart from="I'm sony" to="I'm sorry" />
+    <LinePart from="isn' t " to="isn't " />
+    <LinePart from="isn 't " to="isn't " />
+    <LinePart from="K)/le" to="Kyle" />
+    <LinePart from="L ook" to="Look" />
+    <LinePart from="let me 90" to="let me go" />
+    <LinePart from="Let me 90" to="Let me go" />
+    <LinePart from="let's 90" to="let's go" />
+    <LinePart from="Let's 90" to="Let's go" />
+    <LinePart from="lfl had" to="If I had" />
+    <LinePart from="lova you" to="love you" />
+    <LinePart from="Lova you" to="love you" />
+    <LinePart from="lovo you" to="love you" />
+    <LinePart from="Lovo you" to="love you" />
+    <LinePart from="ls anyone" to="Is anyone" />
+    <LinePart from="ls he" to="Is he" />
+    <LinePart from="-ls he" to="- Is he" />
+    <LinePart from="ls it" to="Is it" />
+    <LinePart from="-ls it" to="- Is it" />
+    <LinePart from="ls she" to="Is she" />
+    <LinePart from="-ls she" to="- Is she" />
+    <LinePart from="ls that" to="Is that" />
+    <LinePart from="-ls that" to="- Is that" />
+    <LinePart from="ls this" to="Is this" />
+    <LinePart from="-ls this" to="- Is this" />
+    <LinePart from="Maze] tov" to="Mazel tov" />
+    <LinePart from="N02' " to="Not " />
+    <LinePart from=" of 0ur " to=" of our " />
+    <LinePart from=" ot mine " to=" of mine " />
+    <LinePart from="PLA YING" to="PLAYING" />
+    <LinePart from="REPEA TING " to="REPEATING " />
+    <LinePart from="Sa y" to="Say" />
+    <LinePart from="she 's" to="she's" />
+    <LinePart from="She 's" to="She's" />
+    <LinePart from="shouldn 't" to="shouldn't" />
+    <LinePart from="sta y" to="stay" />
+    <LinePart from="Sta y" to="Stay" />
+    <LinePart from="SWO rd" to="Sword" />
+    <LinePart from="taka care" to="take care" />
+    <LinePart from="Taka care" to="Take care" />
+    <LinePart from="the Hrst" to="the first" />
+    <LinePart from="toc late" to="too late" />
+    <LinePart from="uf me" to="of me" />
+    <LinePart from="uf our" to="of our" />
+    <LinePart from="wa y" to="way" />
+    <LinePart from="Wal-I\/Iart" to="Wal-Mart" />
+    <LinePart from="wasn '1' " to="wasn't " />
+    <LinePart from="Wasn '1' " to="Wasn't " />
+    <LinePart from="wasn '1†" to="wasn't " />
+    <LinePart from="Wasn '1†" to="Wasn't " />
+    <LinePart from="wasn 't" to="wasn't" />
+    <LinePart from="Wasn 't" to="Wasn't" />
+    <LinePart from="we 've" to="we've" />
+    <LinePart from="We 've" to="We've" />
+    <LinePart from="wem' off" to="went off" />
+    <LinePart from="weren 't" to="weren't" />
+    <LinePart from="who 's" to="who's" />
+    <LinePart from="won 't" to="won't" />
+    <LinePart from="would ha ve" to="would have " />
+    <LinePart from="wouldn 't" to="wouldn't" />
+    <LinePart from="Wouldn 't" to="Wouldn't" />
+    <LinePart from="y()u" to="you" />
+    <LinePart from="you QUYS" to="you guys" />
+    <LinePart from="you' re " to="you're " />
+    <LinePart from="you 're " to="you're " />
+    <LinePart from="you 've" to="you've" />
+    <LinePart from="You 've" to="You've" />
+    <LinePart from="you' ve " to="you've " />
+    <LinePart from="you 've " to="you've " />
+    <LinePart from="aftera while" to="after a while" />
+    <LinePart from="Aftera while" to="After a while" />
+    <LinePart from="THUN DERCLAPS" to="THUNDERCLAPS" />
+    <LinePart from="(BUZZI N G)" to="(BUZZING)" />
+    <LinePart from="[BUZZI N G]" to="[BUZZING]" />
+    <LinePart from="(G RU NTING" to="(GRUNTING" />
+    <LinePart from="[G RU NTING" to="[GRUNTING" />
+    <LinePart from="(G ROWLING" to="(GROWLING" />
+    <LinePart from="[G ROWLING" to="[GROWLING" />
+    <LinePart from=" WAI LS)" to="WAILS)" />
+    <LinePart from=" WAI LS]" to="WAILS]" />
+    <LinePart from="(scu RRYING)" to="(SCURRYING)" />
+    <LinePart from="[scu RRYING]" to="[SCURRYING]" />
+    <LinePart from="(GRUNT5)" to="(GRUNTS)" />
+    <LinePart from="[GRUNT5]" to="[GRUNTS]" />
+    <LinePart from="NARRA TOR:" to="NARRATOR:" />
+    <LinePart from="(GROAN ING" to="(GROANING" />
+    <LinePart from="[GROAN ING" to="[GROANING" />
+    <LinePart from="GROAN ING)" to="GROANING)" />
+    <LinePart from="GROAN ING]" to="GROANING]" />
+    <LinePart from="(LAUGH ING" to="(LAUGHING" />
+    <LinePart from="[LAUGH ING" to="[LAUGHING" />
+    <LinePart from="LAUGH ING)" to="LAUGHING)" />
+    <LinePart from="LAUGH ING]" to="LAUGHING]" />
+    <LinePart from="(BU BBLING" to="(BUBBLING" />
+    <LinePart from="[BU BBLING" to="[BUBBLING" />
+    <LinePart from="BU BBLING)" to="BUBBLING)" />
+    <LinePart from="BU BBLING]" to="BUBBLING]" />
+    <LinePart from="(SH USHING" to="(SHUSHING" />
+    <LinePart from="[SH USHING" to="[SHUSHING" />
+    <LinePart from="SH USHING)" to="SHUSHING)" />
+    <LinePart from="SH USHING]" to="SHUSHING]" />
+    <LinePart from="(CH ILDREN" to="(CHILDREN" />
+    <LinePart from="[CH ILDREN" to="[CHILDREN" />
+    <LinePart from="CH ILDREN)" to="CHILDREN)" />
+    <LinePart from="CH ILDREN]" to="CHILDREN]" />
+    <LinePart from="(MURMU RING" to="(MURMURING" />
+    <LinePart from="[MURMU RING" to="[MURMURING" />
+    <LinePart from="MURMU RING)" to="MURMURING)" />
+    <LinePart from="MURMU RING]" to="MURMURING]" />
+    <LinePart from="(GU N " to="(GUN " />
+    <LinePart from="[GU N " to="[GUN " />
+    <LinePart from="GU N)" to="GUN)" />
+    <LinePart from="GU N]" to="GUN]" />
+    <LinePart from="CH ILDREN:" to="CHILDREN:" />
+    <LinePart from="STU DENTS:" to="STUDENTS:" />
+    <LinePart from="(WH ISTLE" to="(WHISTLE" />
+    <LinePart from="[WH ISTLE" to="[WHISTLE" />
+    <LinePart from="WH ISTLE)" to="WHISTLE)" />
+    <LinePart from="WH ISTLE]" to="WHISTLE]" />
+    <LinePart from="U LU LATING" to="ULULATING" />
+    <LinePart from="AU DIENCE:" to="AUDIENCE:" />
+    <LinePart from="HA WAIIAN" to="HAWAIIAN" />
+    <LinePart from="(ARTH UR" to="(ARTHUR" />
+    <LinePart from="[ARTH UR" to="[ARTHUR" />
+    <LinePart from="ARTH UR)" to="ARTHUR)" />
+    <LinePart from="ARTH UR]" to="ARTHUR]" />
+    <LinePart from="J EREMY:" to="JEREMY:" />
+    <LinePart from="(ELEVA TOR" to="(ELEVATOR" />
+    <LinePart from="[ELEVA TOR" to="[ELEVATOR" />
+    <LinePart from="ELEVA TOR)" to="ELEVATOR)" />
+    <LinePart from="ELEVA TOR]" to="ELEVATOR]" />
+    <LinePart from="CONTIN U ES" to="CONTINUES" />
+    <LinePart from="WIN D HOWLING" to="WIND HOWLING" />
+    <LinePart from="telis me" to="tells me" />
+    <LinePart from="Telis me" to="Tells me" />
+    <LinePart from=". Ls " to=". Is " />
+    <LinePart from="! Ls " to="! Is " />
+    <LinePart from="? Ls " to="? Is " />
+    <LinePart from=". Lt " to=". It " />
+    <LinePart from="! Lt " to="! It " />
+    <LinePart from="? Lt " to="? It " />
+    <LinePart from="SQMEWH ERE ELSE" to="SOMEWHERE ELSE" />
+    <LinePart from=" I,m " to=" I'm " />
+    <LinePart from=" I,ve " to=" I've " />
+    <LinePart from=" you,re " to=" you're " />
+    <LinePart from=" you,ll " to=" you'll " />
+    <LinePart from=" doesn,t " to=" doesn't " />
+    <LinePart from=" let,s " to=" let's " />
+    <LinePart from=" he,s " to=" he's " />
+    <LinePart from=" it,s " to=" it's " />
+    <LinePart from=" can,t " to=" can't " />
+    <LinePart from=" Can,t " to=" Can't " />
+    <LinePart from=" don,t " to=" don't " />
+    <LinePart from=" Don,t " to=" Don't " />
+    <LinePart from="wouldn 'tyou" to="wouldn't you" />
+    <LinePart from=" lgot it" to=" I got it" />
+    <LinePart from=" you,ve " to=" you've " />
+    <LinePart from=" I ve " to=" I've " />
+    <LinePart from=" I ii " to=" I'll " />
+    <LinePart from=" I m " to=" I'm " />
+    <LinePart from=" why d " to=" why'd " />
+    <LinePart from=" couldn t " to=" couldn't " />
+    <LinePart from=" that s " to=" that's " />
+    <LinePart from=" i... " to=" I... " />
+  </PartialLines>
+  <PartialLinesAlways>
+    <LinePart from="forbest act" to="for best act" />
+  </PartialLinesAlways>
+  <BeginLines>
+    <Beginning from="lgot it" to="I got it" />
+    <Beginning from="Don,t " to="Don't " />
+    <Beginning from="Can,t " to="Can't " />
+    <Beginning from="Let,s " to="Let's " />
+    <Beginning from="He,s " to="He's " />
+    <Beginning from="I,m " to="I'm " />
+    <Beginning from="I,ve " to="I've " />
+    <Beginning from="I,ll " to="I'll " />
+    <Beginning from="You,ll " to="You'll " />
+    <Beginning from="T hey " to="They " />
+    <Beginning from="T here " to="There " />
+    <Beginning from="W here " to="Where " />
+    <Beginning from="M aybe " to="Maybe " />
+    <Beginning from="S hould " to="Should " />
+    <Beginning from="|was" to="I was" />
+    <Beginning from="|am " to="I am" />
+    <Beginning from="No w, " to="Now, " />
+    <Beginning from="l... I " to="I... I " />
+    <Beginning from="L... I " to="I... I " />
+    <Beginning from="lrn gonna" to="I'm gonna" />
+    <Beginning from="-l don't" to="-I don't" />
+    <Beginning from="l don't" to="I don't" />
+    <Beginning from="L " to="I " />
+    <Beginning from="-L " to="-I " />
+    <Beginning from="- L " to="- I " />
+    <Beginning from="-l " to="-I " />
+    <Beginning from="- l " to="- I " />
+    <Beginning from="G0" to="Go" />
+    <Beginning from="GO get" to="Go get" />
+    <Beginning from="GO to" to="Go to" />
+    <Beginning from="GO for" to="Go for" />
+    <Beginning from="Ifl" to="If I" />
+    <Beginning from="lt'll" to="It'll" />
+    <Beginning from="Lt'll" to="It'll" />
+    <Beginning from="IVIa" to="Ma" />
+    <Beginning from="IVIu" to="Mu" />
+    <Beginning from="0ne" to="One" />
+    <Beginning from="0nly" to="Only" />
+    <Beginning from="0n " to="On " />
+    <Beginning from="lt " to="It " />
+    <Beginning from="Lt " to="It " />
+    <Beginning from="lt's " to="It's " />
+    <Beginning from="Lt's " to="It's " />
+    <Beginning from="ln " to="In " />
+    <Beginning from="Ln " to="In " />
+    <Beginning from="l-in " to="I-in " />
+    <Beginning from="l-impossible" to="I-impossible" />
+    <Beginning from="l- impossible" to="I-impossible" />
+    <Beginning from="L- impossible" to="I-impossible" />
+    <Beginning from="l-isn't " to="I-isn't " />
+    <Beginning from="L-isn't " to="I-isn't " />
+    <Beginning from="l- isn't " to="I-isn't " />
+    <Beginning from="L- isn't " to="I-isn't " />
+    <Beginning from="l- l " to="I-I " />
+    <Beginning from="L- l " to="I-I " />
+    <Beginning from="l- it " to="I-it " />
+    <Beginning from="L- it " to="I-it " />
+    <Beginning from="Ls it " to="Is it " />
+    <Beginning from="Ls there " to="Is there " />
+    <Beginning from="Ls he " to="Is he " />
+    <Beginning from="Ls she " to="Is she " />
+    <Beginning from="L can" to="I can" />
+    <Beginning from="l can" to="I can" />
+    <Beginning from="L'm " to="I'm " />
+    <Beginning from="L' m " to="I'm " />
+    <Beginning from="Lt' s " to="It's " />
+    <Beginning from="I']I " to="I'll " />
+    <Beginning from="...ls " to="...Is " />
+    <Beginning from="- ls " to="- Is " />
+    <Beginning from="...l " to="...I " />
+    <Beginning from="Ill " to="I'll " />
+    <Beginning from="L hope " to="I hope " />
+    <Beginning from="|’E'$ " to="It's " />
+    <Beginning from="The y're " to="They're " />
+    <Beginning from="&lt;i&gt;/ " to="&lt;i&gt;I " />
+    <Beginning from="/ " to="I " />
+    <Beginning from="&lt;i&gt;/n " to="&lt;i&gt;In " />
+    <Beginning from="/n " to="In " />
+    <Beginning from="&lt;i&gt;Ana’ " to="&lt;i&gt;And " />
+    <Beginning from="&lt;i&gt;Ana' " to="&lt;i&gt;And " />
+    <Beginning from="~ " to="- " />
+    <Beginning from="&lt;i&gt;A'|'|'EN BOROUGH:" to="&lt;i&gt;ATTENBOROUGH:" />
+    <Beginning from="A'|'|'EN BOROUGH:" to="ATTENBOROUGH:" />
+    <Beginning from="DAVID A'|'|'EN BOROUGH:" to="DAVID ATTENBOROUGH:" />
+    <Beginning from="AT|'EN BOROUGH:" to="ATTENBOROUGH:" />
+    <Beginning from="DAVID AT|'EN BOROUGH:" to="DAVID ATTENBOROUGH:" />
+    <Beginning from="&lt;i&gt;AT|'EN BOROUGH:" to="&lt;i&gt;ATTENBOROUGH:" />
+    <Beginning from="TH REE " to="THREE " />
+    <Beginning from="NARRA TOR" to="NARRATOR" />
+    <Beginning from="&lt;i&gt;NARRA TOR" to="&lt;i&gt;NARRATOR" />
+    <Beginning from="lt'syour" to="It's your" />
+    <Beginning from="It'syour" to="It's your" />
+    <Beginning from="Ls " to="Is " />
+    <Beginning from="I ve " to="I've " />
+    <Beginning from="I ii " to="I'll " />
+    <Beginning from="I m " to="I'm " />
+    <Beginning from="Why d " to="Why'd " />
+    <Beginning from="why d " to="Why'd " />
+    <Beginning from="Couldn t " to="Couldn't " />
+    <Beginning from="couldn t " to="Couldn't " />
+    <Beginning from="That s " to="That's " />
+    <Beginning from="that s " to="That's " />
+  </BeginLines>
+  <EndLines>
+    <Ending from=", sin" to=", sir." />
+    <Ending from=" mothen" to=" mother." />
+    <Ending from=" can't_" to=" can't." />
+    <Ending from=" openiL" to=" open it." />
+    <Ending from=" offl" to=" off!" />
+    <Ending from="pshycol" to="psycho!" />
+    <Ending from=" i..." to=" I..." />
+    <Ending from=" L." to=" I." />
+  </EndLines>
+  <WholeLines>
+    <!-- Whole lines - including -" etc -->
+    <Line from="H ey." to="Hey." />
+    <Line from="He)’-" to="Hey." />
+    <Line from="N0." to="No." />
+    <Line from="-N0." to="-No." />
+    <Line from="Noll" to="No!!" />
+    <Line from="(G ROANS)" to="(GROANS)" />
+    <Line from="[G ROANS]" to="[GROANS]" />
+    <Line from="(M EOWS)" to="(MEOWS)" />
+    <Line from="[M EOWS]" to="[MEOWS]" />
+    <Line from="Uaughs]" to="[laughs]" />
+    <Line from="[chitte rs]" to="[chitters]" />
+    <Line from="Hil†it!" to="Hit it!" />
+    <Line from="&lt;i&gt;Hil†it!&lt;/i&gt;" to="&lt;i&gt;Hit it!&lt;/i&gt;" />
+    <Line from="ISIGHS]" to="[SIGHS]" />
+  </WholeLines>
+  <RegularExpressions>
+    <RegEx find="([a-z]) Won't " replaceWith="$1 won't " />
+    <RegEx find=" L([,\r\n :;!?]+)" replaceWith=" I$1" />
+    <RegEx find=" L.([,\r\n :;!?]+)" replaceWith=" I.$1" />
+  </RegularExpressions>
+</OCRFixReplaceList>
diff --git a/libs/subzero/modification/dictionaries/xml/fin_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/fin_OCRFixReplaceList.xml
new file mode 100644
index 000000000..cdce55c73
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/fin_OCRFixReplaceList.xml
@@ -0,0 +1,1032 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="kellojo" to="kello jo" />
+    <Word from="onjo" to="on jo" />
+    <Word from="senjälkeen" to="sen jälkeen" />
+    <Word from="Tsäu" to="Tsau" />
+    <Word from="hydraulinenjousitus" to="hydraulinen jousitus" />
+    <Word from="Kevyetja" to="Kevyet ja" />
+    <Word from="Oleijo" to="Olet jo" />
+    <Word from="viimeinenjuna" to="viimeinen juna" />
+    <Word from="näyttääjotenkin" to="näyttää jotenkin" />
+    <Word from="onjoku" to="on joku" />
+    <Word from="Iapsuuteen" to="Lapsuuteen" />
+    <Word from="Ieikitjunillä" to="leikit junilla" />
+    <Word from="Sfiy" to="Stig" />
+    <Word from="Iukulasejani" to="Lukulasejani" />
+    <Word from="Ieikkiminen" to="Leikkiminen" />
+    <Word from="Käälikäärylepizzä" to="Kaalikäärylepizza" />
+    <Word from="suklääkästikkeen" to="suklaakastikkeen" />
+    <Word from="päistetun" to="paistetun" />
+    <Word from="bänäänin" to="banaanin" />
+    <Word from="pifi" to="piti" />
+    <Word from="aıkeasfaan" to="oikeastaan" />
+    <Word from="Stg" to="Stig" />
+    <Word from="sikainfluenssatja" to="sikainfluenssat ja" />
+    <Word from="Hienojuna" to="Hieno juna" />
+    <Word from="kiinnostuajunista" to="kiinnostua junista" />
+    <Word from="häyıyvetuıín" to="höyryveturin" />
+    <Word from="pienaismalli" to="pienoismalli" />
+    <Word from="ena" to="eno" />
+    <Word from="racfiosãhkäffájãnã" to="radiosähköttäjänä" />
+    <Word from="Amenkan" to="Amerikan" />
+    <Word from="laiva/la" to="laivalla" />
+    <Word from="0/in" to="Olin" />
+    <Word from="Junahaırasfus" to="Junaharrastus" />
+    <Word from="enasfa" to="enosta" />
+    <Word from="/Vıín" to="Niin" />
+    <Word from="Oliivarmasii" to="Olit varmasti" />
+    <Word from="Internetistäjuuri" to="Internetistä juuri" />
+    <Word from="huıjanjãnniffåvãàl" to="hurjan jännittävää." />
+    <Word from="Vaikkajunat" to="Vaikka junat" />
+    <Word from="kääntyija" to="kääntyi ja" />
+    <Word from="osaajotain" to="osaa jotain" />
+    <Word from="Ieikillämme" to="leikillämme" />
+    <Word from="Bellinjuna" to="Beltin juna" />
+    <Word from="tästäjohtolangasta" to="tästä johtolangasta" />
+    <Word from="tuntisijonkun" to="tuntisi jonkun" />
+    <Word from="Olgajotain" to="Olga jotain" />
+    <Word from="tulokseivuodesia" to="tulokset vuodesta" />
+    <Word from="tuloksetvuodesta" to="tulokset vuodesta" />
+    <Word from="Vainjalkapallo" to="Vain jalkapallo" />
+    <Word from="lloveyou" to="I love you" />
+    <Word from="pofl‹aisi" to="potkaisi" />
+    <Word from="minufulos" to="minut ulos" />
+    <Word from="Ieivänpaahdinl" to="leivänpaahdin!" />
+    <Word from="Ieivänpaahdinta" to="leivänpaahdinta" />
+    <Word from="asuajossain" to="asua jossain" />
+    <Word from="Koiratjuoksentelivat" to="Koirat juoksentelivat" />
+    <Word from="tietääjotain" to="tietää jotain" />
+    <Word from="osaatjuna" to="osaat juna" />
+    <Word from="va/as" to="valas" />
+    <Word from="va/asperhe" to="valasperhe" />
+    <Word from="koskeejotain" to="koskee jotain" />
+    <Word from="Iääkkeensä" to="lääkkeensä" />
+    <Word from="Iaulavan" to="laulavan" />
+    <Word from="Kuulitjään" to="Kuulit jään" />
+    <Word from="Ievolle" to="levolle" />
+    <Word from="Va/aa//e" to="Valaalle" />
+    <Word from="va/aa//a" to="valaalla" />
+    <Word from="Iähdenkin" to="lähdenkin" />
+    <Word from="Iakkiin" to="lakkiin" />
+    <Word from="Iohikäärmeellä" to="lohikäärmeellä" />
+    <Word from="Mikı" to="Mik!" />
+    <Word from="Iukossa" to="lukossa" />
+    <Word from="Va/aan" to="Valaan" />
+    <Word from="säve/mä" to="sävelmä" />
+    <Word from="jä//een" to="jälleen" />
+    <Word from="Pööı" to="Pöö!" />
+    <Word from="Hnjaa" to="Hiljaa" />
+    <Word from="Iiftasin" to="liftasin" />
+    <Word from="Jute//aan" to="Jutellaan" />
+    <Word from="Iohduttamaan" to="lohduttamaan" />
+    <Word from="L'lYPäfään" to="Hypätään" />
+    <Word from="Äırıı" to="Äiti!" />
+    <Word from="Fıııpı" to="Filip!" />
+    <Word from="Yr›r›ääı" to="Hyppää!" />
+    <Word from="Miki" to="Mik!" />
+    <Word from="Hengıräı" to="Hengitä!" />
+    <Word from="Va/as" to="Valas" />
+    <Word from="Ko///is" to="Koillis" />
+    <Word from="Audieja" to="Audie ja" />
+    <Word from="I/man" to="Ilman" />
+    <Word from="/entotukia/ukse/ta" to="lentotukialukselta" />
+    <Word from="/aivastosta" to="laivastosta" />
+    <Word from="/entotukikohtaan" to="lentotukikohtaan" />
+    <Word from="tu/ee" to="tulee" />
+    <Word from="akse/iva//at" to="akselivallat" />
+    <Word from="aııekırjoırerrıın" to="allekirjoitettiin" />
+    <Word from="Iitkua" to="litkua" />
+    <Word from="0li" to="Oli" />
+    <Word from="Iaskuvarjojoukkoihin" to="laskuvarjojoukkoihin" />
+    <Word from="Iaskuvarjojoukoissa" to="laskuvarjojoukoissa" />
+    <Word from="Tarvitsetjotain" to="Tarvitset jotain" />
+    <Word from="Ieukaremmi" to="leukaremmi" />
+    <Word from="Iainaatko" to="lainaatko" />
+    <Word from="päällikölleja" to="päällikölle ja" />
+    <Word from="Iähelläni" to="lähelläni" />
+    <Word from="Soti/aan" to="Sotilaan" />
+    <Word from="va//attava" to="vallattava" />
+    <Word from="viho//ise/ta" to="viholliselta" />
+    <Word from="/iittoutuneet" to="liittoutuneet" />
+    <Word from="voitjohtaa" to="voit johtaa" />
+    <Word from="pohditkojotain" to="pohditko jotain" />
+    <Word from="viho//ista" to="vihollista" />
+    <Word from="sejäisi" to="se jäisi" />
+    <Word from="Ientäjillä" to="lentäjillä" />
+    <Word from="Soltutl" to="Soltut!" />
+    <Word from="Iaulustamme" to="laulustamme" />
+    <Word from="Iakkiani" to="lakkiani" />
+    <Word from="Iiemeen" to="liemeen" />
+    <Word from="kanadalaıšia" to="kanadalaisia" />
+    <Word from="si//anpääasema" to="sillanpääasema" />
+    <Word from="vahvıštettiin" to="vahvıstettiin" />
+    <Word from="tu/ituki" to="tulituki" />
+    <Word from="eliittıjoukkoa" to="eliittijoukkoa" />
+    <Word from="paıkaııasıı" to="paikallasi!" />
+    <Word from="Ieikkinyt" to="leikkinyt" />
+    <Word from="Iujitettu" to="lujitettu" />
+    <Word from="Ete/ä" to="Etelä" />
+    <Word from="viho//isranna//e" to="vihollisrannalle" />
+    <Word from="sivusta/ta" to="sivustalta" />
+    <Word from="/oppuisi" to="loppuisi" />
+    <Word from="Iaskuvarjojoukkojen" to="laskuvarjojoukkojen" />
+    <Word from="päättänytjäädä" to="päättänyt jäädä" />
+    <Word from="Iuutnanteille" to="luutnanteille" />
+    <Word from="Iähtövalmiiksi" to="lähtövalmiiksi" />
+    <Word from="Iokoisat" to="lokoisat" />
+    <Word from="Korjaus/ukemat" to="Korjauslukemat" />
+    <Word from="tanke///e" to="tankeille" />
+    <Word from="kyııäı" to="kyllä!" />
+    <Word from="Iistiä" to="listiä" />
+    <Word from="Kunniamita/in" to="Kunniamitalin" />
+    <Word from="Vemon" to="Vernon" />
+    <Word from="fiedãn" to="Tiedän" />
+    <Word from="Eiıis" to="Elvis" />
+    <Word from="Inlemätionä" to="International" />
+    <Word from="holelfssä" to="hotellissa" />
+    <Word from="Hanıey" to="Harvey" />
+    <Word from="peikkä" to="pelkkä" />
+    <Word from="Ehislã" to="Elvistä" />
+    <Word from="Yflãllãvã" to="Yllättävä" />
+    <Word from="mahdolisuus" to="mahdollisuus" />
+    <Word from="loisteiaan" to="loisteliaan" />
+    <Word from="aku" to="alku" />
+    <Word from="Garonilie" to="Garonille" />
+    <Word from="Iikainen" to="likainen" />
+    <Word from="vaiehtelijoita" to="valehtelijoita" />
+    <Word from="puutariıaasi" to="puutarhaasi" />
+    <Word from="Garunin" to="Garonin" />
+    <Word from="oravaiettiä" to="oravalettiä" />
+    <Word from="paijon" to="paljon" />
+    <Word from="sutja" to="sut ja" />
+    <Word from="gospeikvartetissa" to="gospelkvartetissa" />
+    <Word from="Iauiajaksi" to="laulajaksi" />
+    <Word from="viihdyltäjä" to="viihdyttäjä" />
+    <Word from="hannaala" to="harmaata" />
+    <Word from="Iaulajalta" to="laulajalta" />
+    <Word from="saatjotain" to="saat jotain" />
+    <Word from="Löydänjonkun" to="Löydän jonkun" />
+    <Word from="pyüríyi" to="pyörtyi" />
+    <Word from="Cnıdupia" to="Crudupia" />
+    <Word from="Iiikaa" to="liikaa" />
+    <Word from="keıtaa" to="kertaa" />
+    <Word from="Thafs" to="That's" />
+    <Word from="Kappaietta" to="Kappaletta" />
+    <Word from="soijoka" to="soi joka" />
+    <Word from="Levytlä" to="Levyllä" />
+    <Word from="paiaamista" to="palaamista" />
+    <Word from="kuonnunn" to="kuormurin" />
+    <Word from="Tyttüystävät" to="Tyttöystävät" />
+    <Word from="kãpãlöifiin" to="käpälöitiin" />
+    <Word from="Oiko" to="Oliko" />
+    <Word from="tuipalo" to="tulipalo" />
+    <Word from="hebofiavaa" to="helpottavaa" />
+    <Word from="ongeina" to="ongelma" />
+    <Word from="ongeimia" to="ongelmia" />
+    <Word from="Ajateikaa" to="Ajatelkaa" />
+    <Word from="kuıki" to="kurki" />
+    <Word from="lhailen" to="Ihailen" />
+    <Word from="Lähtüsi" to="Lähtösi" />
+    <Word from="yhtiöile" to="yhtiölle" />
+    <Word from="eitoimi" to="ei toimi" />
+    <Word from="voijäädä" to="voi jäädä" />
+    <Word from="Pomkat" to="Porukat" />
+    <Word from="konıata" to="korvata" />
+    <Word from="konsentien" to="konserttien" />
+    <Word from="Sepã" to="Sepä" />
+    <Word from="hebolus" to="helpotus" />
+    <Word from="küyryssä" to="köyryssä" />
+    <Word from="repiat" to="replat" />
+    <Word from="kuikee" to="kulkee" />
+    <Word from="ponıkoita" to="porukoita" />
+    <Word from="naisetja" to="naiset ja" />
+    <Word from="tenıetuileeksi" to="tervetulleeksi" />
+    <Word from="yläpuolelia" to="yläpuolella" />
+    <Word from="kuullut180" to="kuullut 180" />
+    <Word from="Iapsellista" to="lapsellista" />
+    <Word from="esiinnytja" to="esiinnyt ja" />
+    <Word from="Iaulat" to="laulat" />
+    <Word from="Henanjestas" to="Herranjestas" />
+    <Word from="teilie" to="teille" />
+    <Word from="IIe" to="lle" />
+    <Word from="täilaisia" to="tällaisia" />
+    <Word from="Varu" to="Varo" />
+    <Word from="nimeliään" to="nimellään" />
+    <Word from="anneijaan" to="armeijaan" />
+    <Word from="penıstaa" to="perustaa" />
+    <Word from="minkkituıkkia" to="minkkiturkkia" />
+    <Word from="minkkituiiiilla" to="minkkiturkilla" />
+    <Word from="Tenıetuioa" to="Tervetuloa" />
+    <Word from="kuitalevyä" to="kultalevyä" />
+    <Word from="eiämässä" to="elämässä" />
+    <Word from="jutkaisua" to="julkaisua" />
+    <Word from="Foıt" to="Fort" />
+    <Word from="oien" to="olen" />
+    <Word from="asioilie" to="asioille" />
+    <Word from="Eitarvitsekaan" to="Ei tarvitsekaan" />
+    <Word from="pökenyin" to="pökerryin" />
+    <Word from="ylläiiyy" to="yllättyy" />
+    <Word from="komeaita" to="komealta" />
+    <Word from="Chadie" to="Charlie" />
+    <Word from="laulaisilteko" to="laulaisitteko" />
+    <Word from="Iaittaa" to="laittaa" />
+    <Word from="iyttärenne" to="tyttärenne" />
+    <Word from="pikkutyttünä" to="pikkutyttönä" />
+    <Word from="tyttükulta" to="tyttökulta" />
+    <Word from="vimuilua" to="virnuilua" />
+    <Word from="reporitereita" to="reporttereita" />
+    <Word from="vime" to="virne" />
+    <Word from="eijohdu" to="ei johdu" />
+    <Word from="eriiainen" to="erilainen" />
+    <Word from="Iasketa" to="lasketa" />
+    <Word from="kemıttu" to="kerrottu" />
+    <Word from="Manyja" to="Marty ja" />
+    <Word from="etteijutusta" to="ettei jutusta" />
+    <Word from="Katifomiassa" to="Kaliforniassa" />
+    <Word from="sun°filaudan" to="surffilaudan" />
+    <Word from="bnınetti" to="brunetti" />
+    <Word from="vaimiina" to="valmiina" />
+    <Word from="yiimääräiset" to="ylimääräiset" />
+    <Word from="leffatjää" to="leffat jää" />
+    <Word from="koin'lle" to="koirille" />
+    <Word from="Täilaisen" to="Tällaisen" />
+    <Word from="antanutjo" to="antanut jo" />
+    <Word from="Chaılien" to="Charlien" />
+    <Word from="ympäriliesi" to="ympärillesi" />
+    <Word from="Iyü" to="lyö" />
+    <Word from="lopan't" to="loparit" />
+    <Word from="hıisi" to="tulisi" />
+    <Word from="kuuiuvanijonnekin" to="kuuluvani jonnekin" />
+    <Word from="juhın" to="jutun" />
+    <Word from="miefkseni" to="mielikseni" />
+    <Word from="Tuisitko" to="Tulisitko" />
+    <Word from="Iıonäni" to="luonani" />
+    <Word from="äkää" to="alkaa" />
+    <Word from="yi" to="yli" />
+    <Word from="rupallelemaan" to="rupattelemaan" />
+    <Word from="Priscilialla" to="Priscillalla" />
+    <Word from="Hemmoltelet" to="Hemmotelet" />
+    <Word from="Hearlbreak" to="Heartbreak" />
+    <Word from="Holelia" to="Hotelia" />
+    <Word from="Nyton" to="Nyt on" />
+    <Word from="kiertueeile" to="kiertueelle" />
+    <Word from="Elvistã" to="Elvistä" />
+    <Word from="puoleila" to="puolella" />
+    <Word from="Äıä" to="Älä" />
+    <Word from="lnlemalional" to="International" />
+    <Word from="Iuottamustanne" to="luottamustanne" />
+    <Word from="MycroftĂ­sta" to="Mycroftista" />
+    <Word from="Iopettako" to="lopettako" />
+    <Word from="Ielukauppa" to="lelukauppa" />
+    <Word from="Iomamatkalle" to="lomamatkalle" />
+    <Word from="Iyhyelle" to="lyhyelle" />
+    <Word from="Alkää" to="Älkää" />
+    <Word from="K_uka" to="Kuka" />
+    <Word from="IIa" to="lla" />
+    <Word from="Aitinne" to="Ă„itinne" />
+    <Word from="Vä/ikohtaus" to="Välikohtaus" />
+    <Word from="kuo//aan" to="kuollaan" />
+    <Word from="nä/kään" to="nälkään" />
+    <Word from="Su/je" to="Sulje" />
+    <Word from="Iäimäytit" to="läimäytit" />
+    <Word from="Iähetystössä" to="lähetystössä" />
+    <Word from="Iähetystöön" to="lähetystöön" />
+    <Word from="Iaosilainen" to="laosilainen" />
+    <Word from="Iiiketarjous" to="liiketarjous" />
+    <Word from="kaappavat" to="kaappaavat" />
+    <Word from="Ieivissään" to="leivissään" />
+    <Word from="EriC" to="Eric" />
+    <Word from="Voi/Ă " to="VoilĂ " />
+    <Word from="Crawleyı" to="Crawley!" />
+    <Word from="Iihaksiaan" to="lihaksiaan" />
+    <Word from="Iuenkaan" to="luenkaan" />
+    <Word from="Olemma" to="Olemme" />
+    <Word from="Iähtisitte" to="lähtisitte" />
+    <Word from="jotâin" to="jotain" />
+    <Word from="Eversi" to="Eversti" />
+    <Word from="Ieiriytyä" to="leiriytyä" />
+    <Word from="Iiikutte" to="liikutte" />
+    <Word from="Iääketiedettä" to="lääketiedettä" />
+    <Word from="Iivetä" to="livetä" />
+    <Word from="Iapsetkin" to="lapsetkin" />
+    <Word from="Iääkeluettelo" to="lääkeluettelo" />
+    <Word from="Iaatiko" to="laatikko" />
+    <Word from="hyvih" to="hyvin" />
+    <Word from="Ieukakuoppa" to="leukakuoppa" />
+    <Word from="Ientäjäni" to="lentäjäni" />
+    <Word from="Ieikkisi" to="leikkisi" />
+    <Word from="Iupaamastaan" to="lupaamastaan" />
+    <Word from="ku/taseni" to="kultaseni" />
+    <Word from="tu/en" to="tulen" />
+    <Word from="Iautalle" to="lautalle" />
+    <Word from="100_vuotiaaksi" to="100 vuotiaaksi" />
+    <Word from="_" to="" />
+    <Word from="Viiltäjã_Jackin" to="Viiltäjä Jackin" />
+    <Word from="keffärfkerro" to="kellarikerroksen" />
+    <Word from="tan/itsi" to="tarvitsi" />
+    <Word from="_Aivan" to="Aivan" />
+    <Word from="_Valosta" to="Valosta" />
+    <Word from="_Teemmekö" to="Teemmekö" />
+    <Word from="Viiltäjä_Jack" to="Viiltäjä Jack" />
+    <Word from="_Voi" to="Voi" />
+    <Word from="_Tiedätte" to="Tiedätte" />
+    <Word from="kulunutjo" to="kulunut jo" />
+    <Word from="Vuokra_auto" to="Vuokra-auto" />
+    <Word from="_Tuokaa" to="Tuokaa" />
+    <Word from="_Tunnetteko" to="Tunnetteko" />
+    <Word from="_Tiedämme" to="Tiedämme" />
+    <Word from="toissayön" to="toissa yön" />
+    <Word from="_Toki" to="Toki" />
+    <Word from="_Ammuttu" to="Ammuttu" />
+    <Word from="_Jahtasit" to="Jahtasit" />
+    <Word from="_Tunnenko" to="Tunnenko" />
+    <Word from="_Joku" to="Joku" />
+    <Word from="_Taivahan" to="Taivahan" />
+    <Word from="Kuorma_auto" to="Kuorma-auto" />
+    <Word from="_Vain" to="Vain" />
+    <Word from="Mesmer_klubille" to="Mesmer klubille" />
+    <Word from="0nslow'IIe" to="Onslow'lle" />
+    <Word from="Mesmer_klubi" to="Mesmer klubi" />
+    <Word from="_Anteeksi" to="Anteeksi" />
+    <Word from="Schrenk_Notzing" to="Schrenk Notzing" />
+    <Word from="_Tapoin" to="Tapoin" />
+    <Word from="_AIkää" to="Älkää" />
+    <Word from="0dotan" to="Odotan" />
+    <Word from="Iuonteenlu" to="luonteenlu" />
+    <Word from="Iempikaupunkini" to="lempikaupunkini" />
+    <Word from="Iavasta" to="lavasta" />
+    <Word from="Iämmittelijät" to="lämmittelijät" />
+    <Word from="Iaastaria" to="laastaria" />
+    <Word from="Riiuää" to="Riittää" />
+    <Word from="Käyuävätkö" to="Käyttävätkö" />
+    <Word from="Iähestykö" to="lähestykö" />
+    <Word from="Ieikekirja" to="leikekirja" />
+    <Word from="Ievyjään" to="levyjään" />
+    <Word from="Iahjoitamme" to="lahjoitamme" />
+    <Word from="Läppäätuohon" to="Läppää tuohon" />
+    <Word from="CIawdy" to="Clawdy" />
+    <Word from="mita" to="mitä" />
+    <Word from="jalkeen" to="jälkeen" />
+    <Word from="Cannabisjaponica" to="Cannabis japonica" />
+    <Word from="Ieningin" to="leningin" />
+    <Word from="kiıjoitatte" to="kirjoitatte" />
+    <Word from="kiıjoitetuksi" to="kirjoitetuksi" />
+    <Word from="kuluttuu" to="kuluttaa" />
+    <Word from="Iuvulta" to="luvulta" />
+    <Word from="Ieipomiskilpailuun" to="leipomiskilpailuun" />
+    <Word from="Maclntire" to="MacIntire" />
+    <Word from="Iehteemme" to="lehteemme" />
+    <Word from="Alä" to="Älä" />
+    <Word from="kysesssä" to="kyseessä" />
+    <Word from="Itsepuolustustal" to="Itsepuolustusta!" />
+    <Word from="Iiipasimesta" to="liipasimesta" />
+    <Word from="Iuutani" to="luutani" />
+    <Word from="Iahjansa" to="lahjansa" />
+    <Word from="Iähimmäisemme" to="lähimmäisemme" />
+    <Word from="Iuhistuu" to="luhistuu" />
+    <Word from="ıöyhkä" to="löyhkä" />
+    <Word from="Iehtileikkeleitä" to="lehtileikkeleitä" />
+    <Word from="vefieni" to="veljeni" />
+    <Word from="Iapselleni" to="lapselleni" />
+    <Word from="epänormaalinal" to="epänormaalina!" />
+    <Word from="Iuurankoja" to="luurankoja" />
+    <Word from="Iuurangoista" to="luurangoista" />
+    <Word from="päätiellel" to="päätielle!" />
+    <Word from="Valonneitsytta" to="Valonneitsyttä" />
+    <Word from="Iohikáármekuula" to="lohikäärmekuula" />
+    <Word from="yhdella" to="yhdellä" />
+    <Word from="Tasta" to="Tästä" />
+    <Word from="__" to="" />
+    <Word from="Alkáä" to="Älkää" />
+    <Word from="etta" to="että" />
+    <Word from="pitaa" to="pitää" />
+    <Word from="nälkáisiä" to="nälkäisiä" />
+    <Word from="Hyva" to="Hyvä" />
+    <Word from="hyvasta" to="hyvästä" />
+    <Word from="ruoastaja" to="ruoasta ja" />
+    <Word from="Kásivarteni" to="Käsivarteni" />
+    <Word from="käikki" to="kaikki" />
+    <Word from="Mozukustä" to="Mozukusta" />
+    <Word from="Etsivátkö" to="Etsivätkö" />
+    <Word from="Iohikáármekuulaa" to="lohikäärmekuulaa" />
+    <Word from="Valonneitsyttá" to="Valonneitsyttä" />
+    <Word from="taalla" to="täällä" />
+    <Word from="siemeniáán" to="siemeniään" />
+    <Word from="kunhän" to="kunhan" />
+    <Word from="äjättelen" to="ajattelen" />
+    <Word from="pelkuril" to="pelkuri!" />
+    <Word from="kyla" to="kylä" />
+    <Word from="hyökkáykseltä" to="hyökkäykseltä" />
+    <Word from="hyökkáisi" to="hyökkäisi" />
+    <Word from="hyökataan" to="hyökätään" />
+    <Word from="Voitjuoda" to="Voit juoda" />
+    <Word from="Iittaamisesta" to="littaamisesta" />
+    <Word from="Iahtenyt" to="lähtenyt" />
+    <Word from="kylasta" to="kylästä" />
+    <Word from="Etjuurikään" to="Et juurikaan" />
+    <Word from="sämältä" to="samalta" />
+    <Word from="käikkiällä" to="kaikkialla" />
+    <Word from="ehka" to="ehkä" />
+    <Word from="tiennytkaan" to="tiennytkään" />
+    <Word from="taistelenl" to="taistelen!" />
+    <Word from="Iiikkeita" to="liikkeitä" />
+    <Word from="Taistellaanl" to="Taistellaan!" />
+    <Word from="Odottämättomät" to="Odottamattomat" />
+    <Word from="näutinnot" to="nautinnot" />
+    <Word from="rikkään" to="rikkaan" />
+    <Word from="Iuotettavalta" to="luotettavalta" />
+    <Word from="elaa" to="elää" />
+    <Word from="pekkiã" to="pelkkiä" />
+    <Word from="jãkeen" to="jälkeen" />
+    <Word from="nörttejã" to="nörttejä" />
+    <Word from="penıskursseja" to="peruskursseja" />
+    <Word from="Suorititjo" to="Suoritit jo" />
+    <Word from="seinäilä" to="seinällä" />
+    <Word from="Iaiteta" to="laiteta" />
+    <Word from="hennostu" to="hermostu" />
+    <Word from="Coiumbiassa" to="Columbiassa" />
+    <Word from="Penıerssiä" to="Perverssejä" />
+    <Word from="sukupuoieimislã" to="sukupuolielimistä" />
+    <Word from="epãiooginen" to="epälooginen" />
+    <Word from="oisin" to="olisin" />
+    <Word from="iittoni" to="liittoni" />
+    <Word from="oisi" to="olisi" />
+    <Word from="asuntoia" to="asuntola" />
+    <Word from="pääsittejatkoseminaariini" to="pääsitte jatkoseminaariini" />
+    <Word from="Anıatkaapa" to="Arvatkaapa" />
+    <Word from="Iopussa" to="lopussa" />
+    <Word from="Oletjo" to="Olet jo" />
+    <Word from="Haiuan" to="Haluan" />
+    <Word from="luennoilie" to="luennoille" />
+    <Word from="Iintsata" to="lintsata" />
+    <Word from="oletjuuri" to="olet juuri" />
+    <Word from="Iuuietko" to="luuletko" />
+    <Word from="kylvyssã" to="kylvyssä" />
+    <Word from="vãlãhti" to="välähti" />
+    <Word from="Miettikãã" to="Miettikää" />
+    <Word from="insinöün" to="insinööri" />
+    <Word from="Menithalpaan" to="Menit halpaan" />
+    <Word from="Tukaa" to="Tulkaa" />
+    <Word from="Aarun" to="Aaron" />
+    <Word from="Kieleiläsi" to="Kielelläsi" />
+    <Word from="pystytjohonkin" to="pystyt johonkin" />
+    <Word from="KämppikseniWilliam" to="Kämppikseni William" />
+    <Word from="Iuolamies" to="luolamies" />
+    <Word from="keskianıon" to="keskiarvon" />
+    <Word from="kananosta" to="kartanosta" />
+    <Word from="päivälliselie" to="päivälliselle" />
+    <Word from="Iasagnea" to="lasagnea" />
+    <Word from="voitehota" to="voi tehota" />
+    <Word from="0lisit" to="Olisit" />
+    <Word from="menijuuri" to="meni juuri" />
+    <Word from="tapasivatjo" to="tapasivat jo" />
+    <Word from="knıunukoriiiliiset" to="kruunukorkilliset" />
+    <Word from="eijuo" to="ei juo" />
+    <Word from="Näytätuupuneeita" to="Näytät uupuneelta" />
+    <Word from="Etanıaakaan" to="Et arvaakaan" />
+    <Word from="lhanko" to="Ihanko" />
+    <Word from="yfltäkään" to="yritäkään" />
+    <Word from="serkkuniWinn" to="serkkuni Winn" />
+    <Word from="voijatkua" to="voi jatkua" />
+    <Word from="miehetja" to="miehet ja" />
+    <Word from="vĂ­esfinĂ­" to="viestini" />
+    <Word from="kuullılsinusla" to="kuullut sinusta" />
+    <Word from="Tãmã" to="Tämä" />
+    <Word from="kelããn" to="ketään" />
+    <Word from="vedessãkãveijã" to="vedessäkävelijä" />
+    <Word from="/abrassa" to="labrassa" />
+    <Word from="akaa" to="alkaa" />
+    <Word from="Iiinaa" to="liinaa" />
+    <Word from="kanıainen" to="karvainen" />
+    <Word from="oten" to="olen" />
+    <Word from="kallaisesi" to="kaltaisesi" />
+    <Word from="pmffa" to="proffa" />
+    <Word from="tulittänne" to="tulit tänne" />
+    <Word from="Alalteko" to="Alatteko" />
+    <Word from="luuiisit" to="luulisit" />
+    <Word from="Pysãhdy" to="Pysähdy" />
+    <Word from="Paskathänestä" to="Paskat hänestä" />
+    <Word from="Pysãhdyheti" to="Pysähdy heti" />
+    <Word from="Heivetti" to="Helvetti" />
+    <Word from="Pidãlãn" to="Pidätän" />
+    <Word from="Vflru" to="Varo" />
+    <Word from="huolissasijostain" to="huolissasi jostain" />
+    <Word from="hurmaavatpuhelusi" to="hurmaavat puhelusi" />
+    <Word from="ystävysiyin" to="ystävystyin" />
+    <Word from="Cunya" to="Currya" />
+    <Word from="cunya" to="currya" />
+    <Word from="kohdaliani" to="kohdallani" />
+    <Word from="anıoista" to="arvoista" />
+    <Word from="Loputnäkevätnälkää" to="Loput näkevät nälkää" />
+    <Word from="oletollut" to="olet ollut" />
+    <Word from="jäikinıoan" to="jälkiruoan" />
+    <Word from="Saathänet" to="Saat hänet" />
+    <Word from="Kemın" to="Kerron" />
+    <Word from="kappaieiksi" to="kappaleiksi" />
+    <Word from="vuokıanja" to="vuokran ja" />
+    <Word from="iyperys" to="typerys" />
+    <Word from="mmanltisella" to="romanttisella" />
+    <Word from="ıakastellut" to="rakastellut" />
+    <Word from="jutteiimme" to="juttelimme" />
+    <Word from="vesimittann" to="vesimittarin" />
+    <Word from="kuikevat" to="kulkevat" />
+    <Word from="tavaratja" to="tavarat ja" />
+    <Word from="piiltaal" to="piittaat" />
+    <Word from="etehkä" to="et ehkä" />
+    <Word from="Lapsenvahtisituli" to="Lapsenvahtisi tuli" />
+    <Word from="Ymmänälkö" to="Ymmärrätkö" />
+    <Word from="iyiiãresi" to="tyttäresi" />
+    <Word from="myöhã" to="myöhä" />
+    <Word from="nähnytAaron" to="nähnyt Aaron" />
+    <Word from="haiunnut" to="halunnut" />
+    <Word from="Olitoikeassa" to="Olit oikeassa" />
+    <Word from="itseenijuuri" to="itseeni juuri" />
+    <Word from="lempinıokaani" to="lempiruokaani" />
+    <Word from="Iupaamaan" to="lupaamaan" />
+    <Word from="Teetsoimun" to="Teet solmun" />
+    <Word from="Senıice" to="Service" />
+    <Word from="Iasini" to="lasini" />
+    <Word from="Ieuassa" to="leuassa" />
+    <Word from="Iiikekumppaninsa" to="liikekumppaninsa" />
+    <Word from="Iiikekumppani" to="liikekumppani" />
+    <Word from="Iausuttiinkaan" to="lausuttiinkaan" />
+    <Word from="Iastauslaiturille" to="lastauslaiturille" />
+    <Word from="Oleko" to="Oletko" />
+    <Word from="tie/tä" to="tieltä" />
+    <Word from="Mayhew'IIe" to="Mayhew'lle" />
+    <Word from="Iakiasiaintoimisto" to="lakiasiaintoimisto" />
+    <Word from="Iakimiestä" to="lakimiestä" />
+    <Word from="ne//eensä" to="nelleensä" />
+    <Word from="ha//ituksiin" to="hallituksiin" />
+    <Word from="soti/aa//isiin" to="sotilaallisiin" />
+    <Word from="Iahtasit" to="lahtasit" />
+    <Word from="Tiestikö" to="Tiesitkö" />
+    <Word from="Iakimiehiä" to="lakimiehiä" />
+    <Word from="Äläkää" to="Älkää" />
+    <Word from="O/en" to="Olen" />
+    <Word from="minsta" to="minusta" />
+    <Word from="Iuennosta" to="luennosta" />
+    <Word from="Iakimiehestä" to="lakimiehestä" />
+    <Word from="Iopetatte" to="lopetatte" />
+    <Word from="0/it" to="0lit" />
+    <Word from="tu/it" to="tulit" />
+    <Word from="Mayhew'Ita" to="Mayhew'lta" />
+    <Word from="Iähietäisyydellä" to="lähietäisyydellä" />
+    <Word from="ennenkuin" to="ennen kuin" />
+    <Word from="nukkuä" to="nukkua" />
+    <Word from="ihmisia" to="ihmisiä" />
+    <Word from="elossä" to="elossa" />
+    <Word from="tiedettävá" to="tiedettävä" />
+    <Word from="Etsikáá" to="Etsikää" />
+    <Word from="Aıjaı" to="Aijai" />
+    <Word from="Välonneitsyen" to="Valonneitsyen" />
+    <Word from="Iupäustäsi" to="lupaustasi" />
+    <Word from="Yämikugyo" to="Yamikugyo" />
+    <Word from="epäonnistumisiä" to="epäonnistumisia" />
+    <Word from="Ymmárrätkö" to="Ymmärrätkö" />
+    <Word from="Iohikäärmekuula" to="lohikäärmekuula" />
+    <Word from="tasta" to="tästä" />
+    <Word from="taynna" to="täynnä" />
+    <Word from="mina" to="minä" />
+    <Word from="tata" to="tätä" />
+    <Word from="tyhmaa" to="tyhmää" />
+    <Word from="enemman" to="enemmän" />
+    <Word from="pátevöity" to="pätevöity" />
+    <Word from="kylla" to="kyllä" />
+    <Word from="ärvokästä" to="arvokasta" />
+    <Word from="selviytyjáksi" to="selviytyjäksi" />
+    <Word from="myyda" to="myydä" />
+    <Word from="hanet" to="hänet" />
+    <Word from="äpuäsi" to="apuasi" />
+    <Word from="Kukä" to="Kuka" />
+    <Word from="sänoi" to="sanoi" />
+    <Word from="äutän" to="autan" />
+    <Word from="Äla" to="Älä" />
+    <Word from="Han" to="Hän" />
+    <Word from="Mita" to="Mitä" />
+    <Word from="tama" to="tämä" />
+    <Word from="Olettiellamme" to="Olet tiellämme" />
+    <Word from="Kylani" to="Kyläni" />
+    <Word from="Iahdemme" to="lähdemme" />
+    <Word from="viela" to="vielä" />
+    <Word from="yhdeksan" to="yhdeksän" />
+    <Word from="Nasaviisaudet" to="Näsäviisaudet" />
+    <Word from="Láhempänä" to="Lähempänä" />
+    <Word from="tietaa" to="tietää" />
+    <Word from="mentava" to="mentävä" />
+    <Word from="onkään" to="onkaan" />
+    <Word from="tekemista" to="tekemistä" />
+    <Word from="Sina" to="Sinä" />
+    <Word from="sina" to="sinä" />
+    <Word from="kiitettävá" to="kiitettävä" />
+    <Word from="edellámme" to="edellämme" />
+    <Word from="eika" to="eikä" />
+    <Word from="Takanasfl" to="Takanasi!" />
+    <Word from="Iankaan" to="lankaan" />
+    <Word from="välloillensä" to="valloillensa" />
+    <Word from="siita" to="siitä" />
+    <Word from="Iohikaarmekuulan" to="lohikäärmekuulan" />
+    <Word from="Keta" to="Ketä" />
+    <Word from="nama" to="nämä" />
+    <Word from="ajateltavaal" to="ajateltavaa!" />
+    <Word from="olläkseni" to="ollakseni" />
+    <Word from="värmä" to="varma" />
+    <Word from="hanta" to="häntä" />
+    <Word from="hanelle" to="hänelle" />
+    <Word from="Osäätko" to="Osaatko" />
+    <Word from="rajahteita" to="räjähteitä" />
+    <Word from="Jyashil" to="Jyashi!" />
+    <Word from="Nama" to="Nämä" />
+    <Word from="sita" to="sitä" />
+    <Word from="koskään" to="koskaan" />
+    <Word from="Viekáá" to="Viekää" />
+    <Word from="Pidáttäkää" to="Pidättäkää" />
+    <Word from="Oclottakaal" to="Odottakaa!" />
+    <Word from="pelkáämá" to="pelkäämä" />
+    <Word from="ostävänne" to="ostavanne" />
+    <Word from="rovoillänne" to="rovoillanne" />
+    <Word from="Jonäin" to="Jonain" />
+    <Word from="piit'taa" to="piittaa" />
+    <Word from="&gt;" to="" />
+    <Word from="táysikuu" to="täysikuu" />
+    <Word from="sinuttänne" to="sinut tänne" />
+    <Word from="Iahtea" to="lähteä" />
+    <Word from="Paastaksemme" to="Päästäksemme" />
+    <Word from="Párjáämme" to="Pärjäämme" />
+    <Word from="hänskässä" to="hanskassa" />
+    <Word from="Tama" to="Tämä" />
+    <Word from="Menkaa" to="Menkää" />
+    <Word from="Häipykáá" to="Häipykää" />
+    <Word from="kasin" to="käsin" />
+    <Word from="Tata" to="Tätä" />
+    <Word from="Hylkaatkö" to="Hylkäätkö" />
+    <Word from="Paasta" to="Päästä" />
+    <Word from="ryöstäá" to="ryöstää" />
+    <Word from="Iivistä" to="livistä" />
+    <Word from="viivytát" to="viivytät" />
+    <Word from="Pysähtykáä" to="Pysähtykää" />
+    <Word from="kännoiltä" to="kannoilta" />
+    <Word from="kásken" to="käsken" />
+    <Word from="Pysähtykáá" to="Pysähtykää" />
+    <Word from="huonojátkä" to="huono jätkä" />
+    <Word from="kátyrini" to="kätyrini" />
+    <Word from="mitaan" to="mitään" />
+    <Word from="Missa" to="Missä" />
+    <Word from="kyntäván" to="kyntävän" />
+    <Word from="pärjánneet" to="pärjänneet" />
+    <Word from="ruokää" to="ruokaa" />
+    <Word from="märjojä" to="marjoja" />
+    <Word from="kuinkä" to="kuinka" />
+    <Word from="ollä" to="olla" />
+    <Word from="missa" to="missä" />
+    <Word from="Peráänny" to="Peräänny" />
+    <Word from="Pysykáä" to="Pysykää" />
+    <Word from="Vetelàt" to="Vetelät" />
+    <Word from="täppää" to="tappaa" />
+    <Word from="ketaan" to="ketään" />
+    <Word from="pelkaamaan" to="pelkäämään" />
+    <Word from="ovatja" to="ovat ja" />
+    <Word from="ymmarra" to="ymmärrä" />
+    <Word from="ystväni" to="ystäväni" />
+    <Word from="Kärpásiäkö" to="Kärpäsiäkö" />
+    <Word from="metsástät" to="metsästät" />
+    <Word from="Iiittya" to="liittyä" />
+    <Word from="Alá" to="Älä" />
+    <Word from="pyörtyá" to="pyörtyä" />
+    <Word from="nälästá" to="nälästä" />
+    <Word from="hyva" to="hyvä" />
+    <Word from="syömaan" to="syömään" />
+    <Word from="katyreita" to="kätyreitä" />
+    <Word from="Epáreilua" to="Epäreilua" />
+    <Word from="Läuttä" to="Lautta" />
+    <Word from="iltänä" to="iltana" />
+    <Word from="Täisimme" to="Taisimme" />
+    <Word from="Voihän" to="Voihan" />
+    <Word from="hittoläinen" to="hittolainen" />
+    <Word from="Jä" to="Ja" />
+    <Word from="Iohikáármekivi" to="lohikäärmekivi" />
+    <Word from="siina" to="siinä" />
+    <Word from="Iaake" to="lääke" />
+    <Word from="purrutjokin" to="purrut jokin" />
+    <Word from="tahan" to="tähän" />
+    <Word from="paasseet" to="päässeet" />
+    <Word from="Iaakkeen" to="lääkkeen" />
+    <Word from="Ieposija" to="leposija" />
+    <Word from="Kylla" to="Kyllä" />
+    <Word from="pitkalta" to="pitkältä" />
+    <Word from="eivat" to="eivät" />
+    <Word from="tanne" to="tänne" />
+    <Word from="taman" to="tämän" />
+    <Word from="Ehka" to="Ehkä" />
+    <Word from="han" to="hän" />
+    <Word from="mista" to="mistä" />
+    <Word from="pidat" to="pidät" />
+    <Word from="Joutukää" to="Joutukaa" />
+    <Word from="Hanen" to="Hänen" />
+    <Word from="sisallaan" to="sisällään" />
+    <Word from="Pysykáá" to="Pysykää" />
+    <Word from="Lähtekäá" to="Lähtekää" />
+    <Word from="tilään" to="tilaan" />
+    <Word from="paatella" to="päätellä" />
+    <Word from="isani" to="isäni" />
+    <Word from="paasemme" to="pääsemme" />
+    <Word from="haipyivat" to="häipyivät" />
+    <Word from="Tehán" to="Tehän" />
+    <Word from="Hyökkáätte" to="Hyökkäätte" />
+    <Word from="Iiikahdattekaan" to="liikahdattekaan" />
+    <Word from="jä" to="ja" />
+    <Word from="välmistäuduin" to="valmistauduin" />
+    <Word from="Hikavvassa" to="Hikawassa" />
+    <Word from="Kuolel" to="Kuole!" />
+    <Word from="hanen" to="hänen" />
+    <Word from="yhta" to="yhtä" />
+    <Word from="Sisalla" to="Sisällä" />
+    <Word from="ruumiissä" to="ruumiissa" />
+    <Word from="minka" to="minkä" />
+    <Word from="Iihää" to="lihaa" />
+    <Word from="Iuutä" to="luuta" />
+    <Word from="Sisàllàmme" to="Sisällämme" />
+    <Word from="Tottelel" to="Tottele!" />
+    <Word from="Äläjätä" to="Älä jätä" />
+    <Word from="aitisi" to="äitisi" />
+    <Word from="Mina" to="Minä" />
+    <Word from="ymmartamaan" to="ymmärtämään" />
+    <Word from="syödaan" to="syödään" />
+    <Word from="pähältä" to="pahalta" />
+    <Word from="Däkuän" to="Dakuan" />
+    <Word from="sirkutahti" to="sirkustähti" />
+    <Word from="Iapiota" to="lapiota" />
+    <Word from="mieltasi" to="mieltäsi" />
+    <Word from="pitaisi" to="pitäisi" />
+    <Word from="vieda" to="viedä" />
+    <Word from="táálläkäán" to="täälläkään" />
+    <Word from="taytyy" to="täytyy" />
+    <Word from="kivesta" to="kivestä" />
+    <Word from="etsia" to="etsiä" />
+    <Word from="Poikatytöstà" to="Poikatytöstä" />
+    <Word from="hyökkasi" to="hyökkäsi" />
+    <Word from="takaapain" to="takaapäin" />
+    <Word from="Iäskee" to="laskee" />
+    <Word from="haipya" to="häipyä" />
+    <Word from="tehclákseni" to="tehdäkseni" />
+    <Word from="piän" to="pian" />
+    <Word from="tyrkyttäá" to="tyrkyttää" />
+    <Word from="minuä" to="minua" />
+    <Word from="nálkáinen" to="nälkäinen" />
+    <Word from="Sydametön" to="Sydämetön" />
+    <Word from="hylata" to="hylätä" />
+    <Word from="yha" to="yhä" />
+    <Word from="käuniisti" to="kauniisti" />
+    <Word from="ihmisverestá" to="ihmisverestä" />
+    <Word from="Siiiä" to="Sinä" />
+    <Word from="häluät" to="haluat" />
+    <Word from="Iahemmin" to="lähemmin" />
+    <Word from="kayttaa" to="käyttää" />
+    <Word from="hyvaksi" to="hyväksi" />
+    <Word from="paase" to="pääse" />
+    <Word from="siivilla" to="siivillä" />
+    <Word from="jälkeläisá" to="jälkeläisiä" />
+    <Word from="syista" to="syistä" />
+    <Word from="pyháä" to="pyhää" />
+    <Word from="Tyhmat" to="Tyhmät" />
+    <Word from="pyytavat" to="pyytävät" />
+    <Word from="Hölynpölyäl" to="Hölynpölyä!" />
+    <Word from="Nakivat" to="Näkivät" />
+    <Word from="kannissa" to="kännissä" />
+    <Word from="kasivarren" to="käsivarren" />
+    <Word from="hánenlaisensa" to="hänenlaisensa" />
+    <Word from="solää" to="solaa" />
+    <Word from="Iiioitella" to="liioitella" />
+    <Word from="Iiioittele" to="liioittele" />
+    <Word from="Tiedathan" to="Tiedäthän" />
+    <Word from="pyhástä" to="pyhästä" />
+    <Word from="Iohikáármekivestä" to="lohikäärmekivestä" />
+    <Word from="Ymmárrát" to="Ymmärrät" />
+    <Word from="ärmonne" to="armonne" />
+    <Word from="näisten" to="naisten" />
+    <Word from="Iupäukseni" to="lupaukseni" />
+    <Word from="kekseliáisyytesi" to="kekseliäisyytesi" />
+    <Word from="Iaudalta" to="laudalta" />
+    <Word from="kestávyytesi" to="kestävyytesi" />
+    <Word from="taiclakaan" to="taidakaan" />
+    <Word from="tyttöystava" to="tyttöystävä" />
+    <Word from="sormissäni" to="sormissani" />
+    <Word from="räivoisän" to="raivoisan" />
+    <Word from="kärhun" to="karhun" />
+    <Word from="helvetista" to="helvetistä" />
+    <Word from="väi" to="vai" />
+    <Word from="poissä" to="poissa" />
+    <Word from="elamani" to="elämäni" />
+    <Word from="pitkátjalkasi" to="pitkät jalkasi" />
+    <Word from="Kadet" to="Kädet" />
+    <Word from="niita" to="niitä" />
+    <Word from="Kaske" to="Käske" />
+    <Word from="paastaa" to="päästää" />
+    <Word from="Pida" to="Pidä" />
+    <Word from="Iohikaarmekivi" to="lohikäärmekivi" />
+    <Word from="sinustä" to="sinusta" />
+    <Word from="syöksyyjo" to="syöksyy jo" />
+    <Word from="veljeasi" to="veljeäsi" />
+    <Word from="Odotä" to="Odota" />
+    <Word from="Pysáhdy" to="Pysähdy" />
+    <Word from="kivea" to="kiveä" />
+    <Word from="Missaan" to="Missään" />
+    <Word from="tiheámpi" to="tiheämpi" />
+    <Word from="Iuulitkaan" to="luulitkaan" />
+    <Word from="kaarmekuula" to="käärmekuula" />
+    <Word from="muttajätän" to="mutta jätän" />
+    <Word from="kuoletl" to="kuolet!" />
+    <Word from="Iohikaarmekuula" to="lohikäärmekuula" />
+    <Word from="kieltava" to="kieltävä" />
+    <Word from="Láhtekáá" to="Lähtekää" />
+    <Word from="Iohikáärmekuulaa" to="lohikäärmekuulaa" />
+    <Word from="hereilla" to="hereillä" />
+    <Word from="kaljupaa" to="kaljupää" />
+    <Word from="äntämällä" to="antamalla" />
+    <Word from="kuulän" to="kuulan" />
+    <Word from="täkäisin" to="takaisin" />
+    <Word from="puolikkään" to="puolikkaan" />
+    <Word from="pohjoisessaja" to="pohjoisessa ja" />
+    <Word from="metsasta" to="metsästä" />
+    <Word from="Iohikäärmekuulälle" to="lohikäärmekuulalle" />
+    <Word from="teita" to="teitä" />
+    <Word from="Linnutkään" to="Linnutkaan" />
+    <Word from="Puolikkään" to="Puolikkaan" />
+    <Word from="äntänut" to="antanut" />
+    <Word from="tiedan" to="tiedän" />
+    <Word from="heráttámássá" to="herättämässä" />
+    <Word from="Iäsin" to="lasin" />
+    <Word from="hätánä" to="hätänä" />
+    <Word from="Iöysitte" to="löysitte" />
+    <Word from="a//ı'gaal'torıh" to="alligaattorin" />
+    <Word from="Tyttbparka" to="tyttöparka" />
+    <Word from="bänãä" to="bänää" />
+    <Word from="Co/en" to="Colen" />
+    <Word from="Iapsikoıfin" to="lapsikortin" />
+    <Word from="rauhallisemminl" to="rauhallisemmin!" />
+    <Word from="Iahjasi" to="lahjasi" />
+    <Word from="Ruokihänet" to="Ruoki hänet" />
+    <Word from="Iöystymistä" to="löystymistä" />
+    <Word from="Iapsestaan" to="lapsestaan" />
+    <Word from="Iaatuaikaa" to="laatuaikaa" />
+    <Word from="Ioukkaannuit" to="loukkaannuit" />
+    <Word from="Ioistojuttu" to="loistojuttu" />
+    <Word from="Ioukkaavaa" to="loukkaavaa" />
+    <Word from="Ioukkaan" to="loukkaan" />
+    <Word from="l'ıedän" to="Tiedän" />
+    <Word from="Iyömästä" to="lyömästä" />
+    <Word from="C/ıâteauneuf" to="Châteauneuf" />
+    <Word from="Iikaisten" to="likaisten" />
+    <Word from="Iapsenlapseton" to="lapsenlapseton" />
+    <Word from="Ieukani" to="leukani" />
+    <Word from="Ientokonetta" to="lentokonetta" />
+    <Word from="Iorrainea" to="lorrainea" />
+    <Word from="Iastentarhaan" to="lastentarhaan" />
+    <Word from="Iupaavin" to="lupaavin" />
+    <Word from="Iastenhoitaja" to="lastenhoitaja" />
+    <Word from="Kegeleitã" to="Kegeleitä" />
+    <Word from="helkkaril" to="helkkari!" />
+    <Word from="Ieukaani" to="leukaani" />
+    <Word from="Iaihtuneen" to="laihtuneen" />
+    <Word from="Iahjoittamaan" to="lahjoittamaan" />
+    <Word from="trefflt" to="treffit" />
+    <Word from="Iöysyys" to="löysyys" />
+    <Word from="Diggleriã" to="Diggleriä" />
+    <Word from="Kuıfi//a" to="Kurtilla" />
+    <Word from="pysãhdellä" to="pysähdellä" />
+    <Word from="Iomaasi" to="lomaasi" />
+    <Word from="Iastattu" to="lastattu" />
+    <Word from="Iasinne" to="lasinne" />
+    <Word from="Iuihin" to="luihin" />
+    <Word from="Iastensuojelujuttuun" to="lastensuojelujuttuun" />
+    <Word from="Ieffaan" to="leffaan" />
+    <Word from="mulkkul" to="mulkku!" />
+    <Word from="Iapsenvahtia" to="lapsenvahtia" />
+    <Word from="Iähelläsi" to="lähelläsi" />
+    <Word from="stã" to="stä" />
+    <Word from="TOSi" to="Tosi" />
+    <Word from="Ioistoidea" to="loistoidea" />
+    <Word from="Tyısiä" to="Tylsiä" />
+    <Word from="lsi" to="Isi" />
+    <Word from="Iaastarin" to="laastarin" />
+    <Word from="Viewjatkuu" to="View jatkuu" />
+    <Word from="lnStylen" to="InStylen" />
+    <Word from="köriläsl" to="köriläs!" />
+    <Word from="Ieffoissa" to="leffoissa" />
+    <Word from="Ieffaseuraksi" to="leffaseuraksi" />
+    <Word from="Iueskelemaan" to="lueskelemaan" />
+    <Word from="Mitäjätkä" to="Mitä jätkä" />
+    <Word from="Iaukesitkaan" to="laukesitkaan" />
+    <Word from="Kiitã" to="Kiitä" />
+    <Word from="ÄãIiö" to="Ääliö" />
+    <Word from="Iyhytpöksy" to="lyhytpöksy" />
+    <Word from="Iacrosse" to="lacrosse" />
+    <Word from="Iöytãmãttã" to="löytämättä" />
+    <Word from="samojajuttuja" to="samoja juttuja" />
+    <Word from="Järvellel" to="Järvelle!" />
+    <Word from="Talouspaperitl" to="Talouspaperit!" />
+    <Word from="Älkäãs" to="Älkääs" />
+    <Word from="pillunaamal" to="pillunaama!" />
+    <Word from="poikaystävänsã" to="poikaystävänsä" />
+    <Word from="Iapsenvahti" to="lapsenvahti" />
+    <Word from="Nykistã" to="Nykistä" />
+    <Word from="Iaatuaikamme" to="laatuaikamme" />
+    <Word from="Käãnsin" to="Käänsin" />
+    <Word from="Iatinaksi" to="latinaksi" />
+    <Word from="yleensäjuo" to="yleensä juo" />
+    <Word from="kreisejãjuttuja" to="kreisejä juttuja" />
+    <Word from="Iiitostasi" to="liitostasi" />
+    <Word from="Mitäjos" to="Mitä jos" />
+    <Word from="Sinullaja" to="Sinulla ja" />
+    <Word from="Iempparini" to="lempparini" />
+    <Word from="Iienetkin" to="lienetkin" />
+    <Word from="Iuokkajuhla" to="luokkajuhla" />
+    <Word from="Iuokkakokouksesta" to="luokkakokouksesta" />
+    <Word from="Iukuteeman" to="lukuteeman" />
+    <Word from="Menejo" to="Mene jo" />
+    <Word from="Sinãjätit" to="Sinä jätit" />
+    <Word from="Iähtöãsi" to="lähtöäsi" />
+    <Word from="Iãäkikseen" to="lääkikseen" />
+    <Word from="puhuajostain" to="puhua jostain" />
+    <Word from="tavatajoku" to="tavata joku" />
+    <Word from="Iookia" to="lookia" />
+    <Word from="Iapsiystävällisempãnã" to="lapsiystävällisempänä" />
+    <Word from="isãnnälle" to="isännälle" />
+    <Word from="tã" to="tä" />
+    <Word from="Ieidi" to="leidi" />
+    <Word from="Kãvisikö" to="Kävisikö" />
+    <Word from="marisãtkä" to="marisätkä" />
+    <Word from="kännissäjärveen" to="kännissä järveen" />
+    <Word from="sinullajotain" to="sinulla jotain" />
+    <Word from="Iuntun" to="luntun" />
+    <Word from="Iunttu" to="lunttu" />
+    <Word from="Iukitsin" to="lukitsin" />
+    <Word from="jyystãä" to="jyystää" />
+    <Word from="Iuokkajuhlaan" to="luokkajuhlaan" />
+    <Word from="Michellestã" to="Michellestä" />
+    <Word from="Iuokkakokous" to="luokkakokous" />
+    <Word from="sinäja" to="sinä ja" />
+    <Word from="Sinãja" to="Sinä ja" />
+    <Word from="Sillãjoskus" to="Sillä joskus" />
+    <Word from="Iopetimme" to="lopetimme" />
+    <Word from="Ymmãrrãtkö" to="Ymmärrätkö" />
+    <Word from="kanssajoka" to="kanssa joka" />
+    <Word from="Iiioitellusti" to="liioitellusti" />
+    <Word from="Iaihalta" to="laihalta" />
+    <Word from="Miaja" to="Mia ja" />
+    <Word from="Mietitãänpã" to="Mietitäänpä" />
+    <Word from="Kyııä" to="Kyllä" />
+    <Word from="Pidãttelel" to="Pidättele!" />
+    <Word from="ymmärtãmisestä" to="ymmärtämisestä" />
+    <Word from="jajään" to="ja jään" />
+    <Word from="Selenaja" to="Selena ja" />
+    <Word from="Iuokkakokousta" to="luokkakokousta" />
+    <Word from="ákápussi" to="äkäpussi" />
+    <Word from="karkoituksen" to="karkotuksen" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines>
+    <Line from="Katsokaa pa." to="Katsokaapa." />
+    <Line from="Mik!&#xD;&#xA;&quot;&quot;e“9iräı" to="Mik!&#xD;&#xA;-Hengitä!" />
+    <Line from="Tu lta!" to="Tulta!" />
+    <Line from="...0I1..." to="...on..." />
+    <Line from="Ken gän nauh oja?" to="Kengännauhoja?" />
+    <Line from="kĂŁmmottĂŁVĂŁllĂŁ mUiStollĂŁ." to="kammottavana muistona." />
+    <Line from="Hän näki naisen menevän&#xD;&#xA;kellarikerroksen ksen asun to o nsä." to="Hän näki naisen menevän&#xD;&#xA;kellarikerroksen asuntoonsa." />
+    <Line from="Minä etsin käsiini miehen, joka&#xD;&#xA;on aurtanutiestradea ja minua:" to="Minä etsin käsiini miehen, joka&#xD;&#xA;on auttanut Lestradea ja minua:" />
+    <Line from="Huomaa erityisesti&#xD;&#xA;punaisella merkitty &quot;kitoris." to="Huomaa erityisesti&#xD;&#xA;punaisella merkitty &quot;klitoris&quot;." />
+    <Line from="Tulkaa, meillä on&#xD;&#xA;Ha vaıji-bileet suihkussa" to="Tulkaa, meillä on&#xD;&#xA;Havaiji-bileet suihkussa" />
+    <Line from="Ta rkoitatko että&#xD;&#xA;hänet myrkytettiin?" to="Tarkoitatko että&#xD;&#xA;hänet myrkytettiin?" />
+    <Line from="Odotta kaa soittoani&#xD;&#xA;Ievähdyspaikalla." to="Odottakaa soittoani&#xD;&#xA;levähdyspaikalla." />
+    <Line from="Nyt kuuntelet, perska rva." to="Nyt kuuntelet, perskarva." />
+    <Line from="Ta patko hänet sitten?" to="Tapatko hänet sitten?" />
+    <Line from="Seuraa vissa va/oissa." to="Seuraavissa valoissa." />
+    <Line from="Aıoıt rapattaa minut.&#xD;&#xA;- En." to="Aioit tapattaa minut.&#xD;&#xA;- En." />
+    <Line from="Todella vaku uttavaa." to="Todella vakuuttavaa." />
+    <Line from="I-le ovat tuolla alhaalla" to="He ovat tuolla alhaalla" />
+    <Line from="Nainen kuuluu minulle.&#xD;&#xA;- I-Iàivy siitä, ylikasvuinen hyttynen!" to="Nainen kuuluu minulle.&#xD;&#xA;- Häivy siitä, ylikasvuinen hyttynen!" />
+    <Line from="I-Ialuatte käyttää pyhàà kiveä&#xD;&#xA;dynastian aarteen löytämiseksi." to="Haluatte käyttää pyhàà kiveä&#xD;&#xA;dynastian aarteen löytämiseksi." />
+    <Line from="Mitäf?" to="Mitä.. ?" />
+    <Line from="Kuuluuko Hiru ko-klaanista mitään?&#xD;&#xA;- Ninjasoturit ovat edellämme." to="Kuuluuko Hiruko-klaanista mitään?&#xD;&#xA;- Ninjasoturit ovat edellämme." />
+    <Line from="Anteeksı} painoin kai... -" to="Anteeksi, painoin kai... -" />
+    <Line from="ja Rea! Ho usewĂ­ves." to="ja Real Housewives." />
+    <Line from="Et halu n n ut Julkkistansseihinkaan." to="Et halunnut Julkkistansseihinkaan." />
+    <Line from="Laard i käsi?" to="Laardikäsi?" />
+    <Line from="Varo kaa!" to="Varokaa!" />
+    <Line from="Näyttävät kö tytöt väh än&#xD;&#xA;h uorahtavi m m i lta?" to="Näyttävätkö tytöt vähän&#xD;&#xA;huorahtavimmilta?" />
+    <Line from="Stif... Ier." to="Stif... ler." />
+    <Line from="J u mantsu kka! M itä?" to="Jumantsukka! Mitä?" />
+    <Line from="Varasin Ch u m bawam ban," to="Varasin Chumbawamban," />
+    <Line from="J u malavita!" to="Jumalavita!" />
+    <Line from="S" to="Isi..." />
+    <Line from="Haluan kertoa jotai n" to="Haluan kertoa jotain" />
+    <Line from="I-Ialuatte" to="Haluatte" />
+  </WholeLines>
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/fra_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/fra_OCRFixReplaceList.xml
new file mode 100644
index 000000000..0bbe1f004
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/fra_OCRFixReplaceList.xml
@@ -0,0 +1,270 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="@immatriculation" to="d'immatriculation" />
+    <Word from="acquer" to="acquér" />
+    <Word from="acteurjoue" to="acteur joue" />
+    <Word from="aerien" to="aérien" />
+    <Word from="agreable" to="agréable" />
+    <Word from="aientjamais" to="aient jamais" />
+    <Word from="AII" to="All" />
+    <Word from="aitjamais" to="ait jamais" />
+    <Word from="aitjus" to="ait jus" />
+    <Word from="alle" to="allé" />
+    <Word from="alles" to="allés" />
+    <Word from="appele" to="appelé" />
+    <Word from="apres" to="après" />
+    <Word from="aujourdhui" to="aujourd'hui" />
+    <Word from="aupres" to="auprès" />
+    <Word from="beaute" to="beauté" />
+    <Word from="cabossee" to="cabossée" />
+    <Word from="carj'" to="car j'" />
+    <Word from="Carj'" to="Car j'" />
+    <Word from="carla" to="car la" />
+    <Word from="CEdipe" to="Ĺ’dipe" />
+    <Word from="Cest" to="C'est" />
+    <Word from="c'etaient" to="c'Ă©taient" />
+    <Word from="CĂ©taient" to="C'Ă©taient" />
+    <Word from="c'etait" to="c'Ă©tait" />
+    <Word from="C'etait" to="C'Ă©tait" />
+    <Word from="CĂ©tait" to="C'Ă©tait" />
+    <Word from="choregraphiee" to="chorégraphiée" />
+    <Word from="cinema" to="cinéma" />
+    <Word from="cl'AIcatraz" to="d'Alcatraz" />
+    <Word from="cles" to="clés" />
+    <Word from="cœurjoie" to="cœur-joie" />
+    <Word from="completer" to="compléter" />
+    <Word from="costumiere" to="costumière" />
+    <Word from="cree" to="créé" />
+    <Word from="daccord" to="d'accord" />
+    <Word from="d'AIbert" to="d'Albert" />
+    <Word from="d'AIdous" to="d'Aldous" />
+    <Word from="d'AIec" to="d'Alec" />
+    <Word from="danniversaire" to="d'anniversaire" />
+    <Word from="d'Arra'bida" to="d'Arrabida" />
+    <Word from="d'autodérision" to="d'auto-dérision" />
+    <Word from="dautres" to="d'autres" />
+    <Word from="debattait" to="débattait" />
+    <Word from="decor" to="décor" />
+    <Word from="decorateurs" to="décorateurs" />
+    <Word from="decors" to="décors" />
+    <Word from="defi" to="défi" />
+    <Word from="dejà" to="déjà" />
+    <Word from="déjàm" to="déjà..." />
+    <Word from="dejeunait" to="déjeunait" />
+    <Word from="dengager" to="d'engager" />
+    <Word from="déquipement" to="d'équipement" />
+    <Word from="dérnièré" to="dernière" />
+    <Word from="Desole" to="Désolé" />
+    <Word from="dessayage" to="d'essayage" />
+    <Word from="dessence" to="d'essence" />
+    <Word from="détaient" to="c'étaient" />
+    <Word from="detail" to="détail" />
+    <Word from="dexcellents" to="d'excellents" />
+    <Word from="dexpérience" to="d'expérience" />
+    <Word from="dexpériences" to="d'expériences" />
+    <Word from="d'héro'l'ne" to="d'héroïne" />
+    <Word from="d'idees" to="d'idées" />
+    <Word from="d'intensite" to="d'intensité" />
+    <Word from="dontj" to="dont j" />
+    <Word from="doublaitAlfo" to="doublait Alfo" />
+    <Word from="DrNo" to="Dr No" />
+    <Word from="e'" to="Ă©" />
+    <Word from="ecrit" to="Ă©crit" />
+    <Word from="elegant" to="élégant" />
+    <Word from="Ellé" to="Elle" />
+    <Word from="Ă©n" to="en" />
+    <Word from="equipe" to="Ă©quipe" />
+    <Word from="erjus" to="er jus" />
+    <Word from="estjamais" to="est jamais" />
+    <Word from="Ă©t" to="et" />
+    <Word from="etaient" to="Ă©taient" />
+    <Word from="etait" to="Ă©tait" />
+    <Word from="ete" to="été" />
+    <Word from="etiez" to="Ă©tiez" />
+    <Word from="etj'" to="et j'" />
+    <Word from="Etj'" to="Et j'" />
+    <Word from="etje" to="et je" />
+    <Word from="Etje" to="Et je" />
+    <Word from="EtsouvenL" to="Et souvent" />
+    <Word from="eviter" to="Ă©viter" />
+    <Word from="Fabsence" to="l'absence" />
+    <Word from="fadapter" to="t'adapter" />
+    <Word from="fadore" to="j'adore" />
+    <Word from="Fâge" to="l'âge" />
+    <Word from="Fagent" to="l'agent" />
+    <Word from="faiessayé" to="j'ai essayé" />
+    <Word from="Failure" to="l'alllure" />
+    <Word from="Fambiance" to="l'ambiance" />
+    <Word from="Famener" to="l'amener" />
+    <Word from="Fanniversaire" to="l'anniversaire" />
+    <Word from="Fapparence" to="l'apparence" />
+    <Word from="Fapres" to="l'apres" />
+    <Word from="Faprès" to="l'après" />
+    <Word from="Farmée" to="l'armée" />
+    <Word from="Farrière" to="l'arrière" />
+    <Word from="Farrivée" to="l'arrivée" />
+    <Word from="Fascenseur" to="l'ascenseur" />
+    <Word from="Fascension" to="l'ascension" />
+    <Word from="Fassaut" to="l'assaut" />
+    <Word from="Fassomme" to="l'assomme" />
+    <Word from="Fatmosphère" to="l'atmosphère" />
+    <Word from="Fattention" to="l'attention" />
+    <Word from="Favalanche" to="l'avalanche" />
+    <Word from="FĂ©clairage" to="l'Ă©clairage" />
+    <Word from="FĂ©cran" to="l'Ă©cran" />
+    <Word from="FĂ©motion" to="l'Ă©motion" />
+    <Word from="Femplacement" to="l'emplacement" />
+    <Word from="Fendroit" to="l'endroit" />
+    <Word from="Fenseigne" to="l'enseigne" />
+    <Word from="Fensemble" to="l'ensemble" />
+    <Word from="Fentouraient" to="l'entouraient" />
+    <Word from="Fentrée" to="l'entrée" />
+    <Word from="FĂ©paisseur" to="l'Ă©paisseur" />
+    <Word from="FĂ©poque" to="l'Ă©poque" />
+    <Word from="Féquipe" to="Équipe" />
+    <Word from="Fespace" to="l'espace" />
+    <Word from="fespérais" to="j'espérais" />
+    <Word from="Fespère" to="l'espère" />
+    <Word from="Festhétique" to="l'esthétique" />
+    <Word from="Fetranger" to="l'etranger" />
+    <Word from="FĂ©vasion" to="l'Ă©vasion" />
+    <Word from="FĂ©voque" to="l'Ă©voque" />
+    <Word from="Fexpérience" to="l'expérience" />
+    <Word from="Fexplique" to="l'explique" />
+    <Word from="Fexplosion" to="l'explosion" />
+    <Word from="Fextérieur" to="l'extérieur" />
+    <Word from="Fhabituelle" to="l'habituelle" />
+    <Word from="Fhélicoptère" to="l'hélicoptère" />
+    <Word from="Fhéliport" to="l'héliport" />
+    <Word from="Fhélistation" to="l'hélistation" />
+    <Word from="Fhonneur" to="l'honneur" />
+    <Word from="Fhorloge" to="l'horloge" />
+    <Word from="Fidée" to="l'idée" />
+    <Word from="Fimage" to="l'image" />
+    <Word from="Fimportance" to="l'importance" />
+    <Word from="Fimpression" to="l'impression" />
+    <Word from="Finfluence" to="l'influence" />
+    <Word from="Finscription" to="l'inscription" />
+    <Word from="Fintérieur" to="l'intérieur" />
+    <Word from="Fintrigue" to="l'intrigue" />
+    <Word from="Fobjectif" to="l'objectif" />
+    <Word from="Foccasion" to="l'occasion" />
+    <Word from="Fordre" to="l'ordre" />
+    <Word from="Forigine" to="l'origine" />
+    <Word from="frêre" to="frère" />
+    <Word from="gaylns" to="gaijins" />
+    <Word from="general" to="général" />
+    <Word from="hawaĂŻennel" to="hawaĂŻenne" />
+    <Word from="hawa'l'en" to="hawaĂŻen" />
+    <Word from="Ia" to="la" />
+    <Word from="IĂ " to="lĂ " />
+    <Word from="Iaryngotomie" to="laryngotomie" />
+    <Word from="idee" to="idée" />
+    <Word from="idees" to="idées" />
+    <Word from="Ie" to="le" />
+    <Word from="Ies" to="les" />
+    <Word from="Iester" to="Lester" />
+    <Word from="II" to="Il" />
+    <Word from="Iimit" to="limit" />
+    <Word from="IIs" to="Ils" />
+    <Word from="immediatement" to="immédiatement" />
+    <Word from="insufflee" to="insufflée" />
+    <Word from="integrer" to="intégrer" />
+    <Word from="interessante" to="intéressante" />
+    <Word from="Iogions" to="logions" />
+    <Word from="Iorsqu" to="lorsqu" />
+    <Word from="isee" to="isée" />
+    <Word from="Iumiere" to="lumiere" />
+    <Word from="Iynchage" to="lynchage" />
+    <Word from="J'espere" to="J'espère" />
+    <Word from="Jessaie" to="J'essaie" />
+    <Word from="j'etais" to="j'Ă©tais" />
+    <Word from="J'etais" to="J'Ă©tais" />
+    <Word from="latéralémént" to="latéralement" />
+    <Word from="lci" to="Ici" />
+    <Word from="Lci" to="Ici" />
+    <Word from="lé-" to="là-" />
+    <Word from="lepidopteres" to="lépidoptères" />
+    <Word from="litteraire" to="littéraire" />
+    <Word from="ll" to="il" />
+    <Word from="Ll" to="Il" />
+    <Word from="lls" to="ils" />
+    <Word from="Lls" to="Ils" />
+    <Word from="maintenanu" to="maintenant" />
+    <Word from="maniere" to="manière" />
+    <Word from="mariee" to="mariée" />
+    <Word from="Mayer/ing" to="Mayerling" />
+    <Word from="meilleurjour" to="meilleur jour" />
+    <Word from="melange" to="mélange" />
+    <Word from="n'avaiént" to="n'avaient" />
+    <Word from="n'etait" to="n'Ă©tait" />
+    <Word from="oitjamais" to="oit jamais" />
+    <Word from="oitjus" to="oit jus" />
+    <Word from="ontete" to="ont été" />
+    <Word from="operateur" to="opérateur" />
+    <Word from="ouvérté" to="ouverte" />
+    <Word from="PĂ©preuve" to="l'Ă©preuve" />
+    <Word from="pere" to="père" />
+    <Word from="plateforme" to="plate-forme" />
+    <Word from="pourjouer" to="pour jouer" />
+    <Word from="precipice" to="précipice" />
+    <Word from="preferes" to="préférés" />
+    <Word from="premierjour" to="premier jour" />
+    <Word from="presenter" to="présenter" />
+    <Word from="prevu" to="prévu" />
+    <Word from="prevue" to="prévue" />
+    <Word from="propriete" to="propriété" />
+    <Word from="protègeraient" to="protégeraient" />
+    <Word from="qué" to="que" />
+    <Word from="qwangoissé" to="qu'angoissé" />
+    <Word from="realisateur" to="réalisateur" />
+    <Word from="reception" to="réception" />
+    <Word from="reévalu" to="réévalu" />
+    <Word from="repute" to="réputé" />
+    <Word from="reussi" to="réussi" />
+    <Word from="s'arrétait" to="s'arrêtait" />
+    <Word from="s'ave'rer" to="s'avérer" />
+    <Word from="scenario" to="scénario" />
+    <Word from="scene" to="scène" />
+    <Word from="scenes" to="scènes" />
+    <Word from="seances" to="séances" />
+    <Word from="sequence" to="séquence" />
+    <Word from="sflécrasa" to="s'écrasa" />
+    <Word from="speciale" to="spéciale" />
+    <Word from="Supen" to="Super" />
+    <Word from="torturee" to="torturée" />
+    <Word from="Uadmirable" to="L'admirable" />
+    <Word from="Uensemblier" to="L'ensemblier" />
+    <Word from="Uexplosion" to="L'explosion" />
+    <Word from="Uouvre" to="L'ouvre" />
+    <Word from="Vaise" to="l'aise" />
+    <Word from="vecu" to="vécu" />
+    <Word from="vehicules" to="véhicules" />
+    <Word from="Ÿappréciais" to="J'appréciais" />
+    <Word from="Ÿespère" to="J'espère" />
+    <Word from="ÿétrangle" to="s'étrangle" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines>
+    <LinePart from=" I'" to=" l'" />
+    <LinePart from=" |'" to=" l'" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines>
+    <Line from="&quot;D'ac:c:ord.&quot;" to="&quot;D'accord.&quot;" />
+    <Line from="“i QUÎ gagne, qui perd," to="ni qui gagne, qui perd," />
+    <Line from="L'ac:c:ent est mis &#xD;&#xA; &#xD;&#xA; sur son trajet jusqu'en Suisse." to="L'accent est mis &#xD;&#xA; &#xD;&#xA; sur son trajet jusqu'en Suisse." />
+    <Line from="C'est la plus gentille chose &#xD;&#xA; &#xD;&#xA; qu'Hitchc:oc:k m'ait jamais dite." to="C'est la plus gentille chose &#xD;&#xA; &#xD;&#xA; qu'Hitchcock m'ait jamais dite." />
+    <Line from="Tout le monde, en revanche, qualifie &#xD;&#xA; &#xD;&#xA; Goldfinger d'aventu re structurée," to="Tout le monde, en revanche, qualifie &#xD;&#xA; &#xD;&#xA; Goldfinger d'aventure structurée," />
+    <Line from="et le film Shadow of a man &#xD;&#xA; &#xD;&#xA; a lancé sa carrière au cinéma." to="et le film &lt;i&gt;Shadow of a man&lt;/i&gt; &#xD;&#xA; &#xD;&#xA; a lancé sa carrière au cinéma." />
+    <Line from="En 1948, Young est passé à la réalisation &#xD;&#xA; &#xD;&#xA; avec One night with you." to="En 1948, Young est passé à la réalisation &#xD;&#xA; &#xD;&#xA; avec &lt;i&gt;One night with you&lt;/i&gt;." />
+    <Line from="Il a construit tous ces véhicules &#xD;&#xA; &#xD;&#xA; à C)c:ala, en Floride." to="Il a construit tous ces véhicules &#xD;&#xA; &#xD;&#xA; à Ocala, en Floride." />
+    <Line from="Tokyo Pop et A Taxing Woman? Return." to="Tokyo Pop et A Taxing Woman's Return." />
+    <Line from="Peter H u nt." to="Peter Hunt." />
+    <Line from="&quot;C'est bien mieux dans Peau. &#xD;&#xA; &#xD;&#xA; On peut sfléclabousser, faire du bruit.&quot;" to="&quot;C'est bien mieux dans l'eau. &#xD;&#xA; &#xD;&#xA; On peut s'éclabousser, faire du bruit.&quot;" />
+  </WholeLines>
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml
new file mode 100644
index 000000000..4097a7519
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/hrv_OCRFixReplaceList.xml
@@ -0,0 +1,3046 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="advokati" to="odvjetnici" />
+    <Word from="Advokati" to="Odvjetnici" />
+    <Word from="advokatima" to="odvjetnicima" />
+    <Word from="Advokatima" to="Odvjetnicima" />
+    <Word from="afirmiše" to="afirmira" />
+    <Word from="akcenat" to="naglasak" />
+    <Word from="akcionara" to="dioniÄŤara" />
+    <Word from="akvarijum" to="akvarij" />
+    <Word from="akvarijumu" to="akvariju" />
+    <Word from="amin" to="amen" />
+    <Word from="Amin" to="Amen" />
+    <Word from="ans" to="nas" />
+    <Word from="apsorbovanje" to="apsorbiranje" />
+    <Word from="apsorbuje" to="apsorbira" />
+    <Word from="azot" to="dušik" />
+    <Word from="bašta" to="vrt" />
+    <Word from="Bašta" to="Vrt" />
+    <Word from="bašte" to="vrtovi" />
+    <Word from="Bašte" to="Vrtovi" />
+    <Word from="bašti" to="vrtu" />
+    <Word from="baštu" to="vrt" />
+    <Word from="Baštu" to="Vrt" />
+    <Word from="baštom" to="vrtom" />
+    <Word from="bedan" to="bijedan" />
+    <Word from="bede" to="bijede" />
+    <Word from="bedi" to="bijedi" />
+    <Word from="bejah" to="bijah" />
+    <Word from="bejahu" to="bijahu" />
+    <Word from="belešci" to="bilješci" />
+    <Word from="bešike" to="mjehure" />
+    <Word from="bebisiterka" to="dadilja" />
+    <Word from="beg" to="bijeg" />
+    <Word from="begu" to="bijegu" />
+    <Word from="begstva" to="bijega" />
+    <Word from="bejaše" to="bijaše" />
+    <Word from="bekstvo" to="bijeg" />
+    <Word from="bekstvu" to="bijegu" />
+    <Word from="begstvu" to="bijegu" />
+    <Word from="bes" to="bijes" />
+    <Word from="besa" to="bijesa" />
+    <Word from="besan" to="bijesan" />
+    <Word from="besom" to="bijesom" />
+    <Word from="besu" to="bijesu" />
+    <Word from="beše" to="bješe" />
+    <Word from="bimso" to="bismo" />
+    <Word from="blijeđi" to="bljeđi" />
+    <Word from="bioje" to="bio je" />
+    <Word from="bi smo" to="bismo" />
+    <Word from="bi ste" to="biste" />
+    <Word from="bioskop" to="kino" />
+    <Word from="bioskopi" to="kina" />
+    <Word from="bitci" to="bitki" />
+    <Word from="bled" to="blijed" />
+    <Word from="blede" to="blijede" />
+    <Word from="boksuješ" to="boksaš" />
+    <Word from="bolesan" to="bolestan" />
+    <Word from="bolila" to="boljela" />
+    <Word from="borićeš" to="borit ćeš" />
+    <Word from="Borićeš" to="Borit ćeš" />
+    <Word from="braon" to="smeđa" />
+    <Word from="bregu" to="brijegu" />
+    <Word from="bti" to="biti" />
+    <Word from="cedilu" to="cjedilu" />
+    <Word from="ceo" to="cijeli" />
+    <Word from="Ceo" to="Cijeli" />
+    <Word from="cepa" to="cijepa" />
+    <Word from="cev" to="cijev" />
+    <Word from="cevi" to="cijevi" />
+    <Word from="cjevi" to="cijevi" />
+    <Word from="cevima" to="cijevima" />
+    <Word from="Cevi" to="Cijevi" />
+    <Word from="Cjevi" to="Cijevi" />
+    <Word from="Cevima" to="Cijevima" />
+    <Word from="Cjevima" to="Cijevima" />
+    <Word from="cevÄŤica" to="cjevÄŤica" />
+    <Word from="cevÄŤicu" to="cjevÄŤicu" />
+    <Word from="cutanje" to="šutnja" />
+    <Word from="čutanje" to="šutnja" />
+    <Word from="ćutanje" to="šutnja" />
+    <Word from="Cutanje" to="Ĺ utnja" />
+    <Word from="ÄŚutanje" to="Ĺ utnja" />
+    <Word from="Ćutanje" to="Šutnja" />
+    <Word from="cutanjem" to="šutnjom" />
+    <Word from="čutanjem" to="šutnjom" />
+    <Word from="ćutanjem" to="šutnjom" />
+    <Word from="Cutanjem" to="Ĺ utnjom" />
+    <Word from="ÄŚutanjem" to="Ĺ utnjom" />
+    <Word from="Ćutanjem" to="Šutnjom" />
+    <Word from="cvetaju" to="cvjetaju" />
+    <Word from="cvetove" to="cvjetove" />
+    <Word from="cvetu" to="cvijetu" />
+    <Word from="cvjetu" to="cvijetu" />
+    <Word from="cvetalo" to="cvjetalo" />
+    <Word from="cvjetom" to="cvijetom" />
+    <Word from="ÄŚakom" to="Chuckom" />
+    <Word from="čaršav" to="plahta" />
+    <Word from="čaršave" to="plahte" />
+    <Word from="čaršavi" to="plahte" />
+    <Word from="čaršavima" to="plahtama" />
+    <Word from="ÄŤas" to="sat" />
+    <Word from="ÄŤetvoro" to="ÄŤetvero" />
+    <Word from="Čitaću" to="Čitat ću" />
+    <Word from="čerku" to="kćer" />
+    <Word from="Čerku" to="Kćer" />
+    <Word from="ćerku" to="kćer" />
+    <Word from="Ćerku" to="Kćer" />
+    <Word from="ćerkama" to="kćerima" />
+    <Word from="čerkama" to="kćerima" />
+    <Word from="ćerkom" to="kćeri" />
+    <Word from="čerkom" to="kćeri" />
+    <Word from="kćerkom" to="kćeri" />
+    <Word from="kčerkom" to="kćeri" />
+    <Word from="Ču" to="Ću" />
+    <Word from="Češ" to="Ćeš" />
+    <Word from="Če" to="Će" />
+    <Word from="Čemo" to="Ćemo" />
+    <Word from="Čete" to="Ćete" />
+    <Word from="ču" to="ću" />
+    <Word from="češ" to="ćeš" />
+    <Word from="če" to="će" />
+    <Word from="čemo" to="ćemo" />
+    <Word from="čete" to="ćete" />
+    <Word from="ćebe" to="deku" />
+    <Word from="ćebetu" to="deki" />
+    <Word from="ÄŤk" to="ÄŤak" />
+    <Word from="ćš" to="ćeš" />
+    <Word from="ćale" to="tata" />
+    <Word from="ćaletom" to="ocem" />
+    <Word from="ćaleta" to="oca" />
+    <Word from="ćaletu" to="ocu" />
+    <Word from="ćorsokak" to="slijepa ulica" />
+    <Word from="ćorsokaku" to="slijepoj ulici" />
+    <Word from="ćošak" to="ugao" />
+    <Word from="ćošku" to="uglu" />
+    <Word from="ćerka" to="kći" />
+    <Word from="Ćerka" to="Kći" />
+    <Word from="ćmo" to="ćemo" />
+    <Word from="ćte" to="ćete" />
+    <Word from="čuće" to="čut će" />
+    <Word from="čućemo" to="čut ćemo" />
+    <Word from="Čućemo" to="Čut ćemo" />
+    <Word from="Čućete" to="Čut ćete" />
+    <Word from="Čuće" to="Čut će" />
+    <Word from="ćuo" to="čuo" />
+    <Word from="ćutao" to="šutio" />
+    <Word from="Ćutao" to="Šutio" />
+    <Word from="ćute" to="šute" />
+    <Word from="Ćute" to="Šute" />
+    <Word from="cvetova" to="cvjetova" />
+    <Word from="daga" to="da ga" />
+    <Word from="damas" to="danas" />
+    <Word from="date" to="dane" />
+    <Word from="deda" to="djed" />
+    <Word from="Deda" to="Djed" />
+    <Word from="dede" to="djeda" />
+    <Word from="dedi" to="djedu" />
+    <Word from="dedom" to="djedom" />
+    <Word from="definiše" to="definira" />
+    <Word from="dejstvo" to="djelovanje" />
+    <Word from="Dejstvo" to="Djelovanje" />
+    <Word from="dejstvom" to="djelovanjem" />
+    <Word from="Dejstvom" to="Djelovanjem" />
+    <Word from="deleći" to="dijeleći" />
+    <Word from="deo" to="dio" />
+    <Word from="Deo" to="Dio" />
+    <Word from="dešava" to="događa" />
+    <Word from="dete" to="dijete" />
+    <Word from="Dete" to="Dijete" />
+    <Word from="diluje" to="dila" />
+    <Word from="diluju" to="dilaju" />
+    <Word from="diskutuje" to="raspravlja" />
+    <Word from="Diskutuje" to="Raspravlja" />
+    <Word from="diskutujemo" to="raspravljamo" />
+    <Word from="Diskutujemo" to="Raspravljamo" />
+    <Word from="djete" to="dijete" />
+    <Word from="Djete" to="Dijete" />
+    <Word from="detektuje" to="detektira" />
+    <Word from="dodju" to="dođu" />
+    <Word from="dole" to="dolje" />
+    <Word from="Dole" to="Dolje" />
+    <Word from="donijeo" to="donio" />
+    <Word from="Donijeo" to="Donio" />
+    <Word from="Donijeću" to="Donijet ću" />
+    <Word from="dosledan" to="dosljedan" />
+    <!-- nije za regex [ni dospeo - ni dospeju - mora ostati ovako] -->
+    <Word from="dospeo" to="dospio" />
+    <Word from="dospeju" to="dospiju" />
+    <Word from="dođavola" to="dovraga" />
+    <Word from="Dođavola" to="Dovraga" />
+    <Word from="drug" to="prijatelj" />
+    <Word from="drugari" to="prijatelji" />
+    <Word from="drugare" to="prijatelje" />
+    <Word from="drugÄŤiji" to="drugaÄŤiji" />
+    <Word from="drugde" to="drugdje" />
+    <Word from="duuga" to="dĂşga" />
+    <Word from="duvana" to="duhana" />
+    <Word from="dve" to="dvije" />
+    <Word from="Dve" to="Dvije" />
+    <Word from="dvema" to="dvjema" />
+    <Word from="Ä‘avo" to="vrag" />
+    <Word from="Ä‘avola" to="vraga" />
+    <Word from="Ä‘emper" to="dĹľemper" />
+    <Word from="dĹľanki" to="ovisnik" />
+    <Word from="dĹľelat" to="krvnik" />
+    <Word from="đubre" to="smeće" />
+    <Word from="efekat" to="efekt" />
+    <Word from="eksperata" to="struÄŤnjaka" />
+    <Word from="eksperti" to="struÄŤnjaci" />
+    <Word from="Eksperti" to="StruÄŤnjaci" />
+    <Word from="ekspertima" to="struÄŤnjacima" />
+    <Word from="en" to="ne" />
+    <Word from="emitovao" to="emitirao" />
+    <Word from="emitovati" to="emitirati" />
+    <Word from="emituje" to="emitira" />
+    <Word from="emitujem" to="emitiram" />
+    <Word from="Emitujem" to="Emitiram" />
+    <Word from="emituju" to="emitiraju" />
+    <Word from="evra" to="eura" />
+    <Word from="familija" to="obitelj" />
+    <Word from="Familija" to="Obitelj" />
+    <Word from="familiju" to="obitelj" />
+    <Word from="Familiju" to="Obitelj" />
+    <Word from="familijama" to="obiteljima" />
+    <Word from="familiji" to="obitelji" />
+    <Word from="flertuje" to="oÄŤijuka" />
+    <Word from="foka" to="tuljan" />
+    <Word from="foku" to="tuljana" />
+    <Word from="foke" to="tuljani" />
+    <Word from="fokama" to="tuljanima" />
+    <Word from="fotografišu" to="fotografiraju" />
+    <Word from="gasova" to="plinova" />
+    <Word from="gde" to="gdje" />
+    <Word from="Gde" to="Gdje" />
+    <Word from="gluhonem" to="gluhonijem" />
+    <Word from="greše" to="griješe" />
+    <Word from="grješe" to="griješe" />
+    <Word from="greši" to="griješi" />
+    <Word from="grješi" to="griješi" />
+    <Word from="greški" to="grešci" />
+    <Word from="grijehova" to="grijeha" />
+    <Word from="grijehove" to="grijehe" />
+    <Word from="hipnotisao" to="hipnotizirao" />
+    <Word from="hipnotisana" to="hipnotizirana" />
+    <Word from="hipnotiše" to="hipnotizira" />
+    <Word from="Historija" to="Povijest" />
+    <Word from="Historiju" to="Povijest" />
+    <Word from="Historije" to="Povijesti" />
+    <Word from="Historiji" to="Povijesti" />
+    <Word from="Istorija" to="Povijest" />
+    <Word from="Istoriju" to="Povijest" />
+    <Word from="Istorije" to="Povijesti" />
+    <Word from="Istoriji" to="Povijesti" />
+    <Word from="historije" to="povijesti" />
+    <Word from="historiji" to="povijesti" />
+    <Word from="istorije" to="povijesti" />
+    <Word from="istoriji" to="povijesti" />
+    <Word from="istorijom" to="poviješću" />
+    <Word from="hakuje" to="hakira" />
+    <Word from="Hakuje" to="Hakira" />
+    <Word from="hakujemo" to="hakiramo" />
+    <Word from="Hakujemo" to="Hakiramo" />
+    <Word from="Hakuju" to="Hakiraju" />
+    <Word from="hakuju" to="hakiraju" />
+    <Word from="hoču" to="hoću" />
+    <Word from="Hoču" to="Hoću" />
+    <Word from="hteće" to="htjet će" />
+    <Word from="htedoh" to="htjedoh" />
+    <Word from="Htjeo" to="Htio" />
+    <Word from="Hteo" to="Htio" />
+    <Word from="htjeo" to="htio" />
+    <Word from="hteo" to="htio" />
+    <Word from="iči" to="ići" />
+    <Word from="Iči" to="Ići" />
+    <Word from="iko" to="itko" />
+    <Word from="ignoriši" to="ignoriraj" />
+    <Word from="Ignoriši" to="Ignoriraj" />
+    <Word from="ignorišite" to="ignorirajte" />
+    <Word from="Ignorišite" to="Ignorirajte" />
+    <Word from="ignorišu" to="ignoriraju" />
+    <Word from="ilustruju" to="ilustriraju" />
+    <Word from="inspirisao" to="inspirirao" />
+    <Word from="interesantan" to="zanimljiv" />
+    <Word from="Interesantan" to="Zanimljiv" />
+    <Word from="interesuje" to="zanima" />
+    <Word from="Interesuje" to="Zanima" />
+    <Word from="interesujemo" to="zanimamo" />
+    <Word from="Interesujemo" to="Zanimamo" />
+    <Word from="interesujete" to="zanimate" />
+    <Word from="Interesujete" to="Zanimate" />
+    <Word from="Interesuju" to="Zanimaju" />
+    <Word from="interesuju" to="zanimaju" />
+    <Word from="isekao" to="izrezao" />
+    <Word from="isterao" to="istjerao" />
+    <Word from="isteraš" to="istjeraš" />
+    <Word from="Isteraš" to="Istjeraš" />
+    <Word from="istrebi" to="istrijebi" />
+    <Word from="istrebiti" to="istrijebiti" />
+    <Word from="isuviše" to="previše" />
+    <Word from="ivica" to="rub" />
+    <Word from="ivice" to="ruba" />
+    <Word from="ivici" to="rubu" />
+    <Word from="ivicu" to="rub" />
+    <Word from="izduvaj" to="ispuši" />
+    <Word from="izduvamo" to="ispušemo" />
+    <Word from="izoluje" to="izolira" />
+    <Word from="izolujemo" to="izoliramo" />
+    <Word from="izoluješ" to="izoliraš" />
+    <Word from="Izolujete" to="Izolirate" />
+    <Word from="Izolujte" to="Izolirajte" />
+    <Word from="izolujte" to="izolirajte" />
+    <Word from="izgladneo" to="izgladnio" />
+    <Word from="izmeriti" to="izmjeriti" />
+    <Word from="izmerio" to="izmjerio" />
+    <Word from="izmešane" to="izmiješane" />
+    <Word from="izneo" to="iznio" />
+    <Word from="izneti" to="iznijeti" />
+    <Word from="izvestan" to="izvjestan" />
+    <Word from="izvinem" to="ispriÄŤam" />
+    <Word from="izvineš" to="ispričaš" />
+    <Word from="Izvinem" to="IspriÄŤam" />
+    <Word from="Izvineš" to="Ispričaš" />
+    <Word from="izvinim" to="ispriÄŤam" />
+    <Word from="izviniš" to="ispričaš" />
+    <Word from="izviniti" to="ispriÄŤati" />
+    <Word from="izvinjenje" to="isprika" />
+    <Word from="izvinjenja" to="isprike" />
+    <Word from="izvinjenju" to="isprici" />
+    <Word from="jedamput" to="jedanput" />
+    <Word from="jelda" to="jel' da" />
+    <Word from="Ješćemo" to="Jest ćemo" />
+    <Word from="Ješćeš" to="Jest ćeš" />
+    <Word from="ješće" to="jest će" />
+    <Word from="ješću" to="jest ću" />
+    <Word from="Ješću" to="Jest ću" />
+    <Word from="ješćeš" to="jest ćeš" />
+    <Word from="ješćemo" to="jest ćemo" />
+    <Word from="juÄŤe" to="juÄŤer" />
+    <Word from="JuÄŤe" to="JuÄŤer" />
+    <Word from="kakava" to="kakva" />
+    <Word from="kampovao" to="kampirao" />
+    <Word from="kampuje" to="kampira" />
+    <Word from="kampujemo" to="kampiramo" />
+    <Word from="kampuju" to="kampiraju" />
+    <Word from="kancelarija" to="ured" />
+    <Word from="kancelarijama" to="uredima" />
+    <Word from="kancelariju" to="ured" />
+    <Word from="Kancelarija" to="Ured" />
+    <Word from="Kancelariju" to="Ured" />
+    <Word from="kancelariji" to="uredu" />
+    <Word from="kancelarije" to="ureda" />
+    <Word from="kancelarijom" to="uredom" />
+    <Word from="kancera" to="raka" />
+    <Word from="kandidovati" to="kandidirati" />
+    <Word from="kandidujem" to="kandidiram" />
+    <Word from="kapar" to="kopar" />
+    <Word from="kapra" to="kopra" />
+    <Word from="karmin" to="ruĹľ" />
+    <Word from="karminom" to="ruĹľem" />
+    <Word from="kćerci" to="kćeri" />
+    <Word from="kćerka" to="kći" />
+    <Word from="kčerka" to="kći" />
+    <Word from="Kćerka" to="Kći" />
+    <Word from="Kčerka" to="Kći" />
+    <Word from="kćerkama" to="kćerima" />
+    <Word from="ker" to="pas" />
+    <Word from="Ker" to="Pas" />
+    <Word from="kerova" to="pasa" />
+    <Word from="kidnapovan" to="otet" />
+    <Word from="Kidnapovan" to="Otet" />
+    <Word from="kiji" to="koji" />
+    <Word from="kijim" to="kojim" />
+    <Word from="klasifikuju" to="klasificiraju" />
+    <Word from="klešta" to="kliješta" />
+    <Word from="klješta" to="kliješta" />
+    <Word from="Ko" to="Tko" />
+    <Word from="koa" to="kao" />
+    <Word from="koaj" to="koja" />
+    <Word from="kola" to="auto" />
+    <Word from="kolima" to="autu" />
+    <Word from="komandni" to="zapovjedni" />
+    <Word from="kombinuju" to="kombiniraju" />
+    <Word from="kompanija" to="tvrtka" />
+    <Word from="komponovao" to="skladao" />
+    <Word from="komšija" to="susjed" />
+    <Word from="komšiji" to="susjedu" />
+    <Word from="komšiju" to="susjeda" />
+    <Word from="komšiluk" to="susjedstvo" />
+    <Word from="komšiluka" to="susjedstva" />
+    <Word from="komšiluku" to="susjedstvu" />
+    <Word from="komšije" to="susjedi" />
+    <Word from="komšijama" to="susjedima" />
+    <Word from="komšinica" to="susjeda" />
+    <Word from="komšinicu" to="susjedu" />
+    <Word from="konektovan" to="spojen" />
+    <Word from="konektovati" to="spojiti" />
+    <Word from="kontrolišu" to="kontroliraju" />
+    <Word from="Kontrolišu" to="Kontroliraju" />
+    <Word from="Kontroliši" to="Kontroliraj" />
+    <Word from="kontroliši" to="kontroliraj" />
+    <Word from="Kontrolišite" to="Kontrolirajte" />
+    <Word from="kontrolišite" to="kontrolirajte" />
+    <Word from="korpu" to="košaru" />
+    <Word from="kritikuju" to="kritiziraju" />
+    <Word from="krsta" to="kriĹľa" />
+    <Word from="krstaši" to="križari" />
+    <Word from="krstu" to="kriĹľu" />
+    <Word from="krstića" to="križića" />
+    <Word from="krstiću" to="križiću" />
+    <Word from="Krsta" to="KriĹľa" />
+    <Word from="Krstu" to="KriĹľu" />
+    <Word from="Krstića" to="Križića" />
+    <Word from="Krstiću" to="Križiću" />
+    <Word from="krstom" to="kriĹľem" />
+    <Word from="krstove" to="kriĹľeve" />
+    <Word from="Krstove" to="KriĹľeve" />
+    <Word from="krstovima" to="kriĹľevima" />
+    <Word from="Krstovima" to="KriĹľevima" />
+    <Word from="kriĹľom" to="kriĹľem" />
+    <Word from="kupatilo" to="kupaona" />
+    <Word from="kupatilu" to="kupaoni" />
+    <Word from="kvalifikuju" to="kvalificiraju" />
+    <Word from="laĹľeju" to="laĹľu" />
+    <Word from="LaĹľov" to="LaĹľljivac" />
+    <Word from="laĹľov" to="laĹľljivac" />
+    <Word from="laĹľovi" to="laĹľljivci" />
+    <Word from="laĹľovu" to="laĹľljivcu" />
+    <Word from="laĹľovima" to="laĹľljivcima" />
+    <Word from="laĹľovom" to="laĹľljivcem" />
+    <Word from="lebdeo" to="lebdio" />
+    <Word from="leÄŤi" to="lijeÄŤi" />
+    <Word from="leÄŤe" to="lijeÄŤe" />
+    <Word from="ljeÄŤi" to="lijeÄŤi" />
+    <Word from="LeÄŤi" to="LijeÄŤi" />
+    <Word from="LjeÄŤi" to="LijeÄŤi" />
+    <Word from="Lejn" to="Lane" />
+    <Word from="Lenja" to="Lijena" />
+    <Word from="lenji" to="lijeni" />
+    <Word from="lenja" to="lijena" />
+    <Word from="lešnik" to="lješnjak" />
+    <Word from="Leta" to="Ljeta" />
+    <Word from="leto" to="ljeto" />
+    <Word from="Leto" to="Ljeto" />
+    <Word from="letos" to="ljetos" />
+    <Word from="letiti" to="letjeti" />
+    <Word from="leve" to="lijeve" />
+    <Word from="loĹľi" to="pali" />
+    <Word from="lza" to="Iza" />
+    <Word from="ljepiti" to="lijepiti" />
+    <Word from="ljepili" to="lijepili" />
+    <Word from="magnezijuma" to="magnezija" />
+    <Word from="magnezijumu" to="magneziju" />
+    <Word from="maja" to="svibnja"/>
+    <Word from="maju" to="svibnju"/>
+    <Word from="majem" to="svibnjem"/>
+    <Word from="majca" to="majica" />
+    <Word from="majce" to="majice" />
+    <Word from="majcu" to="majicu" />
+    <Word from="majcom" to="majicom" />
+    <Word from="Malopre" to="Malo prije" />
+    <Word from="malopre" to="malo prije" />
+    <Word from="maloprije" to="malo prije" />
+    <Word from="manifestuje" to="manifestira" />
+    <Word from="manifestuju" to="manifestiraju" />
+    <Word from="marta" to="oĹľujka" />
+    <Word from="martu" to="oĹľujku"/>
+    <Word from="martom" to="oĹľujkom" />
+    <Word from="mehur" to="mjehur" />
+    <Word from="menom" to="mnom" />
+    <Word from="meraÄŤ" to="mjeraÄŤ" />
+    <Word from="meri" to="mjeri" />
+    <Word from="mere" to="mjere" />
+    <Word from="merdevine" to="ljestve" />
+    <Word from="merdevinama" to="ljestvama" />
+    <Word from="merljivo" to="mjerljivo" />
+    <Word from="mešane" to="miješane" />
+    <Word from="mešavina" to="mješavina" />
+    <Word from="mešavine" to="mješavine" />
+    <Word from="mešavinu" to="mješavinu" />
+    <Word from="minut" to="minutu" />
+    <Word from="mleo" to="mljeo" />
+    <Word from="moč" to="moć" />
+    <Word from="mofu" to="mogu" />
+    <Word from="momenat" to="trenutak" />
+    <Word from="momenta" to="trena" />
+    <Word from="muzejem" to="muzejom" />
+    <Word from="muzici" to="glazbi" />
+    <Word from="muzika" to="glazba" />
+    <Word from="muzike" to="glazbe" />
+    <Word from="muzikom" to="glazbom" />
+    <Word from="Muzika" to="Glazba" />
+    <Word from="Muzike" to="Glazbe" />
+    <Word from="Muzikom" to="Glazbom" />
+    <Word from="nači" to="naći" />
+    <Word from="nadevati" to="nadijevati" />
+    <Word from="naduvan" to="napušen" />
+    <Word from="najpre" to="najprije" />
+    <Word from="Najpre" to="Najprije" />
+    <Word from="najzad" to="napokon" />
+    <Word from="nanevši" to="nanjevši" />
+    <Word from="nanjeli" to="nanijeli" />
+    <Word from="napastvuje" to="napastuje" />
+    <Word from="Napolje" to="Van" />
+    <Word from="napolje" to="van" />
+    <Word from="Napolju" to="Vani" />
+    <Word from="napolju" to="vani" />
+    <Word from="nauka" to="znanost" />
+    <Word from="Nauka" to="Znanost" />
+    <Word from="nauci" to="znanosti" />
+    <Word from="nazad" to="natrag" />
+    <Word from="Nazad" to="Natrag" />
+    <Word from="napred" to="naprijed" />
+    <Word from="Napred" to="Naprijed" />
+    <Word from="naprimjer" to="na primjer" />
+    <Word from="naseo" to="nasjeo" />
+    <Word from="nasesti" to="nasjesti" />
+    <Word from="nasreću" to="na sreću" />
+    <Word from="nebi" to="ne bi" />
+    <Word from="nebih" to="ne bih" />
+    <Word from="Nebi" to="Ne bi" />
+    <Word from="Nebih" to="Ne bih" />
+    <Word from="nebismo" to="ne bismo" />
+    <Word from="Nebismo" to="Ne bismo" />
+    <Word from="nebiste" to="ne biste" />
+    <Word from="Nebiste" to="Ne biste" />
+    <Word from="nedaj" to="ne daj" />
+    <Word from="negde" to="negdje" />
+    <Word from="Negde" to="Negdje" />
+    <Word from="neguje" to="njeguje" />
+    <Word from="neguju" to="njeguju" />
+    <Word from="nekto" to="netko" />
+    <Word from="nemi" to="nijemi" />
+    <Word from="nemrem" to="ne mogu" />
+    <Word from="nemogu" to="ne mogu" />
+    <Word from="Nemogu" to="Ne mogu" />
+    <Word from="nemora" to="ne mora" />
+    <Word from="Nemora" to="Ne mora" />
+    <Word from="nene" to="njene" />
+    <Word from="nešo" to="nešto" />
+    <Word from="nevesta" to="nevjesta" />
+    <Word from="nevreme" to="nevrijeme" />
+    <Word from="nezi" to="njezi" />
+    <Word from="niasm" to="nisam" />
+    <Word from="nigde" to="nigdje" />
+    <Word from="Nigde" to="Nigdje" />
+    <Word from="nikakave" to="nikakve" />
+    <Word from="niko" to="nitko" />
+    <Word from="Niko" to="Nitko" />
+    <Word from="nisma" to="nisam" />
+    <Word from="Nisma" to="Nisam" />
+    <Word from="nećš" to="nećeš" />
+    <Word from="nejde" to="ne ide" />
+    <Word from="Nejde" to="Ne ide" />
+    <Word from="neda" to="ne da" />
+    <Word from="nedam" to="ne dam" />
+    <Word from="negujem" to="njegujem" />
+    <Word from="njegi" to="njezi" />
+    <Word from="neĹľeli" to="ne Ĺľeli" />
+    <Word from="niej" to="nije" />
+    <Word from="nili" to="niti" />
+    <Word from="njie" to="nije" />
+    <Word from="njem" to="nijem" />
+    <Word from="njeme" to="njene" />
+    <Word from="nominovan" to="nominiran" />
+    <Word from="nsiam" to="nisam" />
+    <Word from="nteko" to="netko" />
+    <Word from="obe" to="obje" />
+    <Word from="Obe" to="Obje" />
+    <Word from="obema" to="objema" />
+    <Word from="Obezbeđuju" to="Osiguravaju" />
+    <Word from="obezbeđuju" to="osiguravaju" />
+    <Word from="objekat" to="objekt" />
+    <Word from="oblast" to="podruÄŤje" />
+    <Word from="oblastima" to="podruÄŤjima" />
+    <Word from="oblasti" to="podruÄŤj*" />
+    <Word from="obolelu" to="oboljelu" />
+    <Word from="oboĹľavalac" to="oboĹľavatelj" />
+    <Word from="obuči" to="obući" />
+    <Word from="obuhvata" to="obuhvaća" />
+    <Word from="odandje" to="odande" />
+    <Word from="odavdje" to="odavde" />
+    <Word from="Odavdje" to="Odavde" />
+    <Word from="odbićeš" to="odbit ćeš" />
+    <Word from="odbićemo" to="odbit ćemo" />
+    <Word from="odela" to="odjela" />
+    <Word from="odelu" to="odjelu" />
+    <Word from="odelenja" to="odjela" />
+    <Word from="odelenje" to="odjel" />
+    <Word from="odelenju" to="odjelu" />
+    <Word from="odeljak" to="odjeljak" />
+    <Word from="odeljenje" to="odjel" />
+    <Word from="Odeljenje" to="Odjel" />
+    <Word from="odjeljenje" to="odjel" />
+    <Word from="Odjeljenje" to="Odjel" />
+    <Word from="odeljenjem" to="odjelom" />
+    <Word from="odma" to="odmah" />
+    <Word from="Odneću" to="Odnijet ću" />
+    <Word from="odneću" to="odnijet ću" />
+    <Word from="odneće" to="odnijet će" />
+    <Word from="odoliti" to="odoljeti" />
+    <Word from="odneti" to="odnijeti" />
+    <Word from="odseo" to="odsjeo" />
+    <Word from="odsela" to="odsjela" />
+    <Word from="odsesti" to="odsjesti" />
+    <!-- odseli ne moĹľe - jer je rijeÄŤ u hrv [da se odseli] -->
+    <Word from="odupreti" to="oduprijeti" />
+    <Word from="oduvek" to="oduvijek" />
+    <Word from="Oduvek" to="Oduvijek" />
+    <Word from="oduvjek" to="oduvijek" />
+    <Word from="Oduvjek" to="Oduvijek" />
+    <Word from="ogladneo" to="ogladnio" />
+    <Word from="okoreli" to="okorjeli" />
+    <Word from="organizuju" to="organiziraju" />
+    <Word from="Organizuju" to="Organiziraju" />
+    <Word from="osjećanja" to="osjećaje" />
+    <Word from="osmehe" to="osmijehe" />
+    <Word from="osmehne" to="osmjehne" />
+    <Word from="osmehnu" to="osmjehnu" />
+    <Word from="osobenosti" to="osobnosti" />
+    <Word from="ostareli" to="ostarjeli" />
+    <Word from="ostrva" to="otoka" />
+    <Word from="ostrvu" to="otoku" />
+    <Word from="ostrvom" to="otokom" />
+    <Word from="Ostrva" to="Otoka" />
+    <Word from="Ostrvu" to="Otoku" />
+    <Word from="Ostrvom" to="Otokom" />
+    <Word from="ostrvima" to="otocima" />
+    <Word from="osete" to="osjete" />
+    <Word from="ostrvo" to="otok" />
+    <Word from="Ostrvo" to="Otok" />
+    <Word from="osvjetljen" to="osvijetljen" />
+    <Word from="ovde" to="ovdje" />
+    <Word from="Ovde" to="Ovdje" />
+    <Word from="ovdej" to="ovdje" />
+    <Word from="ovdije" to="ovdje" />
+    <Word from="Ovdije" to="Ovdje" />
+    <Word from="ovjde" to="ovdje" />
+    <Word from="Ovjde" to="Ovdje" />
+    <Word from="pakuje" to="pakira" />
+    <Word from="Pakuje" to="Pakira" />
+    <Word from="Pakuju" to="Pakiraju" />
+    <Word from="pakuju" to="pakiraju" />
+    <Word from="palatama" to="palaÄŤama" />
+    <Word from="palate" to="palaÄŤe" />
+    <Word from="palatu" to="palaÄŤu" />
+    <Word from="palati" to="palaÄŤi" />
+    <Word from="pantalone" to="hlaÄŤe" />
+    <Word from="Pantalone" to="HlaÄŤe" />
+    <Word from="pantalona" to="hlaÄŤa" />
+    <Word from="pantalonama" to="hlaÄŤama" />
+    <Word from="parče" to="komadić" />
+    <Word from="parčeta" to="komadića" />
+    <Word from="parčetu" to="komadiću" />
+    <Word from="parčetom" to="komadićem" />
+    <Word from="paramparčad" to="komadići" />
+    <Word from="pastuv" to="pastuh" />
+    <Word from="pastuva" to="pastuha" />
+    <Word from="pastuvu" to="pastuhu" />
+    <Word from="pd" to="od" />
+    <Word from="pemzija" to="penzija" />
+    <Word from="pemziju" to="penziju" />
+    <Word from="penzionerski" to="umirovljeniÄŤki" />
+    <Word from="Penzionerski" to="UmirovljeniÄŤki" />
+    <Word from="pertle" to="Ĺľnirance" />
+    <Word from="pesama" to="pjesama" />
+    <Word from="pesnicima" to="pjesnicima" />
+    <Word from="pešice" to="pješice" />
+    <Word from="Pešice" to="Pješice" />
+    <Word from="peške" to="pješke" />
+    <Word from="plata" to="plaća" />
+    <Word from="plača" to="plaća" />
+    <Word from="platom" to="plaćom" />
+    <Word from="platu" to="plaću" />
+    <Word from="plačanje" to="plaćanje" />
+    <Word from="plačanjem" to="plaćanjem" />
+    <Word from="plaćeš" to="plačeš" />
+    <Word from="plen" to="plijen" />
+    <Word from="Plen" to="Plijen" />
+    <Word from="pljen" to="plijen" />
+    <Word from="Pljen" to="Plijen" />
+    <Word from="počeću" to="počet ću" />
+    <Word from="podjelimo" to="podijelimo" />
+    <Word from="podnesti" to="podnijeti" />
+    <Word from="podstrekaÄŤ" to="poticatelj" />
+    <Word from="podsete" to="podsjete" />
+    <Word from="poen" to="bod" />
+    <Word from="poena" to="boda" />
+    <Word from="poene" to="bodove" />
+    <Word from="poeni" to="bodovi" />
+    <Word from="Poeni" to="Bodovi" />
+    <Word from="poenima" to="bodovima" />
+    <Word from="poludili" to="poludjeli" />
+    <Word from="pomaći" to="pomaknuti" />
+    <Word from="pomaknim" to="pomaknem" />
+    <Word from="pomaknio" to="pomaknuo" />
+    <Word from="pomakniš" to="pomakneš" />
+    <Word from="pomakniti" to="pomaknuti" />
+    <Word from="pomenu" to="spomenu" />
+    <Word from="Pomera" to="MiÄŤe" />
+    <Word from="pomera" to="miÄŤe" />
+    <Word from="pomjera" to="pomiÄŤe" />
+    <Word from="pomerajte" to="miÄŤite" />
+    <Word from="pomjeri" to="pomakni" />
+    <Word from="pomeraj" to="miÄŤi" />
+    <Word from="pomjeraj" to="miÄŤi" />
+    <Word from="pomeraju" to="miÄŤu" />
+    <Word from="pomerala" to="micala" />
+    <Word from="pomjerala" to="pomicala" />
+  	<Word from="pomjeraju" to="pomiÄŤu" />
+    <Word from="pomeranja" to="pomicanja" />
+    <Word from="pomerati" to="micati" />
+    <Word from="pomjerati" to="pomicati" />
+    <Word from="pomeriš" to="pomakneš" />
+    <Word from="ponaosob" to="osobno" />
+    <Word from="ponesla" to="ponijela" />
+    <Word from="Ponesla" to="Ponijela" />
+    <Word from="poređenje" to="usporedba" />
+    <Word from="poređenju" to="usporedbi" />
+    <Word from="porekla" to="podrijetla" />
+    <Word from="poreklo" to="podrijetlo" />
+    <Word from="poreklu" to="podrijetlu" />
+    <Word from="Porodica" to="Obitelj" />
+    <Word from="Porodice" to="Obitelji" />
+    <Word from="porodica" to="obitelj" />
+    <Word from="porodice" to="obitelji" />
+    <Word from="porodici" to="obitelji" />
+    <Word from="porodicama" to="obiteljima" />
+    <Word from="porodicom" to="obitelji" />
+    <Word from="porodicu" to="obitelj" />
+    <Word from="poslata" to="poslana" />
+    <Word from="posle" to="poslije" />
+    <Word from="Posle" to="Poslije" />
+    <Word from="poslje" to="poslije" />
+    <Word from="posredi" to="posrijedi" />
+    <Word from="postara" to="pobrine" />
+    <Word from="Postaraću" to="Pobrinut ću" />
+    <Word from="postaraću" to="pobrinut ću" />
+    <Word from="postaraj" to="pobrini" />
+    <Word from="Postaraj" to="Pobrini" />
+    <Word from="Postaraju" to="Pobrinu" />
+    <Word from="postaraju" to="pobrinu" />
+    <Word from="postarajmo" to="pobrinimo" />
+    <Word from="postaramo" to="pobrinemo" />
+    <Word from="postaraš" to="pobrineš" />
+    <Word from="povesne" to="povijesne" />
+    <Word from="Povinuju" to="Pokoravaju" />
+    <Word from="povinuju" to="pokoravaju" />
+    <Word from="pozadi" to="iza" />
+    <Word from="poĹľeleo" to="poĹľelio" />
+    <Word from="PoĹľeleo" to="PoĹľelio" />
+    <Word from="PoĹľeljeo" to="PoĹľelio" />
+    <Word from="poĹľeljeo" to="poĹľelio" />
+    <Word from="praktikuj" to="prakticiraj" />
+    <Word from="praktikuju" to="prakticiraju" />
+    <Word from="praktikovala" to="prakticirala" />
+    <Word from="praktikovati" to="prakticirati" />
+    <Word from="pre" to="prije" />
+    <Word from="Pre" to="Prije" />
+    <Word from="predela" to="predjela" />
+    <Word from="predelu" to="predjelu" />
+    <Word from="Preći" to="Prijeći" />
+    <Word from="preći" to="prijeći" />
+    <Word from="prećutkuje" to="prešućuje" />
+    <Word from="predame" to="preda me" />
+    <Word from="predamnom" to="preda mnom" />
+    <Word from="Predamnom" to="Preda mnom" />
+    <Word from="preformuliši" to="preformuliraj" />
+    <Word from="preklo" to="porijeklo" />
+    <Word from="preloma" to="prijeloma" />
+    <Word from="Preneću" to="Prenijet ću" />
+    <Word from="preneću" to="prenijet ću" />
+    <Word from="prenos" to="prijenos" />
+    <Word from="prenosa" to="prijenosa" />
+    <Word from="prenosom" to="prijenosom" />
+    <Word from="prenosu" to="prijenosu" />
+    <Word from="preneo" to="prenio" />
+    <Word from="Preneo" to="Prenio" />
+    <Word from="prenela" to="prenijela" />
+    <Word from="prenjela" to="prenijela" />
+    <Word from="preneli" to="prenijeli" />
+    <Word from="prenjeli" to="prenijeli" />
+    <Word from="preneti" to="prenijeti" />
+    <Word from="preporuÄŤa" to="preporuÄŤuje" />
+    <Word from="preseći" to="presjeći" />
+    <Word from="preti" to="prijeti" />
+    <Word from="prete" to="prijete" />
+    <Word from="Prete" to="Prijete" />
+    <Word from="prjeti" to="prijeti" />
+    <Word from="prjete" to="prijete" />
+    <Word from="pretećim" to="prijetećim" />
+    <Word from="pretećih" to="prijetećih" />
+    <Word from="pretrpeo" to="pretrpio" />
+    <Word from="prevod" to="prijevod" />
+    <Word from="Prevod" to="Prijevod" />
+    <Word from="prezentovati" to="prezentirati" />
+    <Word from="prezentovane" to="prezentirane" />
+    <Word from="prezentovan" to="prezentiran" />
+    <Word from="prezentovani" to="prezentirani" />
+    <Word from="prezentovano" to="prezentirano" />
+    <Word from="pridonjeti" to="pridonijeti" />
+    <Word from="prijatan" to="ugodan" />
+    <Word from="primećivao" to="primjećivao" />
+    <Word from="primedbi" to="primjedbi" />
+    <Word from="primjete" to="primijete" />
+    <Word from="prisetim" to="prisjetim" />
+    <Word from="prisetio" to="prisjetio" />
+    <Word from="prisetite" to="prisjetite" />
+    <Word from="pritiskam" to="pritišćem" />
+    <Word from="prmda" to="iako" />
+    <Word from="procenat" to="postotak" />
+    <Word from="procent" to="postotak" />
+    <Word from="procenta" to="postotka" />
+    <Word from="procenata" to="postotaka" />
+    <Word from="procenti" to="postoci" />
+    <Word from="Procenti" to="Postoci" />
+    <Word from="procente" to="postotke" />
+    <Word from="Procente" to="Postotke" />
+    <Word from="procentu" to="postotku" />
+    <Word from="Procentu" to="Postotku" />
+    <Word from="procentima" to="postocima" />
+    <Word from="prodato" to="prodano" />
+    <Word from="prohte" to="prohtije" />
+    <Word from="projekat" to="projekt" />
+    <Word from="Projekat" to="Projekt" />
+    <Word from="promijena" to="promjena" />
+    <Word from="prosledili" to="proslijedili" />
+    <Word from="protestvovat" to="protestirat" />
+    <Word from="Protestvovat" to="Protestirat" />
+    <Word from="Protestvujem" to="Protestiram" />
+    <Word from="protestvujem" to="protestiram" />
+    <Word from="protestvuju" to="protestiraju" />
+    <Word from="protestujući" to="protestirajući" />
+    <Word from="psihićki" to="psihički" />
+    <Word from="pto" to="što" />
+    <Word from="ptom" to="potom" />
+    <Word from="punoletan" to="punoljetan" />
+    <Word from="Punoletan" to="Punoljetan" />
+    <Word from="raÄŤunari" to="raÄŤunala" />
+    <Word from="raÄŤunare" to="raÄŤunala" />
+    <Word from="radijo" to="radio" />
+    <Word from="rađe" to="radije" />
+    <Word from="ranac" to="ruksak" />
+    <Word from="rancu" to="ruksaku" />
+    <Word from="rascep" to="rascjep" />
+    <Word from="rasejan" to="rastresen" />
+    <Word from="rasejana" to="rastresena" />
+    <Word from="raspust" to="odmor" />
+    <Word from="razbiću" to="razbit ću" />
+    <Word from="razbijesneo" to="razbjesnio" />
+    <Word from="rašće" to="rast će" />
+    <Word from="Razbiću" to="Razbit ću" />
+    <Word from="razdeviÄŤe" to="razdjeviÄŤe" />
+    <Word from="razgovrati" to="razgovarati" />
+    <Word from="razreši" to="razriješi" />
+    <Word from="razume" to="razumije" />
+    <Word from="razumeju" to="razumiju" />
+    <Word from="reÄŤju" to="rijeÄŤju" />
+    <Word from="ReÄŤju" to="RijeÄŤju" />
+    <Word from="rjeÄŤju" to="rijeÄŤju" />
+    <Word from="RjeÄŤju" to="RijeÄŤju" />
+    <Word from="reagujte" to="reagirajte" />
+    <Word from="redov" to="vojnik" />
+    <Word from="redovu" to="vojniku" />
+    <Word from="ređe" to="rjeđe" />
+    <Word from="ređi" to="rjeđi" />
+    <Word from="rejv" to="rave" />
+    <Word from="rejvu" to="raveu" />
+    <Word from="reko" to="rekao" />
+    <Word from="rengen" to="rendgen" />
+    <Word from="repuješ" to="repaš" />
+    <Word from="resetuje" to="resetira" />
+    <Word from="resetujte" to="resetirajte" />
+    <Word from="Resetujte" to="Resetirajte" />
+    <Word from="rijeđi" to="rjeđi" />
+    <Word from="Rizikuj" to="Riskiraj" />
+    <Word from="rizikuju" to="riskiraju" />
+    <Word from="rizikuje" to="riskira" />
+    <Word from="rizikujte" to="riskirajte" />
+    <Word from="rješio" to="riješio" />
+    <Word from="rokenrol" to="rock'n'roll" />
+    <Word from="ronioc" to="ronilac" />
+    <Word from="saviješću" to="savješću" />
+    <Word from="savešću" to="savješću" />
+    <Word from="secka" to="sjecka" />
+    <Word from="seckam" to="sjeckam" />
+    <Word from="sedećeš" to="sjedit ćeš" />
+    <Word from="sedeli" to="sjedili" />
+    <Word from="sedišta" to="sjedala" />
+    <Word from="sedište" to="sjedalo" />
+    <Word from="sedištu" to="sjedalu" />
+    <Word from="sedni" to="sjedni" />
+    <Word from="Sedni" to="Sjedni" />
+    <Word from="sedi" to="sjedi" />
+    <Word from="Sedi" to="Sjedi" />
+    <Word from="sedite" to="sjedite" />
+    <Word from="sesti" to="sjesti" />
+    <Word from="sekire" to="sjekire" />
+    <Word from="sekiraj" to="brini" />
+    <Word from="sekiram" to="brinem" />
+    <Word from="sekiramo" to="brinemo" />
+    <Word from="sekiraš" to="brineš" />
+    <Word from="sekirate" to="brinete" />
+    <Word from="sekirajte" to="brinite" />
+    <Word from="seme" to="sjeme" />
+    <Word from="sertan" to="sretan" />
+    <Word from="Sešću" to="Sjest ću" />
+    <Word from="sešću" to="sjest ću" />
+    <Word from="sješćemo" to="sjest ćemo" />
+    <Word from="seta" to="sjeta" />
+    <Word from="sigruno" to="sigurno" />
+    <Word from="siguan" to="siguran" />
+    <Word from="sija" to="sja" />
+    <Word from="sijaju" to="sjaju" />
+    <Word from="sirće" to="ocat" />
+    <Word from="sirćeta" to="octa" />
+    <Word from="sirćetu" to="octu" />
+    <Word from="sješću" to="sjest ću" />
+    <Word from="sješće" to="sjest će" />
+    <Word from="sleće" to="slijeće" />
+    <Word from="sleću" to="slijeću" />
+    <Word from="slećemo" to="slijećemo" />
+    <Word from="sleva" to="slijeva" />
+    <Word from="sećanjima" to="sjećanjima" />
+    <Word from="seo" to="sjeo" />
+    <Word from="Seo" to="Sjeo" />
+    <Word from="sem" to="osim" />
+    <Word from="sma" to="sam" />
+    <Word from="smao" to="samo" />
+    <Word from="Smao" to="Samo" />
+    <Word from="sme" to="smije" />
+    <Word from="Sme" to="Smije" />
+    <Word from="smećpm" to="smećem" />
+    <Word from="smej" to="smij" />
+    <Word from="Smejte" to="Smijte" />
+    <Word from="smejte" to="smijte" />
+    <Word from="smesta" to="smjesta" />
+    <Word from="Smesta" to="Smjesta" />
+    <Word from="smeste" to="smjeste" />
+    <Word from="smešak" to="smješak" />
+    <Word from="smeši" to="smiješi" />
+    <Word from="Smeši" to="Smiješi" />
+    <Word from="smešio" to="smiješio" />
+    <Word from="smešiš" to="smiješiš" />
+    <Word from="smeškom" to="smješkom" />
+    <Word from="smjeo" to="smio" />
+    <Word from="smrdeo" to="smrdio" />
+    <Word from="sintersajzer" to="synthesizer" />
+    <Word from="sitnisajzer" to="synthesizer" />
+    <Word from="skelet" to="kostur" />
+    <Word from="sočiva" to="leće" />
+    <Word from="sočivima" to="lećama" />
+    <Word from="sočivo" to="leća" />
+    <Word from="sočivom" to="lećom" />
+    <Word from="sočivu" to="leći" />
+    <Word from="Spakuj" to="Spakiraj" />
+    <Word from="Spakujte" to="Spakirajte" />
+    <Word from="spakujte" to="spakirajte" />
+    <Word from="spasao" to="spasio" />
+    <Word from="Spasao" to="Spasio" />
+    <Word from="spasen" to="spašen" />
+    <Word from="spasla" to="spasila" />
+    <Word from="spasli" to="spasili" />
+    <Word from="speluje" to="sriÄŤe" />
+    <Word from="speluju" to="sriÄŤu" />
+    <Word from="spojiće" to="spojit će" />
+    <Word from="spolja" to="izvana" />
+    <Word from="Srediće" to="Sredit će" />
+    <Word from="Srediću" to="Sredit ću" />
+    <!-- nisu za regex - ne odgovaraju zbog dodatnog ju na kraju -->
+    <Word from="stabilizuju" to="stabiliziraju" />
+    <Word from="starao" to="brinuo" />
+    <Word from="starati" to="brinuti" />
+    <Word from="Starati" to="Brinuti" />
+    <Word from="steni" to="stijeni" />
+    <Word from="stepen" to="stupanj" />
+    <Word from="stepena" to="stupnjeva" />
+    <Word from="stepeni" to="stupnjeva" />
+    <Word from="stepenu" to="stupnju" />
+    <Word from="sticati" to="stjecati" />
+    <Word from="stiditi" to="stidjeti" />
+    <Word from="streljamo" to="strijeljamo" />
+    <Word from="streljati" to="strijeljati" />
+    <Word from="stoleća" to="stoljeća" />
+    <Word from="stobom" to="s tobom" />
+    <Word from="stvrano" to="stvarno" />
+    <Word from="Stupiću" to="Stupit ću" />
+    <Word from="stupiću" to="stupit ću" />
+    <Word from="subjekat" to="subjekt" />
+    <Word from="sudija" to="sudac" />
+    <Word from="Sudija" to="Sudac" />
+    <Word from="sudije" to="suca" />
+    <Word from="sudiji" to="sucu" />
+    <Word from="sudijo" to="suÄŤe" />
+    <Word from="sudiju" to="suca" />
+    <Word from="sudijom" to="sucem" />
+    <Word from="sudijskog" to="sudskog" />
+    <Word from="sugerišu" to="predlažu" />
+    <Word from="sugeriše" to="predlaže" />
+    <Word from="supa" to="juha" />
+    <Word from="supe" to="juhe" />
+    <Word from="supi" to="juhi" />
+    <Word from="supu" to="juhu" />
+    <Word from="supom" to="juhom" />
+    <Word from="supama" to="juhama" />
+    <Word from="Supa" to="Juha" />
+    <Word from="Supe" to="Juhe" />
+    <Word from="Supi" to="Juhi" />
+    <Word from="Supu" to="Juhu" />
+    <Word from="Supom" to="Juhom" />
+    <Word from="Supama" to="Juhama" />
+    <Word from="surfuje" to="surfa" />
+    <Word from="surfuješ" to="surfaš" />
+    <Word from="surfuju" to="surfaju" />
+    <Word from="suština" to="bit" />
+    <Word from="suštinski" to="bitni" />
+    <Word from="suvom" to="suhom" />
+    <Word from="suvog" to="suhog" />
+    <Word from="suvoj" to="suhoj" />
+    <Word from="Suvom" to="Suhom" />
+    <Word from="Suvog" to="Suhog" />
+    <Word from="Suvoj" to="Suhoj" />
+    <Word from="suvim" to="suhim" />
+    <Word from="Suvim" to="Suhim" />
+    <Word from="svestan" to="svjestan" />
+    <Word from="svjest" to="svijest" />
+    <Word from="Svjest" to="Svijest" />
+    <Word from="svjesti" to="svijesti" />
+    <Word from="Svjesti" to="Svijesti" />
+    <Word from="svetova" to="svjetova" />
+    <Word from="svetove" to="svjetove" />
+    <Word from="svugde" to="svugdje" />
+    <Word from="šolja" to="šalica" />
+    <Word from="šolju" to="šalicu" />
+    <Word from="Ĺ ta" to="Ĺ to" />
+    <Word from="štagod" to="što god" />
+    <Word from="šta" to="što" />
+    <Word from="štp" to="što" />
+    <Word from="štampa" to="tisak" />
+    <Word from="štampu" to="tisak" />
+    <Word from="štampom" to="tiskom" />
+    <Word from="štampi" to="tisku" />
+    <Word from="štampati" to="tiskati" />
+    <Word from="Šutjeće" to="Šutjet će" />
+    <Word from="tablu" to="ploÄŤu" />
+    <Word from="taguje" to="tagira" />
+    <Word from="takođe" to="također" />
+    <Word from="Takođe" to="Također" />
+    <Word from="talas" to="val" />
+    <Word from="Talas" to="Val" />
+    <Word from="talasa" to="valova" />
+    <Word from="talase" to="valove" />
+    <Word from="talasi" to="valovi" />
+    <Word from="Talasi" to="Valovi" />
+    <Word from="talasima" to="valovima" />
+    <Word from="Talasima" to="Valovima" />
+    <Word from="tečnost" to="tekućina" />
+    <Word from="tečnosti" to="tekućine" />
+    <Word from="tečnošću" to="tekućinom" />
+    <Word from="tekšo" to="teško" />
+    <Word from="Tekšo" to="Teško" />
+    <Word from="terajte" to="tjerajte" />
+    <Word from="tešio" to="tješio" />
+    <Word from="tešiš" to="tješiš" />
+    <Word from="tki" to="tko" />
+    <Word from="toÄŤak" to="kotaÄŤ" />
+    <Word from="ToÄŤak" to="KotaÄŤ" />
+    <Word from="toha" to="toga" />
+    <Word from="tovj" to="tvoj" />
+    <Word from="trabam" to="trebam" />
+    <Word from="trkanje" to="utrkivanje" />
+    <Word from="trkanja" to="utrkivanja" />
+    <Word from="trkao" to="utrkivao" />
+    <Word from="trougao" to="trokut" />
+    <Word from="trougla" to="trokuta" />
+    <Word from="trouglu" to="trokutu" />
+    <Word from="trouglove" to="trokute" />
+    <Word from="trpeo" to="trpio" />
+    <Word from="Trpeo" to="Trpio" />
+    <Word from="tugi" to="tuzi" />
+    <Word from="tvrtci" to="tvrtki" />
+    <Word from="ubede" to="uvjere" />
+    <Word from="Ubeđivao" to="Uvjeravao" />
+    <Word from="ubeđivati" to="uvjeravati" />
+    <Word from="ubjeđivati" to="uvjeravati" />
+    <Word from="ubeđuje" to="uvjerava" />
+    <Word from="ubeđuješ" to="uvjeravaš" />
+    <Word from="ubeđuju" to="uvjeravaju" />
+    <Word from="ubjediti" to="uvjeriti" />
+    <Word from="uÄŤtivo" to="uljudno" />
+    <Word from="uÄŤtivost" to="uljudnost" />
+    <Word from="učtivošću" to="uljudnošću" />
+    <Word from="udata" to="udana" />
+    <Word from="Udata" to="Udana" />
+    <Word from="udatoj" to="udanoj" />
+    <Word from="udeo" to="udio" />
+    <Word from="ugljenik" to="ugljik" />
+    <Word from="uliva" to="ulijeva" />
+    <Word from="ulivali" to="ulijevali" />
+    <Word from="ulivate" to="ulijevate" />
+    <Word from="uljeva" to="ulijeva" />
+    <Word from="ujutru" to="ujutro" />
+    <Word from="Ukoliko" to="Ako" />
+    <Word from="ukoliko" to="ako" />
+    <Word from="ume" to="zna" />
+    <Word from="umem" to="umijem" />
+    <Word from="umeš" to="umiješ" />
+    <Word from="umesto" to="umjesto" />
+    <Word from="Umesto" to="umjesto" />
+    <Word from="umete" to="znate" />
+    <Word from="umijesto" to="umjesto" />
+    <Word from="Umijesto" to="Umjesto" />
+    <Word from="umetninama" to="umjetninama" />
+    <Word from="umreti" to="umrijeti" />
+    <Word from="Umret" to="Umrijet" />
+    <Word from="umrijećeš" to="umrijet ćeš" />
+    <Word from="umrijećete" to="umrijet ćete" />
+    <Word from="Uneću" to="Unijet ću" />
+    <Word from="univerzitet" to="sveučilište" />
+    <Word from="univerzitetu" to="sveučilištu" />
+    <Word from="Uopšte" to="Uopće" />
+    <Word from="uopšte" to="uopće" />
+    <Word from="uopče" to="uopće" />
+    <Word from="upustva" to="uputstva" />
+    <Word from="uprkos" to="usprkos" />
+    <Word from="Uprkos" to="Usprkos" />
+    <Word from="uradio" to="uÄŤinio" />
+    <Word from="Uredu" to="U redu" />
+    <Word from="uspe" to="uspije" />
+    <Word from="Uspe" to="Uspije" />
+    <Word from="uspeo" to="uspio" />
+    <Word from="Uspeo" to="Uspio" />
+    <Word from="uspećeš" to="uspjet ćeš" />
+    <Word from="uspjećeš" to="uspjet ćeš" />
+    <Word from="uspećemo" to="uspjet ćemo" />
+    <Word from="uspeš" to="uspiješ" />
+    <Word from="uspeju" to="uspiju" />
+    <Word from="uspjevala" to="uspijevala" />
+    <Word from="uspijo" to="uspio" />
+    <Word from="u sred" to="usred" />
+    <Word from="usled" to="uslijed" />
+    <Word from="Usled" to="Uslijed" />
+    <Word from="usledila" to="uslijedila" />
+    <Word from="usljed" to="uslijed" />
+    <Word from="Usljed" to="Uslijed" />
+    <Word from="ušunjate" to="ušuljate" />
+    <Word from="utehe" to="utjehe" />
+    <Word from="uveÄŤe" to="naveÄŤer" />
+    <Word from="uvek" to="uvijek" />
+    <Word from="Uvek" to="Uvijek" />
+    <Word from="uvjek" to="uvijek" />
+    <Word from="Uvjek" to="Uvijek" />
+    <Word from="uvijet" to="uvjet" />
+    <Word from="uvijeti" to="uvjeti" />
+    <Word from="uvijetima" to="uvjetima" />
+    <Word from="uva" to="uha" />
+    <Word from="Uva" to="Uha" />
+    <Word from="uvo" to="uho" />
+    <Word from="Uvo" to="Uho" />
+    <Word from="uvom" to="uhom" />
+    <Word from="Uvom" to="Uhom" />
+    <Word from="uvu" to="uhu" />
+    <Word from="Uvu" to="Uhu" />
+    <Word from="vaistinu" to="uistinu" />
+    <Word from="Vaistinu" to="Uistinu" />
+    <Word from="vajar" to="kipar" />
+    <Word from="vakciniše" to="cijepi" />
+    <Word from="varnica" to="iskra" />
+    <Word from="varnicu" to="iskru" />
+    <Word from="vaspitala" to="odgojila" />
+    <Word from="vaspitavan" to="odgajan" />
+    <Word from="vaspitavanju" to="odgoju" />
+    <Word from="vašljivi" to="ušljivi" />
+    <Word from="vaĹľi" to="vrijedi" />
+    <Word from="veÄŤan" to="vjeÄŤan" />
+    <Word from="većati" to="vijećati" />
+    <Word from="vek" to="stoljeće" />
+    <Word from="veka" to="stoljeća" />
+    <Word from="veke" to="vijeke" />
+    <Word from="vekova" to="stoljeća" />
+    <Word from="venca" to="vijenca" />
+    <Word from="veÄŤnost" to="vjeÄŤnost" />
+    <Word from="veoma" to="vrlo" />
+    <Word from="Veoma" to="Vrlo" />
+    <Word from="vera" to="vjera" />
+    <Word from="vere" to="vjere" />
+    <Word from="veri" to="vjeri" />
+    <Word from="verom" to="vjerom" />
+    <Word from="veru" to="vjeru" />
+    <Word from="veran" to="vjeran" />
+    <Word from="verama" to="vjerama" />
+    <Word from="Vera" to="Vjera" />
+    <Word from="Vere" to="Vjere" />
+    <Word from="Veri" to="Vjeri" />
+    <Word from="Verom" to="Vjerom" />
+    <Word from="Veru" to="Vjeru" />
+    <Word from="Veran" to="Vjeran" />
+    <Word from="Verama" to="Vjerama" />
+    <Word from="veren" to="zaruÄŤen" />
+    <Word from="Veren" to="ZaruÄŤen" />
+    <Word from="verena" to="zaruÄŤena" />
+    <Word from="vereni" to="zaruÄŤeni" />
+    <Word from="verimo" to="zaruÄŤimo" />
+    <Word from="vest" to="vijest" />
+    <Word from="Vest" to="Vijest" />
+    <Word from="vesti" to="vijesti" />
+    <Word from="Vesti" to="Vijesti" />
+    <Word from="Vjesti" to="Vijesti" />
+    <Word from="vjesti" to="vijesti" />
+    <Word from="vestima" to="vijestima" />
+    <Word from="Vestima" to="Vijestima" />
+    <Word from="vjestima" to="vijestima" />
+    <Word from="Vjestima" to="Vijestima" />
+    <Word from="vešala" to="vješala" />
+    <Word from="vešću" to="viješću" />
+    <Word from="vešu" to="rublju" />
+    <Word from="videše" to="vidješe" />
+    <Word from="vidjeo" to="vidio" />
+    <Word from="Vidjeo" to="Vidio" />
+    <Word from="vjerojatnoća" to="vjerojatnost" />
+    <Word from="vješću" to="viješću" />
+    <Word from="vlo" to="vrlo" />
+    <Word from="Vodiće" to="Vodit će" />
+    <Word from="Vodiću" to="Vodit ću" />
+    <Word from="voliti" to="voljeti" />
+    <Word from="vredelo" to="vrijedilo" />
+    <Word from="vrednom" to="vrijednom" />
+    <Word from="vrednog" to="vrijednog" />
+    <Word from="vreme" to="vrijeme" />
+    <Word from="Vreme" to="Vrijeme" />
+    <Word from="vrjeme" to="vrijeme" />
+    <Word from="Vrjeme" to="Vrijeme" />
+    <Word from="vrteo" to="vrtio" />
+    <Word from="vrvela" to="vrvjela" />
+    <Word from="whiskey" to="viski" />
+    <Word from="zaceljivanje" to="zacjeljivanje" />
+    <Word from="zagreva" to="zagrijava" />
+    <Word from="Zagreva" to="Zagrijava" />
+    <Word from="Zagrevate" to="Zagrijavate" />
+    <Word from="zagrevanje" to="zagrijavanje" />
+    <Word from="zakunio" to="zakleo" />
+    <Word from="zalepili" to="zalijepili" />
+    <Word from="zalepiti" to="zalijepiti" />
+    <Word from="zaliv" to="zaljev" />
+    <Word from="zalivu" to="zaljevu" />
+    <Word from="zanm" to="znam" />
+    <Word from="zanma" to="zanima" />
+    <Word from="zaplena" to="zapljena" />
+    <Word from="zapleni" to="zaplijeni" />
+    <Word from="zaplenu" to="zapljenu" />
+    <Word from="zaspem" to="zaspim" />
+    <Word from="zastareo" to="zastario" />
+    <Word from="zauvek" to="zauvijek" />
+    <Word from="Zauvek" to="Zauvijek" />
+    <Word from="zauvjek" to="zauvijek" />
+    <Word from="Zauvjek" to="Zauvijek" />
+    <Word from="zavera" to="zavjera" />
+    <Word from="zahtev" to="zahtjev" />
+    <Word from="Zahtev" to="Zahtjev" />
+    <Word from="zasede" to="zasjede" />
+    <Word from="zasedi" to="zasjedi" />
+    <Word from="zasedu" to="zasjedu" />
+    <Word from="zatp" to="zato" />
+    <Word from="Zatp" to="Zato" />
+    <Word from="zaĹľeleo" to="zaĹľelio" />
+    <Word from="ZaĹľeleo" to="ZaĹľelio" />
+    <Word from="ZaĹľeljeo" to="ZaĹľelio" />
+    <Word from="zaĹľeljeo" to="zaĹľelio" />
+    <Word from="zbg" to="zbog" />
+    <Word from="zdrvo" to="zdravo" />
+    <Word from="Zdrvo" to="Zdravo" />
+    <Word from="zlodela" to="zlodjela" />
+    <Word from="znaći" to="znači" />
+    <Word from="zvaniÄŤan" to="sluĹľben" />
+    <Word from="zvezdom" to="zvijezdom" />
+    <Word from="žemo" to="ćemo" />
+    <Word from="Ĺľeleo" to="Ĺľelio" />
+    <Word from="Želeo" to="Želio" />
+    <Word from="Željeo" to="Želio" />
+    <Word from="Ĺľeljeo" to="Ĺľelio" />
+    <Word from="Živeo" to="Živio" />
+    <Word from="Ĺľiveo" to="Ĺľivio" />
+    <Word from="Ĺľmureo" to="Ĺľmirio" />
+
+    <!-- imena -->
+    <Word from="Abi" to="Abby" />
+    <Word from="Alis" to="Alice" />
+    <Word from="Ajk" to="Ike" />
+    <Word from="Ajku" to="Ikeu" />
+    <Word from="Ajrin" to="Irene" />
+    <Word from="Ajris" to="Iris" />
+    <Word from="Ajron" to="Iron" />
+    <Word from="Ajvi" to="Ivy" />
+    <Word from="Anđeles" to="Angeles" />
+    <Word from="Anđelesa" to="Angelesa" />
+    <Word from="Anđelesu" to="Angelesu" />
+    <Word from="Anđelesom" to="Angelesom" />
+    <Word from="Antoni" to="Anthony" />
+    <Word from="Antoniju" to="Anthonyju" />
+    <Word from="ArÄŤi" to="Archie" />
+    <Word from="Beverli" to="Beverly" />
+    <Word from="Bejker" to="Baker" />
+    <Word from="Bitls" to="Beatles" />
+    <Word from="Bitlsi" to="Beatlesi" />
+    <Word from="BridĹľit" to="Bridget" />
+    <Word from="BriĹľit" to="Brigitte" />
+    <Word from="Bruks" to="Brooks" />
+    <Word from="Dablin" to="Dublin" />
+    <Word from="Dablina" to="Dublina" />
+    <Word from="Dablinu" to="Dublinu" />
+    <Word from="Dag" to="Doug" />
+    <Word from="Darvin" to="Darwin" />
+    <Word from="Darvina" to="Darwina" />
+    <Word from="Darvinu" to="Darwinu" />
+    <Word from="Darvinom" to="Darwinom" />
+    <Word from="Dejv" to="Dave" />
+    <Word from="Dejvi" to="Davie" />
+    <Word from="Dejva" to="Davea" />
+    <Word from="Dejvu" to="Daveu" />
+    <Word from="Dejvom" to="Daveom" />
+    <Word from="Den" to="Dan" />
+    <Word from="Deril" to="Daryl" />
+    <Word from="Dijaz" to="Diaz" />
+    <Word from="Dru" to="Drew" />
+    <Word from="Äeni" to="Jenny" />
+    <Word from="Äošua" to="Joshua" />
+    <Word from="DĹľejmi" to="Jamie" />
+    <Word from="DĹľad" to="Jude" />
+    <Word from="DĹľeri" to="Jerry" />
+    <Word from="DĹľerija" to="Jerryja" />
+    <Word from="DĹľo" to="Joe" />
+    <Word from="DĹľoel" to="Joel" />
+    <Word from="DĹľoelu" to="Joelu" />
+    <Word from="Džoš" to="Josh" />
+    <Word from="Džošu" to="Joshu" />
+    <Word from="DĹľosi" to="Josie" />
+    <Word from="DĹľozi" to="Josie" />
+    <Word from="DĹľes" to="Jess" />
+    <Word from="DĹľen" to="Jen" />
+    <Word from="DĹľej" to="Jay" />
+    <Word from="DĹľejn" to="Jane" />
+    <Word from="DĹľil" to="Jill" />
+    <Word from="DĹľodi" to="Jody" />
+    <Word from="DĹľud" to="Jude" />
+    <Word from="DĹľuli" to="Julie" />
+    <Word from="Ebi" to="Abby" />
+    <Word from="Ejb" to="Abe" />
+    <Word from="Ejba" to="Abea" />
+    <Word from="Ejmi" to="Amy" />
+    <Word from="Ejpril" to="April" />
+    <Word from="Empajer" to="Empire" />
+    <Word from="Enđel" to="Angel" />
+    <Word from="EndĹľi" to="Angie" />
+    <Word from="Entoni" to="Anthony" />
+    <Word from="Ešford" to="Ashford" />
+    <Word from="Ešforda" to="Ashforda" />
+    <Word from="Ešli" to="Ashley" />
+    <Word from="Fibi" to="Phoebe" />
+    <Word from="Filovo" to="Philovo" />
+    <Word from="Flober" to="Flaubert" />
+    <Word from="Fokner" to="Faulkner" />
+    <Word from="Fren" to="Fran" />
+    <Word from="GreÄŤen" to="Gretchen" />
+    <Word from="Grejs" to="Grace" />
+    <Word from="Hadson" to="Hudson" />
+    <Word from="Hadsonu" to="Hudsonu" />
+    <Word from="Hant" to="Hunt" />
+    <Word from="Hemingvej" to="Hemingway" />
+    <Word from="Henk" to="Hank" />
+    <Word from="Hejstings" to="Hastings" />
+    <Word from="Hju" to="Hugh" />
+    <Word from="Hjua" to="Hugha" />
+    <Word from="Hjuz" to="Hughes" />
+    <Word from="Hjuza" to="Hughesa" />
+    <Word from="Hjuston" to="Houston" />
+    <Word from="Hjustonu" to="Houstonu" />
+    <Word from="Igo" to="Hugo" />
+    <Word from="Ilejn" to="Elaine" />
+    <Word from="Židovin" to="Židov" />
+    <Word from="Johni" to="Johnny" />
+    <Word from="JudĹľin" to="Eugene" />
+    <Word from="Kasl" to="Castle" />
+    <Word from="KejdĹľ" to="Cage" />
+    <Word from="Kejn" to="Kane" />
+    <Word from="Kejsi" to="Casey" />
+    <Word from="Kejti" to="Katie" />
+    <Word from="Keren" to="Karen" />
+    <Word from="Kerol" to="Carol" />
+    <Word from="Kerolajn" to="Caroline" />
+    <Word from="Klajv" to="Clive" />
+    <Word from="Klajva" to="Clivea" />
+    <Word from="Klajve" to="Clive" />
+    <Word from="Klajvu" to="Cliveu" />
+    <Word from="Klarens" to="Clarence" />
+    <Word from="Kler" to="Claire" />
+    <Word from="Kloi" to="Chloe" />
+    <Word from="Klod" to="Claude" />
+    <Word from="Klode" to="Claude" />
+    <Word from="Kol" to="Cole" />
+    <Word from="Kolins" to="Collins" />
+    <Word from="Kortni" to="Courtney" />
+    <Word from="Krej?g" to="Craig" />
+    <Word from="Kristi" to="Christie" />
+    <Word from="Lajf" to="Life" />
+    <Word from="Lajl" to="Lile" />
+    <Word from="Lejk" to="Lake" />
+    <Word from="Lorejn" to="Loraine" />
+    <Word from="Lorens" to="Lawrence" />
+    <Word from="Lusi" to="Lucy" />
+    <Word from="Majk" to="Mike" />
+    <Word from="Majkeve" to="Mikeove" />
+    <Word from="Majlo" to="Milo" />
+    <Word from="Maslou" to="Maslow" />
+    <Word from="Medlin" to="Madelaine" />
+    <Word from="Medelin" to="Madeline" />
+    <Word from="Mejbel" to="Mabel" />
+    <Word from="Mejn" to="Maine" />
+    <Word from="Mejna" to="Mainea" />
+    <Word from="Mejnu" to="Maineu" />
+    <Word from="Mejnom" to="Maineom" />
+    <Word from="Mejpls" to="Maples" />
+    <Word from="Mejsi" to="Maisy" />
+    <Word from="Mek" to="Mac" />
+    <Word from="Merilend" to="Maryland" />
+    <Word from="MiÄŤel" to="Mitchell" />
+    <Word from="Nensi" to="Nancy" />
+    <Word from="NiÄŤe" to="Nietzsche" />
+    <Word from="NiÄŤea" to="Nietzschea" />
+    <Word from="NiÄŤeu" to="Nietzscheu" />
+    <Word from="NiÄŤeom" to="Nietzscheom" />
+    <Word from="Odri" to="Audrey" />
+    <Word from="Ohajo" to="Ohio" />
+    <Word from="Ohaja" to="Ohia" />
+    <Word from="Ohaju" to="Ohiu" />
+    <Word from="Olbrajt" to="Albright" />
+    <Word from="O'Nil" to="O'Neal" />
+    <Word from="Orlins" to="Orleans" />
+    <Word from="Orlinsa" to="Orleansa" />
+    <Word from="Orlinsu" to="Orleansu" />
+    <Word from="Pem" to="Pam" />
+    <Word from="PejdĹľ" to="Paige" />
+    <Word from="RedĹľi" to="Reggie" />
+    <Word from="RedĹľinald" to="Reginald" />
+    <Word from="Rej" to="Ray" />
+    <Word from="RejÄŤel" to="Rachel" />
+    <Word from="RiÄŤ" to="Rich" />
+    <Word from="Rouz" to="Rose" />
+    <Word from="Sendi" to="Sandy" />
+    <Word from="Sidnej" to="Sidney" />
+    <Word from="Sindi" to="Cindy" />
+    <Word from="Sojer" to="Sawyer" />
+    <Word from="Sojeru" to="Sawyeru" />
+    <Word from="Sole" to="Saule" />
+    <Word from="Stejsi" to="Stacy" />
+    <Word from="Stoun" to="Stone" />
+    <Word from="Ĺ eron" to="Sharon" />
+    <Word from="Ĺ eril" to="Cheryl" />
+    <Word from="Ĺ irli" to="Shirley" />
+    <Word from="Ĺ paniji" to="Ĺ panjolskoj" />
+    <Word from="Tajms" to="Times" />
+    <Word from="Tejlor" to="Taylor" />
+    <Word from="Vajlder" to="Wilder" />
+    <Word from="Valš" to="Walsh" />
+    <Word from="Vins" to="Vince" />
+    <Word from="Voren" to="Warren" />
+    <Word from="Vud" to="Wood" />
+    <Word from="Žak" to="Jacques" />
+    <Word from="Žil" to="Jules" />
+    <!-- imena mjeseci -->
+    <Word from="januar" to="sijeÄŤanj" />
+    <Word from="Januar" to="SijeÄŤanj" />
+    <Word from="februar" to="veljaÄŤa" />
+    <Word from="februara" to="veljaÄŤe" />
+    <Word from="februaru" to="veljaÄŤi" />
+    <Word from="Februar" to="VeljaÄŤa" />
+    <Word from="Februara" to="VeljaÄŤe" />
+    <Word from="Februaru" to="VeljaÄŤi" />
+    <Word from="mart" to="oĹľujak" />
+    <Word from="Mart" to="OĹľujak" />
+    <Word from="april" to="travanj" />
+    <Word from="April" to="Travanj" />
+    <Word from="maj" to="svibanj" />
+    <Word from="Maj" to="Svibanj" />
+    <Word from="svibnjom" to="svibnjem" />
+    <Word from="jun" to="lipanj" />
+    <Word from="juna" to="lipnja" />
+    <Word from="junu" to="lipnju" />
+    <Word from="Jun" to="Lipanj" />
+    <Word from="Juni" to="Lipanj" />
+    <Word from="juli" to="srpanj" />
+    <Word from="jula" to="srpnja" />
+    <Word from="julu" to="srpnju" />
+    <Word from="Juli" to="Srpanj" />
+    <Word from="septembar" to="rujan" />
+    <Word from="Septembar" to="Rujan" />
+    <Word from="oktobar" to="listopad" />
+    <Word from="Oktobar" to="Listopad" />
+    <Word from="oktobra" to="listopada" />
+    <Word from="oktobru" to="listopadu" />
+    <Word from="novembar" to="studeni" />
+    <Word from="november" to="studeni" />
+    <Word from="novembra" to="studenog" />
+    <Word from="novembru" to="studenom" />
+    <Word from="Novembar" to="Studeni" />
+    <Word from="November" to="Studeni" />
+    <Word from="Novembra" to="Studenog" />
+    <Word from="Novembru" to="Studenom" />
+    <Word from="decembar" to="prosinac" />
+    <Word from="Decembar" to="Prosinac" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines>
+    <LinePart from="Ako ej" to="Ako je" />
+    <LinePart from="ako ej" to="ako je" />
+    <LinePart from="bez svesti" to="bez svijesti" />
+    <LinePart from="Biću uz" to="Bit ću uz" />
+    <LinePart from="bi ja" to="bih ja" />
+    <LinePart from="bi la" to="bila" />
+    <LinePart from="biti uredu" to="biti u redu" />
+    <LinePart from="bi da bude" to="bi biti" />
+    <LinePart from="Bi ste" to="Biste" />
+    <LinePart from="Bilo ko" to="Bilo tko" />
+    <LinePart from="bilo ko" to="bilo tko" />
+    <LinePart from="će da dođe" to="će doći" />
+    <LinePart from="Da li će" to="Hoće li" />
+    <LinePart from="Da li ćemo" to="Hoćemo li" />
+    <LinePart from="Da li ću" to="Hoću li" />
+    <LinePart from="da li ću" to="hoću li" />
+    <LinePart from="dali ću" to="hoću li" />
+    <LinePart from="Da li je" to="Je li" />
+    <LinePart from="da li je" to="je li" />
+    <LinePart from="dali je" to="je li" />
+    <LinePart from="Da li ste" to="Jeste li" />
+    <LinePart from="Da li si" to="Jesi li" />
+    <LinePart from="dali si" to="jesi li" />
+    <LinePart from="da li će" to="hoće li" />
+    <LinePart from="dali će" to="hoće li" />
+    <LinePart from="do srede" to="do srijede" />
+    <LinePart from="Dobro veÄŤe" to="Dobra veÄŤer" />
+    <LinePart from="Dobro veÄŤer" to="Dobra veÄŤer" />
+    <LinePart from="Dobar veÄŤer" to="Dobra veÄŤer" />
+    <LinePart from="gdje ideš" to="kamo ideš" />
+    <LinePart from="Gdje ideš" to="Kamo ideš" />
+    <LinePart from="Gdje sada" to="Kamo sada" />
+    <LinePart from="gle ko" to="gle tko" />
+    <LinePart from="hoću da budem" to="želim biti" />
+    <LinePart from="Hoću da budem" to="Želim biti" />
+    <LinePart from="hoću da kažem" to="želim reći" />
+    <LinePart from="hoćeš da kažeš" to="želiš reći" />
+    <LinePart from="hoće da kaže" to="želi reći" />
+    <LinePart from="hoću da živim" to="želim živjeti" />
+    <LinePart from="Izvini se" to="IspriÄŤaj se" />    
+    <LinePart from="izvini se" to="ispriÄŤaj se" />
+    <LinePart from="Izvinite me" to="IspriÄŤajte me" />
+    <LinePart from="Izvinite nas" to="IspriÄŤajte nas" />
+    <LinePart from="izvinite nas" to="ispriÄŤajte nas" />
+    <LinePart from="Izvinjavamo se" to="IspriÄŤavamo se" />
+    <LinePart from="ja bi" to="ja bih" />
+    <LinePart from="Ja bi" to="Ja bih" />
+    <LinePart from="Jel sam ti" to="Jesam li ti" />
+    <LinePart from="Jeli se" to="Je li se" />
+    <LinePart from="Jeli sve" to="Je li sve" />
+    <LinePart from="Jeli ti" to="Je li ti" />
+    <LinePart from="ko je" to="tko je" />
+    <LinePart from="ko si" to="tko si" />
+    <LinePart from="ko ti je" to="tko ti je" />
+    <LinePart from="ko te je" to="tko te je" />
+    <LinePart from="ko zna" to="tko zna" />
+    <LinePart from="moći da idemo" to="moći ići" />
+    <LinePart from="moglo da bude" to="moglo biti" />
+    <LinePart from="moje saučešće" to="moja sućut" />
+    <LinePart from="mora da bude" to="mora biti" />
+    <LinePart from="moram da budem" to="moram biti" />
+    <LinePart from="Moram da idem" to="Moram ići" />
+    <LinePart from="moram da idem" to="moram ići" />
+    <LinePart from="Moraš da ideš" to="Moraš ići" />
+    <LinePart from="Moramo da idemo" to="Moramo ići" />
+    <LinePart from="moram da vidim" to="moram vidjeti" />
+    <LinePart from="moram da zaboravim" to="moram zaboraviti" />
+    <LinePart from="moraš da zaboraviš" to="moraš zaboraviti" />
+    <LinePart from="mora da zna" to="mora znati" />
+    <LinePart from="moram da znam" to="moram znati" />
+    <LinePart from="Moram da znam" to="Moram znati" />
+    <LinePart from="moraš da znaš" to="moraš znati" />
+    <LinePart from="moraš da ideš" to="moraš ići" />
+    <LinePart from="moĹľe da bude" to="moĹľe biti" />
+    <LinePart from="možeš da budeš" to="možeš biti" />
+    <LinePart from="može da diše" to="može disati" />
+    <LinePart from="možeš da dobiješ" to="možeš dobiti" />
+    <LinePart from="moĹľemo da imamo" to="moĹľemo imati" />
+    <LinePart from="na veÄŤer" to="naveÄŤer" />
+    <LinePart from="Na veÄŤer" to="NaveÄŤer" />
+    <LinePart from="neće da bude" to="neće biti" />
+    <LinePart from="nećeš da budeš" to="nećeš biti" />
+    <LinePart from="nećeš da požališ" to="nećeš požaliti" />
+    <LinePart from="Neko ko" to="Netko tko" />
+    <LinePart from="neko ko" to="netko tko" />
+    <LinePart from="neko nešto" to="netko nešto" />
+    <LinePart from="nedjelju dana" to="tjedan dana" />
+    <LinePart from="Ne mogu da verujem" to="Ne mogu vjerovati" />
+    <LinePart from="new yorški" to="njujorški" />
+    <LinePart from="nju jorški" to="njujorški" />
+    <LinePart from="od kako" to="otkako" />
+    <LinePart from="Plašim se" to="Bojim se" />
+    <LinePart from="plašim se" to="bojim se" />
+    <LinePart from="pravo u oÄŤi" to="ravno u oÄŤi" />
+    <LinePart from="sa njim" to="s njim" />
+    <LinePart from="sa njima" to="s njima" />
+    <LinePart from="sa njom" to="s njom" />
+    <LinePart from="sa tim" to="s tim" />
+    <LinePart from="sa tom" to="s tom" />
+    <LinePart from="sa tobom" to="s tobom" />
+    <LinePart from="sa vama" to="s vama" />
+    <LinePart from="sam da budem" to="sam biti" />
+    <LinePart from="sići dolje" to="sići" />
+    <LinePart from="Si dobro" to="Jesi li dobro" />
+    <LinePart from="Svako ko" to="Svatko tko" />
+    <LinePart from="Svo vreme" to="Sve vrijeme" />
+    <LinePart from="Svo vrijeme" to="Sve vrijeme" />
+    <LinePart from="smeo da" to="smio" />
+    <LinePart from="smeli da" to="smjeli" />
+    <LinePart from="Ĺ to ej" to="Ĺ to je" />
+    <LinePart from="što ej" to="što je" />
+    <LinePart from="to j" to="to je" />
+    <LinePart from="to ej" to="to je" />
+    <LinePart from="To ej" to="To je" />
+    <LinePart from="tamo natrag" to="tamo iza" />
+    <LinePart from="tamo je natrag" to="tamo je iza" />
+    <LinePart from="Tamo je natrag" to="Tamo je iza" />
+    <LinePart from="treba da bude" to="treba biti" />
+    <LinePart from="u jutro" to="ujutro" />
+    <LinePart from="ući unutra" to="ući" />
+    <LinePart from="vas je lagao" to="vam je lagao" />
+    <LinePart from="za uvijek" to="zauvijek" />
+    <LinePart from="zato sto" to="zato što" />
+    <LinePart from="zna da bude" to="zna biti" />
+    <LinePart from="zna ko" to="zna tko" />
+    <LinePart from="znati ko" to="znati tko" />
+    <LinePart from="Ĺľele da budu" to="Ĺľele biti" />
+    <LinePart from="Ĺľeli da bude" to="Ĺľeli biti" />
+    <LinePart from="Ĺľelio da budem" to="Ĺľelio biti" />
+    <LinePart from="Ĺľelim da budem" to="Ĺľelim biti" />
+    <LinePart from="Želim da budem" to="Želim biti" />
+    <LinePart from="želiš da budeš" to="želiš biti" />
+    <LinePart from="želim da idem" to="želim ići" />
+    <LinePart from="želim da odem" to="želim otići" />
+    <LinePart from="želiš da odeš" to="želiš otići" />
+    <LinePart from="želiš da uđeš" to="želiš ući" />
+    <LinePart from="Ĺľelim da umrem" to="Ĺľelim umrijeti" />
+    <LinePart from="Želim da znam" to="Želim znati" />
+    <LinePart from="Ĺľelim da znam" to="Ĺľelim znati" />
+    <LinePart from="želiš da znaš" to="želiš znati" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <!-- deklinacije imenica i konjugacije glagola -->
+    <RegEx find="([0-9])-ogodišnj" replaceWith="$1-godišnj" />
+    <RegEx find="(jeda|dva|tri|četr|pet|šes|sedam|osam|devet)najst([aeiou]|i[mh]|o[mgj]|ima)\b" replaceWith="$1naest$2" />
+    <RegEx find="bsorbira" replaceWith="psorbira" />
+    <RegEx find="bstraktn" replaceWith="pstraktn" />
+    <RegEx find="\badvokat(?![si])" replaceWith="odvjetnik" />
+    <RegEx find="Advokat(?![si])" replaceWith="Odvjetnik" />
+    <RegEx find="\badvokatsk" replaceWith="odvjetniÄŤk" />
+    <RegEx find="Advokatsk" replaceWith="OdvjetniÄŤk" />
+    <RegEx find="ajsmiješnij" replaceWith="ajsmješnij" />
+    <RegEx find="([aA])kcion(?!ar)" replaceWith="$1kcijsk" />
+    <RegEx find="Akcionar" replaceWith="DioniÄŤar" />
+    <RegEx find="akcionar" replaceWith="dioniÄŤar" />
+    <RegEx find="\b[aA]las([kc])" replaceWith="Aljas$1" />
+    <RegEx find="([dnl])ijum" replaceWith="$1ij" />
+    <RegEx find="ngaĹľov" replaceWith="ngaĹľir" />
+    <RegEx find="armij" replaceWith="vojsk" />
+    <RegEx find="Armij" replaceWith="Vojsk" />
+    <RegEx find="svalt" replaceWith="sfalt" />
+    <RegEx find="([aA])zbu[kc]" replaceWith="$1beced" />
+    <RegEx find="akcil" replaceWith="acil" />
+    <RegEx find="bardovanj" replaceWith="bardiranj" />
+    <RegEx find="baštensk" replaceWith="vrtn" />
+    <RegEx find="ataljon" replaceWith="ataljun" />
+    <RegEx find="beđivać" replaceWith="vjeravat ć" />
+    <RegEx find="beđujuć" replaceWith="vjeravajuć" />
+    <RegEx find="ekstv" replaceWith="ijeg" />
+    <RegEx find="bj?elac" replaceWith="bijelac" />
+    <RegEx find="([bB])ele([šgž])" replaceWith="$1ilje$2" />
+    <!-- nikada sa velikim slovom jer je Bela ime -->
+    <RegEx find="([bc])elin" replaceWith="$1jelin" />
+    <RegEx find="belkinj" replaceWith="bjelkinj" />
+    <RegEx find="([bB])erz" replaceWith="$1urz" />
+    <RegEx find="([bB])esom" replaceWith="$1jesom" />
+    <RegEx find="\bbezbj?ed" replaceWith="sigur" />
+    <RegEx find="\bBezbj?ed" replaceWith="Sigur" />
+    <RegEx find="\bbiblij([aeiou]|om|ama)\b" replaceWith="Biblij$1" />
+    <RegEx find="\b([bBpP])iće(š|mo|te)\b" replaceWith="$1it ć$2" />
+    <!-- futur 1. nema i na kraju glagola - "Pogrešno je pisati: biti ću" -->
+    <RegEx find="\b([bB])iti ć([ue]š?|emo|ete)\b" replaceWith="$1it ć$2" />
+    <RegEx find="biro(?!k)" replaceWith="ured" />
+    <RegEx find="Biro(?!k)" replaceWith="Ured" />
+    <RegEx find="\b([bB])j?edn([aeiou]|k[aeou]?)" replaceWith="$1ijedn$2" />
+    <RegEx find="\b([bB])j?el([aeiou]|ac|c[aeiu]|cima|o[mgj]|i[mh])\b" replaceWith="$1ijel$2" />
+    <RegEx find="(?&lt;![uU]rne)([bB])j?esn([aeiou])" replaceWith="$1ijesn$2" />
+    <RegEx find="zvrj?ed" replaceWith="zvrijed" />
+    <RegEx find="znadeĹľ" replaceWith="znad" />
+    <RegEx find="([bB])eĹľanj" replaceWith="$1jeĹľanj" />
+    <RegEx find="([bB])i?j?ež([ei]|i[mš]|imo|ite|ao|al[aeio]|ati)\b" replaceWith="$1jež$2" />
+    <RegEx find="bioskop(?![si])" replaceWith="kin" />
+    <RegEx find="Bioskop(?![si])" replaceWith="Kin" />
+    <RegEx find="([bB])lj?ed([aeiouj])" replaceWith="$1lijed$2" />
+    <RegEx find="bliži[čć]" replaceWith="bližit ć" />
+    <RegEx find="lagosloven" replaceWith="lagoslovljen" />
+    <RegEx find="ogat?st?v" replaceWith="ogatstv" />
+    <RegEx find="([bBvV])o[Il]e(n|l[aieo]|ti)\b" replaceWith="$1olje$2" />
+    <RegEx find="([dbvmBVM])oleo" replaceWith="$1olio" />
+    <RegEx find="oĹľij" replaceWith="oĹľj" />
+    <RegEx find="boži[čć]([aeiu]|em|ima)?\b" replaceWith="Božić$1" />
+    <RegEx find="(?&lt;!\A|[.!?][&quot;”’]?\s+)\bBoži[čć]n([aeiou]|om|im)\b" replaceWith="božićn$1" />
+    <RegEx find="[bB]ubašvab" replaceWith="žohar" />
+    <RegEx find="bukval" replaceWith="doslov" />
+    <RegEx find="Bukval" replaceWith="Doslov" />
+    <RegEx find="\bCalifornij?" replaceWith="Kalifornij" />
+    <RegEx find="\b([cC])j?el([aeiou]|o[mgj]|i[mh]|ima?|osti)\b" replaceWith="$1ijel$2" />
+    <RegEx find="\b([cC])j?en([aeiou])" replaceWith="$1ijen$2" />
+    <RegEx find="([cC])j?enjen" replaceWith="$1ijenjen" />
+    <RegEx find="([cC])j?eni([lt])" replaceWith="$1ijeni$2" />
+    <RegEx find="([cC])rj?ev" replaceWith="$1rijev" />
+    <RegEx find="([cCsS])vj?e[ćč]([aeiou]|[oe]m|ama)\b" replaceWith="$1vijeć$2" />
+    <!-- časopisa » satopisa NE! - ne diraj te 2 linije! -->
+    <RegEx find="ÄŤas([au]|om|ov[aei]|ovima)\b" replaceWith="sat$1" />
+    <RegEx find="ÄŚas([au]|om|ov[aei]|ovima)\b" replaceWith="Sat$1" />
+    <RegEx find="([čČ])eka[čć]" replaceWith="$1ekat ć" />
+    <RegEx find="([ÄŤÄŚ])ovi?j?e([kÄŤ])" replaceWith="$1ovje$2" />
+    <RegEx find="ćopa" replaceWith="šepa" />
+    <RegEx find="ćuti" replaceWith="šuti" />
+    <RegEx find="Ćuti" replaceWith="Šuti" />
+    <RegEx find="\bćuta(?!o)" replaceWith="šutje" />
+    <RegEx find="\bĆuta(?!o)" replaceWith="Šutje" />
+    <RegEx find="[cčć]ut([ln])j" replaceWith="šut$1j" />
+    <RegEx find="[CČĆ]ut([ln])j" replaceWith="Šut$1j" />
+    <RegEx find="ćurk" replaceWith="puric" />
+    <RegEx find="Ćurk" replaceWith="Puric" />
+    <RegEx find="\b([dD])a[čć]([eu])" replaceWith="$1at ć$2" />
+    <RegEx find="ejstv(?!o)" replaceWith="jelovanj" />
+    <RegEx find="eklarisa" replaceWith="eklarira" />
+    <RegEx find="\b([dD])el([aou](?!x)|ić|ić[aeiu]|ima)" replaceWith="$1jel$2" />
+    <RegEx find="([dD])elova([lnt])" replaceWith="$1jelova$2" />
+    <RegEx find="\b([dD])j?eli([mšo]|mo|l[aeio]|t[ei])\b" replaceWith="$1ijeli$2" />
+    <RegEx find="\b([bBdD])j?el([ei])\b" replaceWith="$1ijel$2" />
+    <RegEx find="ikvent" replaceWith="inkvent" />
+    <RegEx find="([dD])elimi" replaceWith="$1jelomi" />
+    <RegEx find="([dD])eluj" replaceWith="$1jeluj" />
+    <RegEx find="([dD])isać" replaceWith="$1isat ć" />
+    <RegEx find="diskutova" replaceWith="raspravlja" />
+    <RegEx find="\b([dD])i?j?etet([au]|o[mv]|ov[aeiou]|ovo[mjg])\b" replaceWith="$1jetet$2" />
+    <RegEx find="\b([dD])ec([aeiou]|om)\b" replaceWith="$1jec$2" />
+    <RegEx find="\b([dD])e[čć]ic" replaceWith="$1ječic" />
+    <RegEx find="\b([dD])j?elov([aei]|ima)\b" replaceWith="$1ijelov$2" />
+    <RegEx find="\b([dD])evi([cÄŤ])" replaceWith="$1jevi$2" />
+    <RegEx find="\b([dD])evoj" replaceWith="$1jevoj" />
+    <RegEx find="([dD])eÄŤa" replaceWith="$1jeÄŤa" />
+    <RegEx find="delji" replaceWith="djelji" />
+    <RegEx find="([dD])j?eÄŤi?j" replaceWith="$1jeÄŤj" />
+    <RegEx find="([dD])etinj" replaceWith="$1jetinj" />
+    <RegEx find="\b([dD])esi(?!ć)" replaceWith="$1ogodi" />
+    <RegEx find="\b([dD])esić" replaceWith="$1ogodit ć" />
+    <RegEx find="\b([dD])j?eljenj" replaceWith="$1ijeljenj" />
+    <RegEx find="\b([dD])ijec([aeiou]|om)\b" replaceWith="$1jec$2" />
+    <RegEx find="ragoce" replaceWith="ragocje" />
+    <RegEx find="([dD])obi[čćc](?!i)" replaceWith="$1obit ć" />
+    <RegEx find="\b([dD])obij(a|en)" replaceWith="$1obiv$2" />
+    <RegEx find="([dD])o[čć]ić([eu])" replaceWith="$1oći ć$2" />
+    <RegEx find="([dD])ol?j?nj" replaceWith="$1onj" />
+    <RegEx find="([dD]o|[NnZz]a|[OoUu]d?)neo" replaceWith="$1nio" />
+    <RegEx find="\b([dDpP])o(d?)nj?e([lt])" replaceWith="$1o$2nije$3" />
+    <RegEx find="\b([dDpP])o(d?)nj?eć([eu])" replaceWith="$1o$2nijet ć$3" />
+    <RegEx find="\b([oO])dnj?e(l[aeio]|ti)\b" replaceWith="$1dnije$2" />
+    <RegEx find="\bdopada" replaceWith="sviđa" />
+    <RegEx find="\bDopada" replaceWith="Sviđa" />
+    <RegEx find="([dD])oprinj?e([ltv])" replaceWith="$1oprinije$2" />
+    <RegEx find="([dD])oprin(j?es?o)" replaceWith="$1oprinio" />
+    <RegEx find="\b([dD])osije" replaceWith="$1osje" />
+    <RegEx find="([dD])ospe(l[aeio]|lo[mgj]|lima|ti)\b" replaceWith="$1ospje$2" />
+    <RegEx find="([dD])ospe(?=[mš]|te\b)" replaceWith="$1ospije" />
+    <RegEx find="dostaja[čćc]" replaceWith="dostajat ć" />
+    <RegEx find="oveš[čćc]" replaceWith="ovest ć" />
+    <RegEx find="([dD])rj?ema" replaceWith="$1rijema" />
+    <RegEx find="drugaric" replaceWith="prijateljic" />
+    <RegEx find="Drugaric" replaceWith="Prijateljic" />
+    <RegEx find="dušek" replaceWith="madrac" />
+    <RegEx find="Dušek" replaceWith="Madrac" />
+    <RegEx find="dĹľigeric" replaceWith="jetr" />
+    <RegEx find="DĹľigeric" replaceWith="Jetr" />
+    <RegEx find="Ĺľinovsk" replaceWith="ivovsk" />
+    <RegEx find="\bđep" replaceWith="džep" />
+    <RegEx find="Äep" replaceWith="DĹľep" />
+    <RegEx find="\bđubret" replaceWith="smeć" />
+    <RegEx find="\bđubriš" replaceWith="smetliš" />
+    <RegEx find="eklariše" replaceWith="eklarira" />
+    <RegEx find="ekspert(?![ni])" replaceWith="struÄŤnjak" />
+    <RegEx find="Ekspert(?![ni])" replaceWith="StruÄŤnjak" />
+    <RegEx find="ekspertn" replaceWith="struÄŤn" />
+    <RegEx find="Ekspertn" replaceWith="StruÄŤn" />
+    <RegEx find="enerk" replaceWith="enirk" />
+    <RegEx find="vakuiše" replaceWith="vakuira" />
+    <RegEx find="vakuišu" replaceWith="vakuiraju" />
+    <RegEx find="volucij?on(?![ar])" replaceWith="volucijsk" />
+    <RegEx find="vrop" replaceWith="urop" />
+    <RegEx find="fabri[kc]" replaceWith="tvornic" />
+    <RegEx find="Fabri[kc]" replaceWith="Tvornic" />
+    <RegEx find="fabriÄŤ" replaceWith="tvorniÄŤ" />
+    <RegEx find="\bfarb" replaceWith="boj" />
+    <RegEx find="Farb(?!er)" replaceWith="Boj" />
+    <RegEx find="fij?o[ck]" replaceWith="ladic" />
+    <RegEx find="Fij?o[ck]" replaceWith="Ladic" />
+    <RegEx find="inansi" replaceWith="inanci" />
+    <RegEx find="ormacij?on" replaceWith="ormacijsk" />
+    <RegEx find="\bfu[dt]bal(?![se])" replaceWith="nogomet" />
+    <RegEx find="\bFu[dt]bal(?![se])" replaceWith="Nogomet" />
+    <RegEx find="fu[dt]balsk" replaceWith="nogometn" />
+    <RegEx find="cioniše" replaceWith="cionira" />
+    <RegEx find="([fF])orezni" replaceWith="$1orenzi" />
+    <RegEx find="ejsbu" replaceWith="aceboo" />
+    <RegEx find="arant(uje|ova)" replaceWith="arantira" />
+    <RegEx find="([gGsS])luv" replaceWith="$1luh" />
+    <RegEx find="([gG])nev" replaceWith="$1njev" />
+    <RegEx find="\b([gG])nj?ezd" replaceWith="$1nijezd" />
+    <RegEx find="([gG])odić" replaceWith="$1odit ć" />
+    <RegEx find="ospodj" replaceWith="ospođ" />
+    <RegEx find="([gG])ore([lt])" replaceWith="$1orje$2" />
+    <!-- ne diraj! [dogorio/razgorio/ izgorio] -->
+    <RegEx find="([gG])oreo" replaceWith="$1orio" />
+    <RegEx find="([gG])rej(?!p)" replaceWith="$1rij" />
+    <RegEx find="\b([gG])rj?e([hs])" replaceWith="$1rije$2" />
+    <RegEx find="\b([gG])riješn" replaceWith="$1rješn" />
+    <RegEx find="([gG])rj?eši([šsmotl])" replaceWith="$1riješi$2" />
+    <RegEx find="gvožđ" replaceWith="željez" />
+    <RegEx find="Gvožđ" replaceWith="Željez" />
+    <RegEx find="haos" replaceWith="kaos" />
+    <RegEx find="Haos" replaceWith="Kaos" />
+    <RegEx find="hemi(?![sfgmt])" replaceWith="kemi" />
+    <RegEx find="Hemi(?![sfgmt])" replaceWith="Kemi" />
+    <RegEx find="\bh?istorij[ei]" replaceWith="povijesti" />
+    <RegEx find="\bh?istorij[au]" replaceWith="povijest" />
+    <RegEx find="\bh?istorijsk" replaceWith="povijesn" />
+    <RegEx find="\bHistorijsk" replaceWith="Povijesn" />
+    <RegEx find="\bIstorijsk" replaceWith="Povijesn" />
+    <RegEx find="\bhiljad([aeiou]|om|ama)\b" replaceWith="tisuć$1" />
+    <RegEx find="\bHiljad([aeiou]|om|ama)\b" replaceWith="Tisuć$1" />
+    <RegEx find="hirur" replaceWith="kirur" />
+    <RegEx find="Hirur" replaceWith="Kirur" />
+    <RegEx find="hleb" replaceWith="kruh" />
+    <RegEx find="Hleb" replaceWith="Kruh" />
+    <RegEx find="\b([hH])oče" replaceWith="$1oće" />
+    <!-- [h->k]olesterol -->
+    <RegEx find="holest" replaceWith="kolest" />
+    <RegEx find="Holest" replaceWith="Kolest" />
+    <RegEx find="\bhor([au]|om|ov[ia]|ovima)\b" replaceWith="zbor$1" />
+    <RegEx find="\bHor([au]|om|ov[ia]|ovima)\b" replaceWith="Zbor$1" />
+    <RegEx find="hri?šćan" replaceWith="kršćan" />
+    <RegEx find="Hri?šćan" replaceWith="Kršćan" />
+    <RegEx find="[kh]romo[sz]om" replaceWith="kromosom" />
+    <RegEx find="[KH]romo[sz]om" replaceWith="Kromosom" />
+    <RegEx find="hroniÄŤ" replaceWith="kroniÄŤ" />
+    <RegEx find="HroniÄŤ" replaceWith="KroniÄŤ" />
+    <RegEx find="([hH])te([lt])" replaceWith="$1tje$2" />
+    <RegEx find="idja" replaceWith="iđa" />
+    <RegEx find="\b([iI])mać" replaceWith="$1mat ć" />
+    <RegEx find="nostranstv" replaceWith="nozemstv" />
+    <RegEx find="nstikt" replaceWith="nstinkt" />
+    <RegEx find="interesantn" replaceWith="zanimljiv" />
+    <RegEx find="Interesantn" replaceWith="Zanimljiv" />
+    <RegEx find="inuć" replaceWith="inut ć" />
+    <RegEx find="teresova" replaceWith="teresira" />
+    <RegEx find="vjuis" replaceWith="vjuir" />
+    <RegEx find="vjuiše" replaceWith="vjuira" />
+    <RegEx find="vjuišu" replaceWith="vjuiraju" />
+    <RegEx find="ntezivn" replaceWith="ntenzivn" />
+    <RegEx find="([iI])seÄŤe" replaceWith="$1zreĹľe" />
+    <RegEx find="spoljava" replaceWith="zraĹľava" />
+    <RegEx find="spovj?e(d|st)" replaceWith="spovije$1" />
+    <RegEx find="zbe([gć])" replaceWith="zbje$1" />
+    <RegEx find="spresj?ecan" replaceWith="spresijecan" />
+    <RegEx find="spri[čć]ać" replaceWith="spričat ć" />
+    <RegEx find="italijan" replaceWith="talijan" />
+    <RegEx find="Italijan" replaceWith="Talijan" />
+    <RegEx find="\b([iI])zmen" replaceWith="$1zmjen" />
+    <RegEx find="([iI])znj?eć" replaceWith="$1znijet ć" />
+    <RegEx find="znj?el" replaceWith="znijel" />
+    <RegEx find="zolova" replaceWith="zolira" />
+    <RegEx find="zume([ltv])" replaceWith="zumje$1" />
+    <RegEx find="zvesn" replaceWith="zvjesn" />
+    <RegEx find="zvinjava([mšojlt]) se" replaceWith="spričava$1 se" />
+    <RegEx find="([iI])zvin[iu]([lo])" replaceWith="$1spriÄŤa$2" />
+    <RegEx find="jaket" replaceWith="jakn" />
+    <RegEx find="\b([jJ])agnje" replaceWith="$1anje" />
+    <RegEx find="jereti" replaceWith="hereti" />
+    <RegEx find="Jereti" replaceWith="Hereti" />
+    <RegEx find="jevanđelj" replaceWith="evanđelj" />
+    <RegEx find="\b([kK])af([aeiou]|om|ama|anama|ic[aeiu]|an[aeiuo]|anom|ansk[aeiuo])\b" replaceWith="$1av$2" />
+    <RegEx find="([kK]alib(?:ar|r[aeui]))\. *([0-9])" replaceWith="$1 .$2" />
+    <RegEx find="arantin" replaceWith="aranten" />
+    <RegEx find="kašik" replaceWith="žlic" />
+    <RegEx find="Kašik" replaceWith="Žlic" />
+    <RegEx find="(k[ćč]|[ćč])erk([eio](?!m))" replaceWith="kćeri" />
+    <RegEx find="(K[ćč]|[ĆČ])erk([eio](?!m))" replaceWith="Kćeri" />
+    <RegEx find="\b([kK])[čć]erku\b" replaceWith="$1ćer" />
+    <RegEx find="elner" replaceWith="onobar" />
+    <RegEx find="\bkero?v?([aeiu]|om)\b" replaceWith="ps$1" />
+    <RegEx find="\bKero?v?([aeiu]|om)\b" replaceWith="Ps$1" />
+    <RegEx find="kev([aeiou]|om)\b" replaceWith="majk$1" />
+    <RegEx find="Kev([aeiou]|om)\b" replaceWith="Majk$1" />
+    <RegEx find="kidnapova([otl])" replaceWith="ote$1" />
+    <RegEx find="Kidnapova([otl])" replaceWith="Ote$1" />
+    <RegEx find="kidnapovanj" replaceWith="otimanj" />
+    <RegEx find="Kidnapovanj" replaceWith="Otimanj" />
+    <RegEx find="\bkirij" replaceWith="stanarin" />
+    <RegEx find="Kirij" replaceWith="Stanarin" />
+    <RegEx find="iseonik" replaceWith="isik" />
+    <RegEx find="([kK])lovn" replaceWith="$1laun" />
+    <RegEx find="olj?ev([kc])" replaceWith="olijev$1" />
+    <RegEx find="oleginic" replaceWith="olegic" />
+    <!-- ne vadi iz RegEx -->
+    <RegEx find="komanduj" replaceWith="naređuj" />
+    <RegEx find="inuje" replaceWith="inira" />
+    <RegEx find="binova" replaceWith="binira" />
+     <RegEx find="\b([kKvV])olen" replaceWith="$1oljen" />
+    <RegEx find="komitet" replaceWith="odbor" />
+    <RegEx find="Komitet" replaceWith="Odbor" />
+    <RegEx find="plikuj" replaceWith="plicira" />
+    <!-- kompromitova -->
+    <RegEx find="omitova" replaceWith="omitira" />
+    <RegEx find="komšijsk" replaceWith="susjedn" />
+    <RegEx find="onfor" replaceWith="omfor" />
+    <RegEx find="konkurs" replaceWith="natjeÄŤaj" />
+    <RegEx find="Konkurs" replaceWith="NatjeÄŤaj" />
+    <RegEx find="krenuć" replaceWith="krenut ć" />
+    <RegEx find="kuris" replaceWith="kurir" />
+    <RegEx find="roli(sa|še)" replaceWith="rolira" />
+    <RegEx find="([eo])risa" replaceWith="$1rira" />
+    <RegEx find="oristić" replaceWith="oristit ć" />
+    <RegEx find="oriš[ćč]en" replaceWith="orišten" />
+    <RegEx find="([kK])orj?en" replaceWith="$1orijen" />
+    <RegEx find="\b([kK])orp([aei])" replaceWith="$1ošar$2" />
+    <RegEx find="ritikova([olt])" replaceWith="ritizira$1" />
+    <RegEx find="ritikuje" replaceWith="ritizira" />
+    <RegEx find="rofn" replaceWith="rafn" />
+    <RegEx find="rompir" replaceWith="rumpir" />
+    <RegEx find="rstašk" replaceWith="rižarsk" />
+    <RegEx find="([kK])uÄŤk" replaceWith="$1uj" />
+    <RegEx find="([kKlL])upić" replaceWith="$1upit ć" />
+    <RegEx find="([kK])uva(?!jt)" replaceWith="$1uha" />
+    <RegEx find="([lL])etnj" replaceWith="$1jetn" />
+    <RegEx find="ezbej" replaceWith="ezbij" />
+    <RegEx find="([lL])j?eči([mštol])" replaceWith="$1iječi$2" />
+    <RegEx find="([lL])j?e[čć]ni([cč])" replaceWith="$1iječni$2" />
+    <RegEx find="([lL])j?e[čć]nik(?!i)" replaceWith="$1iječnik" />
+    <RegEx find="\b([lL])ekar(?![inso])" replaceWith="$1ijeÄŤnik" />
+    <RegEx find="\b([lL])j?ek([au]|om|ov[aei]|ovima)?\b" replaceWith="$1ijek$2" />
+    <RegEx find="\b([iI]zl|[lL])j?eÄŤen" replaceWith="$1ijeÄŤen" />
+    <RegEx find="\blenj?([aeiou]|om|osti?|ošću|ima?|čin[aieou]|činama)?\b" replaceWith="lijen$1" />
+    <!-- Lena je englesko ime i zato ne moĹľe -->
+    <RegEx find="\bLenj?(om?|osti?|ošću|ima?|čin[aieou]|činama)?\b" replaceWith="Lijen$1" />
+    <RegEx find="\b([lL])j?ep([aeiou]|o[mgj]|ih|ima?)?\b" replaceWith="$1ijep$2" />
+    <RegEx find="([lL])j?epot" replaceWith="$1jepot" />
+    <RegEx find="\b([lL])ep([šil])" replaceWith="$1jep$2" />
+    <RegEx find="\b([lL])ev(?!is)" replaceWith="$1ijev" />
+    <RegEx find="(?&lt;!p)([lL])ete([lt])" replaceWith="$1etje$2" />
+    <!-- ne diraj! [uzletio/razletio/sletio/podletio] -->
+    <RegEx find="([lL])eteo" replaceWith="$1etio" />
+    <RegEx find="\b([lL])eto([ms])" replaceWith="$1jeto$2" />
+    <RegEx find="icemer" replaceWith="icemjer" />
+    <RegEx find="\bliÄŤn([aeiou]|im|o[mgj])" replaceWith="osobn$1" />
+    <RegEx find="\bLiÄŤn([aeiou]|im|o[mgj])" replaceWith="Osobn$1" />
+    <RegEx find="(?&lt;![kz])obanj" replaceWith="ubanj" />
+    <RegEx find="([lL])ović" replaceWith="$1ovit ć" />
+    <RegEx find="\b([lL])jep([aeiou]|om|oj|ima)\b" replaceWith="$1ijep$2" />
+    <RegEx find="\b([lL])uda([kcč])" replaceWith="$1uđa$2" />
+    <RegEx find="(u|[Pp]re|[sS]vi)deo" replaceWith="$1dio" />
+    <RegEx find="\b([lL])juski" replaceWith="$1judski" />
+    <RegEx find="makaz" replaceWith="škar" />
+    <RegEx find="Makaz" replaceWith="Ĺ kar" />
+    <RegEx find="maknil" replaceWith="maknul" />
+    <RegEx find="\bmap(?!ir)" replaceWith="kart" />
+    <RegEx find="\bMap(?!ir)" replaceWith="Kart" />
+    <RegEx find="mator" replaceWith="star" />
+    <RegEx find="Mator" replaceWith="Star" />
+    <RegEx find="\b([mM])er([aou]|i[lt]|e(?!d))" replaceWith="$1jer$2" />
+    <RegEx find="([mM])ese([cÄŤ])" replaceWith="$1jese$2" />
+    <RegEx find="\b([mM])est([aoiu])" replaceWith="$1jest$2" />
+    <RegEx find="mešt(?!r)" replaceWith="mješt" />
+    <RegEx find="igracion" replaceWith="igracijsk" />
+    <RegEx find="(is|si)lić" replaceWith="$1lit ć" />
+    <RegEx find="išič" replaceWith="išić" />
+    <RegEx find="([mM])j?ešalic" replaceWith="$1iješalic" />
+    <RegEx find="([mM])j?eša([jmnšo]|n[aio]|no[mgj]|nima?|mo|ju|njem|nj[aeu]|l[aeio]|t[ei])?\b" replaceWith="$1iješa$2" />
+    <RegEx find="([mM])edve([dđ])" replaceWith="$1edvje$2" />
+    <RegEx find="minđuš" replaceWith="naušnic" />
+    <RegEx find="ilij?[ou]n" replaceWith="ilijun" />
+    <RegEx find="(?&lt;![iI]|[kK]a)([mM])j?enja([jmnšo]|mo|njem?|ju|l[aeio]|t[ei])?\b" replaceWith="$1ijenja$2" />
+    <RegEx find="([mM])lj?ek([aou])" replaceWith="$1lijek$2" />
+    <RegEx find="([mM])lj?eÄŤn" replaceWith="$1lijeÄŤn" />
+    <RegEx find="leven" replaceWith="ljeven" />
+    <RegEx find="([mM])oč([iun])" replaceWith="$1oć$2" />
+    <RegEx find="oguč" replaceWith="oguć" />
+    <RegEx find="([mpsMPS])olić" replaceWith="$1olit ć" />
+    <RegEx find="([mM])orać" replaceWith="$1orat ć" />
+    <RegEx find="otivisa" replaceWith="otivira" />
+    <RegEx find="([mM])rze([šolt])" replaceWith="$1rzi$2" />
+    <RegEx find="rzeć(?!i)" replaceWith="rzit ć" />
+    <RegEx find="([mM])uva([mjovšlt])" replaceWith="$1ota$2" />
+    <RegEx find="([mM])uv([eou])" replaceWith="$1uh$2" />
+    <RegEx find="muziÄŤk" replaceWith="glazben" />
+    <RegEx find="MuziÄŤk" replaceWith="Glazben" />
+    <RegEx find="nabdjeva(?!ÄŤ)" replaceWith="nabdijeva" />
+    <RegEx find="([nN])aden" replaceWith="$1adjen" />
+    <RegEx find="([nN])amer" replaceWith="$1amjer" />
+    <RegEx find="agovj?est" replaceWith="agovijest" />
+    <RegEx find="ajcijenjen" replaceWith="ajcjenjen" />
+    <RegEx find="\b([nN])amj?en([aeiou])" replaceWith="$1amjen$2" />
+    <RegEx find="\b([nN])amj?eni([mštol])" replaceWith="$1amijeni$2" />
+    <RegEx find="(?&lt;![zZ])amest" replaceWith="amjest" />
+    <RegEx find="([nN])ane([lt])" replaceWith="$1anje$2" />
+    <RegEx find="aoÄŤar(?!k)" replaceWith="aoÄŤal" />
+    <RegEx find="aran[Ä‘d]Ĺľ" replaceWith="aranÄŤ" />
+    <RegEx find="arudĹľbin" replaceWith="arudĹľb" />
+    <RegEx find="([nN])asel([aeio])\b" replaceWith="$1asjel$2" />
+    <RegEx find="([nN]a|[Ii])smej" replaceWith="$1smij" />
+    <RegEx find="asle([dđ])" replaceWith="aslje$1" />
+    <RegEx find="([nN])atera" replaceWith="$1atjera" />
+    <RegEx find="([nN])atj?erać" replaceWith="$1atjerat ć" />
+    <RegEx find="([nN])a(gradi|pravi|tera|uči|zva)ć" replaceWith="$1a$2t ć" />
+    <RegEx find="nauÄŤn" replaceWith="znanstven" />
+    <RegEx find="NauÄŤn" replaceWith="Znanstven" />
+    <RegEx find="\b([nN])e[cč]([eu]š?|emo|ete)\b" replaceWith="$1eć$2" />
+    <RegEx find="edelj" replaceWith="edjelj" />
+    <RegEx find="\b([nN])eg([aeu]|om|ama)\b" replaceWith="$1jeg$2" />
+    <RegEx find="\b([nN])eĹľ(an|n[aeiou]|nom|nima)\b" replaceWith="$1jeĹľ$2" />
+    <RegEx find="(?&lt;!j)emaÄŤk" replaceWith="jemaÄŤk" />
+    <RegEx find="[nN]j?em(?=a?c)" replaceWith="Nijem" />
+    <RegEx find="emo[zĹľ]e" replaceWith="e moĹľe" />
+    <RegEx find="eprijat(?!e)" replaceWith="eugod" />
+    <RegEx find="erj?ešen" replaceWith="eriješen" />
+    <RegEx find="nerv(?![no])" replaceWith="Ĺľivc" />
+    <RegEx find="Nerv(?![no])" replaceWith="Živc" />
+    <RegEx find="nervn" replaceWith="ĹľivÄŤan" />
+    <RegEx find="Nervn" replaceWith="Živčan" />
+    <RegEx find="esmij" replaceWith="e smij" />
+    <RegEx find="esre[cćč]n" replaceWith="esretn" />
+    <RegEx find="esvj?est" replaceWith="esvijest" />
+    <RegEx find="(?&lt;!mhv)ališ[eu]" replaceWith="alizira" />
+    <RegEx find="([nN])ezna(?![bÄŤlnt])" replaceWith="$1e zna" />
+    <RegEx find="([nN])eĹľn" replaceWith="$1jeĹľn" />
+    <RegEx find="\b([nN])oč([iu]|n[aeiou]|no[mjg]|nim)?" replaceWith="$1oć$2" />
+    <RegEx find="\b([oO])dbra" replaceWith="$1bra" />
+    <RegEx find="bavj?est" replaceWith="bavijest" />
+    <RegEx find="belod" replaceWith="bjelod" />
+    <RegEx find="bešen" replaceWith="bješen" />
+    <RegEx find="bezbj?edi" replaceWith="sigura" />
+    <RegEx find="bezbj?eđen" replaceWith="siguran" />
+    <RegEx find="bezbijeđenj" replaceWith="siguranj" />
+    <RegEx find="bezbeđivanj([aeu]|ima)" replaceWith="siguravanj$1" />
+    <RegEx find="bezbj?eđuje" replaceWith="sigurava" />
+    <RegEx find="brača" replaceWith="braća" />
+    <RegEx find="\b([oO])deć" replaceWith="$1djeć" />
+    <RegEx find="([oO])dj?eljenj(?!e)" replaceWith="$1djel" />
+    <RegEx find="dgaji" replaceWith="dgoji" />
+    <RegEx find="\b([oO])dj?elo" replaceWith="$1dijelo" />
+    <RegEx find="\b([oO])dnje(l[aeio]|t|t[ei])\b" replaceWith="$1odnije$2" />
+    <RegEx find="\b([oO]|[pP]o|[rR]a|[sS]a)(d?)se([cć])" replaceWith="$1$2sje$3" />
+    <RegEx find="dvešć" replaceWith="dvest ć" />
+    <RegEx find="oficir(?!s)" replaceWith="ÄŤasnik" />
+    <RegEx find="oficirs" replaceWith="ÄŤasniÄŤ" />
+    <RegEx find="gladne([lvt])" replaceWith="gladnje$1" />
+    <RegEx find="kean" replaceWith="cean" />
+    <RegEx find="\bokvasi" replaceWith="smoÄŤi" />
+    <RegEx find="pklad" replaceWith="klad" />
+    <RegEx find="(?&lt;![mdp])ostić" replaceWith="ostit ć" />
+    <RegEx find="psedn" replaceWith="psjedn" />
+    <RegEx find="(?&lt;!d)([oO])pšt" replaceWith="$1pć" />
+    <RegEx find="\b([oO])rman" replaceWith="$1rmar" />
+    <RegEx find="ortova([lt])" replaceWith="ortira$1" />
+    <RegEx find="ruĹľij" replaceWith="ruĹľj" />
+    <RegEx find="([oO])set" replaceWith="$1sjet" />
+    <RegEx find="(?&lt;![dDPp]rv?)([oO])si?j?e[ćč]a" replaceWith="$1sjeća" />
+    <RegEx find="slobodić" replaceWith="slobodit ć" />
+    <RegEx find="([oOuU])sta[čć]" replaceWith="$1stat ć" />
+    <RegEx find="otadĹľbin" replaceWith="domovin" />
+    <RegEx find="OtadĹľbin" replaceWith="Domovin" />
+    <RegEx find="\b([oO])teć(?!i)" replaceWith="$1tet ć" />
+    <RegEx find="\b([oOsSuU])tera" replaceWith="$1tjera" />
+    <RegEx find="([oO])tmen" replaceWith="$1tmjen" />
+    <RegEx find="ovaploćenj" replaceWith="utjelovljenj" />
+    <RegEx find="Ovaploćenj" replaceWith="Utjelovljenj" />
+    <RegEx find="vlaš[cćč]en" replaceWith="vlašten" />
+    <RegEx find="ozbir" replaceWith="obzir" />
+    <RegEx find="\b([oO])zli?j?ed([aeiu]|om|ama)\b" replaceWith="$1zljed$2" />
+    <RegEx find="\b([oO])zlj?edi([moštl])" replaceWith="$1zlijedi$2" />
+    <RegEx find="zleđen" replaceWith="zlijeđen" />
+    <RegEx find="acj?ent" replaceWith="acijent" />
+    <RegEx find="pacov" replaceWith="štakor" />
+    <RegEx find="Pacov" replaceWith="Ĺ takor" />
+    <RegEx find="(?&lt;!\b[zZ]apre)([pP])ašć([eu])" replaceWith="$1ast ć$2" />
+    <RegEx find="([pP])esni(?!c)" replaceWith="$1jesni" />
+    <RegEx find="\b([pP])j?es([ak](?!m))" replaceWith="$1ijes$2" />
+    <RegEx find="\b([pP])j?eš[čć]an" replaceWith="$1ješčan" />
+    <RegEx find="([pP])e(sm|ša)" replaceWith="$1je$2" />
+    <RegEx find="peškir(?!i(ma)?\b)" replaceWith="ručnik" />
+    <RegEx find="Peškir(?!i(ma)?\b)" replaceWith="Ručnik" />
+    <RegEx find="peškir(?=i(ma)?\b)" replaceWith="ručnic" />
+    <RegEx find="Peškir(?=i(ma)?\b)" replaceWith="Ručnic" />
+    <RegEx find="([pP])eva" replaceWith="$1jeva" />
+    <RegEx find="\bpijac" replaceWith="trĹľnic" />
+    <RegEx find="Pijac" replaceWith="TrĹľnic" />
+    <RegEx find="([pP])(ita|lati|obrinu|okaza|oveza|riča)ć" replaceWith="$1$2t ć" />
+    <RegEx find="\b([pP])lj?en\b" replaceWith="$1lijen" />
+    <RegEx find="\b([pP])lj?en([au]|om)\b" replaceWith="$1lijen$2" />
+    <RegEx find="([pP])luč([an])" replaceWith="$1luć$2" />
+    <RegEx find="\b([pP])obj?edi([mštol])" replaceWith="$1obijedi$2" />
+    <RegEx find="([pP])obe([đgć])" replaceWith="$1obje$2" />
+    <RegEx find="očastvovan" replaceWith="očašćen" />
+    <RegEx find="odst(ica|ak)" replaceWith="ot$1" />
+    <RegEx find="([pP])o[dt]stiÄŤ" replaceWith="$1otiÄŤ" />
+    <RegEx find="\b([pP])o[dt]sj?eti([šmo]|l[aieo]|t[ei])?\b" replaceWith="$1odsjeti$2" />
+    <RegEx find="([dDpP])odel" replaceWith="$1odjel" />
+    <RegEx find="([dDpP])odj?eli([lto])" replaceWith="$1odijeli$2" />
+    <RegEx find="odretl" replaceWith="orijekl" />
+    <RegEx find="(?&lt;![mn])o(d?)se([kć])(?!s)" replaceWith="o$1sje$2" />
+    <RegEx find="odu?hvat" replaceWith="othvat" />
+    <RegEx find="(?&lt;!r)oent" replaceWith="oant" />
+    <RegEx find="([pP])ogrj?eši(?!v)" replaceWith="$1ogriješi" />
+    <RegEx find="([pP])olen" replaceWith="$1elud" />
+    <RegEx find="lude([lt])" replaceWith="ludje$1" />
+    <RegEx find="([pP]o|[iI]z)ludeć" replaceWith="$1ludjet ć" />
+    <RegEx find="ludj?eo" replaceWith="ludio" />
+    <RegEx find="pomarandĹľ" replaceWith="naranÄŤ" />
+    <RegEx find="\bpomen" replaceWith="spomen" />
+    <RegEx find="\bPomen" replaceWith="Spomen" />
+    <RegEx find="pomera([mšt])" replaceWith="miče$1" />
+    <RegEx find="Pomera([mšt])" replaceWith="Miče$1" />
+    <RegEx find="pomeren" replaceWith="pomaknut" />
+    <RegEx find="([pP])omj?eri" replaceWith="$1omakni" />
+    <RegEx find="([pP])omoč" replaceWith="$1omoć" />
+    <RegEx find="([pP])oresk" replaceWith="$1orezn" />
+    <RegEx find="porodiÄŤn" replaceWith="obiteljsk" />
+    <RegEx find="PorodiÄŤn" replaceWith="Obiteljsk" />
+    <RegEx find="([pP])os([lt])a[čć]" replaceWith="$1os$2at ć" />
+    <RegEx find="([pP])os(l?)e([dt])" replaceWith="$1os$2je$3" />
+    <RegEx find="([pP])osmatra" replaceWith="$1romatra" />
+    <RegEx find="([pP])ose([td])" replaceWith="$1osje$2" />
+    <RegEx find="otcenjiva" replaceWith="odcjenjiva" />
+    <RegEx find="([pP])oter" replaceWith="$1otjer" />
+    <RegEx find="ovinuje" replaceWith="okorava" />
+    <RegEx find="vrj?edi([lomšt])" replaceWith="vrijedi$1" />
+    <RegEx find="([pP]r?)over" replaceWith="$1ovjer" />
+    <RegEx find="([uUo])ver(en|lji)" replaceWith="$1vjer$2" />
+    <RegEx find="pozoriš" replaceWith="kazališ" />
+    <RegEx find="Pozoriš" replaceWith="Kazališ" />
+    <RegEx find="raktikuje" replaceWith="rakticira" />
+    <RegEx find="rebić" replaceWith="rebit ć" />
+    <RegEx find="reci?j?edni" replaceWith="redsjedni" />
+    <RegEx find="redsedni" replaceWith="redsjedni" />
+    <RegEx find="rj?edlo([gz])" replaceWith="rijedlo$1" />
+    <RegEx find="repostav" replaceWith="retpostav" />
+    <RegEx find="ređaš" replaceWith="rijaš" />
+    <RegEx find="premić" replaceWith="premit ć" />
+    <RegEx find="renje([lt])" replaceWith="renije$1" />
+    <RegEx find="rese([ÄŤk])" replaceWith="resje$1" />
+    <RegEx find="([pP])r([oe])ter" replaceWith="$1r$2tjer" />
+    <RegEx find="([pP])rets" replaceWith="$1reds" />
+    <RegEx find="prevazi" replaceWith="nadi" />
+    <RegEx find="Prevazi" replaceWith="Nadi" />
+    <RegEx find="ridik" replaceWith="rodik" />
+    <RegEx find="rihvata" replaceWith="rihvaća" />
+    <RegEx find="prijatn" replaceWith="ugodn" />
+    <RegEx find="Prijatn" replaceWith="Ugodn" />
+    <RegEx find="([pP])rimj?en([ji])" replaceWith="$1rimijen$2" />
+    <RegEx find="([pP])(r?)([io])veš[čć]" replaceWith="$1$2$3vest ć" />
+    <RegEx find="rj?edlog([au]|om)?\b" replaceWith="rijedlog$1" />
+    <RegEx find="rijtelj" replaceWith="rijatelj" />
+    <RegEx find="(ri|[Ss])tiskaj" replaceWith="$1tišći" />
+    <RegEx find="rj?estupni([kc])([aeu]|om)\b" replaceWith="rijestupni$1$2" />
+    <RegEx find="\b([pP])rj?evoz([aiu]|om)?\b" replaceWith="$1rijevoz$2" />
+    <RegEx find="\b([pP])rj?etnj" replaceWith="$1rijetnj" />
+    <RegEx find="rimi?j?ećuj" replaceWith="rimjećuj" />
+    <RegEx find="\b([pP])rimj?e(ćen|ćen[aeiou]|tio?|til[aeio]|njen|šati|šan|[st]iti)\b" replaceWith="$1rimije$2" />
+    <RegEx find="([pP])rime([rn])" replaceWith="$1rimje$2" />
+    <RegEx find="\b([pP])rimet([aln])" replaceWith="$1rimjet$2" />
+    <RegEx find="([pP])rimj?et([ie])" replaceWith="$1rimijet$2" />
+    <RegEx find="\b([pP])rimj?eni([lošmt])" replaceWith="$1rimijeni$2" />
+    <RegEx find="([pP])(ri|od)sj?e[čć]a" replaceWith="$1$2sjeća" />
+    <RegEx find="\b([pP])rocen(?!t)" replaceWith="$1rocjen" />
+    <RegEx find="([pP])rose([kcÄŤ])" replaceWith="$1rosje$2" />
+    <RegEx find="([pP])romj?eni([mštol])" replaceWith="$1romijeni$2" />
+    <RegEx find="([pP])rj?eti([mštol])" replaceWith="$1rijeti$2" />
+    <RegEx find="r[io]davnic" replaceWith="rodavaonic" />
+    <RegEx find="roglašuje" replaceWith="roglašava" />
+    <RegEx find="roklestv" replaceWith="rokletstv" />
+    <RegEx find="([pP])role(ć|t[no])" replaceWith="$1rolje$2" />
+    <RegEx find="romen(?!ad)" replaceWith="romjen" />
+    <RegEx find="([pP])romj?eni([mštl])" replaceWith="$1romijeni$2" />
+    <RegEx find="([pP])rotiv([adkoprstz])" replaceWith="$1rotu$2" />
+    <RegEx find="rovid([an])" replaceWith="rozir$1" />
+    <RegEx find="rovj?erić" replaceWith="rovjerit ć" />
+    <RegEx find="punić" replaceWith="punit ć" />
+    <RegEx find="ustić(?!i)" replaceWith="ustit ć" />
+    <RegEx find="put[ae]?r" replaceWith="maslac" />
+    <RegEx find="Put[ae]?r" replaceWith="Maslac" />
+    <RegEx find="(?&lt;!g)([rR])a([dn])ić([eu])" replaceWith="$1a$2it ć$3" />
+    <RegEx find="atosilja" replaceWith="iješi" />
+    <RegEx find="azme([nr])" replaceWith="azmje$1" />
+    <RegEx find="azumi?j?eć" replaceWith="azumjet ć" />
+    <RegEx find="azumi?j?eo" replaceWith="azumio" />
+    <RegEx find="([rR])azumj?e([mšv]|te)" replaceWith="$1azumije$2" />
+    <RegEx find="aznj?e([lt])" replaceWith="aznije$1" />
+    <RegEx find="aznj?eo" replaceWith="aznio" />
+    <RegEx find="eag(uje|ova)" replaceWith="eagira" />
+    <RegEx find="eaguju" replaceWith="eagiraju" />
+    <RegEx find="([rRlL])e[čć]ić([eu])" replaceWith="$1eći ć$2" />
+    <RegEx find="egistrova" replaceWith="egistrira" />
+    <RegEx find="(?&lt;!r)ištić" replaceWith="ištit ć" />
+    <RegEx find="([rR])editelj" replaceWith="$1edatelj" />
+    <RegEx find="egulis" replaceWith="egulir" />
+    <RegEx find="reme([sš])t" replaceWith="remje$1t" />
+    <RegEx find="eskira" replaceWith="iskira" />
+    <RegEx find="\b([rR])i?j?ešava" replaceWith="$1ješava" />
+    <RegEx find="(?&lt;!k)amj?enjen" replaceWith="amijenjen" />
+    <RegEx find="mjenjen" replaceWith="mijenjen" />
+    <RegEx find="izik(ova|uje)" replaceWith="iskira" />
+    <RegEx find="([^d])rješit" replaceWith="$1riješit" />
+    <RegEx find="([Rr])j?ešić" replaceWith="$1iješit ć" />
+    <RegEx find="([rR])i?j?ešenj([aeiu])" replaceWith="$1ješenj$2" />
+    <RegEx find="\b([rR])j?eÄŤ(i|ima)?\b" replaceWith="$1ijeÄŤ$2" />
+    <RegEx find="\b([rR])i?j?eÄŤni([kcÄŤ])" replaceWith="$1jeÄŤni$2" />
+    <RegEx find="\b([rR])j?ek([aeu]|om|ama)\b" replaceWith="$1ijek$2" />
+    <RegEx find="\b([rR])j?eš([ei]o?|il[aeio]|it[ei]|imo?|i[mš]|en|en[aeiou])\b" replaceWith="$1iješ$2" />
+    <RegEx find="\b([rR])j?etk([aiou])" replaceWith="$1ijetk$2" />
+    <RegEx find="saÄŤeka" replaceWith="priÄŤeka" />
+    <RegEx find="SaÄŤeka" replaceWith="PriÄŤeka" />
+    <RegEx find="aglasno" replaceWith="uglasno" />
+    <RegEx find="\bsam sam\b" replaceWith="sam sâm" />
+    <RegEx find="amoubic" replaceWith="amoubojic" />
+    <RegEx find="\bsanti" replaceWith="centi" />
+    <RegEx find="saobraćaj(?![ac])" replaceWith="promet" />
+    <RegEx find="Saobraćaj(?![ac])" replaceWith="Promet" />
+    <RegEx find="aosj?e[čć]a" replaceWith="uosjeća" />
+    <RegEx find="aputni" replaceWith="uputni" />
+    <RegEx find="([sS])ara([dđ])" replaceWith="$1ura$2" />
+    <RegEx find="([sS])atan" replaceWith="$1oton" />
+    <RegEx find="uÄŤesni" replaceWith="sudioni" />
+    <RegEx find="UÄŤesni" replaceWith="Sudioni" />
+    <RegEx find="([sS])avi?j?e([sš])" replaceWith="$1avje$2" />
+    <RegEx find="\b([sSzZ])avet" replaceWith="$1avjet" />
+    <RegEx find="avremen" replaceWith="uvremen" />
+    <RegEx find="(aĹľa|k)lj?eva" replaceWith="$1lijeva" />
+    <RegEx find="\b([sS])ed([ei]|i[mš]|imo|it[ei]|eć[iaeu]|il[aeio]|iše)\b" replaceWith="$1jed$2" />
+    <RegEx find="\b([sS])e[ćč]a([mšo]|mo|t[ei]|ju|l[aeio]|nj[aeu]|njem?)?\b" replaceWith="$1jeća$2" />
+    <RegEx find="([sS])ede([olt])" replaceWith="$1jedi$2" />
+    <RegEx find="([sS])j?ed[ei]ć(?!i)" replaceWith="$1jedit ć" />
+    <RegEx find="sedmiÄŤn" replaceWith="tjedn" />
+    <RegEx find="SedmiÄŤn" replaceWith="Tjedn" />
+    <RegEx find="([sS])edn([eui])" replaceWith="$1jedn$2" />
+    <RegEx find="([sS])ekir(?!a)" replaceWith="$1jekir" />
+    <RegEx find="\b([sS])enk?([aeiou]|om|ci)\b" replaceWith="$1jen$2" />
+    <RegEx find="\b([sS])eti([hšmo]|mo|l[aeio]|še|vši|t[ei])?\b" replaceWith="$1jeti$2" />
+    <RegEx find="([sS])ever" replaceWith="$1jever" />
+    <RegEx find="\b([sS])emen" replaceWith="$1jemen" />
+    <RegEx find="([sS])h?vata" replaceWith="$1hvaća" />
+    <RegEx find="h?vati[čćc]" replaceWith="hvatit ć" />
+    <RegEx find="\b([sS])istem(?!s)" replaceWith="$1ustav" />
+    <RegEx find="([sS])kuv" replaceWith="$1kuh" />
+    <RegEx find="lj?etanj" replaceWith="lijetanj" />
+    <RegEx find="li?j?edbeni" replaceWith="ljedbeni" />
+    <RegEx find="([sS])li?j?edeć" replaceWith="$1ljedeć" />
+    <RegEx find="\b([sS])lj?e([dp])([aeiuo]|o[mgj]|i[mš]|imo|it[ei]|il[aeio]|ac|c[aeiu]|cem)?\b" replaceWith="$1lije$2$3" />
+    <RegEx find="edoslj?ed" replaceWith="edoslijed" />
+    <RegEx find="smara(?!g)" replaceWith="gnjavi" />
+    <RegEx find="Smara(?!g)" replaceWith="Gnjavi" />
+    <RegEx find="\b([sS])men([aeiu]|ama)\b" replaceWith="$1mjen$2" />
+    <RegEx find="([sS])mj?eh([au]|om)?\b" replaceWith="$1mijeh$2" />
+    <RegEx find="me[ćč]ar" replaceWith="metlar" />
+    <RegEx find="\b([sS])mj?e([mš]|mo|t[ei]|šn[aeiou]|šno[mgj]|ima?)\b" replaceWith="$1mije$2" />
+    <RegEx find="\b([sS])mej([aeu])" replaceWith="$1mij$2" />
+    <RegEx find="\b([sS])mer" replaceWith="$1mjer" />
+    <RegEx find="([sS])mes(?!t)" replaceWith="$1mjes" />
+    <RegEx find="([sS])mesti([šmolt])" replaceWith="$1mjesti$2" />
+    <RegEx find="([sS])mj?eš([en])" replaceWith="$1miješ$2" />
+    <RegEx find="([sS])nj?eg([au]|om|ovima)?\b" replaceWith="$1nijeg$2" />
+    <RegEx find="sopstven" replaceWith="vlastit" />
+    <RegEx find="Sopstven" replaceWith="Vlastit" />
+    <RegEx find="\b([sS]?)([PphH])akova" replaceWith="$1$2akira" />
+    <RegEx find="pasava" replaceWith="pašava" />
+    <RegEx find="pelova" replaceWith="rica" />
+    <RegEx find="([sS])pase(\b|[mšt])" replaceWith="$1pasi$2" />
+    <RegEx find="([sS])pasen(?!j)" replaceWith="$1pašen" />
+    <RegEx find="spolja?š?nj?" replaceWith="vanjsk" />
+    <RegEx find="Spolja?š?nj?" replaceWith="Vanjsk" />
+    <RegEx find="portist" replaceWith="portaš" />
+    <RegEx find="\bsprat" replaceWith="kat" />
+    <RegEx find="\bSprat" replaceWith="Kat" />
+    <RegEx find="pri?j?eÄŤava" replaceWith="prjeÄŤava" />
+    <RegEx find="prj?eÄŤi" replaceWith="prijeÄŤi" />
+    <RegEx find="prj?eÄŤe" replaceWith="prijeÄŤe" />
+    <RegEx find="([sS])reč" replaceWith="$1reć" />
+    <RegEx find="([sS])re[cčć](a?)n" replaceWith="$1ret$2n" />
+    <RegEx find="\b([sS])rj?ed([au]|om|ama)\b" replaceWith="$1rijed$2" />
+    <RegEx find="\b([sS])ta[čć]([eu])" replaceWith="$1tat ć$2" />
+    <RegEx find="tavr" replaceWith="tvar" />
+    <RegEx find="\b([sS])tj?en([aeu])" replaceWith="$1tijen$2" />
+    <RegEx find="\b([sSuU])tica" replaceWith="$1tjeca" />
+    <RegEx find="stomak" replaceWith="trbuh" />
+    <RegEx find="Stomak" replaceWith="Trbuh" />
+    <RegEx find="stomačn" replaceWith="trbušn" />
+    <RegEx find="Stomačn" replaceWith="Trbušn" />
+    <RegEx find="\b([sS])trj?el([aeouc]|i(?!c[aeiou]))" replaceWith="$1trijel$2" />
+    <RegEx find="sugeriše" replaceWith="predlaže" />
+    <RegEx find="Sugeriše" replaceWith="Predlaže" />
+    <RegEx find="sujever" replaceWith="praznovjer" />
+    <RegEx find="Sujever" replaceWith="Praznovjer" />
+    <RegEx find="([sS])umlj" replaceWith="$1umnj" />
+    <RegEx find="unđer" replaceWith="pužva" />
+    <RegEx find="used" replaceWith="usjed" />
+    <RegEx find="\b([sS])uv([aeiou])\b" replaceWith="$1uh$2" />
+    <RegEx find="suštin[eio]" replaceWith="biti" />
+    <RegEx find="Suštin[eio]" replaceWith="Biti" />
+    <RegEx find="vedo([ÄŤkc])" replaceWith="vjedo$1" />
+    <RegEx find="([sS])vesn" replaceWith="$1vjesn" />
+    <!-- razlikuju se svjetlo i svijetlo no tu automatske pomoći nema, već je na korisnicima da dodaju i gdje je potrebno! -->
+    <RegEx find="\b([sS])vetl" replaceWith="$1vjetl" />
+    <RegEx find="\b([sS])vešteni" replaceWith="$1većeni" />
+    <RegEx find="([sS])veĹľ([aeiu]|e[mg]|[io]m|oj|in[aeiou]|inom)?\b" replaceWith="$1vjeĹľ$2" />
+    <RegEx find="\b([sS])vj?et([au]|om)?\b(?!\s+([A-ZÄŚÄĹ Ĺ˝]|vod|stvari?|ÄŤovj?ek|pism|zemlj))" replaceWith="$1vijet$2" />
+    <RegEx find="([sS])vi?j?etsk" replaceWith="$1vjetsk" />
+    <RegEx find="šar?garep" replaceWith="mrkv" />
+    <RegEx find="Ĺ ar?garep" replaceWith="Mrkv" />
+    <RegEx find="([šŠ])ečer" replaceWith="$1ećer" />
+    <RegEx find="([šŠ])olj" replaceWith="$1alic" />
+    <RegEx find="štab" replaceWith="stožer" />
+    <RegEx find="Ĺ tab" replaceWith="StoĹľer" />
+    <RegEx find="štamparsk" replaceWith="tiskovn" />
+    <RegEx find="Ĺ tamparsk" replaceWith="Tiskovn" />
+    <RegEx find="takmiÄŤenj" replaceWith="natjecanj" />
+    <RegEx find="TakmiÄŤenj" replaceWith="Natjecanj" />
+    <RegEx find="\b([tT])aÄŤ([ank])" replaceWith="$1oÄŤ$2" />
+    <RegEx find="\b([nN])etaÄŤ" replaceWith="$1etoÄŤ" />
+    <RegEx find="talasn" replaceWith="valn" />
+    <RegEx find="lentov" replaceWith="lentir" />
+    <RegEx find="anjir" replaceWith="anjur" />
+    <RegEx find="\b([tT])j?el([aiou])" replaceWith="$1ijel$2" />
+    <RegEx find="\b([tT])elesn" replaceWith="$1jelesn" />
+    <RegEx find="\b([tT])era([mnjoš]|mo|ju|l[aeio]|še|t[ei])?\b" replaceWith="$1jera$2" />
+    <RegEx find="([^\Wi])terati\b" replaceWith="$1tjerati" />
+    <RegEx find="([tT])erać" replaceWith="$1jerat ć" />
+    <RegEx find="([tT])e?rba" replaceWith="$1reba" />
+    <RegEx find="tester" replaceWith="pil" />
+    <RegEx find="Tester" replaceWith="Pil" />
+    <RegEx find="\b([tT])j?esn([aeiou])" replaceWith="$1ijesn$2" />
+    <RegEx find="toÄŤkov" replaceWith="kotaÄŤ" />
+    <RegEx find="\b([tT])okom(?!\s+ri?j?eke)" replaceWith="$1ijekom" />
+    <RegEx find="oplot(?!n)" replaceWith="oplin" />
+    <RegEx find="([tT])raći" replaceWith="$1rati" />
+    <RegEx find="([tT])ra([jg]a|ži)ć" replaceWith="$1ra$2t ć" />
+    <RegEx find="([tT])rj?eza" replaceWith="$1rijeza" />
+    <RegEx find="\b([tT])rpe([lt])" replaceWith="$1rpje$2" />
+    <RegEx find="retrpe([lt])" replaceWith="retrpje$1" />
+    <RegEx find="trudni([lt])" replaceWith="trudnje$1" />
+    <RegEx find="([tT])rĹľn(?!ic)" replaceWith="$1rgovaÄŤk" />
+    <RegEx find="([uU])bi?j?edi" replaceWith="$1vjeri" />
+    <RegEx find="bj?edljiv" replaceWith="vjerljiv" />
+    <RegEx find="bi?j?eđen" replaceWith="vjeren" />
+    <RegEx find="bj?eđivanj" replaceWith="vjeravanj" />
+    <RegEx find="\b([uU])bic" replaceWith="$1bojic" />
+    <RegEx find="(?&lt;!l)([Uu])([bd])ić" replaceWith="$1$2it ć" />
+    <RegEx find="(?&lt;![Kk])([uU])bist" replaceWith="$1bojst" />
+    <RegEx find="ucać" replaceWith="ucat ć" />
+    <RegEx find="\b([uUoO])cen" replaceWith="$1cjen" />
+    <RegEx find="uÄŤestv" replaceWith="sudjel" />
+    <RegEx find="UÄŤestv" replaceWith="Sudjel" />
+    <RegEx find="\b([uU])ćut" replaceWith="$1šut" />
+    <RegEx find="\b([uU])davi" replaceWith="$1topi" />
+    <RegEx find="([uU])logova" replaceWith="$1logira" />
+    <RegEx find="([uU])mešan" replaceWith="$1mješan" />
+    <RegEx find="([uU])metni([kcÄŤ])" replaceWith="$1mjetni$2" />
+    <RegEx find="([uU])metno" replaceWith="$1mjetno" />
+    <RegEx find="([uU])mrj?eć" replaceWith="$1mrijet ć" />
+    <RegEx find="\b([uU])nj?e([lt])" replaceWith="$1nije$2" />
+    <RegEx find="\b([uU]?)([nN])aprj?ed\b" replaceWith="$1$2aprijed" />
+    <RegEx find="([uU])pore" replaceWith="$1spore" />
+    <RegEx find="([uU])potrj?ebi([štol])" replaceWith="$1potrijebi$2" />
+    <RegEx find="propa[sš][čćc]ava" replaceWith="propaštava" />
+    <RegEx find="([uU])radić" replaceWith="$1činit ć" />
+    <RegEx find="ezuslov" replaceWith="ezuvjet" />
+    <RegEx find="\b([uU])slov" replaceWith="$1vjet" />
+    <RegEx find="([uU])smer([aie])" replaceWith="$1smjer$2" />
+    <RegEx find="spi?j?e(h|si)" replaceWith="spje$1" />
+    <RegEx find="spi?j?eš([an]|n[aeiou])" replaceWith="spješ$1" />
+    <RegEx find="\b([uU])spe([lt])" replaceWith="$1spje$2" />
+    <RegEx find="\b([uU])spj?e(mo?|va[mšt]?)\b" replaceWith="$1spije$2" />
+    <RegEx find="sred?sre[dđ]" replaceWith="sredotoč" />
+    <RegEx find="([uU])strj?el" replaceWith="$1strijel" />
+    <RegEx find="\b([uU])te([hš])" replaceWith="$1tje$2" />
+    <RegEx find="univerzum" replaceWith="svemir" />
+    <RegEx find="Univerzum" replaceWith="Svemir" />
+    <RegEx find="\buskrs([aeiu]|om|ima)?\b" replaceWith="Uskrs$1" />
+    <RegEx find="([uU])tiÄŤe" replaceWith="$1tjeÄŤe" />
+    <RegEx find="\b([uU])ver([aeil])" replaceWith="$1vjer$2" />
+    <RegEx find="\b([uUcC])vet([aeiu]|om|ima|n[aeiou]|nima?|no[mgj])?\b" replaceWith="$1vjet$2" />
+    <RegEx find="\b([uU])zeć" replaceWith="$1zet ć" />
+    <RegEx find="([uU])zok" replaceWith="$1zrok" />
+    <RegEx find="vajarstv" replaceWith="kiparstv" />
+    <RegEx find="Vajarstv" replaceWith="Kiparstv" />
+    <RegEx find="vakcinira" replaceWith="cijepi" />
+    <RegEx find="Vakcinira" replaceWith="Cijepi" />
+    <RegEx find="(?&lt;!z)vanred" replaceWith="izvanred" />
+    <RegEx find="(?&lt;!z)Vanred" replaceWith="Izvanred" />
+    <RegEx find="varać" replaceWith="varat ć" />
+    <RegEx find="\bvarvar" replaceWith="barbar" />
+    <RegEx find="\bVarvar" replaceWith="Barbar" />
+    <RegEx find="vaskrsn" replaceWith="uskrns" />
+    <RegEx find="Vaskrsn" replaceWith="Uskrns" />
+    <RegEx find="vaspitan" replaceWith="obrazovan" />
+    <RegEx find="Vaspitan" replaceWith="Obrazovan" />
+    <RegEx find="vaspitn" replaceWith="obrazovn" />
+    <RegEx find="Vaspitn" replaceWith="Obrazovn" />
+    <RegEx find="vazduh" replaceWith="zrak" />
+    <RegEx find="Vazduh" replaceWith="Zrak" />
+    <RegEx find="vazdušn" replaceWith="zračn" />
+    <RegEx find="Vazdušn" replaceWith="Zračn" />
+    <!-- bez e, jer mijenja veče(r) u veće, što je gnjavaža -->
+    <RegEx find="\b([vV])eč([aiu]|[ei][mg]|ih|ima|in[iu]|inom|o[mj])?\b" replaceWith="$1eć$2" />
+    <RegEx find="([vV])e[čć]n" replaceWith="$1ječn" />
+    <RegEx find="([vV])eÄŤit" replaceWith="$1jeÄŤit" />
+    <RegEx find="([vV])enÄŤa" replaceWith="$1jenÄŤa" />
+    <RegEx find="\b([vV])er([ova|ns])" replaceWith="$1jer$2" />
+    <RegEx find="([nN])ever(?!b)" replaceWith="$1evjer" />
+    <RegEx find="([vV])erova" replaceWith="$1jerova" />
+    <RegEx find="([vV])j?ero[vj]at(a?)n" replaceWith="$1jerojat$2n" />
+    <RegEx find="([vV])eruj" replaceWith="$1jeruj" />
+    <RegEx find="\bvereni([ckÄŤ])" replaceWith="zaruÄŤni$1" />
+    <RegEx find="\bVereni([ckÄŤ])" replaceWith="ZaruÄŤni$1" />
+    <RegEx find="([vV])ešanj" replaceWith="$1ješanj" />
+    <RegEx find="([vV])ešt" replaceWith="$1ješt" />
+    <RegEx find="\b([vV])j?en(ac|c[aeiu]m?)" replaceWith="$1ijen$2" />
+    <RegEx find="vj?eštačk" replaceWith="umjetn" />
+    <RegEx find="Vj?eštačk" replaceWith="Umjetn" />
+    <RegEx find="([vV])et(ar|r[aeuo])" replaceWith="$1jet$2" />
+    <RegEx find="([vV])ever" replaceWith="$1jever" />
+    <RegEx find="([vV])eĹľb" replaceWith="$1jeĹľb" />
+    <RegEx find="([vV])ide([hlt])" replaceWith="$1idje$2" />
+    <RegEx find="([vVTt])idj?eć(?!i)" replaceWith="$1idjet ć" />
+    <RegEx find="([vV])ideo(?!zapis|tek[aiue]|\s+(ka[zs]et[aeiu]|igri?c?[aeiou]|snim[kc]|trgovin[aeoiu]))\b" replaceWith="$1idio" />
+    <RegEx find="\b([vV])išlj" replaceWith="$1iš" />
+    <RegEx find="([vV])olj?eć" replaceWith="$1oljet ć" />
+    <RegEx find="\b([vV])oz([au]|om|ov[ie]|ovima)?\b" replaceWith="$1lak$2" />
+    <RegEx find="\b([vV])ozi[čć]([eu])" replaceWith="$1ozit ć$2" />
+    <RegEx find="\b([vV])rj?ed(e|an|n[aeiou]|nih|nosti?|nošću)?\b" replaceWith="$1rijed$2" />
+    <RegEx find="\b([vV])red([ei])" replaceWith="$1rijed$2" />
+    <RegEx find="([vV])rj?eđa" replaceWith="$1rijeđa" />
+    <RegEx find="vređen" replaceWith="vrijeđen" />
+    <RegEx find="([vV])rtel" replaceWith="$1rtjel" />
+    <RegEx find="ahtjeva([ojlmšt])" replaceWith="ahtijeva$1" />
+    <RegEx find="ahtev([aeioun])" replaceWith="ahtjev$1" />
+    <RegEx find="([zZ])amen" replaceWith="$1amjen" />
+    <RegEx find="(?&lt;!k)amenj(uj|iv)" replaceWith="amjenj$1" />
+    <RegEx find="\b([zZnN]a[mv])er" replaceWith="$1jer" />
+    <RegEx find="([zZ])amj?eni([šmo]|mo|t[mš]|l[aeio]|še)?\b" replaceWith="$1amijeni$2" />
+    <RegEx find="\b([zZ])ane([lt])" replaceWith="$1anje$2" />
+    <RegEx find="apoved" replaceWith="apovjed" />
+    <RegEx find="apovj?est" replaceWith="apovijed" />
+    <RegEx find="zasmej" replaceWith="nasmij" />
+    <RegEx find="([zZ])ave([rs])([aeuo])" replaceWith="$1avje$2$3" />
+    <RegEx find="\bzavis([ni])" replaceWith="ovis$1" />
+    <RegEx find="\bZavis([ni])" replaceWith="Ovis$1" />
+    <RegEx find="\b([zZ])eva" replaceWith="$1ijeva" />
+    <RegEx find="zvaniÄŤn" replaceWith="sluĹľben" />
+    <RegEx find="ZvaniÄŤn" replaceWith="SluĹľben" />
+    <RegEx find="([zZ])([nv])ać" replaceWith="$1$2at ć" />
+    <RegEx find="([zZ])vj?er(?!s)" replaceWith="$1vijer" />
+    <RegEx find="\b([zZ])vj?ezd([aeiou]|ama)\b" replaceWith="$1vijezd$2" />
+    <RegEx find="([zZ])vezd([ai])" replaceWith="$1vjezd$2" />
+    <RegEx find="([žŽ])el[ei]([lz]|ti)" replaceWith="$1elje$2" />
+    <RegEx find="([žŽ])eleć(?!i)" replaceWith="$1eljet ć" />
+    <RegEx find="([žŽ])ive([lt])" replaceWith="$1ivje$2" />
+    <RegEx find="iveć(?!i)" replaceWith="ivjet ć" />
+    <RegEx find="lj?ezd" replaceWith="lijezd" />
+    <RegEx find="([žŽ])muri" replaceWith="$1miri" />
+    <RegEx find="([žŽ])ude([lt])" replaceWith="$1udje$2" />
+    <RegEx find="Ĺľur[ck]" replaceWith="zabav" />
+    <RegEx find="Žur[ck]" replaceWith="Zabav" />
+    <RegEx find="([sSzZ])amnom" replaceWith="$1a mnom" />
+    <RegEx find="([sSnNpPzZ]r?[aoi]z[vn])ać" replaceWith="$1at ć" />
+    <!-- mjeseci [\b mora biti nakon jun]-->
+    <RegEx find="januar([au]|ima)" replaceWith="sijeÄŤnj$1" />
+    <RegEx find="([Ss])j?eÄŤnj([au]|ima)" replaceWith="$1ijeÄŤnj$2" />
+    <RegEx find="april([au]|ima)" replaceWith="travnj$1" />
+    <RegEx find="\ba[uv]gust" replaceWith="kolovoz" />
+    <RegEx find="septembr" replaceWith="rujn" />
+    <RegEx find="oktobr" replaceWith="listopad" />
+    <RegEx find="decembr" replaceWith="prosinc" />
+    <RegEx find="Januar(?!s)" replaceWith="SijeÄŤnj" />
+    <RegEx find="April(?!s)" replaceWith="Travnj" />
+    <!--Marta je ime / Maja je ime-->
+    <RegEx find="\bA[uv]gust(?!o)" replaceWith="Kolovoz" />
+    <RegEx find="Septembr" replaceWith="Rujn" />
+    <RegEx find="Oktobr" replaceWith="Listopad" />
+    <RegEx find="Decembr" replaceWith="Prosinc" />
+    <!-- pridjevi optimalan, minimalan i maksimalan nemaju komparativ i superlativ. -->
+    <RegEx find="[Nn]aj(opt|min|maks)imalnij" replaceWith="$1imaln" />
+    <!-- experimental -->
+    <RegEx find="ÄŤ" replaceWith="č" />
+    <RegEx find="Ă„" replaceWith="ÄŤ" />
+    <RegEx find="ć" replaceWith="ć" />
+    <RegEx find="Ă„â€" replaceWith="Ä‘" />
+    <RegEx find="Ĺľ" replaceWith="ž" />
+    <RegEx find="Ă…Âľ" replaceWith="Ĺľ" />
+    <RegEx find="š" replaceWith="š" />
+    <RegEx find="Å¡" replaceWith="š" />
+    <RegEx find="Ă„Ĺš" replaceWith="ÄŚ" />
+    <RegEx find="Ă„Ĺ’" replaceWith="ÄŚ" /> 
+    <RegEx find="Ć" replaceWith="Ć" />
+    <RegEx find="Ă„" replaceWith="Ä" />
+    <RegEx find="Äą " replaceWith="Ĺ " />
+    <RegEx find="Ă… " replaceWith="Ĺ " />
+    <RegEx find="Ĺ˝" replaceWith="Ž" />
+    <RegEx find="Ž" replaceWith="Ž" />
+    <RegEx find="[^e]seda(?!m|tiv)" replaceWith="sjeda" />
+    <RegEx find="ii" replaceWith="i" />
+    <RegEx find="Ä‘Ĺľ" replaceWith="dĹľ" />
+    <RegEx find="zĹľ" replaceWith="Ĺľ" />
+    <RegEx find="(?&lt;![Hh])abs" replaceWith="aps" />
+    <RegEx find="acel" replaceWith="acjel" />
+    <RegEx find="adji" replaceWith="ađi" />
+    <RegEx find="adk" replaceWith="atk" />
+    <RegEx find="(?&lt;![ml])a([blcrnz])ić" replaceWith="a$1it ć" />
+    <RegEx find="a(jm|mn)(t?)ić" replaceWith="a$1$2it ć" />
+    <RegEx find="ajuc" replaceWith="ajuć" />
+    <RegEx find="\bajpod" replaceWith="iPod" />
+    <RegEx find="alepn" replaceWith="aljepn" />
+    <RegEx find="alj?epi" replaceWith="alijepi" />
+    <RegEx find="alolet" replaceWith="aloljet" />
+    <RegEx find="amens" replaceWith="amjens" />
+    <RegEx find="ampovan" replaceWith="ampiran" />
+    <RegEx find="(an|ru|men|mi)tovan" replaceWith="$1tiran" />
+    <RegEx find="(?&lt;!gl|[Nn])avić" replaceWith="avit ć" />
+    <RegEx find="asmj?eš" replaceWith="asmiješ" />
+    <RegEx find="asnić" replaceWith="asnit ć" />
+    <RegEx find="ašić" replaceWith="ašit ć" />
+    <RegEx find="azać" replaceWith="azat ć" />
+    <RegEx find="atrać" replaceWith="atrat ć" />
+    <RegEx find="aterać" replaceWith="atjerat ć" />
+    <RegEx find="(?&lt;!s)avešć" replaceWith="avest ć" />
+    <RegEx find="aviknuće" replaceWith="aviknut će" />
+    <RegEx find="avirin" replaceWith="abirin" />
+    <RegEx find="([aeiou])z([kp])" replaceWith="$1s$2" />
+    <RegEx find="(?&lt;![Ss]p)avać" replaceWith="avat ć" />
+    <RegEx find="be[čć]aje" replaceWith="bećava" />
+    <RegEx find="begl" replaceWith="bjegl" />
+    <RegEx find="iliše" replaceWith="ilizira" />
+    <RegEx find="ilišu" replaceWith="iliziraju" />
+    <RegEx find="izc" replaceWith="isc" />
+    <RegEx find="ćič" replaceWith="čić" />
+    <RegEx find="dilova" replaceWith="dila" />
+    <RegEx find="diteljk" replaceWith="diteljic" />
+    <RegEx find="citov" replaceWith="citir" />
+    <RegEx find="cjenil" replaceWith="cijenil" />
+    <RegEx find="dnaÄŤin" replaceWith="dnadĹľb" />
+    <RegEx find="\bdral" replaceWith="deral" />
+    <RegEx find="dranj" replaceWith="deranj" />
+    <RegEx find="dsek" replaceWith="dsjek" />
+    <RegEx find="[dt]cj?en(i|jen)" replaceWith="dcijen$1" />
+    <RegEx find="(?&lt;![dt])cj?enim" replaceWith="cijenim" />
+    <RegEx find="ebać" replaceWith="ebat ć" />
+    <RegEx find="editov" replaceWith="editir" />
+    <RegEx find="edituje" replaceWith="editira" />
+    <RegEx find="edituju" replaceWith="editiraju" />
+    <RegEx find="edjen" replaceWith="eđen" />
+    <RegEx find="ed([kph])" replaceWith="et$1" />
+    <RegEx find="(?&lt;![NnJj])edać" replaceWith="edat ć" />
+    <RegEx find="eide(?!n)" replaceWith="e ide" />
+    <RegEx find="eizbeĹľ" replaceWith="eizbjeĹľ" />
+    <RegEx find="efiniši" replaceWith="efiniraj" />
+    <RegEx find="efinišu" replaceWith="efiniraju" />
+    <RegEx find="empton" replaceWith="ampton" />
+    <!-- bjegunac-->
+    <RegEx find="(?&lt;!j)egun" replaceWith="jegun" />
+    <RegEx find="(?&lt;!j)elokup" replaceWith="jelokup" />
+    <RegEx find="enlj" replaceWith="enj" />
+    <RegEx find="eoni([cÄŤ])" replaceWith="ioni$1" />
+    <RegEx find="erišu" replaceWith="eriraju" />
+    <RegEx find="ermer" replaceWith="ramor" />
+    <!-- bez j zbog nesvjestica npr. -->
+    <RegEx find="esvest" replaceWith="esvijest" />
+    <RegEx find="etektov" replaceWith="etektir" />
+    <RegEx find="evać" replaceWith="evat ć" />
+    <RegEx find="fanziv" replaceWith="fenziv" />
+    <RegEx find="figurisa" replaceWith="figurira" />
+    <RegEx find="(mpl|st|f)ikova([nlot])" replaceWith="$1icira$2" />
+    <RegEx find="fikuj" replaceWith="ficir" />
+    <RegEx find="(fi[ln]|form)isa" replaceWith="$1ira" />
+    <RegEx find="(?&lt;!o)formiš" replaceWith="formiraj" />
+    <RegEx find="fi(sa|še)" replaceWith="fira" />
+    <RegEx find="fiskov" replaceWith="fiscir" />
+    <RegEx find="frov" replaceWith="frir" />
+    <RegEx find="grišć" replaceWith="grist ć" />
+    <RegEx find="grutova" replaceWith="grutira" />
+    <RegEx find="haot" replaceWith="kaot" />
+    <RegEx find="hrono" replaceWith="krono" />
+    <RegEx find="(?&lt;![MH])ick([eoiu])" replaceWith="iÄŤk$1" />
+    <RegEx find="idev" replaceWith="idjev" />
+    <RegEx find="ijo([absdegknptz])" replaceWith="io$1" />
+    <RegEx find="([ai])nić" replaceWith="$1nit ć" />
+    <RegEx find="(?&lt;!\b[Oo]zlo|\b[Ii]sp(rip)?ov|i)jeđen" replaceWith="ijeđen" />
+    <RegEx find="(?&lt;!hva)lisa([ol])" replaceWith="lira$1" />
+    <RegEx find="(?&lt;!hva)lisati" replaceWith="lirati" />
+    <RegEx find="irać" replaceWith="irat ć" />
+    <RegEx find="jći" replaceWith="jući" />
+    <RegEx find="jdin" replaceWith="jedin" />
+    <RegEx find="kodnevnic" replaceWith="kodnevic" />
+    <RegEx find="([kKpPvVtT])ratić" replaceWith="$1ratit ć" />
+    <RegEx find="koriš[čć]a" replaceWith="korišta" />
+    <!-- doktorica / profesorica -->
+    <RegEx find="(kt|s)ork" replaceWith="$1oric" />
+    <RegEx find="ktovanj" replaceWith="ktiranj" />
+    <RegEx find="ktuj" replaceWith="ktiraj" />
+    <RegEx find="(?&lt;![Oo]b)([nl])izuj[eu]" replaceWith="$1izira" />
+    <RegEx find="\bl([čćžzvsmrtpdbgkn])" replaceWith="i$1" />
+    <RegEx find="\bL([čćžzvsmrtpdbgkn])" replaceWith="I$1" />
+    <RegEx find="(?&lt;![Hh])omić" replaceWith="omit ć" />
+    <RegEx find="laćać" replaceWith="laćat ć" />
+    <RegEx find="ledov" replaceWith="ljedov" />
+    <RegEx find="lj?epić" replaceWith="lijepit ć" />
+    <RegEx find="lepš" replaceWith="ljepš" />
+    <RegEx find="lizankinj" replaceWith="lizank" />
+    <RegEx find="ljubc" replaceWith="ljupc" />
+    <RegEx find="ljutić" replaceWith="ljutit ć" />
+    <RegEx find="lša" replaceWith="iša" />
+    <RegEx find="Lša" replaceWith="Iša" />
+    <RegEx find="l([ou])žić" replaceWith="l$1žit ć" />
+    <RegEx find="luparenj" replaceWith="lupiranj" />
+    <RegEx find="([mv])ešten" replaceWith="$1ješten" />
+    <RegEx find="miniš[eu]" replaceWith="minira" />
+    <RegEx find="m([io]t?)rić" replaceWith="m$1rit ć" />
+    <RegEx find="mi?j?enić" replaceWith="mijenit ć" />
+    <RegEx find="mjenim" replaceWith="mijenim" />
+    <RegEx find="napredi" replaceWith="naprijedi" />
+    <RegEx find="ngaĹľuj" replaceWith="ngaĹľiraj" />
+    <RegEx find="nho" replaceWith="nko" />
+    <RegEx find="nisa([nlot])" replaceWith="nira$1" />
+    <RegEx find="(?&lt;!am)nesti" replaceWith="nijeti" />
+    <RegEx find="(?&lt;!sit)niše([mš])" replaceWith="nira$1" />
+    <RegEx find="(?&lt;!sit|fi)nišu" replaceWith="niraju" />
+    <RegEx find="niše(mo|te)" replaceWith="nira$1" />
+    <RegEx find="njaće" replaceWith="njat će" />
+    <RegEx find="nspirisa([nlt])" replaceWith="nspirira$1" />
+    <RegEx find="novj?eta" replaceWith="novijeta" />
+    <RegEx find="nović" replaceWith="novit ć" />
+    <RegEx find="ntis" replaceWith="ntir" />
+    <RegEx find="ntiše" replaceWith="ntira" />
+    <RegEx find="ntišu" replaceWith="ntiraju" />
+    <RegEx find="ntitj?el" replaceWith="ntitijel" />
+    <RegEx find="nzuje" replaceWith="nzira" />
+    <RegEx find="atursk" replaceWith="aturaln" />
+    <RegEx find="azuij" replaceWith="azumij" />
+    <RegEx find="([pg])asić" replaceWith="$1asit ć" />
+    <RegEx find="obed" replaceWith="objed" />
+    <RegEx find="([oO])besi" replaceWith="$1bjesi" />
+    <RegEx find="o[cčć]aren" replaceWith="očaran" />
+    <RegEx find="([oO])d([kp])" replaceWith="$1t$2" />
+    <RegEx find="oćeju" replaceWith="oće" />
+    <RegEx find="očeće" replaceWith="očet će" />
+    <RegEx find="oÄŤmi" replaceWith="oÄŤni" />
+    <RegEx find="odseÄŤ" replaceWith="odsjeÄŤ" />
+    <RegEx find="odsetni" replaceWith="odsjetni" />
+    <RegEx find="oeĹľ" replaceWith="oĹľe" />
+    <RegEx find="oješć" replaceWith="ojest ć" />
+    <RegEx find="ojtn" replaceWith="ojatn" />
+    <RegEx find="(?&lt;![Pp])oletn" replaceWith="oljetn" />
+    <RegEx find="onova([lt])" replaceWith="onira$1" />
+    <RegEx find="(?&lt;![nt])opić" replaceWith="opit ć" />
+    <RegEx find="([eoa])pisać" replaceWith="$1pisat ć" />
+    <RegEx find="oriće(mo|te)" replaceWith="orit će$1" />
+    <RegEx find="orks" replaceWith="orsk" />
+    <RegEx find="osejan" replaceWith="osijan" />
+    <RegEx find="o([dbjpv])ać(?!o)" replaceWith="o$1at ć" />
+    <RegEx find="oslj?ep" replaceWith="oslijep" />
+    <RegEx find="sj?etić" replaceWith="sjetit ć" />
+    <RegEx find="osb" replaceWith="osob" />
+    <RegEx find="ovinova([lt])" replaceWith="okorava$1" />
+    <RegEx find="posel" replaceWith="posjel" />
+    <RegEx find="produkova" replaceWith="producira" />
+    <RegEx find="\bpominj" replaceWith="spominj" />
+    <!-- ignoriše / koncentriše /operiše /toleriše /-->
+    <RegEx find="([te]|ku|pi|no)riše" replaceWith="$1rira" />
+    <RegEx find="(?&lt;![Pp]r|[Nn])adje(?!(v|n(e|u[olt]))\b)" replaceWith="ađe" />
+    <RegEx find="par nedj?elja" replaceWith="par tjedana" />
+    <RegEx find="pendov" replaceWith="pendir" />
+    <RegEx find="ralijs" replaceWith="rals" />
+    <RegEx find="kratij" replaceWith="kracij" />
+    <RegEx find="(?&lt;![is]|S)redić" replaceWith="rjedit ć" />
+    <RegEx find="(?&lt;![mr])ejt" replaceWith="ate" />
+    <RegEx find="rešć" replaceWith="rest ć" />
+    <!-- preduzeti / preduzetnik -->
+    <RegEx find="reduz" replaceWith="oduz" />
+    <RegEx find="relj?ep" replaceWith="relijep" />
+    <RegEx find="(?&lt;!e)rime([dt])" replaceWith="rimje$1" />
+    <RegEx find="risać(?!o)" replaceWith="risat ć" />
+    <RegEx find="ristun" replaceWith="risutn" />
+    <RegEx find="(?&lt;!k)rimić" replaceWith="rimit ć" />
+    <RegEx find="prostav" replaceWith="protstav" />
+    <RegEx find="pulis" replaceWith="pulir" />
+    <RegEx find="rićemo" replaceWith="rit ćemo" />
+    <RegEx find="rčaće" replaceWith="rčat će" />
+    <RegEx find="renaduvan" replaceWith="renapuhan" />
+    <RegEx find="rijedel" replaceWith="rijedil" />
+    <RegEx find="r([mv])isa" replaceWith="r$1ira" />
+    <RegEx find="rj?evozn" replaceWith="rijevozn" />
+    <RegEx find="rutuje" replaceWith="rutira" />
+    <RegEx find="rviši" replaceWith="rviraj" />
+    <RegEx find="ržać" replaceWith="ržat ć" />
+    <RegEx find="s([čć])" replaceWith="š$1" />
+    <RegEx find="seden" replaceWith="sjeden" />
+    <RegEx find="smeva" replaceWith="smijava" />
+    <RegEx find="stać(?!i)" replaceWith="stat ć" />
+    <RegEx find="\bstaral" replaceWith="brinul" />
+    <RegEx find="\bStaral" replaceWith="Brinul" />
+    <RegEx find="stovet" replaceWith="stovjet" />
+    <RegEx find="struis" replaceWith="struir" />
+    <RegEx find="struiše" replaceWith="struira" />
+    <RegEx find="struišu" replaceWith="struiraju" />
+    <RegEx find="(?&lt;!n)([sz])vesti([lt])" replaceWith="$1vijest$2" />
+    <RegEx find="svetić" replaceWith="svetit ć" />
+    <RegEx find="svetlj(?!iv)" replaceWith="svjetlj" />
+    <RegEx find="([šđ])ać" replaceWith="$1ač" />
+    <RegEx find="šević" replaceWith="ševit ć" />
+    <RegEx find="šunjać" replaceWith="šuljat ć" />
+    <RegEx find="tambul" replaceWith="tanbul" />
+    <RegEx find="tarisa" replaceWith="tira" />
+    <RegEx find="taun" replaceWith="town" />
+    <RegEx find="tćeš" replaceWith="t ćeš" />
+    <RegEx find="tideo" replaceWith="tidio" />
+    <RegEx find="tede(?![oć])" replaceWith="tedje" />
+    <RegEx find="tedeo" replaceWith="tedio" />
+    <RegEx find="tešn" replaceWith="tješn" />
+    <RegEx find="tisanj" replaceWith="tiranj" />
+    <RegEx find="(mo|ti|r)viš[eu]" replaceWith="$1vira" />
+    <RegEx find="tegri(sa|še)" replaceWith="tegrira" />
+    <RegEx find="teriv" replaceWith="tjeriv" />
+    <RegEx find="tnerk" replaceWith="tneric" />
+    <RegEx find="trisa" replaceWith="trira" />
+    <RegEx find="triši" replaceWith="triraj" />
+    <!-- ne diraj!!! - mijenja drugaÄŤije (komentira) -->
+    <RegEx find="tariše" replaceWith="tira" />
+    <RegEx find="tarišu" replaceWith="tiraju" />
+    <RegEx find="trišu" replaceWith="triraju" />
+    <RegEx find="ueln" replaceWith="ualn" />
+    <RegEx find="uisa" replaceWith="uira" />
+    <RegEx find="tvd" replaceWith="tvrd" />
+    <RegEx find="tvrn" replaceWith="tvarn" />
+    <RegEx find="u([bd])ić" replaceWith="u$1it ć" />
+    <RegEx find="u([cdtš])ać" replaceWith="u$1at ć" />
+    <RegEx find="(?&lt;![Kk]lj|[Uu]n|[Vv]|[jJ]ast|[Ss]and)učić" replaceWith="učit ć" />
+    <RegEx find="udijin" replaceWith="uÄŤev" />
+    <RegEx find="uduč" replaceWith="uduć" />
+    <RegEx find="udj([ai])" replaceWith="uđ$1" />
+    <RegEx find="(?&lt;!r)ugao" replaceWith="kut" />
+    <RegEx find="\bugl([au]|om|ovi|ovima)\b" replaceWith="kut$1" />
+    <RegEx find="([uU])meo" replaceWith="$1mio" />
+    <RegEx find="uliše" replaceWith="ulira" />
+    <RegEx find="ulišu" replaceWith="uliraju" />
+    <RegEx find="umere" replaceWith="umjere" />
+    <RegEx find="upoce" replaceWith="upocje" />
+    <RegEx find="urfovan" replaceWith="urfan" />
+    <RegEx find="ušać" replaceWith="ušat ć" />
+    <RegEx find="uzp" replaceWith="usp" />
+    <RegEx find="(?&lt;!kr|m)užić" replaceWith="užit ć" />
+    <RegEx find="veri([lt])" replaceWith="vjeri$1" />
+    <RegEx find="([do])vešć" replaceWith="$1vest ć" />
+    <RegEx find="vetion" replaceWith="vjetion" />
+    <RegEx find="visić" replaceWith="visit ć" />
+    <RegEx find="visa([lt])" replaceWith="vira$1" />
+    <RegEx find="([vV])jeov" replaceWith="$1jerov" />
+    <RegEx find="vljstv" replaceWith="voljstv" />
+    <RegEx find="v([or])dić" replaceWith="v$1dit ć" />
+    <RegEx find="(?&lt;![ČčĆć])vorić" replaceWith="vorit ć" />
+    <RegEx find="vpj" replaceWith="voj" />
+    <!-- mijenja u korist češće riječi -->
+    <RegEx find="([vV])rača" replaceWith="$1raća" />
+    <RegEx find="vršić" replaceWith="vršit ć" />
+    <RegEx find="zleÄŤi" replaceWith="zlijeÄŤi" />
+    <RegEx find="zmern" replaceWith="zmjern" />
+    <RegEx find="znst" replaceWith="znost" />
+    <RegEx find="(?&lt;![Oo]bra|o)zova([lton])" replaceWith="zira$1" />
+    <RegEx find="zpr" replaceWith="spr" />
+    <RegEx find="zuslov" replaceWith="zuvjet" />
+    <RegEx find="zvešć" replaceWith="zvest ć" />
+    <RegEx find="zvolić" replaceWith="zvolit ć" />
+    <RegEx find="Ĺľalj?ev" replaceWith="Ĺľalijev" />
+    <RegEx find="živać" replaceWith="živat ć" />
+    <RegEx find="Ĺľive([lot])" replaceWith="Ĺľivi$1" />
+
+    <!-- osobna imena/prezimena i imena gradova/drĹľava itd. -->
+    <RegEx find="Afghanistan" replaceWith="Afganistan" />
+    <RegEx find="Ajdah" replaceWith="Idah" />
+    <RegEx find="Ajl[ae]nd" replaceWith="Island" />
+    <RegEx find="Ajzak" replaceWith="Isaac" />
+    <RegEx find="Ajzenhauer" replaceWith="Eisenhower" />
+    <RegEx find="([aA])l[cz]h[ae]jmer" replaceWith="$1lzheimer" />
+    <RegEx find="Atin" replaceWith="Aten" />
+    <RegEx find="rÄŤer" replaceWith="rcher" />
+    <RegEx find="Avgani" replaceWith="Afgani" />
+    <RegEx find="Bejkon" replaceWith="Bacon" />
+    <RegEx find="Belgijan" replaceWith="Belgij" />
+    <RegEx find="endĹľ(?!o)" replaceWith="enj" />
+    <RegEx find="Betmen" replaceWith="Batman" />
+    <RegEx find="Blejk" replaceWith="Blake" />
+    <RegEx find="Bruklin" replaceWith="Brooklyn" />
+    <RegEx find="Brajan" replaceWith="Brian" />
+    <RegEx find="Brajs" replaceWith="Bryce" />
+    <RegEx find="Braun" replaceWith="Brown" />
+    <RegEx find="Brussels" replaceWith="Bruxelles" />
+    <RegEx find="ÄŚarls" replaceWith="Charles" />
+    <RegEx find="ÄŚ[eu]rÄŤil" replaceWith="Churchill" />
+    <RegEx find="ÄŚikag" replaceWith="Chicag" />
+    <RegEx find="Dajan" replaceWith="Dian" />
+    <RegEx find="Dankan" replaceWith="Duncan" />
+    <RegEx find="Dejvi([ds])" replaceWith="Davi$1" />
+    <RegEx find="Dijeg" replaceWith="Dieg" />
+    <RegEx find="Diznilend" replaceWith="Disneyland" />
+    <RegEx find="Doson" replaceWith="Dawson" />
+    <RegEx find="Dvajt" replaceWith="Dwight" />
+    <RegEx find="DĹľastin" replaceWith="Justin" />
+    <RegEx find="DĹľef" replaceWith="Jeff" />
+    <RegEx find="DĹľejn" replaceWith="Jane" />
+    <RegEx find="DĹľejk" replaceWith="Jake" />
+    <RegEx find="DĹľejms" replaceWith="James" />
+    <RegEx find="DĹľejson" replaceWith="Jason" />
+    <RegEx find="DĹľek" replaceWith="Jack" />
+    <RegEx find="DĹľeremi" replaceWith="Jeremy" />
+    <RegEx find="DĹľesik" replaceWith="Jessic" />
+    <RegEx find="DĹľim" replaceWith="Jim" />
+    <RegEx find="DĹľon" replaceWith="John" />
+    <RegEx find="DĹľoni" replaceWith="Johnny" />
+    <RegEx find="DĹľonson" replaceWith="Johnson" />
+    <RegEx find="DĹľordĹľ" replaceWith="George" />
+    <RegEx find="DĹľouns" replaceWith="Jones" />
+    <RegEx find="DĹľulij" replaceWith="Juli" />
+    <RegEx find="Efrejm" replaceWith="Ephraim" />
+    <RegEx find="Ejmos" replaceWith="Amos" />
+    <RegEx find="[EA]jnštajn" replaceWith="Einstein" />
+    <RegEx find="Endi" replaceWith="Andy" />
+    <RegEx find="Endrj?u" replaceWith="Andrew" />
+    <RegEx find="Filadelfij" replaceWith="Philadelphi" />
+    <RegEx find="Finiks" replaceWith="Phoenix" />
+    <RegEx find="\bFrojd" replaceWith="Freud" />
+    <RegEx find="Frenk" replaceWith="Frank" />
+    <RegEx find="Gejts" replaceWith="Gates" />
+    <RegEx find="\bÄovani" replaceWith="Giovanni" />
+    <RegEx find="Hari" replaceWith="Harry" />
+    <RegEx find="Hauard" replaceWith="Howard" />
+    <RegEx find="Hitrou" replaceWith="Heathrow" />
+    <RegEx find="Hrist" replaceWith="Krist" />
+    <RegEx find="Holandij" replaceWith="Nizozemsk" />
+    <RegEx find="\bHolands" replaceWith="Nizozems" />
+    <RegEx find="Holivud" replaceWith="Hollywood" />
+    <RegEx find="Holms" replaceWith="Holmes" />
+    <RegEx find="indijan(?!s)" replaceWith="Indijan" />
+    <RegEx find="Iraq" replaceWith="Irak" />
+    <RegEx find="Itan" replaceWith="Ethan" />
+    <RegEx find="Jejl" replaceWith="Yale" />
+    <RegEx find="Jevrej" replaceWith="Židov" />
+    <RegEx find="jevrej" replaceWith="Ĺľidov" />
+    <RegEx find="Jovan" replaceWith="Ivan" />
+    <RegEx find="kadilak" replaceWith="Cadillac" />
+    <RegEx find="Kajl" replaceWith="Kyle" />
+    <RegEx find="Kavendiš" replaceWith="Cavendish" />
+    <RegEx find="Kejleb" replaceWith="Caleb" />
+    <RegEx find="KembridĹľ" replaceWith="Cambridge" />
+    <RegEx find="Kinkejd" replaceWith="Kincaid" />
+    <RegEx find="Klej" replaceWith="Clay" />
+    <RegEx find="Klif" replaceWith="Cliff" />
+    <RegEx find="Konn?ektik[aeu]t" replaceWith="Connecticut" />
+    <RegEx find="Korejan" replaceWith="Korej" />
+    <RegEx find="Kris(?!t)" replaceWith="Chris" />
+    <RegEx find="Kvins" replaceWith="Queens" />
+    <RegEx find="Lajonel" replaceWith="Lionel" />
+    <RegEx find="Leri" replaceWith="Larry" />
+    <RegEx find="Klivlend" replaceWith="Cleveland" />
+    <RegEx find="(?&lt;![LT])ejl" replaceWith="ale" />
+    <RegEx find="Losanđeles" replaceWith="Los Angeles" />
+    <RegEx find="Majami" replaceWith="Miami" />
+    <RegEx find="Majkl" replaceWith="Michael" />
+    <RegEx find="Majls" replaceWith="Miles" />
+    <RegEx find="Marfi" replaceWith="Murphy" />
+    <RegEx find="Mejson" replaceWith="Mason" />
+    <RegEx find="Memfis" replaceWith="Memphis" />
+    <RegEx find="Menhetn" replaceWith="Manhattan" />
+    <RegEx find="Metju" replaceWith="Matthew" />
+    <RegEx find="Mexic" replaceWith="Meksik" />
+    <RegEx find="iÄŤigen" replaceWith="ichigan" />
+    <RegEx find="Misisipi" replaceWith="Mississippi" />
+    <RegEx find="Mocart" replaceWith="Mozart" />
+    <RegEx find="Nejt" replaceWith="Nate" />
+    <RegEx find="Nešvil" replaceWith="Nashville" />
+    <RegEx find="Nizuzem" replaceWith="Nizozem" />
+    <RegEx find="Njutn" replaceWith="Newton" />
+    <RegEx find="N[jJ]u DĹľer[sz]i" replaceWith="New Jersey" />
+    <RegEx find="N[jJ]u Jork" replaceWith="New York" />
+    <RegEx find="N[jJ]u Orleans" replaceWith="New Orleans" />
+    <RegEx find="Njujork" replaceWith="New York" />
+    <RegEx find="Njuton" replaceWith="Newton" />
+    <RegEx find="Pokipsi" replaceWith="Poughkeepsie" />
+    <RegEx find="ulicer" replaceWith="ulitzer" />
+    <RegEx find="Rajan" replaceWith="Ryan" />
+    <RegEx find="RiÄŤ" replaceWith="Rich" />
+    <RegEx find="odĹľe" replaceWith="oge" />
+    <RegEx find="rols rojs" replaceWith="Rolls-Royce" />
+    <RegEx find="Sajmon" replaceWith="Simon" />
+    <RegEx find="S[ae]mjuel" replaceWith="Samuel" />
+    <RegEx find="Sijetl" replaceWith="Seattle" />
+    <RegEx find="Sinsinati" replaceWith="Cincinnati" />
+    <RegEx find="Sten" replaceWith="Stan" />
+    <RegEx find="Stiv" replaceWith="Steve" />
+    <RegEx find="Stiven" replaceWith="Stephen" />
+    <RegEx find="Stjuart" replaceWith="Stuart" />
+    <RegEx find="SanÄŤez" replaceWith="Sanchez" />
+    <RegEx find="Ĺ ejn" replaceWith="Shane" />
+    <RegEx find="Ĺ erlok" replaceWith="Sherlock" />
+    <RegEx find="Ĺ panij([aeou])" replaceWith="Ĺ panjolsk$1" />
+    <RegEx find="([šŠ])pansk" replaceWith="$1panjolsk" />
+    <RegEx find="([šŠ])vetsk" replaceWith="$1vedsk" />
+    <RegEx find="Ĺ tokh?olm" replaceWith="Stockholm" />
+    <RegEx find="vajcar" replaceWith="vicar" />
+    <RegEx find="Tajms" replaceWith="Times" />
+    <RegEx find="Tajler" replaceWith="Tyler" />
+    <RegEx find="Vajoming" replaceWith="Wyoming" />
+    <RegEx find="Valt" replaceWith="Walt" />
+    <RegEx find="V[ao]šington" replaceWith="Washington" />
+    <RegEx find="Vavilon" replaceWith="Babilon" />
+    <RegEx find="vavilons" replaceWith="babilons" />
+    <RegEx find="Vejn" replaceWith="Wayne" />
+    <RegEx find="Vejder" replaceWith="Vader" />
+    <RegEx find="Vilijam" replaceWith="William" />
+    <RegEx find="VinÄŤi" replaceWith="Vinci" />
+    <RegEx find="Vinsent" replaceWith="Vincent" />
+    <RegEx find="Viskonsin" replaceWith="Wisconsin" />
+    <RegEx find="Volter" replaceWith="Walter" />
+    <RegEx find="Vots" replaceWith="Wats" />
+    <!-- 10kg » 10 kg   |  20cm » 20 cm   |  44dag » 44 dag -->
+    <RegEx find="\b(\d+)([a-z]{2,4})\b" replaceWith="$1 $2" />
+    <!-- 34m » 34 m -->
+    <RegEx find="([\d]){1}?m" replaceWith="$1 m" />
+    <!-- From here credit goes to: MilanRS [http://www.prijevodi-online.org] -->
+    <RegEx find="([ks]ao)\.:" replaceWith="$1:" />
+    <RegEx find="([a-zčđšž])Ij([a-zčđšž])" replaceWith="$1lj$2" />
+    <RegEx find="([^A-ZÄŚÄĹ Ĺ˝a-zčđšž])Iju(bav|d|t)" replaceWith="$1lju$2" />
+    <!-- kad postoji razmak između tagova </i> <i> -->
+    <!-- <RegEx find="(&gt;) +(&lt;)" replaceWith="$1$2" /> -->
+    <!-- ',"' to '",' -->
+    <RegEx find="(\w),&quot;(\s|$)" replaceWith="$1&quot;,$2" />
+    <RegEx find=",\.{3}|\.{3},|\.{2} \." replaceWith="..." />
+    <!-- "1 :", "2 :"... "n :" to "n:" -->
+    <RegEx find="([0-9]) +: +(\D)" replaceWith="$1: $2" />
+    <!-- Two or more consecutive "," to "..." -->
+    <RegEx find=",{2,}" replaceWith="..." />
+    <!-- Two or more consecutive "-" to "..." -->
+    <RegEx find="-{2,}" replaceWith="..." />
+    <RegEx find="([^().])\.{2}([^().:])" replaceWith="$1...$2" />
+    <!-- separator stotica i decimalnog ostatka 1,499,000.00 -> 1.499.000,00 -->
+    <RegEx find="([0-9]{3})\.([0-9]{2}[^0-9])" replaceWith="$1,$2" />
+    <RegEx find="([0-9]),([0-9]{3}\D)" replaceWith="$1.$2" />
+    <!-- Apostrophes -->
+    <RegEx find="´´" replaceWith="&quot;" />
+    <!-- <RegEx find="[´`]" replaceWith="'" /> -->
+    <!-- <RegEx find="[“”]" replaceWith="&quot;" /> -->
+    <RegEx find="''" replaceWith="&quot;" />
+    <!-- Two or more consecutive '"' to one '"' -->
+    <RegEx find="&quot;{2,}" replaceWith="&quot;" />
+    <!-- Fix zero and capital 'o' ripping mistakes -->
+    <RegEx find="(?&lt;=[0-9]\.?)O" replaceWith="0" />
+    <RegEx find="\b0(?=[A-ZÄŚÄĹ Ĺ˝a-zčđšž])" replaceWith="O" />
+    <!-- Brisanje crte - na poÄŤetku 1. reda (i kada ima dva reda) -->
+    <RegEx find="\A- ?([A-ZÄŚÄĹ Ĺ˝a-zčđšž0-9„'&quot;]|\.{3})" replaceWith="$1" />
+    <RegEx find="\A(&lt;[ibu]&gt;)- ?" replaceWith="$1" />
+    <RegEx find="  - " replaceWith=" -" />
+    <!-- Brisanje razmaka iza crte - na poÄŤetku 2. reda -->
+    <RegEx find="(?&lt;=\n(&lt;[ibu]&gt;)?)- (?=[A-ZÄŚÄŠŽčš0-9„'&quot;&lt;])" replaceWith="-" />
+    <!-- Korigiranje crte - kad je u sredini prvog reda -->
+    <RegEx find="([.!?&quot;&gt;]) - ([A-ZÄŚÄŠŽčš'&quot;&lt;])" replaceWith="$1 -$2" />
+    <!-- Zatvoren tag pa razmak poslije crtice -->
+    <RegEx find="(&gt;) - ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="$1 -$2" />
+    <!-- Zatvoren tag pa crtica razmak -->
+    <RegEx find="(&gt;)- ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="$1-$2" />
+    <!-- Zagrada pa crtica razmak -->
+    <RegEx find="\(- ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="(-$1" />
+    <!-- Smart space after dot -->
+    <!-- osim kad je zadnje t (rijeÄŤ kolt) -->
+    <RegEx find="([a-su-zá-úñä-ü])\.([^\s\n().:?!*^“”'&quot;&lt;])" replaceWith="$1. $2" />
+    <!-- Oznaka za kalibar. Npr. "Colt .45" -->
+    <!-- Da bi radilo, da bi ovaj razmak bio dozvoljen, odÄŤekirajte "Razmaci ispred toÄŤke" -->
+    <RegEx find="t\.(?=[0-9]{2}})" replaceWith="t ." />
+    <!-- Joey(j)a -->
+    <RegEx find="([A-Z][a-z])eyj([a-z])" replaceWith="$1ey$2" />
+    <!-- Sređuje zarez sa razmakom -->
+    <RegEx find="([A-ZÄŚÄĹ Ĺ˝a-zčđšžá-úñä-ĂĽ&quot;]),([^\s\n(),?!“&lt;])" replaceWith="$1, $2" />
+    <RegEx find="([?!])-" replaceWith="$1 -" />
+    <!-- Space after last of some consecutive dots (eg. "...") -->
+    <RegEx find="(?&lt;=[a-zčđšž])(\.{3}|!)(?=[a-zčđšž])" replaceWith="$1 " />
+    <!-- Delete space after "..." that is at the beginning of the line. You may delete this line if you don't like it -->
+    <!-- <RegEx find="^\.{3} +" replaceWith="..." /> -->
+    <!-- "tekst ... tekst" mijenja u "tekst... tekst" -->
+    <RegEx find="([A-ZÄŚÄĹ Ĺ˝a-zčđšž]) \.{3} " replaceWith="$1... " />
+    <RegEx find="(\S)\. &quot;" replaceWith="$1.&quot;" />
+    <RegEx find="&quot; \." replaceWith="&quot;." />
+    <RegEx find="(\S\.{3}) &quot;(\s|$)" replaceWith="$1&quot;$2" />
+    <RegEx find=" \.{3}$" replaceWith="..." />
+    <RegEx find="([a-zčđšž])( \.{3}|\.{2}$)" replaceWith="$1..." />
+    <!-- Razmak ispred zagrade -->
+    <RegEx find="([A-ZÄŚÄĹ Ĺ˝a-zčđšž])\(" replaceWith="$1 (" />
+    <!-- Razmak iza upitnika -->
+    <RegEx find="\?([A-ZÄŚÄŠŽčš])" replaceWith="? $1" />
+    <RegEx find="(^|&gt;)\.{3} ([A-ZÄŚÄŠŽčš])" replaceWith="$1...$2" />
+    <!-- Briše ... kad je na početku reda "... -->
+    <RegEx find="^&quot;\.{3} " replaceWith="&quot;" />
+    <RegEx find="([0-9])\$" replaceWith="$1 $$" />
+    <!-- ti š -> t š by Strider -->
+    <!-- Zamijeni sva "**ti šu*" s "**t šu*" i "**ti še*" s "**t še*" -->
+    <!-- <RegEx find="([a-z])ti (š+[eu])" replaceWith="$1t $2" /> -->
+    <!-- <RegEx find="([A-Za-z])ti( |\r?\n)(š[eu])" replaceWith="$1t$2$3" /> -->
+    <!-- <RegEx find="(?i)\b(ni)t (š[eu])" replaceWith="$1ti $2" /> -->
+    <!-- Razmak poslije <i> i poslije .. -->
+    <RegEx find="^(&lt;[ibu]&gt;) +" replaceWith="$1" />
+    <!-- Razmak ? "</i> -->
+    <RegEx find="([.?!]) +(&quot;&lt;)" replaceWith="$1$2" />
+    <!-- Bez razmaka kod Npr.: -->
+    <RegEx find="([Nn])pr\. +:" replaceWith="$1pr.:" />
+    <RegEx find="\. ," replaceWith=".," />
+    <RegEx find="([?!])\." replaceWith="$1" />
+    <!-- Da ne kvari potpise sa ..:: -->
+    <RegEx find="\.{3}::" replaceWith="..::" />
+    <RegEx find="::\.{3}" replaceWith="::.." />
+    <RegEx find="\.{2} ::" replaceWith="..::" />
+    <!-- Skraćenice bez razmaka -->
+    <RegEx find="d\. o\.o\." replaceWith="d.o.o." />
+  </RegularExpressions>
+</OCRFixReplaceList>
diff --git a/libs/subzero/modification/dictionaries/xml/hrv_diacriticOCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/hrv_diacriticOCRFixReplaceList.xml
new file mode 100644
index 000000000..4983307f0
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/hrv_diacriticOCRFixReplaceList.xml
@@ -0,0 +1,1592 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="andele" to="anđele" />
+    <Word from="andeli" to="anđeli" />
+    <Word from="bas" to="baš" />
+    <Word from="basta" to="vrt" />
+    <Word from="Basta" to="Vrt" />
+    <Word from="baste" to="vrtovi" />
+    <Word from="Baste" to="Vrtovi" />
+    <Word from="basti" to="vrtu" />
+    <Word from="Basti" to="Vrtu" />
+    <Word from="bastu" to="vrt" />
+    <Word from="Bastu" to="Vrt" />
+    <Word from="bastom" to="vrtom" />
+    <Word from="Bastom" to="Vrtom" />
+    <Word from="Bice" to="Biće" />
+    <Word from="bice" to="biće" />
+    <Word from="Biceš" to="Bit ćeš" />
+    <Word from="Bicu" to="Bit ću" />
+    <Word from="bicu" to="biću" />
+    <Word from="blizi" to="bliĹľi" />
+    <Word from="bojis" to="bojiš" />
+    <Word from="braca" to="braća" />
+    <Word from="Braca" to="Braća" />
+    <Word from="broncane" to="bronÄŤane" />
+    <Word from="budes" to="budeš" />
+    <Word from="buducnost" to="budućnost" />
+    <Word from="buducnosti" to="budućnosti" />
+    <Word from="buducnoscu" to="budućnošću" />
+    <Word from="Cak" to="ÄŚak" />
+    <Word from="cak" to="ÄŤak" />
+    <Word from="Cao" to="Ćao" />
+    <Word from="cao" to="ćao" />
+    <Word from="cas" to="sat" />
+    <Word from="casu" to="cašu" />
+    <Word from="cašu" to="čašu" />
+    <Word from="caj" to="ÄŤaj" />
+    <Word from="caja" to="ÄŤaja" />
+    <Word from="casno" to="ÄŤasno" />
+    <Word from="Casno" to="ÄŚasno" />
+    <Word from="cale" to="tata" />
+    <Word from="cebe" to="deku" />
+    <Word from="cekali" to="ÄŤekali" />
+    <Word from="cekas" to="čekaš" />
+    <Word from="Cemu" to="ÄŚemu" />
+    <Word from="cemu" to="ÄŤemu" />
+    <Word from="cerku" to="kćer" />
+    <Word from="Cerku" to="Kćer" />
+    <Word from="ceš" to="ćeš" />
+    <Word from="ces" to="ćeš" />
+    <Word from="ćes" to="ćeš" />
+    <Word from="cesto" to="ÄŤesto" />
+    <Word from="Cesto" to="ÄŚesto" />
+    <Word from="cesce" to="češće" />
+    <Word from="Cesce" to="Češće" />
+    <Word from="cega" to="ÄŤega" />
+    <Word from="cetri" to="ÄŤetiri" />
+    <Word from="cetiri" to="ÄŤetiri" />
+    <Word from="Cetiri" to="ÄŚetiri" />
+    <Word from="Cetverokut" to="ÄŚetverokut" />
+    <Word from="cetvrtak" to="ÄŤetvrtak" />
+    <Word from="cetvrtu" to="ÄŤetvrtu" />
+    <Word from="ceznja" to="ÄŤeĹľnja" />
+    <Word from="ceznje" to="ÄŤeĹľnje" />
+    <Word from="ceznji" to="ÄŤeĹľnji" />
+    <Word from="ceznju" to="ÄŤeĹľnju" />
+    <Word from="ceznjom" to="ÄŤeĹľnjom" />
+    <Word from="Cim" to="ÄŚim" />
+    <Word from="cim" to="ÄŤim" />
+    <Word from="Cija" to="ÄŚija" />
+    <Word from="cija" to="ÄŤija" />
+    <Word from="cije" to="ÄŤije" />
+    <Word from="Ciji" to="ÄŚiji" />
+    <Word from="ciji" to="ÄŤiji" />
+    <Word from="cijih" to="ÄŤijih" />
+    <Word from="Cijih" to="ÄŚijih" />
+    <Word from="cijim" to="ÄŤijim" />
+    <Word from="Cijim" to="ÄŚijim" />
+    <Word from="ÄŚime" to="ÄŚime" />
+    <Word from="cime" to="ÄŤime" />
+    <Word from="cizme" to="ÄŤizme" />
+    <Word from="cinio" to="ÄŤinio" />
+    <Word from="cinila" to="ÄŤinila" />
+    <Word from="cinili" to="ÄŤinili" />
+    <Word from="ciniti" to="ÄŤiniti" />
+    <Word from="cipka" to="ÄŤipka" />
+    <Word from="cipku" to="ÄŤipku" />
+    <Word from="cita" to="ÄŤita" />
+    <Word from="citao" to="ÄŤitao" />
+    <Word from="citas" to="čitaš" />
+    <Word from="citavu" to="ÄŤitavu" />
+    <Word from="corsokak" to="slijepa ulica" />
+    <Word from="corsokaku" to="slijepoj ulici" />
+    <Word from="cosak" to="ugao" />
+    <Word from="cosku" to="uglu" />
+    <Word from="covek" to="ÄŤovjek" />
+    <Word from="covjek" to="ÄŤovjek" />
+    <Word from="covjeka" to="ÄŤovjeka" />
+    <Word from="covjeku" to="ÄŤovjeku" />
+    <Word from="covece" to="ÄŤovjeÄŤe" />
+    <Word from="covjece" to="ÄŤovjeÄŤe" />
+    <Word from="covjecnost" to="ÄŤovjeÄŤnost" />
+    <Word from="necovjecnost" to="neÄŤovjeÄŤnost" />
+    <Word from="necovjecnosti" to="neÄŤovjeÄŤnosti" />
+    <Word from="necovjecnoscu" to="nečovječnošću" />
+    <Word from="cerka" to="kći" />
+    <Word from="Cerka" to="Kći" />
+    <Word from="cerke" to="kćeri" />
+    <Word from="Cerke" to="Kćeri" />
+    <Word from="clan" to="ÄŤlan" />
+    <Word from="Clan" to="ÄŚlan" />
+    <Word from="clanke" to="ÄŤlanke" />
+    <Word from="clanovi" to="ÄŤlanovi" />
+    <Word from="clanove" to="ÄŤlanove" />
+    <Word from="clanovima" to="ÄŤlanovima" />
+    <Word from="cinis" to="činiš" />
+    <Word from="cmo" to="ćemo" />
+    <Word from="crpeci" to="crpeći" />
+    <Word from="cte" to="ćete" />
+    <Word from="ćte" to="ćete" />
+    <Word from="cu" to="ću" />
+    <Word from="cuo" to="ÄŤuo" />
+    <Word from="Cuo" to="ÄŚuo" />
+    <Word from="Cudo" to="ÄŚudo" />
+    <Word from="cudo" to="ÄŤudo" />
+    <Word from="cudi" to="ÄŤudi" />
+    <Word from="Cujte" to="ÄŚujte" />
+    <Word from="cula" to="ÄŤula" />
+    <Word from="culi" to="ÄŤuli" />
+    <Word from="Culi" to="ÄŚuli" />
+    <Word from="culima" to="ÄŤulima" />
+    <Word from="cupam" to="ÄŤupam" />
+    <Word from="cuti" to="ÄŤuti" />
+    <Word from="cutanje" to="šutnja" />
+    <Word from="Cutanje" to="Ĺ utnja" />
+    <Word from="cutljiv" to="šutljiv" />
+    <Word from="cutnja" to="šutnja" />
+    <Word from="cutao" to="šutio" />
+    <Word from="Cutao" to="Ĺ utio" />
+    <Word from="cuvali" to="ÄŤuvali" />
+    <Word from="cuveni" to="ÄŤuveni" />
+    <!--d-->
+    <Word from="davo" to="vrag" />
+    <Word from="definise" to="definira" />
+    <Word from="definisi" to="definiraj" />
+    <Word from="delimicno" to="djelomiÄŤno" />
+    <Word from="delimicni" to="djelomiÄŤni" />
+    <Word from="Desava" to="Događa" />
+    <Word from="desava" to="događa" />
+    <Word from="disi" to="diši" />
+    <Word from="Dodji" to="Dođi" />
+    <Word from="Dodjite" to="Dođite" />
+    <Word from="dodji" to="dođi" />
+    <Word from="dodjite" to="dođite" />
+    <Word from="Dodju" to="Dođu" />
+    <Word from="dodju" to="dođu" />
+    <Word from="dodu" to="dođu" />
+    <Word from="dobijes" to="dobiješ" />
+    <Word from="doci" to="doći" />
+    <Word from="Dodi" to="Dođi" />
+    <Word from="dodi" to="dođi" />
+    <Word from="dodite" to="dođite" />
+    <Word from="dode" to="dođe" />
+    <Word from="dodes" to="dođeš" />
+    <Word from="dodeš" to="dođeš" />
+    <Word from="dodem" to="dođem" />
+    <Word from="dodjem" to="dođem" />
+    <Word from="dolazis" to="dolaziš" />
+    <Word from="dodete" to="dođete" />
+    <Word from="dopustao" to="dopuštao" />
+    <Word from="dorucak" to="doruÄŤak" />
+    <Word from="dorucku" to="doruÄŤku" />
+    <Word from="dosaduju" to="dosađuju" />
+    <Word from="drhteci" to="drhteći" />
+    <Word from="drukciji" to="drugaÄŤiji" />
+    <Word from="drugaciji" to="drugaÄŤiji" />
+    <Word from="Drugacije" to="DrugaÄŤije" />
+    <Word from="drugacije" to="drugaÄŤije" />
+    <Word from="drzi" to="drĹľi" />
+    <Word from="dzanki" to="ovisnik" />
+    <Word from="drhteći" to="drhteći" />
+    <Word from="Drhteći" to="Drhteći" />
+    <Word from="druze" to="druĹľe" />
+    <Word from="duze" to="duĹľe" />
+    <Word from="duzinom" to="duĹľinom" />
+    <Word from="drveca" to="drveća" />
+    <Word from="drvece" to="drveće" />
+    <Word from="drvecu" to="drveću" />
+    <Word from="drvecem" to="drvećem" />
+    <Word from="flasom" to="flašom" />
+    <Word from="flasu" to="flašu" />
+    <Word from="fucka" to="fućka" />
+    <Word from="funkcionisu" to="funkcioniraju" />
+    <!--g-->
+    <Word from="gacice" to="gaćice" />
+    <Word from="gadao" to="gađao" />
+    <Word from="gadis" to="gadiš" />
+    <Word from="Gadis" to="Gadiš" />
+    <Word from="gdica" to="gđica" />
+    <Word from="gdice" to="gđice" />
+    <Word from="gdicu" to="gđicu" />
+    <Word from="gdici" to="gđici" />
+    <Word from="gda" to="gđa" />
+    <Word from="gdu" to="gđu" />
+    <Word from="gdo" to="gđo" />
+    <Word from="gdi" to="gđi" />
+    <Word from="glupaco" to="glupaÄŤo" />
+    <Word from="gorucu" to="goruću" />
+    <Word from="goruce" to="goruće" />
+    <Word from="govoris" to="govoriš" />
+    <Word from="gradani" to="građani" />
+    <Word from="gradic" to="gradić" />
+    <Word from="gradicu" to="gradiću" />
+    <Word from="gradica" to="gradića" />
+    <Word from="grese" to="griješe" />
+    <Word from="greski" to="grešci" />
+    <Word from="gresku" to="grešku" />
+    <Word from="gresci" to="grešci" />
+    <Word from="gubis" to="gubiš" />
+    <Word from="htjeo" to="htio" />
+    <Word from="hocu" to="hoću" />
+    <Word from="Hocu" to="Hoću" />
+    <Word from="Hoces" to="Hoćeš" />
+    <Word from="hoces" to="hoćeš" />
+    <Word from="hodas" to="hodaš" />
+    <Word from="Ici" to="Ići" />
+    <Word from="ici" to="ići" />
+    <Word from="iceg" to="iÄŤeg" />
+    <Word from="icega" to="iÄŤega" />
+    <Word from="icemu" to="iÄŤemu" />
+    <Word from="Ides" to="Ideš" />
+    <Word from="ides" to="ideš" />
+    <Word from="Iduci" to="Idući" />
+    <Word from="iduci" to="idući" />
+    <Word from="iduce" to="iduće" />
+    <Word from="iducem" to="idućem" />
+    <Word from="iduceg" to="idućeg" />
+    <Word from="isao" to="išao" />
+    <Word from="isla" to="išla" />
+    <Word from="istjece" to="istjeÄŤe" />
+    <Word from="istrazio" to="istrazio" />
+    <Word from="Istrazio" to="Istrazio" />
+    <Word from="išcupao" to="iščupao" />
+    <Word from="iscupao" to="iščupao" />
+    <Word from="imas" to="imaš" />
+    <Word from="Ijudi" to="ljudi" />
+    <Word from="imidz" to="imidĹľ" />
+    <Word from="igras" to="igraš" />
+    <Word from="ignorisi" to="ignoriraj" />
+    <Word from="ignorisi" to="ignoriraju" />
+    <Word from="isuvise" to="previše" />
+    <Word from="izaci" to="izaći" />
+    <Word from="Izadi" to="Izađi" />
+    <Word from="izadi" to="izađi" />
+    <Word from="izade" to="izađe" />
+    <Word from="izades" to="izađeš" />
+    <Word from="izasao" to="izašao" />
+    <Word from="izasla" to="izašla" />
+    <Word from="izici" to="izaći" />
+    <Word from="izmedu" to="između" />
+    <Word from="Izmedu" to="Između" />
+    <Word from="izvuci" to="izvući" />
+    <Word from="jebes" to="jebeš" />
+    <Word from="Jebes" to="Jebeš" />
+    <Word from="jos" to="još" />
+    <Word from="Jos" to="Još" />
+    <Word from="juce" to="juÄŤer" />
+    <Word from="Juce" to="JuÄŤer" />
+    <Word from="jucer" to="juÄŤer" />
+    <Word from="Jucer" to="JuÄŤer" />
+    <!--k-->
+    <Word from="kaslja" to="kašlja" />
+    <Word from="kaze" to="kaĹľe" />
+    <Word from="Kaze" to="KaĹľe" />
+    <Word from="Kazite" to="KaĹľite" />
+    <Word from="nekaze" to="ne kaĹľe" />
+    <Word from="kazu" to="kaĹľu" />
+    <Word from="kcer" to="kćer" />
+    <Word from="kcerka" to="kći" />
+    <Word from="Kcerka" to="Kći" />
+    <Word from="kcerkama" to="kćerima" />
+    <Word from="kcerku" to="kćer" />
+    <Word from="Kcerku" to="Kćer" />
+    <Word from="kecap" to="keÄŤap" />
+    <Word from="kecapa" to="keÄŤapa" />
+    <Word from="kociji" to="koÄŤiji" />
+    <Word from="kolaca" to="kolaÄŤa" />
+    <Word from="kolace" to="kolaÄŤe" />
+    <Word from="komadic" to="komadić" />
+    <Word from="komšija" to="susjed" />
+    <Word from="komsiji" to="susjedu" />
+    <Word from="komsiluk" to="susjedstvo" />
+    <Word from="komsiluku" to="susjedstvu" />
+    <Word from="komsije" to="susjedi" />
+    <Word from="komsijama" to="susjedima" />
+    <Word from="kontrolisu" to="kontroliraju" />
+    <Word from="konkurisem" to="konkuriram" />
+    <Word from="konkurise" to="konkurira" />
+    <Word from="kovceg" to="kovÄŤeg" />
+    <Word from="kovcegu" to="kovÄŤegu" />
+    <Word from="krada" to="krađa" />
+    <Word from="krece" to="kreće" />
+    <Word from="Kreci" to="Kreći" />
+    <Word from="kreci" to="kreći" />
+    <Word from="krosnje" to="krošnje" />
+    <Word from="kuca" to="kuća" />
+    <Word from="kuča" to="kuća" />
+    <Word from="kuči" to="kući" />
+    <Word from="kuce" to="kuće" />
+    <Word from="kuci" to="kući" />
+    <Word from="kucama" to="kućama" />
+    <Word from="kusa" to="kuša" />
+    <Word from="kusas" to="kušaš" />
+    <!--l-->
+    <Word from="lakocom" to="lakoćom" />
+    <Word from="laz" to="laĹľ" />
+    <Word from="lazac" to="laĹľljivac" />
+    <Word from="laze" to="laĹľe" />
+    <Word from="lazi" to="laĹľi" />
+    <Word from="lazne" to="laĹľne" />
+    <Word from="lazov" to="laĹľljivac" />
+    <Word from="ledja" to="leđa" />
+    <Word from="ledjima" to="leđima" />
+    <Word from="lezati" to="leĹľati" />
+    <Word from="odlezati" to="odleĹľati" />
+    <Word from="lezala" to="leĹľala" />
+    <Word from="lezali" to="leĹľali" />
+    <Word from="lezis" to="ležiš" />
+    <Word from="Lezis" to="Ležiš" />
+    <Word from="lici" to="liÄŤi" />
+    <Word from="licim" to="liÄŤim" />
+    <Word from="licis" to="ličiš" />
+    <Word from="licnost" to="liÄŤnost" />
+    <Word from="licnosti" to="liÄŤnosti" />
+    <Word from="lijecniku" to="lijeÄŤniku" />
+    <Word from="logican" to="logiÄŤan" />
+    <Word from="los" to="loš" />
+    <Word from="losa" to="loša" />
+    <Word from="losu" to="lošu" />
+    <Word from="ljubis" to="ljubiš" />
+    <!--m-->
+    <Word from="majcine" to="majÄŤine" />
+    <Word from="Medutim" to="Međutim" />
+    <Word from="medutim" to="međutim" />
+    <Word from="mici" to="miÄŤi" />
+    <Word from="Mici" to="MiÄŤi" />
+    <Word from="mislis" to="misliš" />
+    <Word from="Mislis" to="Misliš" />
+    <Word from="moc" to="moć" />
+    <Word from="moci" to="moći" />
+    <Word from="motivisu" to="motiviraju" />
+    <Word from="mozda" to="moĹľda" />
+    <Word from="Mozda" to="MoĹľda" />
+    <Word from="mreza" to="mreĹľa" />
+    <Word from="mrezu" to="mreĹľu" />
+    <Word from="mrzis" to="mrziš" />
+    <Word from="muce" to="muÄŤe" />
+    <Word from="mucenik" to="muÄŤenik" />
+    <Word from="muska" to="muška" />
+    <Word from="muz" to="muĹľ" />
+    <Word from="muza" to="muĹľa" />
+    <!--n-->
+    <Word from="nadem" to="nađem" />
+    <Word from="nades" to="nađeš" />
+    <Word from="naci" to="naći" />
+    <Word from="Naci" to="Naći" />
+    <Word from="nacin" to="naÄŤin" />
+    <Word from="nadje" to="nađe" />
+    <Word from="Nadje" to="Nađe" />
+    <Word from="nadjem" to="nađem" />
+    <Word from="nadjes" to="nađeš" />
+    <Word from="Nadjes" to="Nađeš" />
+    <Word from="najvise" to="najvise" />
+    <Word from="Najvise" to="Najviše" />
+    <Word from="naocale" to="naoÄŤale" />
+    <Word from="Napisite" to="Napišite" />
+    <Word from="nasa" to="naša" />
+    <Word from="Nase" to="Naše" />
+    <Word from="nase" to="naše" />
+    <Word from="naseg" to="našeg" />
+    <Word from="nasi" to="naši" />
+    <Word from="Nasi" to="Naši" />
+    <Word from="nasu" to="našu" />
+    <Word from="nasoj" to="našoj" />
+    <Word from="nastavis" to="nastaviš" />
+    <Word from="nagovestaj" to="nagovještaj" />
+    <Word from="nasla" to="našla" />
+    <Word from="Nasla" to="Našla" />
+    <Word from="nasli" to="našli" />
+    <Word from="Nasli" to="Našli" />
+    <Word from="nasrecu" to="na sreću" />
+    <Word from="nauce" to="nauÄŤe" />
+    <Word from="necim" to="neÄŤim" />
+    <Word from="necije" to="neÄŤije" />
+    <Word from="neciji" to="neÄŤiji" />
+    <Word from="necemu" to="neÄŤemu" />
+    <Word from="necemo" to="nećemo" />
+    <Word from="necega" to="neÄŤega" />
+    <Word from="nekoc" to="nekoć" />
+    <Word from="Nesreca" to="Nesreća" />
+    <Word from="nesto" to="nešto" />
+    <Word from="Nesto" to="Nešto" />
+    <Word from="nezan" to="njeĹľan" />
+    <Word from="nicega" to="niÄŤega" />
+    <Word from="niceg" to="niÄŤeg" />
+    <Word from="nicemu" to="niÄŤemu" />
+    <Word from="nicim" to="niÄŤim" />
+    <Word from="niciji" to="niÄŤiji" />
+    <Word from="nicija" to="niÄŤija" />
+    <Word from="necu" to="neću" />
+    <Word from="Necu" to="Neću" />
+    <Word from="Nemas" to="Nemaš" />
+    <Word from="nemas" to="nemaš" />
+    <Word from="nezna" to="njeĹľna" />
+    <Word from="nezni" to="njeĹľni" />
+    <Word from="neznim" to="njeĹľnim" />
+    <Word from="neznih" to="njeĹľnih" />
+    <Word from="neznu" to="njeĹľnu" />
+    <Word from="nezno" to="njeĹľno" />
+    <Word from="njezno" to="njeĹľno" />
+    <Word from="new yorski" to="njujorški" />
+    <Word from="nju jorski" to="njujorški" />
+    <Word from="noci" to="noći" />
+    <Word from="nocnu" to="noćnu" />
+    <Word from="nosac" to="nosaÄŤ" />
+    <Word from="nosis" to="nosiš" />
+    <Word from="nosices" to="nosit ćeš" />
+    <Word from="noz" to="noĹľ" />
+    <Word from="nozem" to="noĹľem" />
+    <!-- o -->
+    <Word from="Obecao" to="Obećao" />
+    <Word from="obozavalac" to="oboĹľavatelj" />
+    <Word from="obide" to="obiđe" />
+    <Word from="Obezbedjuju" to="Osiguravaju" />
+    <Word from="obezbedjuju" to="osiguravaju" />
+    <Word from="obracas" to="obraćaš" />
+    <Word from="obraćas" to="obraćaš" />
+    <Word from="ocito" to="oÄŤito" />
+    <Word from="ocnjaci" to="oÄŤnjaci" />
+    <Word from="odes" to="odeš" />
+    <Word from="odreden" to="određen" />
+    <Word from="odvec" to="odveć" />
+    <Word from="opasac" to="opasaÄŤ" />
+    <Word from="opca" to="opća" />
+    <Word from="opcih" to="općih" />
+    <Word from="opci" to="opći" />
+    <Word from="operise" to="operira" />
+    <Word from="operiseš" to="operiraš" />
+    <Word from="operisemo" to="operiramo" />  
+    <Word from="osjecam" to="osjećam" />
+    <Word from="osjecanja" to="osjećanja" />
+    <Word from="operisete" to="operirate" />
+    <Word from="osjecaces" to="osjećat ćeš" />
+    <Word from="osecaces" to="osjećat ćeš" />
+    <Word from="oceve" to="oÄŤeve" />
+    <Word from="odlazis" to="odlaziš" />
+    <Word from="odlucim" to="odluÄŤim" />
+    <Word from="okrece" to="okreće" />
+    <Word from="ogrtac" to="ogrtaÄŤ" />
+    <Word from="ostra" to="oštra" />
+    <Word from="ostre" to="oštre" />
+    <Word from="ostri" to="oštri" />
+    <Word from="ostru" to="oštru" />
+    <Word from="ostrom" to="oštrom" />
+    <Word from="otezala" to="oteĹľala" />
+    <Word from="otidi" to="otiđi" />
+    <Word from="otidji" to="otiđi" />
+    <Word from="otisao" to="otišao" />
+    <Word from="otputujes" to="otputuješ" />
+    <Word from="oziljak" to="oĹľiljak" />
+    <!--p-->
+    <Word from="palaca" to="palaÄŤa" />
+    <Word from="palaci" to="palaÄŤi" />
+    <Word from="palacu" to="palaÄŤu" />
+    <Word from="papucama" to="papuÄŤama" />
+    <Word from="parce" to="komadić" />
+    <Word from="pateci" to="pateći" />
+    <Word from="patis" to="patiš" />
+    <Word from="pcela" to="pÄŤela" />
+    <Word from="pcele" to="pÄŤele" />
+    <Word from="peraca" to="peraÄŤa" />
+    <Word from="Peraci" to="PeraÄŤi" />
+    <Word from="pica" to="pića" />
+    <Word from="pice" to="piće" />
+    <Word from="picem" to="pićem" />
+    <Word from="pijes" to="piješ" />
+    <Word from="pise" to="piše" />
+    <Word from="pisu" to="pišu" />
+    <Word from="pisem" to="pišem" />
+    <Word from="pises" to="pišeš" />
+    <Word from="pisite" to="pišite" />
+    <Word from="pitas" to="pitaš" />
+    <Word from="placa" to="plaća" />
+    <Word from="placam" to="plaćam" />
+    <Word from="place" to="plaÄŤe" />
+    <Word from="placu" to="plaću" />
+    <Word from="placanje" to="plaćanje" />
+    <Word from="placanjem" to="plaćanjem" />
+    <Word from="placeš" to="plačeš" />
+    <Word from="placuci" to="plačući" />
+    <Word from="plazu" to="plaĹľu" />
+    <Word from="plazi" to="plaĹľi" />
+    <Word from="plese" to="pleše" />
+    <Word from="plesemo" to="plešemo" />
+    <Word from="plesete" to="plešete" />
+    <Word from="plesu" to="plešu" />
+    <Word from="ploca" to="ploÄŤa" />
+    <Word from="ploce" to="ploÄŤe" />
+    <Word from="pluca" to="pluća" />
+    <Word from="plucima" to="plućima" />
+    <Word from="pobjeci" to="pobjeći" />
+    <Word from="poceo" to="poÄŤeo" />
+    <Word from="poceli" to="poÄŤeli" />
+    <Word from="pocetak" to="poÄŤetak" />
+    <Word from="pocevsi" to="počevši" />
+    <Word from="pocevši" to="počevši" />
+    <Word from="poci" to="poći" />
+    <Word from="pocinje" to="poÄŤinje" />
+    <Word from="pociva" to="poÄŤiva" />
+    <Word from="pocivao" to="poÄŤivao" />
+    <Word from="pocivali" to="poÄŤivali" />
+    <Word from="Podji" to="Pođi" />
+    <Word from="podji" to="pođi" />
+    <Word from="pode" to="pođe" />
+    <Word from="podje" to="pođe" />
+    <Word from="Podje" to="Pođe" />
+    <Word from="podici" to="podići" />
+    <Word from="Podici" to="Podići" />
+    <Word from="podimo" to="pođimo" />
+    <Word from="podjem" to="pođem" />
+    <Word from="podjemo" to="pođemo" />
+    <Word from="poduzeca" to="poduzeća" />
+    <Word from="poduzece" to="poduzeće" />
+    <Word from="poduzecu" to="poduzeću" />
+    <Word from="pojesce" to="pojest će" />
+    <Word from="pokazi" to="pokaĹľi" />
+    <Word from="Pokazi" to="PokaĹľi" />
+    <Word from="pokrece" to="pokreće" />
+    <Word from="pomaci" to="pomaknuti" />
+    <Word from="pomoc" to="pomoć" />
+    <Word from="pomoci" to="pomoći" />
+    <Word from="poletis" to="poletiš" />
+    <Word from="pomazes" to="pomažeš" />
+    <Word from="pomognes" to="pomogneš" />
+    <Word from="poreci" to="poreći" />
+    <Word from="porice" to="poriÄŤe" />
+    <Word from="posalji" to="pošalji" />
+    <Word from="Posalji" to="Pošalji" />
+    <Word from="posaljite" to="pošaljite" />
+    <Word from="posle" to="poslije" />
+    <Word from="Posluzite" to="PosluĹľite" />
+    <Word from="posluzite" to="posluĹľite" />
+    <Word from="posluzili" to="posluĹľili" />
+    <Word from="postaras" to="pobrineš" />
+    <Word from="posto" to="pošto" />
+    <Word from="Posto" to="Pošto" />
+    <Word from="potpises" to="potpišeš" />
+    <Word from="pozuda" to="poĹľuda" />
+    <Word from="pozude" to="poĹľude" />
+    <Word from="pozudi" to="poĹľudi" />
+    <Word from="pozudu" to="poĹľudu" />
+    <Word from="prakticno" to="praktiÄŤno" />
+    <Word from="presao" to="prešao" />
+    <Word from="Previse" to="Previše" />
+    <Word from="previse" to="previše" />
+    <Word from="preziveo" to="preĹľivio" />
+    <Word from="Priblizi" to="PribliĹľi" />
+    <Word from="Pridji" to="Priđi" />
+    <Word from="pridji" to="priđi" />
+    <Word from="pricam" to="priÄŤam" />
+    <Word from="pricati" to="priÄŤati" />
+    <Word from="pricaš" to="pričaš" />
+    <Word from="pricu" to="priÄŤu" />
+    <Word from="prici" to="priÄŤi" />
+    <Word from="prijedi" to="prijeđi" />
+    <Word from="priusti" to="priušti" />
+    <Word from="priustiti" to="priuštiti" />
+    <Word from="priustimo" to="priuštimo" />
+    <Word from="proci" to="proći" />
+    <Word from="prodavac" to="prodavaÄŤ" />
+    <Word from="promasio" to="promašio" />
+    <Word from="Promasio" to="Promašio" />
+    <Word from="proslo" to="prošlo" />
+    <Word from="Proslo" to="Prošlo" />
+    <Word from="prosloscu" to="prošlošću" />
+    <Word from="pricas" to="pričaš" />
+    <Word from="prisao" to="prišao" />
+    <Word from="prosao" to="prošao" />
+    <Word from="prosla" to="prošla" />
+    <Word from="prosle" to="prošle" />
+    <Word from="prosli" to="prošli" />
+    <Word from="Prosli" to="Prošli" />
+    <Word from="proslim" to="prošlim" />
+    <Word from="preporuca" to="preporuÄŤuje" />
+    <Word from="pticica" to="ptiÄŤica" />
+    <Word from="pticicu" to="ptiÄŤicu" />
+    <Word from="pusac" to="pušač" />
+    <Word from="pusaci" to="pušači" />
+    <!--r-->
+    <Word from="racunari" to="raÄŤunala" />
+    <Word from="racunare" to="raÄŤunala" />
+    <Word from="radis" to="radiš" />
+    <Word from="raskosni" to="raskošni" />
+    <Word from="razgovaras" to="razgovaraš" />
+    <Word from="razumes" to="razumiješ" />
+    <Word from="Razumes" to="Razumiješ" />
+    <Word from="Receno" to="ReÄŤeno" />
+    <Word from="receno" to="reÄŤeno" />
+    <Word from="recima" to="rijeÄŤima" />
+    <Word from="resimo" to="riješimo" />
+    <Word from="rijedji" to="rjeđi" />
+    <Word from="rjedji" to="rjeđi" />
+    <Word from="rec" to="rijeÄŤ" />
+    <Word from="rijec" to="rijeÄŤ" />
+    <Word from="Rijeci" to="RijeÄŤi" />
+    <Word from="Rjesit" to="Riješit" />
+    <Word from="rodena" to="rođena" />
+    <Word from="rucno" to="ruÄŤno" />
+    <Word from="ruza" to="ruĹľa" />
+    <Word from="ruzu" to="ruĹľu" />
+    <Word from="ruzan" to="ruĹľan" />
+
+    <!-- s -->
+    <Word from="salje" to="šalje" />
+    <Word from="salju" to="šalju" />
+    <Word from="saljes" to="šalješ" />
+    <Word from="sasio" to="sašio" />
+    <Word from="sasila" to="sašila" />
+    <Word from="sasili" to="sašili" />
+    <Word from="sasiti" to="sašiti" />
+    <Word from="savijescu" to="savješću" />
+    <Word from="savescu" to="savješću" />
+    <Word from="sedis" to="sjediš" />
+    <Word from="sedeces" to="sjedit ćeš" />
+    <Word from="sedista" to="sjedala" />
+    <Word from="sediste" to="sjedalo" />
+    <Word from="setala" to="šetala" />
+    <Word from="setam" to="šetam" />
+    <Word from="sendvic" to="sendviÄŤ" />
+    <Word from="seva" to="ševa" />
+    <Word from="sevu" to="ševu" />
+    <Word from="sijecanj" to="sijeÄŤanj" />
+    <Word from="Sidji" to="Siđi" />
+    <Word from="sidji" to="siđi" />
+    <Word from="siroki" to="široki" />
+    <Word from="sjecam" to="sjećam" />
+    <Word from="Sjecam" to="Sjećam" />
+    <Word from="sjecanja" to="sjećanja" />
+    <Word from="sjecanje" to="sjećanje" />
+    <Word from="sjecaju" to="sjećaju" />
+    <Word from="slicno" to="sliÄŤno" />
+    <Word from="sledeca" to="sljedeća" />
+    <Word from="sledeci" to="sljedeći" />
+    <Word from="Sledeci" to="Sljedeći" />
+    <Word from="Sledece" to="Sljedeće" />
+    <Word from="slucaja" to="sluÄŤaja" />
+    <Word from="sljedeci" to="sljedeći" />
+    <Word from="Sljedeci" to="Sljedeći" />
+    <Word from="skace" to="skaÄŤe" />
+    <Word from="skaci" to="skaÄŤi" />
+    <Word from="skacu" to="skaÄŤu" />
+    <Word from="Skotska" to="Ĺ kotska" />
+    <Word from="Skotskoj" to="Ĺ kotskoj" />
+    <Word from="skrt" to="škrt" />
+    <Word from="skrte" to="škrte" />
+    <Word from="slozio" to="sloĹľio" />
+    <Word from="slozila" to="sloĹľila" />
+    <Word from="slozili" to="sloĹľili" />
+    <Word from="sloziti" to="sloĹľiti" />
+    <Word from="smece" to="smeće" />
+    <Word from="smesak" to="smješak" />
+    <Word from="Smijes" to="Smiješ" />
+    <Word from="smijes" to="smiješ" />
+    <Word from="smraci" to="smraÄŤi" />
+    <Word from="smracilo" to="smraÄŤilo" />
+    <Word from="smrcu" to="smrću" />
+    <Word from="sokiras" to="šokiraš" />
+    <Word from="spominjes" to="spominješ" />
+    <Word from="srljas" to="srljaš" />
+    <Word from="Sta" to="Ĺ to" />
+    <Word from="stagod" to="što god" />
+    <Word from="sta" to="što" />
+    <Word from="stab" to="stoĹľer" />
+    <Word from="Stab" to="StoĹľer" />
+    <Word from="standa" to="štanda" />
+    <Word from="standu" to="štandu" />
+    <Word from="stavis" to="staviš" />
+    <Word from="stp" to="što" />
+    <Word from="spavaca" to="spavaća" />
+    <Word from="spavacoj" to="spavaćoj" />
+    <Word from="srdacan" to="srdaÄŤan" />
+    <Word from="srecom" to="srećom" />
+    <Word from="sresce" to="srest će" />
+    <Word from="srešce" to="srest će" />
+    <Word from="stampa" to="tisak" />
+    <Word from="stampu" to="tisak" />
+    <Word from="stampom" to="tiskom" />
+    <Word from="stampi" to="tisku" />
+    <Word from="stampati" to="tiskati" />
+    <Word from="steceni" to="steÄŤeni" />
+    <Word from="stici" to="stići" />
+    <Word from="strasan" to="strašan" />
+    <Word from="strasno" to="strašno" />
+    <Word from="sudeci" to="sudeći" />
+    <Word from="sudenja" to="suđenja" />
+    <Word from="sudenje" to="suđenje" />
+    <Word from="sudenju" to="suđenju" />
+    <Word from="sugerisu" to="predlaĹľu" />
+    <Word from="sumnjas" to="sumnjaš" />
+    <Word from="sumska" to="šumska" />
+    <Word from="sumski" to="šumski" />
+    <Word from="sumskoj" to="šumskoj" />
+    <Word from="supak" to="šupak" />
+    <Word from="suti" to="šuti" />
+    <Word from="Suti" to="Ĺ uti" />
+    <Word from="sustina" to="bit" />
+    <Word from="sustinski" to="bitni" />
+    <Word from="svacije" to="svaÄŤije" />
+    <Word from="svaciji" to="svaÄŤiji" />
+    <Word from="svaciju" to="svaÄŤiju" />
+    <Word from="svecan" to="sveÄŤan" />
+    <Word from="svecani" to="sveÄŤani" />
+    <Word from="Svida" to="Sviđa" />
+    <Word from="svidam" to="sviđam" />
+    <Word from="svidala" to="sviđala" />
+    <Word from="svidalo" to="sviđalo" />
+    <Word from="svidao" to="sviđao" />
+    <!--t-->
+    <Word from="takode" to="također" />
+    <Word from="takodje" to="također" />
+    <Word from="Takodje" to="Također" />
+    <Word from="takoder" to="također" />
+    <Word from="taknes" to="takneš" />
+    <Word from="teska" to="teška" />
+    <Word from="Teska" to="Teška" />
+    <Word from="teske" to="teške" />
+    <Word from="teski" to="teški" />
+    <Word from="tesko" to="teško" />
+    <Word from="Tesko" to="Teško" />
+    <Word from="teskom" to="teškom" />
+    <Word from="tezak" to="teĹľak" />
+    <Word from="Tezak" to="TeĹľak" />  
+    <Word from="tisucu" to="tisuću" />
+    <Word from="tisuce" to="tisuće" />
+    <Word from="trazis" to="tražiš" />
+    <Word from="Tocak" to="KotaÄŤ" />
+    <Word from="tocak" to="kotaÄŤ" />
+    <Word from="tocka" to="toÄŤka" />
+    <Word from="tocku" to="toÄŤku" />
+    <Word from="tece" to="teÄŤe" />
+    <Word from="teze" to="teĹľe" />
+    <Word from="tezi" to="teĹľi" />
+    <Word from="tezis" to="težiš" />
+    <Word from="tezinu" to="teĹľinu" />
+    <Word from="tezimo" to="teĹľimo" />
+    <Word from="Tezi" to="TeĹľi" />
+    <Word from="Teziš" to="Težiš" />
+    <Word from="Tezimo" to="TeĹľimo" />
+    <Word from="trajace" to="trajat će" />
+    <Word from="Trajace" to="Trajat će" />
+    <Word from="trci" to="trÄŤi" />
+    <Word from="trcim" to="trÄŤim" />
+    <Word from="treci" to="treći" />
+    <Word from="trcao" to="trÄŤao" />
+    <Word from="trebas" to="trebaš" />
+    <Word from="Trebas" to="Trebaš" />
+    <Word from="trudis" to="trudiš" />
+    <Word from="tuces" to="tučeš" />
+    <Word from="tucu" to="tuÄŤnjavu" />
+    <Word from="tuce" to="tuÄŤe" />
+    <Word from="tucom" to="tuÄŤom" />
+    <Word from="tudje" to="tuđe" />
+    <Word from="tudjeg" to="tuđeg" />
+    <Word from="tudjem" to="tuđem" />
+    <Word from="tumaras" to="tumaraš" />
+    <Word from="tvoris" to="tvoriš" />
+    <!--u-->
+    <Word from="ubijes" to="ubiješ" />
+    <Word from="Ubijes" to="Ubiješ" />
+    <Word from="uci" to="ući" />
+    <Word from="ucio" to="uÄŤio" />
+    <Word from="Ucio" to="UÄŤio" />
+    <Word from="ucinimo" to="uÄŤinimo" />
+    <Word from="ucinio" to="uÄŤinio" />
+    <Word from="udas" to="udaš" />
+    <Word from="udi" to="uđi" />
+    <Word from="Udi" to="UÄ‘i" />
+    <Word from="Udji" to="UÄ‘i" />
+    <Word from="udji" to="uđi" />
+    <Word from="Udje" to="UÄ‘e" />
+    <Word from="udje" to="uđe" />
+    <Word from="udeš" to="udeš" />
+    <Word from="Udju" to="UÄ‘u" />
+    <Word from="udjes" to="uđeš" />
+    <Word from="ucine" to="uÄŤine" />
+    <Word from="ukljucujuci" to="uključujući" />
+    <Word from="umiruci" to="umirući" />
+    <Word from="umes" to="umiješ" />
+    <Word from="umrecu" to="umrijet ću" />
+    <Word from="unistice" to="uništit će" />
+    <Word from="ubedjuju" to="uvjeravaju" />
+    <Word from="ubeduju" to="uvjeravaju" />
+    <Word from="ubedujuci" to="uvjeravajući" />
+    <Word from="uceni" to="uÄŤeni" />
+    <Word from="uopce" to="uopće" />
+    <Word from="ugriscu" to="ugrist ću" />
+    <Word from="Uopce" to="Uopće" />
+    <Word from="Uopste" to="Uopće" />
+    <Word from="uopste" to="uopće" />
+    <Word from="usao" to="ušao" />
+    <Word from="uspanicio" to="uspaniÄŤio" />
+    <Word from="Usao" to="Ušao" />
+    <Word from="utapas" to="utapaš" />
+    <Word from="utesi" to="utješi" />
+    <Word from="utesim" to="utješim" />
+    <Word from="uradis" to="učiniš" />
+    <Word from="uzinu" to="uĹľinu" />
+    <Word from="uzivo" to="uĹľivo" />
+    <!--v-->
+    <Word from="valda" to="valjda" />
+    <Word from="vasa" to="vaša" />
+    <Word from="vasem" to="vašem" />
+    <Word from="vaseg" to="vašeg" />
+    <Word from="Vaseg" to="Vašeg" />
+    <Word from="vasoj" to="vašoj" />
+    <Word from="vasi" to="vaši" />
+    <Word from="vazi" to="vrijedi" />
+    <Word from="vecan" to="vjeÄŤan" />
+    <Word from="vecih" to="većih" />
+    <Word from="vecitim" to="vjeÄŤitim" />
+    <Word from="Vec" to="Već" />
+    <Word from="vec" to="već" />
+    <Word from="vecna" to="vjeÄŤna" />
+    <Word from="vecno" to="vjeÄŤno" />
+    <Word from="vecnost" to="vjeÄŤnost" />
+    <Word from="Veceras" to="VeÄŤeras" />
+    <Word from="vecera" to="veÄŤera" />
+    <Word from="vecere" to="veÄŤere" />
+    <Word from="veceri" to="veÄŤeri" />
+    <Word from="veceru" to="veÄŤeru" />
+    <Word from="veceras" to="veÄŤeras" />
+    <Word from="verovacu" to="vjerovat ću" />
+    <Word from="viden" to="viđen" />
+    <Word from="Viden" to="Viđen" />
+    <Word from="vishe" to="više" />
+    <Word from="vjerujes" to="vjeruješ" />
+    <Word from="vjencati" to="vjenÄŤati" />
+    <Word from="vjencali" to="vjenÄŤali" />
+    <Word from="voce" to="voće" />
+    <Word from="vocka" to="voćka" />
+    <Word from="vocku" to="voćku" />
+    <Word from="vocnjak" to="voćnjak" />
+    <Word from="vocnjaku" to="voćnjaku" />
+    <Word from="vodic" to="vodiÄŤ" />
+    <Word from="vodju" to="vođu" />
+    <Word from="Vozac" to="VozaÄŤ" />
+    <Word from="vozac" to="vozaÄŤ" />
+    <Word from="vozaca" to="vozaÄŤa" />
+    <Word from="vracam" to="vraćam" />
+    <Word from="vracen" to="vraÄŤen" />
+    <Word from="vreca" to="vreÄŤa" />
+    <Word from="vrece" to="vreće" />
+    <Word from="vrecu" to="vreću" />
+    <Word from="vredjanje" to="vrijeđanje" />
+    <Word from="vredja" to="vrijeđa" />
+    <Word from="vrticu" to="vrtiću" />
+
+    <!--z-->
+    <Word from="zaduzen" to="zaduĹľen" />
+    <Word from="Zaduzen" to="ZaduĹľen" />
+    <Word from="zarucen" to="zaruÄŤen" />
+    <Word from="zacepe" to="zaÄŤepe" />
+    <Word from="Zacepi" to="ZaÄŤepi" />
+    <Word from="zapoceli" to="zapoÄŤeli" />
+    <Word from="zasto" to="zašto" />
+    <Word from="Zasto" to="Zašto" />
+    <Word from="zateci" to="zateći" />
+    <Word from="Zele" to="Žele" />
+    <Word from="zele" to="Ĺľele" />
+    <Word from="zelila" to="Ĺľeljela" />
+    <Word from="zene" to="Ĺľene" />
+    <Word from="zenke" to="Ĺľenke" />
+    <Word from="zesce" to="žešće" />
+    <Word from="zezas" to="zezaš" />
+    <Word from="zita" to="Ĺľita" />
+    <Word from="zito" to="Ĺľito" />
+    <Word from="zitu" to="Ĺľitu" />
+    <Word from="ziv" to="Ĺľiv" />
+    <Word from="ziva" to="Ĺľiva" />
+    <Word from="zive" to="Ĺľive" />
+    <Word from="zivi" to="Ĺľivi" />
+    <Word from="zivis" to="živiš" />
+    <Word from="Živeo" to="Živio" />
+    <Word from="zivjeo" to="Ĺľivio" />
+    <Word from="Zivjeo" to="Živio" />
+    <Word from="zlocestom" to="zloÄŤestom" />
+    <Word from="zlocestog" to="zloÄŤestog" />
+    <Word from="zlocestoj" to="zloÄŤestoj" />
+    <Word from="zmureo" to="Ĺľmirio" />
+    <Word from="znacaj" to="znaÄŤaj" />
+    <Word from="znacaja" to="znaÄŤaja" />
+    <Word from="znace" to="znaÄŤe" />
+    <Word from="znaceš" to="znat ćeš" />
+    <Word from="znas" to="znaš" />
+    <Word from="Znas" to="Znaš" />
+    <Word from="zuris" to="zuriš" />
+    <Word from="zvanican" to="sluĹľben" />
+
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines>
+    <LinePart from="da nadjem" to="naći" />
+    <LinePart from="da budes" to="biti" />
+    <LinePart from="da ides" to="ići" />
+    <LinePart from="gdje ides" to="kamo ideš" />
+    <LinePart from="Gdje ides" to="Kamo ideš" />
+    <LinePart from="hocu da budem" to="Ĺľelim biti" />
+    <LinePart from="Hocu da budem" to="Želim biti" />
+    <LinePart from="hocu da kazem" to="želim reći" />
+    <LinePart from="hoces da kazes" to="želiš reći" />
+    <LinePart from="hoce da kaze" to="želi reći" />
+    <LinePart from="medu nama" to="među nama" />
+    <LinePart from="moramo da idemo" to="moramo ići" />
+    <LinePart from="moras da ides" to="moraš ići" />
+    <LinePart from="na vecer" to="naveÄŤer" />
+    <LinePart from="Na vecer" to="NaveÄŤer" />
+    <LinePart from="ne cu" to="neću" />
+    <LinePart from="ne ces" to="nećeš" />
+    <LinePart from="ono sto" to="ono što" />
+    <LinePart from="Zao mi" to="Žao mi" />
+    <LinePart from="zao mi" to="Ĺľao mi" />
+    <LinePart from="Zato sto" to="Zato što" />
+    <LinePart from="zato sto" to="zato što" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <RegEx find="acma" replaceWith="aÄŤma" />
+    <RegEx find="(?&lt;![Pp]r|[Nn])adje(?!(v|n(e|u[olt]))\b)" replaceWith="ađe" />
+    <RegEx find="ndj?el" replaceWith="nđel" />
+    <RegEx find="areduj" replaceWith="aređuj" />
+    <RegEx find="(?&lt;![ou])ndje" replaceWith="nđe" />
+    <RegEx find="([0-9])-ogodisnj([aeiu])\b" replaceWith="$1-godišnj$2" />
+    <RegEx find="(cetr|ses)najst([aeiou]|i[mh]|o[mgj]|ima)\b" replaceWith="$1naest$2" />
+    <RegEx find="ajsmijesnij" replaceWith="ajsmješnij" />
+    <RegEx find="avljas" replaceWith="avljaš" />
+    <RegEx find="bastensk" replaceWith="vrtn" />
+    <RegEx find="beres" replaceWith="bereš" />
+    <RegEx find="([bB])elesk" replaceWith="$1ilješk" />
+    <RegEx find="([bB])elez" replaceWith="$1iljeĹľ" />
+    <RegEx find="\b([bBpP])ice(s|mo|te)\b" replaceWith="$1it će$2" />
+    <RegEx find="\b([bBpP])iti +c([ue]s?|emo|ete)\b" replaceWith="$1it ć$2" />
+    <RegEx find="eznadez" replaceWith="eznad" />
+    <RegEx find="([bB])ezanj" replaceWith="$1jeĹľanj" />
+    <RegEx find="([bB])i?j?ez([ei]|i[ms]|imo|ite|ao|al[aeio]|ati)\b" replaceWith="$1jeĹľ$2" />
+    <RegEx find="boljs" replaceWith="boljš" />
+    <RegEx find="([bB])oric" replaceWith="$1orit ć" />
+    <RegEx find="([bB])ozij([aeiu]|om|ima)?\b" replaceWith="$1oĹľj$2" />
+    <RegEx find="[bB]o[zž]ic([aeiun]|em|ima)?\b" replaceWith="Božić$1" />
+    <RegEx find="bracun" replaceWith="braÄŤun" />
+    <RegEx find="([bB])udu[cč]" replaceWith="$1uduć" />
+    <RegEx find="([cCsS])vj?ec([aeiou]|[oe]m|ama)\b" replaceWith="$1vijeć$2" />
+    <RegEx find="[Cc]acka" replaceWith="ÄŤaÄŤka" />
+    <RegEx find="[cC]amac" replaceWith="ÄŤamac" />
+    <RegEx find="[cC]amc" replaceWith="ÄŤamc" />
+    <RegEx find="\bcaro" replaceWith="ÄŤaro" />
+    <RegEx find="Caroli(?!n)" replaceWith="ÄŚaroli" />
+    <RegEx find="cast" replaceWith="ÄŤast" />
+    <RegEx find="Cast" replaceWith="ÄŚast" />
+    <RegEx find="cas([au]|om|ovima)\b" replaceWith="sat$1" />
+    <RegEx find="Cas([au]|om|ovima)\b" replaceWith="Sat$1" />
+    <RegEx find="[cC]ascen" replaceWith="čašćen" />
+    <RegEx find="\bc([eu]|emo|ete)\b" replaceWith="ć$1" />
+    <RegEx find="\bC([eu]|emo|ete)\b" replaceWith="Ć$1" />
+    <RegEx find="\b[cC]([ae])k\b" replaceWith="ÄŤ$1k" />
+    <RegEx find="[cC]ek" replaceWith="ÄŤek" />
+    <RegEx find="[cC]ekov" replaceWith="ÄŤekov" />
+    <RegEx find="celij" replaceWith="ćelij" />
+    <RegEx find="[cC]etvrt" replaceWith="ÄŤetvrt" />
+    <RegEx find="cetver" replaceWith="ÄŤetver" />
+    <RegEx find="[cC]ist" replaceWith="ÄŤist" />
+    <RegEx find="[cC]istoc" replaceWith="čistoć" />
+    <RegEx find="[cC]isce" replaceWith="čišće" />
+    <RegEx find="[cC]ita" replaceWith="ÄŤita" />
+    <RegEx find="\bcin" replaceWith="ÄŤin" />
+    <RegEx find="\bCin" replaceWith="ÄŚin" />
+    <RegEx find="[cC]lan" replaceWith="ÄŤlan" />
+    <RegEx find="[cC]okolad" replaceWith="ÄŤokolad" />
+    <RegEx find="[cC]ovi?j?ek" replaceWith="ÄŤovjek" />
+    <RegEx find="[cC]uda" replaceWith="ÄŤuda" />
+    <RegEx find="[cC]udes" replaceWith="ÄŤudes" />
+    <RegEx find="[cC]udn" replaceWith="ÄŤudn" />
+    <RegEx find="[cCČč]udovi[sš]" replaceWith="čudoviš" />
+    <RegEx find="\b[cC]uje" replaceWith="ÄŤuje" />
+    <RegEx find="[cC]u([vlp])a" replaceWith="ÄŤu$1a" />
+    <RegEx find="cut([ei])" replaceWith="šut$1" />
+    <RegEx find="Cut([ei])" replaceWith="Ĺ ut$1" />
+    <RegEx find="cuta([ltšv])" replaceWith="šutje$1" />
+    <RegEx find="Cuta([ltšv])" replaceWith="Šutje$1" />
+    <RegEx find="[cC]vrst" replaceWith="ÄŤvrst" />
+    <RegEx find="\b([dD])ac([eu])" replaceWith="$1at ć$2" />
+    <RegEx find="dj?avol" replaceWith="vrag" />
+    <RegEx find="([Dd])eck" replaceWith="$1eÄŤk" />
+    <RegEx find="([dD])j?evojcic" replaceWith="$1jevojÄŤic" />
+    <RegEx find="\b([dD])elic" replaceWith="$1jelić" />
+    <RegEx find="\b([dD])j?elis\b" replaceWith="$1ijeliš" />
+    <RegEx find="\b([dD])ecic([aeiou]|om)\b" replaceWith="$1jeÄŤic$2" />
+    <RegEx find="([dD])j?eca([kc])" replaceWith="$1jeÄŤa$2" />
+    <RegEx find="([dD])eci?j([aeiou])" replaceWith="$1jeÄŤj$2" />
+    <RegEx find="\b([dD])esic" replaceWith="$1ogodit ć" />
+    <RegEx find="dnoslj" replaceWith="dnošlj" />
+    <RegEx find="\b([dD])omac" replaceWith="$1omać" />
+    <RegEx find="ogada" replaceWith="ogađa" />
+    <RegEx find="osaduj" replaceWith="osađuj" />
+    <RegEx find="\b([dD])rustv" replaceWith="$1ruštv" />
+    <RegEx find="drzim" replaceWith="drĹľim" />
+    <RegEx find="([dD])o[bc]ic([eu])" replaceWith="$1oći ć$2" />
+    <RegEx find="\b([dDpP])o(d?)nj?ec([eu])" replaceWith="$1o$2nijet ć$3" />
+    <RegEx find="([dDpP])ovesc([eu])" replaceWith="$1ovest ć$2" />
+    <RegEx find="\bd[jz]ep" replaceWith="dĹľep" />
+    <RegEx find="\bD[jz]ep" replaceWith="DĹľep" />
+    <RegEx find="([dD])osao" replaceWith="$1ošao" />
+    <!-- posao i pošao je drugačije pa ne može biti uopće u skripti -->
+    <RegEx find="([dD])osl([aio])\b" replaceWith="$1ošl$2" />
+    <RegEx find="([dD])rza([volt])" replaceWith="$1rĹľa$2" />
+    <RegEx find="dsijekl" replaceWith="dsjekl" />
+    <RegEx find="([dD])us([aeiou])" replaceWith="$1uš$2" />
+    <RegEx find="dzigeric" replaceWith="jetr" />
+    <RegEx find="Dzigeric" replaceWith="Jetr" />
+    <RegEx find="([dD])zinovsk" replaceWith="$1ivovsk" />
+    <RegEx find="gipcan" replaceWith="gipćan" />
+    <RegEx find="entise" replaceWith="entira" />
+    <RegEx find="eskuc" replaceWith="eskuć" />
+    <RegEx find="onise" replaceWith="onira" />
+    <RegEx find="gadanj" replaceWith="gađanj" />
+    <RegEx find="([gG])dj(?!e)" replaceWith="$1Ä‘" />
+    <RegEx find="([gG])ledac" replaceWith="$1ledat ć" />
+    <RegEx find="\b([gG])radj?([ae])n" replaceWith="$1rađ$2n" />
+    <RegEx find="\b([gG])rijesn" replaceWith="$1rješn" />
+    <RegEx find="([gG])rj?esi([smotl])" replaceWith="$1riješi$2" />
+    <RegEx find="([gG])reska" replaceWith="$1reška" />
+    <RegEx find="([hH])oce(š|mo|te)?\b" replaceWith="$1oće$2" />
+    <RegEx find="([hH])o[cć]es" replaceWith="$1oćeš" />
+    <RegEx find="hri?scan" replaceWith="kršćan" />
+    <RegEx find="Hri?scan" replaceWith="Kršćan" />
+    <RegEx find="hronicn" replaceWith="kroniÄŤn" />
+    <RegEx find="Hronicn" replaceWith="KroniÄŤn" />
+    <RegEx find="ijeci([lt])" replaceWith="ijeÄŤi$1" />
+    <RegEx find="gnorise" replaceWith="gnorira" />
+    <RegEx find="gnori[sš]e[sš]" replaceWith="gnoriraš" />
+    <RegEx find="ilack" replaceWith="ilaÄŤk" />
+    <RegEx find="\b([iI])mac([eu]|es|emo|ete)\b" replaceWith="$1mat ć$2" />
+    <RegEx find="\b([iI])mas" replaceWith="$1maš" />
+    <RegEx find="([iI])nace" replaceWith="$1naÄŤe" />
+    <RegEx find="nsistirac" replaceWith="nzistirat ć" />
+    <RegEx find="([iI])zadj([ei])" replaceWith="$1zađ$2" />
+    <RegEx find="zbec" replaceWith="zbjeć" />
+    <RegEx find="nadj?en" replaceWith="nađen" />
+    <RegEx find="([iI])scezn" replaceWith="$1ščezn" />
+    <RegEx find="(?&lt;![ŠšSs])([Pp])rica" replaceWith="$1riča" />
+    <RegEx find="([iI])znj?ec" replaceWith="$1znijet ć" />
+    <RegEx find="zvesta" replaceWith="zvješta" />
+    <RegEx find="zvj?esc" replaceWith="zvješć" />
+    <RegEx find="jacanj" replaceWith="jaÄŤanj" />
+    <RegEx find="jevandjelj" replaceWith="evanđelj" />
+    <RegEx find="kasi[kc]" replaceWith="Ĺľlic" />
+    <RegEx find="Kasi[kc]" replaceWith="Žlic" />
+    <RegEx find="([kKLl])aze([mt])" replaceWith="$1aĹľe$2" />
+    <RegEx find="([kKLl])azes" replaceWith="$1ažeš" />
+    <RegEx find="([kK])aznjava" replaceWith="$1aĹľnjava" />
+    <RegEx find="kcerk[eio]" replaceWith="kćeri" />
+    <RegEx find="Kcerk[eio]" replaceWith="Kćeri" />
+    <RegEx find="kljuc" replaceWith="kljuÄŤ" />
+    <RegEx find="oledz" replaceWith="oledĹľ" />
+    <RegEx find="\b([kK])olicin" replaceWith="$1oliÄŤin" />
+    <RegEx find="arise" replaceWith="ira" />
+    <RegEx find="komsijsk" replaceWith="susjedn" />
+    <RegEx find="onacn" replaceWith="onaÄŤn" />
+    <RegEx find="krecu" replaceWith="kreću" />
+    <RegEx find="centrise" replaceWith="centrira" />
+    <RegEx find="centrisi" replaceWith="centriraj" />
+    <RegEx find="trolise" replaceWith="trolira" />
+    <RegEx find="([kK])ori[sš]cen" replaceWith="$1orišten" />
+    <RegEx find="([kKTtSs])rece" replaceWith="$1reće" />
+    <RegEx find="rivicn" replaceWith="aznen" />
+    <RegEx find="krsten" replaceWith="kršten" />
+    <RegEx find="([kK])uck" replaceWith="$1uj" />
+    <RegEx find="([kK])uc([iueo]|no)" replaceWith="$1uć$2" />
+    <RegEx find="kupic" replaceWith="kupit ć" />
+    <RegEx find="\b([kK])rstask([aeiou]|om)?\b" replaceWith="$1riĹľarsk$2" />
+    <RegEx find="\b([lL])j?eci([stol])?" replaceWith="$1ijeÄŤi$2" />
+    <RegEx find="([lL])j?ecni([kc])" replaceWith="$1ijeÄŤni$2" />
+    <RegEx find="\b([lL])j?ecen" replaceWith="$1ijeÄŤen" />
+    <RegEx find="\b([lL])aks" replaceWith="$1akš" />
+    <RegEx find="laksava" replaceWith="akšava" />
+    <RegEx find="([lL])eps" replaceWith="$1jepš" />
+    <RegEx find="[lL]isce" replaceWith="lišće" />
+    <RegEx find="locest" replaceWith="loÄŤest" />
+    <RegEx find="([lL])ogic([kn])" replaceWith="$1ogiÄŤ$2" />
+    <RegEx find="\blicn([aeiou]|im|o[mgj])" replaceWith="osobn$1" />
+    <RegEx find="\bLicn([aeiou]|im|o[mgj])" replaceWith="Osobn$1" />
+    <RegEx find="\b([lL])os([aeiu]|o[mj]|e[mg])" replaceWith="$1oš$2" />
+    <RegEx find="udack([aeiou]|om)\b" replaceWith="uđa$1" />
+    <RegEx find="\b([Mm])ack" replaceWith="$1aÄŤk" />
+    <RegEx find="(?&lt;![iI]|[kK]a)([mM])j?enjas\b" replaceWith="$1ijenjaš" />
+    <RegEx find="([mM])ast([auoi](?!r))" replaceWith="$1ašt$2" />
+    <!--** besmislicu ?**-->
+    <RegEx find="([mM])islic([eu])" replaceWith="$1islit ć$2" />
+    <RegEx find="mislje" replaceWith="mišlje" />
+    <RegEx find="([mM])j?esalic([aeiou]|ama)\b" replaceWith="$1iješalic$2" />
+    <RegEx find="([mM])j?esa([jmns]|n[aio]|no[mgj]|nima?|mo|ju|njem|nju|l[aeio]|t[ei])\b" replaceWith="$1iješa$2" />
+    <RegEx find="([mM])lj?ecn" replaceWith="$1lijeÄŤn" />
+    <RegEx find="\b([mMNn])oc([iuna])" replaceWith="$1oć$2" />
+    <RegEx find="([mM])oguc" replaceWith="$1oguć" />
+    <RegEx find="([mM])oras" replaceWith="$1oraš" />
+    <RegEx find="([mM])orac([eu])" replaceWith="$1orat ć$2" />
+    <RegEx find="otivise([mst])" replaceWith="otivira$1" />
+    <RegEx find="medju" replaceWith="među" />
+    <RegEx find="([mMbB])oze" replaceWith="$1oĹľe" />
+    <RegEx find="([mM])o[zž]es" replaceWith="$1ožeš" />
+    <RegEx find="([mM])racn" replaceWith="$1raÄŤn" />
+    <RegEx find="([mM])rznj([aeiuo])" replaceWith="$1rĹľnj$2" />
+    <RegEx find="([mM])rzec([eu])" replaceWith="$1rzit ć$2" />
+    <RegEx find="([mM])uci([mstol])" replaceWith="$1uÄŤi$2" />
+    <RegEx find="([mM])uskar" replaceWith="$1uškar" />
+    <RegEx find="uvas" replaceWith="otaš" />
+    <RegEx find="muzick" replaceWith="glazben" />
+    <RegEx find="Muzick" replaceWith="Glazben" />
+    <RegEx find="([nNZz])acel" replaceWith="$1aÄŤel" />
+    <RegEx find="([nN])acin" replaceWith="$1aÄŤin" />
+    <RegEx find="(?&lt;![iI])([nN])acic" replaceWith="$1aći ć" />
+    <RegEx find="([nN])adji" replaceWith="$1ađi" />
+    <RegEx find="aocit" replaceWith="aoÄŤit" />
+    <RegEx find="ameravas" replaceWith="amjeravaš" />
+    <RegEx find="amj?enis" replaceWith="amijeniš" />
+    <RegEx find="amesta" replaceWith="amješta" />
+    <RegEx find="aocar(?!k)" replaceWith="aoÄŤal" />
+    <RegEx find="(?&lt;![[tT])apise" replaceWith="apiše" />
+    <RegEx find="([nN])as([io])([mj])\b" replaceWith="$1aš$2" />
+    <RegEx find="([nNvV])asi([mh])" replaceWith="$1aši$2" />
+    <RegEx find="\b([nN])asao\b" replaceWith="$1ašao" />
+    <RegEx find="([nN])auci([mstl])" replaceWith="$1auÄŤi$2" />
+    <RegEx find="([nN])aucic" replaceWith="$1aučit ć" />
+    <RegEx find="naucn" replaceWith="znanstven" />
+    <RegEx find="Naucn" replaceWith="Znanstven" />
+    <RegEx find="([nN])a?zvac" replaceWith="$1azvat ć" />
+    <RegEx find="([nN])eca([kc])" replaceWith="$1eća$2" />
+    <RegEx find="\b([nN])ec([ue]|emo|ete)\b" replaceWith="$1eć$2" />
+    <RegEx find="([Nn])edac" replaceWith="$1edać" />
+    <RegEx find="\b([nN])ezna(s|juci|vsi)\b" replaceWith="$1e zna$2" />
+    <RegEx find="(?&lt;!j)emack" replaceWith="jemaÄŤk" />
+    <RegEx find="([nN])erj?esen" replaceWith="$1eriješen" />
+    <RegEx find="eutralis[eu]" replaceWith="eutralizira" />
+    <RegEx find="\b([nN])ista" replaceWith="$1išta" />
+    <RegEx find="\b([nN])oc([iu]|n[aeiou]|no[mjg]|nim)?" replaceWith="$1oć$2" />
+    <RegEx find="noic" replaceWith="noiÄŤ" />
+    <RegEx find="\b([nN])ovcan" replaceWith="$1ovÄŤan" />
+    <RegEx find="beca" replaceWith="beća" />
+    <RegEx find="besen" replaceWith="bješen" />
+    <RegEx find="bezbj?edjenj" replaceWith="siguranj" />
+    <RegEx find="bezbj?edjivanj" replaceWith="siguravanj" />
+    <RegEx find="bezbj?edjuje" replaceWith="sigurava" />
+    <RegEx find="([oO])bidj" replaceWith="$1biđ" />
+    <RegEx find="([oO])bicn" replaceWith="$1biÄŤn" />
+    <RegEx find="bozava" replaceWith="boĹľava" />
+    <RegEx find="([oO])brac" replaceWith="$1brać" />
+    <RegEx find="([oO])bucen" replaceWith="$1buÄŤen" />
+    <RegEx find="\b([oO])caj" replaceWith="$1ÄŤaj" />
+    <RegEx find="\b([oO])cev" replaceWith="$1ÄŤev" />
+    <RegEx find="([oO])cek" replaceWith="$1ÄŤek" />
+    <RegEx find="\b([oO])ci" replaceWith="$1ÄŤi" />
+    <RegEx find="([oO])dbacen" replaceWith="$1dbaÄŤen" />
+    <RegEx find="([oO])dl([iu])can" replaceWith="$1dl$2can" />
+    <RegEx find="\b([oO])dj?ec([aeiou]|om)" replaceWith="$1djeć$2" />
+    <RegEx find="\b((?:[oO]|[pP]o|[rR]a|[sS]a)d?)sec" replaceWith="$1sjeć" />
+    <RegEx find="([oO])dvesc([eu])" replaceWith="$1dvest ć$2" />
+    <RegEx find="ogadj?a" replaceWith="ogađa" />
+    <RegEx find="onizav" replaceWith="oniĹľav" />
+    <RegEx find="rosti[cć]" replaceWith="rostit ć" />
+    <RegEx find="([oO])ruzj([aeu])" replaceWith="$1ruĹľj$2" />
+    <RegEx find="([oO])sj?e[cč]a" replaceWith="$1sjeća" />
+    <RegEx find="osjecu" replaceWith="osjeću" />
+    <RegEx find="([oO])slobodić([eu])" replaceWith="$1slobodit ć$2" />
+    <RegEx find="([oO])sta[čć]([eu])" replaceWith="$1stat ć$2" />
+    <RegEx find="([oO])svez" replaceWith="$1svjeĹľ" />
+    <RegEx find="([oO])tkri[cč]" replaceWith="$1tkrić" />
+    <RegEx find="([oOSs])tici" replaceWith="$1tići" />
+    <RegEx find="([oO])tis([al])" replaceWith="$1tiš$2" />
+    <RegEx find="zledjen" replaceWith="zlijeđen" />
+    <RegEx find="([pP])az([nl])j" replaceWith="$1aĹľ$2j" />
+    <RegEx find="\b([pP])j?es[cć]an" replaceWith="$1ješčan" />
+    <RegEx find="([pP])esa([kc])" replaceWith="$1ješa$2" />
+    <RegEx find="([pP](?:ita|lati|obrinu|okaza|oveza|rica))c" replaceWith="$1t ć" />
+    <RegEx find="istolj" replaceWith="ištolj" />
+    <RegEx find="isuc" replaceWith="išuć" />
+    <RegEx find="([pP])lasi([mslt])" replaceWith="$1laši$2" />
+    <RegEx find="([pP])lace([sn])" replaceWith="$1laće$2" />
+    <RegEx find="(?&lt;![mM])ljacka" replaceWith="ljaÄŤka" />
+    <RegEx find="([pP])obj?ec" replaceWith="$1objeć" />
+    <RegEx find="objedis" replaceWith="obijediš" />
+    <RegEx find="([Pp])objeduj" replaceWith="$1objeđuj" />
+    <RegEx find="obacaj" replaceWith="obaÄŤaj" />
+    <RegEx find="([pP])oce([tl])" replaceWith="$1oÄŤe$2" />
+    <RegEx find="([pPTt])ocn" replaceWith="$1oÄŤn" />
+    <RegEx find="\b([pP])o[dt]sj?etis?\b" replaceWith="$1odsjetiš" />
+    <RegEx find="oducava" replaceWith="oduÄŤava" />
+    <RegEx find="([pP])ogres" replaceWith="$1greš" />
+    <RegEx find="([pP])ogrj?esi(o|l[aeio]|t[ei])?\b" replaceWith="$1ogriješi$2" />
+    <RegEx find="([pP])okusa([jo])" replaceWith="$1okuša$2" />
+    <RegEx find="([pP])omoc" replaceWith="$1omoć" />
+    <RegEx find="([pP]o|[Ii]z)ludec" replaceWith="$1ludjet ć" />
+    <RegEx find="([pP])onasa" replaceWith="$1onaša" />
+    <RegEx find="porodicn" replaceWith="obiteljsk" />
+    <RegEx find="Porodicn" replaceWith="Obiteljsk" />
+    <RegEx find="([pP])os([lt])ac" replaceWith="$1os$2at ć" />
+    <RegEx find="([pP])osten" replaceWith="$1ošten" />
+    <RegEx find="([pP])ostuje" replaceWith="$1oštuje" />
+    <RegEx find="([pP])ostova" replaceWith="$1oštova" />
+    <RegEx find="([pP])ovredj?en" replaceWith="$1ovrijeđen" />
+    <RegEx find="([pP])ovrj?edis" replaceWith="$1ovrijediš" />
+    <RegEx find="pozoris([tn](?:[aeu]|[eo]m|ima?)?)\b" replaceWith="kazališ$1" />
+    <RegEx find="Pozoris([tn](?:[aeu]|[eo]m|ima?)?)\b" replaceWith="Kazališ$1" />
+    <RegEx find="([pP])ozuri" replaceWith="$1oĹľuri" />
+    <RegEx find="redjas" replaceWith="rijaš" />
+    <RegEx find="redlaz" replaceWith="redlaĹľ" />
+    <RegEx find="(?&lt;![Šš])([pP])rica" replaceWith="$1riča" />
+    <RegEx find="\b([pP])rilicn" replaceWith="$1riliÄŤn" />
+    <RegEx find="romj?enis" replaceWith="romijeniš" />
+    <RegEx find="([pP](?:ri|od))sj?eca" replaceWith="$1sjeća" />
+    <RegEx find="rosec" replaceWith="rosjeÄŤ" />
+    <RegEx find="rosj?ecn" replaceWith="rosjeÄŤn" />
+    <RegEx find="roslost" replaceWith="rošlost" />
+    <RegEx find="([pP]r?[io])vesc" replaceWith="$1vest ć" />
+    <RegEx find="rolec" replaceWith="roljeć" />
+    <RegEx find="romj?eniš" replaceWith="romijeniš" />
+    <RegEx find="([pP])ronac" replaceWith="$1ronać" />
+    <RegEx find="([pP])ruzi([lt])" replaceWith="$1ruĹľi$2" />
+    <RegEx find="acun" replaceWith="aÄŤun" />
+    <RegEx find="azlicit" replaceWith="azliÄŤit" />
+    <RegEx find="azmislja" replaceWith="azmišlja" />
+    <RegEx find="azumijec" replaceWith="azumjeć" />
+    <RegEx find="(?&lt;!v)ecenic" replaceWith="eÄŤenic" />
+    <RegEx find="ecic" replaceWith="eći ć" />
+    <RegEx find="rivlac" replaceWith="rivlaÄŤ" />
+    <RegEx find="([^d])rjesit" replaceWith="$1riješit" />
+    <RegEx find="\b([rR])i?j?esava" replaceWith="$1ješava" />
+    <RegEx find="([rR])i?j?esenj([aeiu])" replaceWith="$1ješenj$2" />
+    <RegEx find="\b([rR])jec(i|ima)?\b" replaceWith="$1ijeÄŤ$2" />
+    <RegEx find="\b([rR])i?j?ecni([kc])" replaceWith="$1jeÄŤni$2" />
+    <RegEx find="(?&lt;!t)rocita" replaceWith="roÄŤita" />
+    <RegEx find="([Rr])oden" replaceWith="$1ođen" />
+    <RegEx find="([dDrRvVg])odje" replaceWith="$1ođe" />
+    <RegEx find="([rR])ucak" replaceWith="$1uÄŤak" />
+    <RegEx find="ruce" replaceWith="ruće" />
+    <RegEx find="rucio" replaceWith="ruÄŤio" />
+    <RegEx find="arud[zĹľ]bin" replaceWith="arudĹľb" />
+    <RegEx find="([rR])uck([auo])" replaceWith="$1uÄŤk$2" />
+    <RegEx find="\b([Rr])uca([lt])" replaceWith="$1uÄŤa$2" />
+    <RegEx find="saceka" replaceWith="priÄŤeka" />
+    <RegEx find="Saceka" replaceWith="PriÄŤeka" />
+    <RegEx find="sagarep" replaceWith="mrkv" />
+    <RegEx find="Sagarep" replaceWith="Mrkv" />
+    <RegEx find="([sS])amoc" replaceWith="$1amoć" />
+    <RegEx find="[sS]ans" replaceWith="šans" />
+    <RegEx find="([sS])alj([eu])" replaceWith="$1alj$2" />
+    <RegEx find="saobracaj(?!ac)" replaceWith="promet" />
+    <RegEx find="Saobracaj(?!ac)" replaceWith="Promet" />
+    <RegEx find="aosj?eca" replaceWith="uosjeća" />
+    <RegEx find="aucesni([kc])" replaceWith="udioni$1" />
+    <RegEx find="([sSZZ])avrs([ei])" replaceWith="$1avrš$2" />
+    <RegEx find="azvac" replaceWith="azvat ć" />
+    <RegEx find="azalj?eva" replaceWith="aĹľalijeva" />
+    <RegEx find="\b([sS])eca([msšo]|mo|t[ei]|ju|l[aeio]|nj[aeu]|njem?)?\b" replaceWith="$1jeća$2" />
+    <RegEx find="([sSŠš])ecer" replaceWith="šećer" />
+    <RegEx find="([sS])edec" replaceWith="$1jedit ć" />
+    <RegEx find="([sS])icusn" replaceWith="$1ićušn" />
+    <RegEx find="([sS])isark" replaceWith="češer" />
+    <RegEx find="([sS])koci" replaceWith="$1koÄŤi" />
+    <RegEx find="[sS]kol([aeiu]|om|sk[aeiuo]|sko[mgj])" replaceWith="škol$1" />
+    <RegEx find="([sS])li?j?ede[cč]" replaceWith="$1ljedeć" />
+    <RegEx find="([sS])licn" replaceWith="$1liÄŤn" />
+    <RegEx find="([sS])lucaj" replaceWith="$1luÄŤaj" />
+    <RegEx find="([sS])lusa" replaceWith="$1luša" />
+    <RegEx find="([sS])luz([eb])" replaceWith="$1luĹľ$2" />
+    <RegEx find="\b([sS])jeca[sš]\b" replaceWith="$1jećaš" />
+    <RegEx find="\b([sS])mj?es(n[aeiou]|no[mgj])\b" replaceWith="$1miješ$2" />
+    <RegEx find="mestis" replaceWith="mjestiš" />
+    <RegEx find="([sS])nazn" replaceWith="$1naĹľn" />
+    <RegEx find="nizen" replaceWith="niĹľen" />
+    <RegEx find="([sS])okira" replaceWith="šokira" />
+    <RegEx find="([sS])pases" replaceWith="$1pasiš" />
+    <RegEx find="spoljasnj?([aeiu])" replaceWith="vanjsk$1" />
+    <RegEx find="Spoljasnj?([aeiu])" replaceWith="Vanjsk$1" />
+    <RegEx find="([sS])pri?j?ecava" replaceWith="$1prjeÄŤava" />
+    <RegEx find="([sS])prj?ec([ei])" replaceWith="$1prijeÄŤ$2" />
+    <RegEx find="rdacn" replaceWith="rdaÄŤn" />
+    <RegEx find="([sS])rec([aeiou])" replaceWith="$1reć$2" />
+    <RegEx find="([sS])rec(a?)n" replaceWith="$1ret$2n" />
+    <RegEx find="spijun" replaceWith="špijun" />
+    <RegEx find="Spijun" replaceWith="Ĺ pijun" />
+    <RegEx find="([sS])rusi" replaceWith="$1ruši" />
+    <RegEx find="\b([sS])tac([eu])" replaceWith="$1tat ć$2" />
+    <RegEx find="stanes" replaceWith="staneš" />
+    <RegEx find="stomac" replaceWith="trbuš" />
+    <RegEx find="Stomac" replaceWith="Trbuš" />
+    <RegEx find="strasi" replaceWith="straši" />
+    <RegEx find="trucn" replaceWith="truÄŤn" />
+    <RegEx find="sugerise" replaceWith="predlaĹľe" />
+    <RegEx find="Sugerise" replaceWith="PredlaĹľe" />
+    <RegEx find="sustin([eio])" replaceWith="biti" />
+    <RegEx find="Sustin([eio])" replaceWith="Biti" />
+    <RegEx find="vesteni([kc])" replaceWith="većeni$1" />
+    <RegEx find="([sS])vez([aeiu]|[io]m|oj|in[aeiou]|inom)?\b" replaceWith="$1vjeĹľ$2" />
+    <RegEx find="([Ss])olj" replaceWith="šalic" />
+    <RegEx find="\bSpanij([aeou])" replaceWith="Ĺ panjolsk$1" />
+    <RegEx find="\bSpansk" replaceWith="Ĺ panjolsk" />
+    <RegEx find="stabl" replaceWith="stoĹľer" />
+    <RegEx find="Stabl" replaceWith="StoĹľer" />
+    <RegEx find="stamparsk" replaceWith="tiskovn" />
+    <RegEx find="Stamparsk" replaceWith="Tiskovn" />
+    <RegEx find="[sš]ticen" replaceWith="štićen" />
+    <RegEx find="stedj?e" replaceWith="štedje" />
+    <RegEx find="sicen" replaceWith="sićen" />
+    <RegEx find="eskoc" replaceWith="eškoć" />
+    <RegEx find="trucn" replaceWith="truÄŤn" />
+    <RegEx find="([sS])tize" replaceWith="$1tiĹľe" />
+    <RegEx find="([sS])uoci" replaceWith="$1uoÄŤi" />
+    <RegEx find="\b([sS])uti" replaceWith="$1uti" />
+    <RegEx find="resut" replaceWith="rešut" />
+    <RegEx find="([RVrvg])odja" replaceWith="$1ođa" />
+    <RegEx find="([sS])veći" replaceWith="$1vijeći" />
+    <RegEx find="takmicenj" replaceWith="natjecanj" />
+    <RegEx find="Takmicenj" replaceWith="Natjecanj" />
+    <RegEx find="\b([tT])ac(an|n[aeoiu]|no[mgj]|nima?|nij[aeiu]|nij[ei]m|nijoj|k[aeiou]|kama)" replaceWith="$1oÄŤ$2" />
+    <RegEx find="ehnic(?!i)" replaceWith="ehniÄŤ" />
+    <RegEx find="\b([tT])ice" replaceWith="$1iÄŤe" />
+    <RegEx find="ticn" replaceWith="tiÄŤn" />
+    <RegEx find="\b([tTSs])rcan" replaceWith="$1rÄŤan" />
+    <RegEx find="\b([tT])re[čc]in" replaceWith="$1rećin" />
+    <RegEx find="\b([tT])rce" replaceWith="$1rÄŤe" />
+    <RegEx find="\b([tTDd])rzis" replaceWith="$1ržiš" />
+    <RegEx find="\b([tT])isin" replaceWith="$1išin" />
+    <RegEx find="\b([tT])is([aeiu]|om|e[mg])\b" replaceWith="$1iš$2" />
+    <RegEx find="\b([tT])raz([ei])" replaceWith="$1raĹľ$2" />
+    <RegEx find="\b([nN])etac([an])" replaceWith="$1etoÄŤ$2" />
+    <RegEx find="\b([uU])cenj" replaceWith="$1ÄŤenj" />
+    <RegEx find="\b([uU])ci([mntl])" replaceWith="$1ÄŤi$2" />
+    <RegEx find="([uU])ci([lt])" replaceWith="$1ÄŤi$2" />
+    <RegEx find="paljac" replaceWith="paljaÄŤ" />
+    <RegEx find="\b([uU])redj" replaceWith="$1ređ" />
+    <RegEx find="([uU])spijes(an|n[aeiou]|no[mgj])" replaceWith="$1spješ$2" />
+    <RegEx find="\b([uU])dje([mst])" replaceWith="$1Ä‘e$2" />
+    <RegEx find="\b([uU])sl([aeio])" replaceWith="$1šl$2" />
+    <RegEx find="\b([uU])zasn" replaceWith="$1Ĺľasn" />
+    <RegEx find="\b([uU])zec([eu])" replaceWith="$1zet ć$2" />
+    <RegEx find="\b([uU])zmes" replaceWith="$1zmeš" />
+    <RegEx find="\b([uU])ziva" replaceWith="$1Ĺľiva" />
+    <RegEx find="([vV])as([aeu]|o[jm])\b" replaceWith="$1aš$2" />
+    <RegEx find="([vV]l?)azn([aeiu]|o[mgj])\b" replaceWith="$1aĹľn$2" />
+    <RegEx find="([vV])ecn" replaceWith="$1jeÄŤn" />
+    <RegEx find="([vV])e[cč]in" replaceWith="$1ećin" />
+    <RegEx find="([vV])estin" replaceWith="$1ještin" />
+    <RegEx find="elicin" replaceWith="eliÄŤin" />
+    <RegEx find="\b([vV])i?j?enca" replaceWith="$1jenÄŤa" />
+    <RegEx find="([vV])j?ezb" replaceWith="$1jeĹľb" />
+    <RegEx find="([vV])idj?ec" replaceWith="$1idjet ć" />
+    <RegEx find="(?&lt;!Da)([vV])idj?a" replaceWith="$1iđa" />
+    <RegEx find="([vV])idis" replaceWith="$1idiš" />
+    <RegEx find="\b([vV])ec([aeiu]|[ei]m|ima|o[mj])?\b" replaceWith="$1eć$2" />
+    <RegEx find="([vV])ezes" replaceWith="$1ezeš" />
+    <RegEx find="\b([vV])ise" replaceWith="$1iše" />
+    <RegEx find="\b([vV])islj" replaceWith="$1iš" />
+    <RegEx find="odj?enj(?!a[kc])" replaceWith="ođenj" />
+    <RegEx find="([vV])olis" replaceWith="$1oliš" />
+    <RegEx find="([vV])olj?ec" replaceWith="$1oljet ć" />
+    <RegEx find="\b([vV])ozic([eu])" replaceWith="$1ozit ć$2" />
+    <RegEx find="([vV])rac" replaceWith="$1raÄŤ" />
+    <RegEx find="vrsen" replaceWith="vršen" />
+    <RegEx find="\b([vV])ratic" replaceWith="$1ratit ć" />
+    <RegEx find="zalost" replaceWith="Ĺľalost" />
+    <RegEx find="zalosna" replaceWith="Ĺľalosna" />
+    <RegEx find="zalosno" replaceWith="Ĺľalosno" />
+    <RegEx find="zalosni" replaceWith="Ĺľalosni" />
+    <RegEx find="zalosc" replaceWith="žalošć" />
+    <RegEx find="gorca" replaceWith="gorÄŤa" />
+    <RegEx find="ahtjevas" replaceWith="ahtijevaš" />
+    <RegEx find="\bz([ae])li" replaceWith="Ĺľ$1li" />
+    <RegEx find="\bZ([ae])li" replaceWith="Ĺ˝$1li" />
+    <RegEx find="[zZ]alic" replaceWith="žalit ć" />
+    <RegEx find="apo[cÄŤ]mi" replaceWith="apoÄŤni" />
+    <RegEx find="asluzuj" replaceWith="asluĹľuj" />
+    <RegEx find="([zZ])astit" replaceWith="$1aštit" />
+    <RegEx find="astrasujuc" replaceWith="astrašujuć" />
+    <RegEx find="[zZ]edn" replaceWith="Ĺľedn" />
+    <RegEx find="\b[zZ]en([aeui]|om|io|il[aei]|sk)" replaceWith="Ĺľen$1" />
+    <RegEx find="[zZ]eli([mt])" replaceWith="Ĺľeli$1" />
+    <RegEx find="[zZ]ele([ltz])" replaceWith="Ĺľelje$1" />
+    <RegEx find="[zZ]elil" replaceWith="Ĺľeljel" />
+    <RegEx find="[zZ]eli[sš]" replaceWith="želiš" />
+    <RegEx find="[zZ]elj?eo" replaceWith="Ĺľelio" />
+    <RegEx find="[zZ]elj([aeiou])" replaceWith="Ĺľelj$1" />
+    <RegEx find="zidem" replaceWith="ziđem" />
+    <RegEx find="\b[zZ]ive([lt])" replaceWith="Ĺľivje$1" />
+    <RegEx find="[zZ]ivec([eu])" replaceWith="živjet ć$1" />
+    <RegEx find="([žŽ])ive([lt])" replaceWith="$1ivje$2" />
+    <RegEx find="[zZ]ivi([mšt])" replaceWith="živi$1" />
+    <RegEx find="[zZ]ivo([mgjt])" replaceWith="Ĺľivo$1" />
+    <RegEx find="[zZ]lj?ezd([aeiou])" replaceWith="Ĺľlijezd$1" />
+    <RegEx find="\b([zZ])locin" replaceWith="$1loÄŤin" />
+    <RegEx find="zluduj" replaceWith="zluđuj" />
+    <RegEx find="znajes" replaceWith="znaješ" />
+    <RegEx find="zopacen" replaceWith="zopaÄŤen" />
+    <RegEx find="dajes" replaceWith="daješ" />
+    <RegEx find="zur[ck]" replaceWith="zabav" />
+    <RegEx find="Zur[ck]" replaceWith="Zabav" />
+    <RegEx find="zvanicn" replaceWith="sluĹľben" />
+    <RegEx find="Zvanicn" replaceWith="SluĹľben" />
+    <RegEx find="zvecark" replaceWith="zveÄŤark" />
+    <RegEx find="([zZ])vuca([lto])" replaceWith="$1vuÄŤa$2" />
+    <RegEx find="\b([zZ])vuci" replaceWith="$1vuÄŤi" />
+    <!-- yxy experimental -->
+    <RegEx find="([aez])vrsi" replaceWith="$1vrši" />
+    <RegEx find="aces" replaceWith="aćeš" />
+    <RegEx find="agicn" replaceWith="agiÄŤn" />
+    <RegEx find="ajvec" replaceWith="ajveć" />
+    <RegEx find="amcen" replaceWith="amÄŤen" />
+    <RegEx find="antic([nk])" replaceWith="antiÄŤ$1" />
+    <RegEx find="aredj" replaceWith="aređ" />
+    <RegEx find="arezlj" replaceWith="areĹľlj" />
+    <RegEx find="aruci" replaceWith="aruÄŤi" />
+    <RegEx find="asticn" replaceWith="astiÄŤn" />
+    <RegEx find="avlac" replaceWith="avlaÄŤ" />
+    <RegEx find="azoc" replaceWith="azoÄŤ" />
+    <RegEx find="bacen" replaceWith="baÄŤen" />
+    <RegEx find="bicaj" replaceWith="biÄŤaj" />
+    <RegEx find="bivse" replaceWith="bivše" />
+    <RegEx find="blizn" replaceWith="bliĹľn" />
+    <RegEx find="buden" replaceWith="buđen" />
+    <RegEx find="cemo" replaceWith="ćemo" />
+    <RegEx find="ucestvuj" replaceWith="sudjeluj" />
+    <RegEx find="cinje" replaceWith="ÄŤinje" />
+    <RegEx find="[Cc]injenicn" replaceWith="ÄŤinjeniÄŤn" />
+    <RegEx find="cisc" replaceWith="čišć" />
+    <RegEx find="Cisc" replaceWith="Čišć" />
+    <RegEx find="dacn" replaceWith="daÄŤn" />
+    <RegEx find="dace" replaceWith="dat će" />
+    <RegEx find="daces" replaceWith="dat ćeš" />
+    <RegEx find="dinacn" replaceWith="dinaÄŤn" />
+    <RegEx find="dlucn" replaceWith="dluÄŤn" />
+    <RegEx find="dlucuj" replaceWith="dluÄŤuj" />
+    <RegEx find="djit" replaceWith="Ä‘it" />
+    <RegEx find="djuj" replaceWith="Ä‘uj" />
+    <RegEx find="djujes" replaceWith="đuješ" />
+    <RegEx find="draz([ao])" replaceWith="draĹľ$1" />
+    <RegEx find="(?&lt;!a)druzi" replaceWith="druĹľi" />
+    <RegEx find="([dD])rzi([ia](?!k))" replaceWith="$1rĹľ$2" />
+    <RegEx find="e[cć]as" replaceWith="ećaš" />
+    <RegEx find="emo[zĹľ]e" replaceWith="e moĹľe" />
+    <RegEx find="(?&lt;![Rr])eces" replaceWith="ećeš" />
+    <RegEx find="enadjen" replaceWith="enađen" />
+    <RegEx find="erisu" replaceWith="eriraju" />
+    <RegEx find="esavin" replaceWith="ešavin" />
+    <RegEx find="estace[sš]" replaceWith="estat ćeš" />
+    <RegEx find="eticn" replaceWith="etiÄŤn" />
+    <RegEx find="fise" replaceWith="fira" />
+    <RegEx find="frick" replaceWith="friÄŤk" />
+    <!-- popravlja i iz/nad/gledaš -->
+    <RegEx find="gledas" replaceWith="gledaš" />
+    <RegEx find="granicava" replaceWith="graniÄŤava" />
+    <RegEx find="grisc(?!i)" replaceWith="grist ć" />
+    <RegEx find="guslj" replaceWith="gušlj" />
+    <RegEx find="gusi" replaceWith="guši" />
+    <RegEx find="(?&lt;!\b[oO]zlo|\b[iI]sp(rip)?ov|i)jedjen" replaceWith="ijeđen" />
+    <RegEx find="hic(k|en)" replaceWith="hić$1" />
+    <RegEx find="hoticn" replaceWith="hotiÄŤn" />
+    <RegEx find="hvaca" replaceWith="hvaća" />
+    <RegEx find="hvacas" replaceWith="hvaćaš" />
+    <RegEx find="hva([lt])is" replaceWith="hva$1iš" />
+    <RegEx find="(?&lt;![Gg]r|[Ll])icka" replaceWith="iÄŤka" />
+    <RegEx find="(?&lt;!M)ick([eoiu])" replaceWith="iÄŤk$1" />
+    <RegEx find="igrac" replaceWith="igraÄŤ" />
+    <RegEx find="iznervira" replaceWith="iĹľivcira" />
+    <RegEx find="asnjav" replaceWith="ašnjav" />
+    <RegEx find="jasnic([eu])" replaceWith="jasnit ć$1" />
+    <RegEx find="juci" replaceWith="jući" />
+    <RegEx find="kaslja" replaceWith="kašlja" />
+    <RegEx find="kusava" replaceWith="kušava" />
+    <RegEx find="lican" replaceWith="liÄŤan" />
+    <RegEx find="lacen" replaceWith="laÄŤen" />
+    <RegEx find="l([ae])dj" replaceWith="l$1Ä‘" />
+    <RegEx find="licn" replaceWith="liÄŤn" />
+    <RegEx find="(?&lt;!e)mj?ecen" replaceWith="mjećen" />
+    <RegEx find="([mv])edje" replaceWith="$1eđe" />
+    <RegEx find="micn" replaceWith="miÄŤn" />
+    <RegEx find="miruce" replaceWith="miruće" />
+    <RegEx find="mec([eu])" replaceWith="meć$1" />
+    <RegEx find="mrsav" replaceWith="mršav" />
+    <RegEx find="naranc" replaceWith="naranÄŤ" />
+    <RegEx find="nacenj" replaceWith="naÄŤenj" />
+    <RegEx find="(?&lt;![Rr]evo)lucio" replaceWith="luÄŤio" />
+    <RegEx find="(?&lt;!sit)nisem" replaceWith="niram" />
+    <RegEx find="(?&lt;!sit)nises" replaceWith="niraš" />
+    <RegEx find="([rn])adj?en" replaceWith="$1ađen" />
+    <RegEx find="nisemo" replaceWith="niramo" />
+    <RegEx find="nisten" replaceWith="ništen" />
+    <RegEx find="(?&lt;![Ee]t|[Gg]e|[Rr]i|[Tt]am)noc" replaceWith="noć" />
+    <RegEx find="oceju" replaceWith="oće" />
+    <RegEx find="oceo" replaceWith="oÄŤeo" />
+    <RegEx find="ocni" replaceWith="oÄŤni" />
+    <RegEx find="o([mk])aze" replaceWith="o$1aĹľe" />
+    <RegEx find="sta([jn])es" replaceWith="sta$1eš" />
+    <RegEx find="osvece" replaceWith="osveće" />
+    <RegEx find="ozen" replaceWith="oĹľen" />
+    <RegEx find="pecific" replaceWith="pecifiÄŤ" />
+    <RegEx find="plase" replaceWith="plaše" />
+    <RegEx find="ptuz" replaceWith="ptuĹľ" />
+    <RegEx find="pustaj" replaceWith="puštaj" />
+    <RegEx find="pustas" replaceWith="puštaš" />
+    <RegEx find="pusten" replaceWith="pušten" />
+    <RegEx find="racen" replaceWith="raćen" />
+    <RegEx find="reden" replaceWith="ređen" />
+    <RegEx find="redoce" replaceWith="redoÄŤe" />
+    <RegEx find="rucin" replaceWith="rućin" />
+    <RegEx find="([lr])adj" replaceWith="$1ađ" />
+    <RegEx find="redje([nm])" replaceWith="ređe$1" />
+    <RegEx find="rocit" replaceWith="roÄŤit" />
+    <RegEx find="ronad" replaceWith="ronađ" />
+    <RegEx find="([KkPp])renes\b" replaceWith="$1reneš" />
+    <RegEx find="sapni" replaceWith="šapni" />
+    <RegEx find="setnj" replaceWith="šetnj" />
+    <RegEx find="sjecni" replaceWith="sjeÄŤni" />
+    <RegEx find="slusk" replaceWith="slušk" />
+    <RegEx find="slj?edece" replaceWith="sljedeće" />
+    <RegEx find="spesn" replaceWith="spješn" />
+    <RegEx find="splac" replaceWith="splaÄŤ" />
+    <RegEx find="stand(?!a)" replaceWith="štand" />
+    <RegEx find="sudj?en" replaceWith="suđen" />
+    <RegEx find="tace" replaceWith="tat će" />
+    <RegEx find="tces" replaceWith="t ćeš" />
+    <RegEx find="teza([kv])" replaceWith="teĹľa$1" />
+    <RegEx find="tjece" replaceWith="tjeÄŤe" />
+    <RegEx find="tjesi" replaceWith="tješi" />
+    <RegEx find="trazi([vo])" replaceWith="traĹľi$1" />
+    <RegEx find="trazuj" replaceWith="traĹľuj" />
+    <RegEx find="trise" replaceWith="trira" />
+    <RegEx find="trisi" replaceWith="triraj" />
+    <RegEx find="tros([ek])" replaceWith="troš$1" />
+    <RegEx find="tumaci" replaceWith="tumaÄŤi" />
+    <RegEx find="\b([DdtTRrNn])uzn" replaceWith="$1uĹľn" />
+    <RegEx find="\b([dtDTRr])uzan" replaceWith="$1uĹľan" />
+    <RegEx find="tvrdju" replaceWith="tvrđu" />
+    <RegEx find="tvrden" replaceWith="tvrđen" />
+    <RegEx find="\bujes\b" replaceWith="uješ" />
+    <RegEx find="\bzes\b" replaceWith="žeš" />
+    <RegEx find="ucis" replaceWith="učiš" />
+    <RegEx find="ucice" replaceWith="učit će" />
+    <RegEx find="(?&lt;![Kk]lj)učiće" replaceWith="učit će" />
+    <RegEx find="udju" replaceWith="uđu" />
+    <RegEx find="([Uu])nisti" replaceWith="$1ništi" />
+    <!--busenje je iznimka, ali bušenje nije, dakle češća riječ prevladava-->
+    <RegEx find="usenj" replaceWith="ušenj" />
+    <RegEx find="uspece" replaceWith="uspjet će" />
+    <RegEx find="vazn" replaceWith="vaĹľn" />
+    <RegEx find="vadj" replaceWith="vađ" />
+    <RegEx find="vidja" replaceWith="viđa" />
+    <RegEx find="vidja([sš])" replaceWith="viđa$1" />
+    <RegEx find="visis" replaceWith="visiš" />
+    <RegEx find="([Vv])jecn" replaceWith="$1jeÄŤn" />
+    <RegEx find="vjezb" replaceWith="vjeĹľb" />
+    <RegEx find="(?&lt;!p)rsten" replaceWith="ršten" />
+    <RegEx find="vruc" replaceWith="vruć" />
+    <RegEx find="vuce" replaceWith="vuÄŤe" />
+    <RegEx find="([Sso])naci" replaceWith="$1naći" />
+    <RegEx find="([Zz])naci" replaceWith="$1naÄŤi" />
+    <RegEx find="([Zz])r?tv" replaceWith="Ĺľrtv" />
+    <RegEx find="ziljk" replaceWith="Ĺľiljk" />
+    <RegEx find="zitk" replaceWith="Ĺľitk" />
+    <RegEx find="zgajivac" replaceWith="zgajivaÄŤ" />
+    <RegEx find="zogira" replaceWith="Ĺľogira" />
+    <!-- preĹľiveo/doĹľiveo/nadĹľiveo etc. -->
+    <RegEx find="zivj?e([lt])i" replaceWith="Ĺľivje$1i" />
+    <RegEx find="ziveo" replaceWith="Ĺľivio" />
+    <!-- pozoveš nazoveš sazoveš -->
+    <RegEx find="zoves" replaceWith="zoveš" />
+    <RegEx find="zurb" replaceWith="Ĺľurb" />
+    <RegEx find="Zurb" replaceWith="Žurb" />
+    <RegEx find="zvucen" replaceWith="zvuÄŤen" />
+  </RegularExpressions>
+</OCRFixReplaceList>
diff --git a/libs/subzero/modification/dictionaries/xml/hun_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/hun_OCRFixReplaceList.xml
new file mode 100644
index 000000000..999b7fff0
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/hun_OCRFixReplaceList.xml
@@ -0,0 +1,25 @@
+<OCRFixReplaceList>
+  <WholeWords />
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <!-- nagy I-l javítások -->
+    <RegEx find="([\x41-\x5a\x61-\x7a\xc1-\xfc])II" replaceWith="$1ll" />
+    <RegEx find="II([\x61-\x7a\xe1-\xfc])" replaceWith="ll$1" />
+    <RegEx find="([\x61-\x7a\xe1-\xfc])I" replaceWith="$1l" />
+    <RegEx find="([\x20])I([^aeou\x41-\x5a\xc1-\xdc])" replaceWith="$1l$2" />
+    <RegEx find="\bl([bcdfghjklmnpqrstvwxz])" replaceWith="I$1" />
+    <RegEx find="([\x41-\x5a\xc1-\xdc])I([\x61-\x7a\xe1-\xfc])" replaceWith="$1l$2" />
+    <RegEx find="([\x61-\x7a\xe1-\xfc][\-])I([\x61-\x7a\xe1-\xfc])" replaceWith="$1l$2" />
+    <RegEx find="([\x41-\x5a\xc1-\xdc])I([\-][\x41-\x5a\xc1-\xdc][\x61-\x7a\xe1-\xfc])" replaceWith="$1l$2" />
+    <RegEx find="\b([AEÜÓ])I([^\x41-\x5a\xc1-\xdc])" replaceWith="$1l$2" />
+    <RegEx find="\bI([aáeéiíoóöuúüy\xf5\xfb])" replaceWith="l$1" />
+    <RegEx find="\b(?:II|ll)" replaceWith="Il" />
+    <RegEx find="([\xf5\xfb])I" replaceWith="$1l" />
+  </RegularExpressions>
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/nld_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/nld_OCRFixReplaceList.xml
new file mode 100644
index 000000000..5f9b0f664
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/nld_OCRFixReplaceList.xml
@@ -0,0 +1,24 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="ls" to="Is" />
+    <Word from="ln" to="In" />
+    <Word from="lk" to="Ik" />
+    <Word from="ledereen" to="Iedereen" />
+    <Word from="ledere" to="Iedere" />
+    <Word from="lemand" to="Iemand" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <RegEx find="\blk(?=\p{Ll}{2})" replaceWith="Ik" />
+    <RegEx find="\bln(?=\p{Ll}{2})" replaceWith="In" />
+    <RegEx find="\bls(?=\p{Ll}{2})" replaceWith="Is" />
+    <RegEx find="\beIk" replaceWith="elk" />
+    <RegEx find="\bler(land|se|s|)\b" replaceWith="Ier$1" />
+  </RegularExpressions>
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml
new file mode 100644
index 000000000..64007ef91
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/nob_OCRFixReplaceList.xml
@@ -0,0 +1,58 @@
+<ReplaceList>
+  <WholeWords>
+    <Word from="varjeg" to="var jeg" />
+    <Word from="omjeg" to="om jeg" />
+    <Word from="menjeg" to="men jeg" />
+    <Word from="noejeg" to="noe jeg" />
+    <Word from="førjeg" to="før jeg" />
+    <Word from="harjobbet" to="har jobbet" />
+    <Word from="Kunnejeg" to="Kunne jeg" />
+    <Word from="haddejeg" to="hadde jeg" />
+    <Word from="pĂĄjorden" to="pĂĄ jorden" />
+    <Word from="nĂĄrjeg" to="nĂĄr jeg" />
+    <Word from="tenkerjeg" to="tenker jeg" />
+    <Word from="helejorden" to="hele jorden" />
+    <Word from="menjorden" to="men jorden" />
+    <Word from="rundtjorden" to="rundt jorden" />
+    <Word from="forjorden" to="for jorden" />
+    <Word from="avjordens" to="av jordens" />
+  </WholeWords>
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary -->
+    <!-- If new word(s) exists in spelling dictionary, it(they) is accepted -->
+    <WordPart from="ď¬" to="fi" />
+    <WordPart from="fl" to="fl" />
+    <WordPart from="/" to="l" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="l" to="i" />
+    <WordPart from="€" to="e" />
+    <WordPart from="I" to="l" />
+    <WordPart from="c" to="o" />
+    <WordPart from="i" to="t" />
+    <WordPart from="cc" to="oo" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="n/" to="ry" />
+    <WordPart from="ae" to="æ" />
+
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="c" to="e" />
+    <WordPart from="o" to="e" />
+    <WordPart from="I" to="t" />
+    <WordPart from="n" to="o" />
+    <WordPart from="s" to="e" />
+    <WordPart from="\A" to="Vi" />
+    <WordPart from="n/" to="rv" />
+    <WordPart from="Ă" to="Ă…" />
+    <WordPart from="Ă­" to="i" />
+  </PartialWords>
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RemovedWholeWords />
+  <RemovedPartialLines />
+  <RemovedBeginLines />
+  <RemovedEndLines />
+  <RemovedWholeLines />
+</ReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/nor_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/nor_OCRFixReplaceList.xml
new file mode 100644
index 000000000..475d7dc2c
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/nor_OCRFixReplaceList.xml
@@ -0,0 +1,43 @@
+<OCRFixReplaceList>
+  <WholeWords />
+  <PartialWordsAlways />
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary -->
+    <!-- If new word(s) exists in spelling dictionary, it(they) is accepted -->
+    <WordPart from="¤" to="o" />
+    <WordPart from="ď¬" to="fi" />
+    <WordPart from="fl" to="fl" />
+    <WordPart from="/" to="l" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="IVI" to="M" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="lVl" to="M" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="l" to="i" />
+    <WordPart from="€" to="e" />
+    <WordPart from="I" to="l" />
+    <WordPart from="c" to="o" />
+    <WordPart from="i" to="t" />
+    <WordPart from="cc" to="oo" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="n/" to="ry" />
+    <WordPart from="ae" to="æ" />
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="c" to="e" />
+    <WordPart from="I" to="t" />
+    <WordPart from="n" to="o" />
+    <WordPart from="s" to="e" />
+    <WordPart from="\A" to="Vi" />
+    <WordPart from="n/" to="rv" />
+    <WordPart from="Ă" to="Ă…" />
+    <WordPart from="Ă­" to="i" />
+  </PartialWords>
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/por_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/por_OCRFixReplaceList.xml
new file mode 100644
index 000000000..4be515db2
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/por_OCRFixReplaceList.xml
@@ -0,0 +1,508 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="abitual" to="habitual" />
+    <Word from="Ă cerca" to="acerca" />
+    <Word from="acessor" to="assessor" />
+    <Word from="acĂłlico" to="acĂłlito" />
+    <Word from="açoreano" to="açoriano" />
+    <Word from="actuacao" to="actuação" />
+    <Word from="acucar" to="açúcar" />
+    <Word from="açucar" to="açúcar" />
+    <Word from="advinhar" to="adivinhar" />
+    <Word from="africa" to="Ăfrica" />
+    <Word from="ajuisar" to="ajuizar" />
+    <Word from="album" to="álbum" />
+    <Word from="alcoolémia" to="alcoolemia" />
+    <Word from="aldiĂŁo" to="aldeĂŁo" />
+    <Word from="algerino" to="argelino" />
+    <Word from="ameixeal" to="ameixial" />
+    <Word from="amiaça" to="ameaça" />
+    <Word from="analizar" to="analisar" />
+    <Word from="andáste" to="andaste" />
+    <Word from="anemona" to="anémona" />
+    <Word from="antartico" to="antárctico" />
+    <Word from="antártico" to="antárctico" />
+    <Word from="antepĂ´r" to="antepor" />
+    <Word from="apárte" to="aparte" />
+    <Word from="apiadeiro" to="apeadeiro" />
+    <Word from="apiar" to="apear" />
+    <Word from="apreciacao" to="apreciação" />
+    <Word from="arctico" to="árctico" />
+    <Word from="arrazar" to="arrasar" />
+    <Word from="ártico" to="árctico" />
+    <Word from="artifice" to="artĂ­fice" />
+    <Word from="artifĂ­cial" to="artificial" />
+    <Word from="ascenção" to="ascensão" />
+    <!-- <Word from="assucar" to="açúcar" /> assucar é uma palavra existente no dicionário -->
+    <Word from="assúcar" to="açúcar" />
+    <Word from="aste" to="haste" />
+    <Word from="asterĂ­stico" to="asterisco" />
+    <Word from="averção" to="aversão" />
+    <Word from="avizar" to="avisar" />
+    <Word from="avulsso" to="avulso" />
+    <Word from="baĂ­nha" to="bainha" />
+    <Word from="banca-rota" to="bancarrota" />
+    <Word from="bandeija" to="bandeja" />
+    <Word from="bébé" to="bebé" />
+    <Word from="beige" to="bege" />
+    <Word from="benção" to="bênção" />
+    <Word from="beneficiĂŞncia" to="beneficĂŞncia" />
+    <Word from="beneficiente" to="beneficente" />
+    <Word from="benvinda" to="bem-vinda" />
+    <Word from="benvindo" to="bem-vindo" />
+    <Word from="boasvindas" to="boas-vindas" />
+    <Word from="borborinho" to="burburinho" />
+    <Word from="Brazil" to="Brasil" />
+    <Word from="bussula" to="bĂşssola" />
+    <Word from="cabo-verdeano" to="cabo-verdiano" />
+    <Word from="caimbras" to="cĂŁibras" />
+    <Word from="calcáreo" to="calcário" />
+    <Word from="calsado" to="calçado" />
+    <Word from="calvĂ­ce" to="calvĂ­cie" />
+    <Word from="camoneano" to="camoniano" />
+    <Word from="campiĂŁo" to="campeĂŁo" />
+    <Word from="cançacos" to="cansaços" />
+    <Word from="caracter" to="carácter" />
+    <Word from="caractéres" to="caracteres" />
+    <Word from="catequeze" to="catequese" />
+    <Word from="catequisador" to="catequizador" />
+    <Word from="catequisar" to="catequizar" />
+    <Word from="chĂ­cara" to="xĂ­cara" />
+    <Word from="ciclano" to="sicrano" />
+    <Word from="cicrano" to="sicrano" />
+    <Word from="cidadĂŁes" to="cidadĂŁos" />
+    <Word from="cidadões" to="cidadãos" />
+    <Word from="cincoenta" to="cinquenta" />
+    <Word from="cinseiro" to="cinzeiro" />
+    <Word from="cinsero" to="sincero" />
+    <Word from="citacoes" to="citações" />
+    <Word from="coalizĂŁo" to="colisĂŁo" />
+    <Word from="cĂ´dia" to="cĂ´dea" />
+    <Word from="combĂłio" to="comboio" />
+    <Word from="compĂ´r" to="compor" />
+    <Word from="concerteza" to="com certeza" />
+    <Word from="constituia" to="constituĂ­a" />
+    <Word from="constituĂ­u" to="constituiu" />
+    <Word from="contato" to="contacto" />
+    <Word from="contensão" to="contenção" />
+    <Word from="contribuicoes" to="contribuições" />
+    <Word from="cĂ´r" to="cor" />
+    <Word from="corassão" to="coração" />
+    <Word from="corçario" to="corsário" />
+    <Word from="corçário" to="corsário" />
+    <Word from="cornprimidosinbo" to="comprimidozinho" />
+    <!-- <Word from="cota-parte" to="quota-parte" /> é uma palavra existente no dicionário -->
+    <Word from="crâneo" to="crânio" />
+    <Word from="dE" to="de" />
+    <Word from="defenição" to="definição" />
+    <Word from="defenido" to="definido" />
+    <Word from="defenir" to="definir" />
+    <Word from="deficite" to="défice" />
+    <Word from="degladiar" to="digladiar" />
+    <Word from="deiche" to="deixe" />
+    <Word from="desinteria" to="disenteria" />
+    <Word from="despendio" to="dispĂŞndio" />
+    <Word from="despĂŞndio" to="dispĂŞndio" />
+    <Word from="desplicĂŞncia" to="displicĂŞncia" />
+    <Word from="dificulidade" to="dificuldade" />
+    <Word from="dispender" to="despender" />
+    <Word from="dispendio" to="dispĂŞndio" />
+    <Word from="distribuido" to="distribuĂ­do" />
+    <Word from="druĂ­da" to="druida" />
+    <Word from="Ă©crĂŁ" to="ecrĂŁ" />
+    <Word from="ecran" to="ecrĂŁ" />
+    <Word from="Ă©cran" to="ecrĂŁ" />
+    <Word from="ĂŞle" to="ele" />
+    <Word from="elice" to="hélice" />
+    <Word from="élice" to="hélice" />
+    <Word from="emiratos" to="emirados" />
+    <Word from="engolis-te" to="engoliste" />
+    <Word from="engulir" to="engolir" />
+    <Word from="enguliste" to="engoliste" />
+    <Word from="entertido" to="entretido" />
+    <Word from="entitular" to="intitular" />
+    <Word from="entreterimento" to="entretenimento" />
+    <Word from="entreti-me" to="entretive-me" />
+    <Word from="envĂłlucro" to="invĂłlucro" />
+    <Word from="erĂłi" to="herĂłi" />
+    <Word from="escluir" to="excluir" />
+    <Word from="esclusĂŁo" to="exclusĂŁo" />
+    <Word from="escrivões" to="escrivães" />
+    <Word from="esqueiro" to="isqueiro" />
+    <Word from="esquesito" to="esquisito" />
+    <Word from="estacoes" to="estações" />
+    <Word from="esteje" to="esteja" />
+    <Word from="excavação" to="escavação" />
+    <Word from="excavar" to="escavar" />
+    <Word from="exdrĂşxula" to="esdrĂşxula" />
+    <Word from="exdrĂşxulas" to="esdrĂşxulas" />
+    <Word from="exitar" to="hesitar" />
+    <Word from="explicacoes" to="explicações" />
+    <Word from="exquisito" to="esquisito" />
+    <Word from="extende" to="estende" />
+    <Word from="extender" to="estender" />
+    <Word from="fĂ cilmenfe" to="facilmente" />
+    <Word from="fĂ cilmente" to="facilmente" />
+    <Word from="fariam-lhe" to="far-lhe-iam" />
+    <Word from="FARMĂClAS" to="FARMĂCIAS" />
+    <Word from="farmecĂŞutico" to="farmacĂŞutico" />
+    <Word from="fassa" to="faça" />
+    <Word from="fébre" to="febre" />
+    <Word from="fecula" to="fécula" />
+    <Word from="fémea" to="fêmea" />
+    <Word from="femenino" to="feminino" />
+    <Word from="femininismo" to="feminismo" />
+    <Word from="fĂ­siologista" to="fisiologista" />
+    <Word from="fizémos" to="fizemos" />
+    <Word from="fizes-te" to="fizeste" />
+    <Word from="flĂ´r" to="flor" />
+    <Word from="forĂŁo" to="foram" />
+    <Word from="formalisar" to="formalizar" />
+    <Word from="fĂ´ro" to="foro" />
+    <Word from="fos-te" to="foste" />
+    <Word from="fragância" to="fragrância" />
+    <Word from="françês" to="francês" />
+    <Word from="frasqutnho" to="frasquinho" />
+    <Word from="frustado" to="frustrado" />
+    <Word from="furá" to="furar" />
+    <Word from="gaz" to="gás" />
+    <Word from="gáz" to="gás" />
+    <Word from="geito" to="jeito" />
+    <Word from="geneceu" to="gineceu" />
+    <Word from="geropiga" to="jeropiga" />
+    <Word from="glicémia" to="glicemia" />
+    <Word from="gorgeta" to="gorjeta" />
+    <Word from="grangear" to="granjear" />
+    <Word from="guizar" to="guisar" />
+    <Word from="hectar" to="hectare" />
+    <Word from="herméticamente" to="hermeticamente" />
+    <Word from="hernia" to="hérnia" />
+    <Word from="higiéne" to="higiene" />
+    <Word from="hilariedade" to="hilaridade" />
+    <Word from="hiperacĂ­dez" to="hiperacidez" />
+    <Word from="hontem" to="ontem" />
+    <Word from="igiene" to="higiene" />
+    <Word from="igienico" to="higiénico" />
+    <Word from="igiénico" to="higiénico" />
+    <Word from="igreija" to="igreja" />
+    <Word from="iguasu" to="iguaçu" />
+    <Word from="ilacção" to="ilação" />
+    <Word from="imbigo" to="umbigo" />
+    <Word from="impecilho" to="empecilho" />
+    <Word from="Ă­ncas" to="incas" />
+    <Word from="incĂŞsto" to="incesto" />
+    <Word from="inclusivé" to="inclusive" />
+    <Word from="incĂ´modos" to="incĂłmodos" />
+    <Word from="incontestávelmente" to="incontestavelmente" />
+    <Word from="incontestĂ velmente" to="incontestavelmente" />
+    <Word from="indespensáveis" to="indispensáveis" />
+    <Word from="indespensável" to="indispensável" />
+    <Word from="India" to="ĂŤndia" />
+    <Word from="indiguinação" to="indignação" />
+    <Word from="indiguinado" to="indignado" />
+    <Word from="indiguinar" to="indignar" />
+    <Word from="inflacção" to="inflação" />
+    <Word from="ingreja" to="igreja" />
+    <Word from="INSCRICOES" to="INSCRIÇÕES" />
+    <Word from="intensão" to="intenção" />
+    <Word from="intertido" to="entretido" />
+    <Word from="intoxica" to="Intoxica" />
+    <Word from="intrega" to="entrega" />
+    <Word from="inverosĂ­mel" to="inverosĂ­mil" />
+    <Word from="iorgute" to="iogurte" />
+    <Word from="ipopĂłtamo" to="hipopĂłtamo" />
+    <Word from="ipsilon" to="Ă­psilon" />
+    <Word from="ipslon" to="Ă­psilon" />
+    <Word from="isquesito" to="esquisito" />
+    <Word from="juĂ­z" to="juiz" />
+    <Word from="juiza" to="juĂ­za" />
+    <Word from="jĂşniores" to="juniores" />
+    <Word from="justanzente" to="justamente" />
+    <Word from="juz" to="jus" />
+    <Word from="kilo" to="quilo" />
+    <Word from="laboratĂłrio-porque" to="laboratĂłrio porque" />
+    <Word from="ladravaz" to="ladrava" />
+    <Word from="lamentĂ velmente" to="lamentavelmente" />
+    <Word from="lampeĂŁo" to="lampiĂŁo" />
+    <Word from="largartixa" to="lagartixa" />
+    <Word from="largarto" to="lagarto" />
+    <Word from="lĂŞm" to="lĂŞem" />
+    <Word from="leucémia" to="leucemia" />
+    <Word from="licensa" to="licença" />
+    <Word from="linguĂ­sta" to="linguista" />
+    <Word from="lisongear" to="lisonjear" />
+    <Word from="logista" to="lojista" />
+    <Word from="maçajar" to="massajar" />
+    <Word from="Macfadden-o" to="Macfadden o" />
+    <Word from="mae" to="mĂŁe" />
+    <Word from="magestade" to="majestade" />
+    <Word from="mãgua" to="mágoa" />
+    <Word from="mangerico" to="manjerico" />
+    <Word from="mangerona" to="manjerona" />
+    <Word from="manteem-se" to="mantĂŞm-se" />
+    <Word from="mantega" to="manteiga" />
+    <Word from="mantem-se" to="mantém-se" />
+    <Word from="massiço" to="maciço" />
+    <Word from="massisso" to="maciço" />
+    <Word from="médica-Rio" to="médica Rio" />
+    <Word from="menistro" to="ministro" />
+    <Word from="merciaria" to="mercearia" />
+    <Word from="metrelhadora" to="metralhadora" />
+    <Word from="miscegenação" to="miscigenação" />
+    <Word from="misogenia" to="misoginia" />
+    <Word from="misogeno" to="misĂłgino" />
+    <Word from="misĂłgeno" to="misĂłgino" />
+    <Word from="mÂş" to="Âş" />
+    <Word from="mĂ´lho" to="molho" />
+    <Word from="monumentânea" to="momentânea" />
+    <Word from="mortandela" to="mortadela" />
+    <Word from="morteIa" to="mortela" />
+    <Word from="muinto" to="muito" />
+    <Word from="nasaias" to="nasais" />
+    <Word from="nĂŞle" to="nele" />
+    <Word from="nest" to="neste" />
+    <Word from="Nivea" to="NĂ­vea" />
+    <Word from="nonagessimo" to="nonagésimo" />
+    <Word from="nonagéssimo" to="nonagésimo" />
+    <Word from="nornal" to="normal" />
+    <Word from="notĂ velmente" to="notavelmente" />
+    <Word from="obcessĂŁo" to="obsessĂŁo" />
+    <Word from="obesidae" to="obesidade" />
+    <Word from="Ăłbviamente" to="obviamente" />
+    <Word from="òbviamente" to="obviamente" />
+    <Word from="ofecina" to="oficina" />
+    <Word from="oje" to="hoje" />
+    <Word from="omem" to="homem" />
+    <Word from="opcoes" to="opções" />
+    <Word from="opĂłbrio" to="oprĂłbrio" />
+    <Word from="oprĂłbio" to="oprĂłbrio" />
+    <Word from="orfĂŁo" to="ĂłrfĂŁo" />
+    <Word from="organigrama" to="organograma" />
+    <Word from="organisar" to="organizar" />
+    <Word from="orgĂŁo" to="ĂłrgĂŁo" />
+    <Word from="orta" to="horta" />
+    <Word from="Ăłtima" to="Ăłptima" />
+    <Word from="Ăłtimos" to="Ăłptimos" />
+    <Word from="paralização" to="paralisação" />
+    <Word from="paralizado" to="paralisado" />
+    <Word from="paralizar" to="paralisar" />
+    <Word from="paráste" to="paraste" />
+    <Word from="Pátria" to="pátria" />
+    <Word from="paĂşl" to="Paul" />
+    <Word from="pecalço" to="percalço" />
+    <Word from="pĂŞga" to="pega" />
+    <Word from="periodo" to="perĂ­odo" />
+    <Word from="pertubar" to="perturbar" />
+    <Word from="perĂş" to="peru" />
+    <Word from="piqueno" to="pequeno" />
+    <Word from="pirinéus" to="Pirenéus" />
+    <Word from="poblema" to="problema" />
+    <Word from="pobrema" to="problema" />
+    <Word from="poden" to="podem" />
+    <Word from="poder-mos" to="pudermos" />
+    <Word from="ponteagudo" to="pontiagudo" />
+    <Word from="pontuacoes" to="pontuações" />
+    <Word from="prazeiroso" to="prazeroso" />
+    <Word from="precaridade" to="precariedade" />
+    <Word from="precizar" to="precisar" />
+    <Word from="preserverança" to="perseverança" />
+    <Word from="previlégio" to="privilégio" />
+    <Word from="primária-que" to="primária que" />
+    <Word from="priĂşdo" to="perĂ­odo" />
+    <Word from="probalidade" to="probabilidade" />
+    <Word from="progreso" to="progresso" />
+    <Word from="proibĂ­do" to="proibido" />
+    <Word from="proĂ­bido" to="proibido" />
+    <Word from="prĂłpia" to="prĂłpria" />
+    <Word from="propiedade" to="propriedade" />
+    <Word from="propio" to="prĂłprio" />
+    <Word from="prĂłpio" to="prĂłprio" />
+    <Word from="provocacoes" to="provocações" />
+    <Word from="prsença" to="presença" />
+    <Word from="prustituta" to="prostituta" />
+    <Word from="pudérmos" to="pudermos" />
+    <Word from="pĂşlico" to="pĂşblico" />
+    <Word from="pĂşs" to="pus" />
+    <Word from="pusémos" to="pusemos" />
+    <Word from="quadricomia" to="quadricromia" />
+    <Word from="quadriplicado" to="quadruplicado" />
+    <Word from="quaisqueres" to="quaisquer" />
+    <Word from="quer-a" to="quere-a" />
+    <Word from="quere-se" to="quer-se" />
+    <Word from="quer-o" to="quere-o" />
+    <Word from="quĂ­mco" to="quĂ­mico" />
+    <Word from="quises-te" to="quiseste" />
+    <Word from="quizer" to="quiser" />
+    <Word from="quizeram" to="quiseram" />
+    <Word from="quizesse" to="quisesse" />
+    <Word from="quizessem" to="quisessem" />
+    <Word from="raĂ­nha" to="rainha" />
+    <Word from="raĂ­z" to="raiz" />
+    <Word from="raizes" to="raĂ­zes" />
+    <Word from="ratato" to="retrato" />
+    <Word from="raĂşl" to="raul" />
+    <Word from="razar" to="rasar" />
+    <Word from="rectaguarda" to="retaguarda" />
+    <Word from="rédia" to="rédea" />
+    <Word from="reestabelecer" to="restabelecer" />
+    <Word from="refeicoes" to="refeições" />
+    <Word from="refĂŞrencia" to="referĂŞncia" />
+    <Word from="regeitar" to="rejeitar" />
+    <Word from="regurjitar" to="regurgitar" />
+    <Word from="reinvidicação" to="reivindicação" />
+    <Word from="reinvidicar" to="reivindicar" />
+    <Word from="requer-a" to="requere-a" />
+    <Word from="requere-se" to="requer-se" />
+    <Word from="requer-o" to="requere-o" />
+    <Word from="requesito" to="requisito" />
+    <Word from="requisicoes" to="requisições" />
+    <Word from="RESIDENCIA" to="RESIDĂŠNCIA" />
+    <Word from="respiraçáo" to="respiração" />
+    <Word from="restablecer" to="restabelecer" />
+    <Word from="réstea" to="réstia" />
+    <Word from="ruborisar" to="ruborizar" />
+    <Word from="rĂşbrica" to="rubrica" />
+    <Word from="sĂ dia" to="sadia" />
+    <Word from="saiem" to="saem" />
+    <Word from="salchicha" to="salsicha" />
+    <Word from="salchichas" to="salsichas" />
+    <Word from="saloice" to="saloiice" />
+    <Word from="salvé" to="salve" />
+    <Word from="salve-raĂ­nha" to="salve-rainha" />
+    <Word from="salvé-rainha" to="salve-rainha" />
+    <Word from="salvé-raínha" to="salve-rainha" />
+    <Word from="sao" to="sĂŁo" />
+    <Word from="sargeta" to="sarjeta" />
+    <Word from="seções" to="secções" />
+    <Word from="seija" to="seja" />
+    <Word from="seissentos" to="seiscentos" />
+    <Word from="seje" to="seja" />
+    <Word from="semiar" to="semear" />
+    <Word from="séniores" to="seniores" />
+    <Word from="sensibilidadc" to="sensibilidade" />
+    <Word from="sensĂ­velmente" to="sensivelmente" />
+    <Word from="setessentos" to="setecentos" />
+    <Word from="siclano" to="sicrano" />
+    <Word from="Sifilis" to="SĂ­filis" />
+    <Word from="sifĂ­lis" to="sĂ­filis" />
+    <Word from="sinĂŁo" to="senĂŁo" />
+    <Word from="sinmtoma" to="sintoma" />
+    <Word from="sintéticamente" to="sinteticamente" />
+    <Word from="sintetisa" to="sintetiza" />
+    <Word from="SĂ“" to="sĂł" />
+    <Word from="sĂ´fra" to="sofra" />
+    <Word from="sĂ´fregamente" to="sofregamente" />
+    <Word from="somáste" to="somaste" />
+    <Word from="sombracelha" to="sobrancelha" />
+    <Word from="sombrancelha" to="sobrancelha" />
+    <Word from="sombrancelhas" to="sobrancelhas" />
+    <Word from="suavisar" to="suavizar" />
+    <Word from="substituido" to="substituĂ­do" />
+    <Word from="suburbio" to="subĂşrbio" />
+    <!-- <Word from="sues" to="seus" /> sues existe "Cuidado, nĂŁo sues muito." -->
+    <Word from="suI" to="sul" />
+    <Word from="Suiça" to="Suíça" />
+    <Word from="suiças" to="suíças" />
+    <Word from="suiço" to="suíço" />
+    <Word from="suiços" to="suíços" />
+    <Word from="supĂ´r" to="supor" />
+    <Word from="tabeliões" to="tabeliães" />
+    <Word from="taĂ­nha" to="tainha" />
+    <Word from="tava" to="estava" />
+    <Word from="tĂŞem" to="tĂŞm" />
+    <Word from="telemovel" to="telemĂłvel" />
+    <Word from="telémovel" to="telemóvel" />
+    <Word from="terminacoes" to="terminações" />
+    <Word from="toráxico" to="torácico" />
+    <Word from="tou" to="estou" />
+    <Word from="transpĂ´r" to="transpor" />
+    <Word from="trasnporte" to="transporte" />
+    <Word from="tumors" to="tumores" />
+    <Word from="Ăşmida" to="hĂşmida" />
+    <Word from="umidade" to="unidade" />
+    <Word from="vai-vem" to="vaivém" />
+    <Word from="vegilância" to="vigilância" />
+    <Word from="vegilante" to="vigilante" />
+    <Word from="ventoĂ­nha" to="ventoinha" />
+    <Word from="verosĂ­mel" to="verosĂ­mil" />
+    <Word from="video" to="vĂ­deo" />
+    <Word from="virus" to="vĂ­rus" />
+    <Word from="visiense" to="viseense" />
+    <Word from="voçe" to="você" />
+    <Word from="voçê" to="você" />
+    <Word from="vĂ´o" to="voo" />
+    <Word from="xadrĂŞs" to="xadrez" />
+    <Word from="xafariz" to="chafariz" />
+    <Word from="xéxé" to="xexé" />
+    <Word from="xilindrĂł" to="chilindrĂł" />
+    <Word from="zaĂ­re" to="Zaire" />
+    <Word from="zepelin" to="zepelim" />
+    <Word from="zig-zag" to="ziguezague" />
+    <Word from="zoĂ´" to="zoo" />
+    <Word from="zĂ´o" to="zoo" />
+    <Word from="zuar" to="zoar" />
+    <Word from="zum-zum" to="zunzum" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines>
+    <LinePart from="IN 6-E" to="N 6 E" />
+    <LinePart from="in tegrar-se" to="integrar-se" />
+    <LinePart from="in teresse" to="interesse" />
+    <LinePart from="in testinos" to="intestinos" />
+    <LinePart from="indica ção" to="indicação" />
+    <LinePart from="inte tino" to="intestino" />
+    <LinePart from="intes tinos" to="intestinos" />
+    <LinePart from="L da" to="Lda" />
+    <LinePart from="mal estar" to="mal-estar" />
+    <LinePart from="mastiga çáo" to="mastigação" />
+    <LinePart from="médi cas" to="médicas" />
+    <LinePart from="mineo rais" to="minerais" />
+    <LinePart from="mola res" to="molares" />
+    <LinePart from="movi mentos" to="movimentos" />
+    <LinePart from="movimen to" to="movimento" />
+    <LinePart from="N 5-Estendido" to="NÂş 5 Estendido" />
+    <LinePart from="oxigé nio" to="oxigénio" />
+    <LinePart from="pod mos" to="podemos" />
+    <LinePart from="poder-se ia" to="poder-se-ia" />
+    <LinePart from="pos sibilidade" to="possibilidade" />
+    <LinePart from="possibi lidades" to="possibilidades" />
+    <LinePart from="pro duto" to="produto" />
+    <LinePart from="procu rar" to="procurar" />
+    <LinePart from="Q u e" to="Que" />
+    <LinePart from="qualifi cam" to="qualificam" />
+    <LinePart from="R egiĂŁo" to="RegiĂŁo" />
+    <LinePart from="unsuficien temente" to="insuficientemente" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <!-- <RegEx find="\bi\b" replaceWith="I" /> just an example - do not use this regex -->
+    <RegEx find="([0-9]) +Âş" replaceWith="$1Âş" />
+    <RegEx find="\Bcao\b" replaceWith="ção" />
+    <RegEx find="\Bcoes\b" replaceWith="ções" />
+    <!-- <RegEx find="\Bccao\b" replaceWith="cção" /> não faz sentido ter este e ter a linha de cima -->
+    <!-- <RegEx find="\Bccoes\b" replaceWith="cções" /> não faz sentido ter este e ter a linha de cima -->
+    <RegEx find="\b(m|M)ae\b" replaceWith="$1ĂŁe" />
+    <RegEx find="\Bdmnis\B" replaceWith="dminis" />
+    <RegEx find="\BlcĂłl\B" replaceWith="lcoĂłl" />
+    <RegEx find="\b(t|T)a[nm]b[eé]m\b" replaceWith="$1ambém" />
+    <RegEx find="\bzeppeli[mn]\b" replaceWith="zepelim" />
+    <RegEx find="\b(s|S)ufe?ciente\b" replaceWith="$1uficiente" />
+    <RegEx find="\b(n|N)ao\b" replaceWith="$1ĂŁo" />
+    <RegEx find="\b(B|b)elem\b" replaceWith="$1elém" />
+    <RegEx find="\b(s|S)u[íi]sso(s)?\b" replaceWith="$1uíço$2" />
+    <RegEx find="\b(s|S)u[íi]ssa(s)?\b" replaceWith="$1uíça$2" />
+    <RegEx find="\b(p|P)rivelig[ie]\p{Ll}d" replaceWith="$1rivelegiad" />
+    <RegEx find="\bpud(?:Ă©s|e-)se\b" replaceWith="pudesse" />
+    <RegEx find="\biquilĂ­br(?:e|i)o\b" replaceWith="equilĂ­brio" />
+    <RegEx find="\b(c|C)orregi\B" replaceWith="$1orrigid" />
+    <RegEx find="(?&lt;=A|a)ssociacao" replaceWith="ssociação" />
+    <RegEx find="(?&lt;=N|n)inguem" replaceWith="inguém" />
+    <RegEx find="(?&lt;=g|G)rat(?:uĂ­|Ăşi)to" replaceWith="ratuito" />
+    <RegEx find="(?&lt;=d|D)esiquilĂ­br[ei]o" replaceWith="esequilĂ­brio" />
+    <RegEx find="\b[k|K]il(ogramas?|Ăłmetros?)" replaceWith="qui$1" />
+  </RegularExpressions>
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/rus_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/rus_OCRFixReplaceList.xml
new file mode 100644
index 000000000..8bffbd904
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/rus_OCRFixReplaceList.xml
@@ -0,0 +1,257 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="НЄЙ" to="НЕЙ" />
+    <Word from="ОРГЗНĐЗМОБ" to="ОРГĐĐťĐĐ—ĐśĐ" />
+    <Word from="Чї0" to="ЧТО" />
+    <Word from="НЭ" to="ĐťĐ" />
+    <Word from="СОСЄДНЮЮ" to="СОСЕДНЮЮ" />
+    <Word from="ПЛЗНЄТУ" to="ПЛĐНЕТУ" />
+    <Word from="ЗЗГЭДОК" to="Đ—ĐĐ“ĐДОК" />
+    <Word from="СОТВОРЄНĐĐŻ" to="СОТВОРЕНĐĐŻ" />
+    <Word from="ĐśĐĐ Đ­" to="ĐśĐĐ Đ" />
+    <Word from="ПОЯБЛЄНĐĐŻ" to="ПОЯВЛЕНĐĐŻ" />
+    <Word from="ЗЄМЛЄ" to="ЗЕМЛЕ" />
+    <Word from="Đ„Đ©Đ„" to="Đ•Đ©Đ" />
+    <Word from="ТЄМНЬІХ" to="ТЕМНЫХ" />
+    <Word from="СЄРЬЄЗНЬІМ" to="СЕРЬЕЗНЫМ" />
+    <Word from="ПОШІІ0" to="ПОШЛО" />
+    <Word from="Пр0ĐĐ—0ШЄЛ" to="ПРОĐЗОШЕЛ" />
+    <Word from="СЄКРЄТЭМĐ" to="СЕКРЕТĐĐśĐ" />
+    <Word from="МЭТЄРĐЗЛЬІ" to="ĐśĐТЕРĐĐЛЫ" />
+    <Word from="ПЯТЄН" to="ПЯТЕН" />
+    <Word from="ПЛаНЄїЄ" to="ПЛĐНЕТЕ" />
+    <Word from="КЗТЭКЛĐĐ—Đś" to="ĐšĐТĐКЛĐĐ—Đś" />
+    <Word from="ОКЗЗЗЛСЯ" to="ОКĐĐ—ĐЛСЯ" />
+    <Word from="ДЭЛЬШЕ" to="Đ”ĐЛЬШЕ" />
+    <Word from="ТВК" to="ТĐĐš" />
+    <Word from="ПЛЗНЄТЗ" to="ПЛĐНЕТĐ" />
+    <Word from="ЧЄГО" to="ЧЕГО" />
+    <Word from="УЗНЭТЬ" to="ĐŁĐ—ĐťĐТЬ" />
+    <Word from="ПЛЭНЄТЄ" to="ПЛĐНЕТЕ" />
+    <Word from="НЄМ" to="НЕМ" />
+    <Word from="БОЗМОЖНЗ" to="ВОЗМОЖНĐ" />
+    <Word from="СОБЄРШЄННО" to="СОВЕРШЕННО" />
+    <Word from="ĐНЭЧЄ" to="ĐĐťĐЧЕ" />
+    <Word from="БСЄ" to="ВСЕ" />
+    <Word from="НЕДОСТЗТКĐ" to="НЕДОСТĐТКĐ" />
+    <Word from="НОВЬІЄ" to="НОВЫЕ" />
+    <Word from="Đ’Đ„Đ›ĐКОЛЄПНЭЯ" to="Đ’Đ•Đ›ĐКОЛЕПНĐĐŻ" />
+    <Word from="ОСТЭІІОСЬ" to="ОСТĐЛОСЬ" />
+    <Word from="НЗЛĐЧĐĐ„" to="ĐťĐĐ›ĐЧĐĐ•" />
+    <Word from="бЫ" to="бы" />
+    <Word from="ПРОЦВЕТВТЬ" to="ПРОЦВЕТĐТЬ" />
+    <Word from="КЗК" to="ĐšĐĐš" />
+    <Word from="ВОДЗ" to="ВОДĐ" />
+    <Word from="НЗШЕЛ" to="ĐťĐШЕЛ" />
+    <Word from="НЄ" to="НЕ" />
+    <Word from="ТОЖЄ" to="ТОЖЕ" />
+    <Word from="ВУЛКЭНĐЧЄСКОЙ" to="ВУЛКĐĐťĐЧЕСКОЙ" />
+    <Word from="ЭКТĐБНОСТĐ" to="ĐКТĐВНОСТĐ" />
+    <Word from="ПОЯВĐЛЗСЬ" to="ПОЯВĐĐ›ĐСЬ" />
+    <Word from="НОВЗЯ" to="НОВĐĐŻ" />
+    <Word from="СТРЭТЄГĐĐŻ" to="СТРĐТЕГĐĐŻ" />
+    <Word from="УСПЄШН0" to="УСПЕШНО" />
+    <Word from="ПОСЗДКУ" to="ПОСĐДКУ" />
+    <Word from="ГОТОБЫ" to="ГОТОВЫ" />
+    <Word from="НЗЧЗТЬ" to="ĐťĐЧĐТЬ" />
+    <Word from="ОХОТЭ" to="ОХОТĐ" />
+    <Word from="ПРĐЗНЗКЗМĐ" to="ПРĐĐ—ĐťĐĐšĐĐśĐ" />
+    <Word from="Пр0ШЛОМ" to="ПРОШЛОМ" />
+    <Word from="НЭСТОЯЩЄМ" to="ĐťĐСТОЯЩЕМ" />
+    <Word from="ПУСТОТЗХ" to="ПУСТОТĐĐĄ" />
+    <Word from="БЛЗЖНОЙ" to="Đ’Đ›ĐЖНОЙ" />
+    <Word from="ПОЧБЄ" to="ПОЧВЕ" />
+    <Word from="МЬІ" to="МЫ" />
+    <Word from="СЄЙЧЗС" to="СЕЙЧĐС" />
+    <Word from="ЄСЛĐ" to="ЕСЛĐ" />
+    <Word from="ЗЗТРОНЕМ" to="Đ—ĐТРОНЕМ" />
+    <Word from="ОПЗСЗЄМСЯ" to="ОПĐСĐЕМСЯ" />
+    <Word from="СĐЛЬН0" to="СĐЛЬНО" />
+    <Word from="ОТЛĐЧЗЄТСЯ" to="ОТЛĐЧĐЕТСЯ" />
+    <Word from="РЭНЬШЄ" to="Đ ĐНЬШЕ" />
+    <Word from="НЗЗЬІВЗЮТ" to="ĐťĐĐ—Đ«Đ’ĐЮТ" />
+    <Word from="ТЄКЛ3" to="ТЕКЛĐ" />
+    <Word from="ОСЗДОЧНЫМĐ" to="ОСĐДОЧНЫМĐ" />
+    <Word from="ПОСТЄПЄНН0" to="ПОСТЕПЕННО" />
+    <Word from="ĐСПЭРЯЛЗСЬ" to="ĐСПĐĐ ĐŻĐ›ĐСЬ" />
+    <Word from="ЄОЛЬШОЄ" to="БОЛЬШОЕ" />
+    <Word from="КОЛĐЧЄСТБО" to="КОЛĐЧЕСТВО" />
+    <Word from="ГЄМЗТĐТЕ" to="Đ“Đ•ĐśĐТĐТĐ" />
+    <Word from="ПОЛУЧЭЄТ" to="ПОЛУЧĐЕТ" />
+    <Word from="НЄДОСТЗЧН0" to="НЕДОСТĐТОЧНО" />
+    <Word from="ĐźĐТЭНĐĐŻ" to="ĐźĐТĐĐťĐĐŻ" />
+    <Word from="ПОКЗ" to="ПОКĐ" />
+    <Word from="БЬІХОДĐĐ›Đ" to="ВЫХОДĐĐ›Đ" />
+    <Word from="ЗЄМІІЄ" to="ЗЕМЛЕ" />
+    <Word from="ВЄСЬІĐĐ—" to="ВЕСЬМĐ" />
+    <Word from="ЗЄМЛĐ" to="ЗЕМЛĐ" />
+    <Word from="бЬІЛО" to="БЫЛО" />
+    <Word from="ĐšĐĐ—ĐťĐ" to="Đ–ĐĐ—ĐťĐ" />
+    <Word from="СТЗНОВĐЛЗСЬ" to="СТĐНОВĐĐ›ĐСЬ" />
+    <Word from="СОЛЄНЄЄ" to="СОЛĐНЕЕ" />
+    <Word from="МЭГНĐТНЫМ" to="ĐśĐĐ“ĐťĐТНЫМ" />
+    <Word from="ЧТОбЬІ" to="ЧТОБЫ" />
+    <Word from="СОЗДЕТЬ" to="СОЗДĐТЬ" />
+    <Word from="МЗГНĐТНОЄ" to="ĐśĐĐ“ĐťĐТНОЕ" />
+    <Word from="КЭЖУТСЯ" to="ĐšĐЖУТСЯ" />
+    <Word from="ОЗНЗЧЗЄТ" to="ОЗНĐЧĐЕТ" />
+    <Word from="МОГЛЗ" to="МОГЛĐ" />
+    <Word from="ĐМЄТЬ" to="ĐМЕТЬ" />
+    <Word from="КОСМОСЭ" to="КОСМОСĐ" />
+    <Word from="СОЛНЄЧНЗЯ" to="СОЛНЕЧНĐĐŻ" />
+    <Word from="СĐСТЄМЗ" to="СĐСТЕМĐ" />
+    <Word from="ПОСІІУЖĐЛО" to="ПОСЛУЖĐЛО" />
+    <Word from="МЗГНĐТНОГО" to="ĐśĐĐ“ĐťĐТНОГО" />
+    <Word from="ПЛВНЄТЫ" to="ПЛĐНЕТЫ" />
+    <Word from="ЛОКЗЛЬНЬІХ" to="ЛОКĐЛЬНЫХ" />
+    <Word from="ПОЛЄЙ" to="ПОЛЕЙ" />
+    <Word from="КЗЖУТСЯ" to="ĐšĐЖУТСЯ" />
+    <Word from="КЗКОГО" to="ĐšĐКОГО" />
+    <Word from="СТРЗШНОГО" to="СТРĐШНОГО" />
+    <Word from="СТОЛКНОЕЄНĐĐŻ" to="СТОЛКНОВЕНĐĐŻ" />
+    <Word from="МЕСТЗМĐ" to="МЕСТĐĐśĐ" />
+    <Word from="СДЄЛЗТЬ" to="СДЕЛĐТЬ" />
+    <Word from="СТЗЛО" to="СТĐЛО" />
+    <Word from="МЭГНĐТНОГО" to="ĐśĐĐ“ĐťĐТНОГО" />
+    <Word from="ЗЗКЛЮЧЗВШЄЙСЯ" to="Đ—ĐКЛЮЧĐВШЕЙСЯ" />
+    <Word from="Đ„Đ“Đž" to="Đ•Đ“Đž" />
+    <Word from="ЯДРЄ" to="ЯДРЕ" />
+    <Word from="НЗ" to="ĐťĐ" />
+    <Word from="ĐСЧЄЗЛ3" to="ĐСЧЕЗЛĐ" />
+    <Word from="СЧĐТЗЮ" to="СЧĐТĐĐ®" />
+    <Word from="ШЭНСЫ" to="ШĐНСЫ" />
+    <Word from="ĐНЗЧЄ" to="ĐĐťĐЧЕ" />
+    <Word from="СТЗЛ" to="СТĐĐ›" />
+    <Word from="ТРЗТĐТЬ" to="ТРĐТĐТЬ" />
+    <Word from="НЗПРЗВЛЯЄТСЯ" to="ĐťĐПРĐВЛЯЕТСЯ" />
+    <Word from="ОБЛЭСТĐ" to="ОБЛĐСТĐ" />
+    <Word from="ЯВЛЯІОТСЯ" to="ЯВЛЯЮТСЯ" />
+    <Word from="ГЛЭВНОЙ" to="Đ“Đ›ĐВНОЙ" />
+    <Word from="ДОКЗЗЗТЄЛЬСТВ" to="ДОКĐĐ—ĐТЕЛЬСТВ" />
+    <Word from="ĐšĐСЛОТЭМĐ" to="ĐšĐСЛОТĐĐśĐ" />
+    <Word from="ОНЭ" to="ОНĐ" />
+    <Word from="ПРЗКТĐЧЄСКĐ" to="ПРĐКТĐЧЕСКĐ" />
+    <Word from="ЛЄСУ" to="ЛЕСУ" />
+    <Word from="УСЛОБĐĐŻĐś" to="УСЛОВĐĐŻĐś" />
+    <Word from="СПЗСТĐСЬ" to="СПĐСТĐСЬ" />
+    <Word from="Đ Đ—Đ—Đ’ĐВЗЮЩĐЄСЯ" to="Đ ĐĐ—Đ’ĐĐ’ĐЮЩĐЕСЯ" />
+    <Word from="ШЭПКĐ" to="ШĐПКĐ" />
+    <Word from="ЗНЗЄМ" to="Đ—ĐťĐĐ•Đś" />
+    <Word from="СООĐРЭЄМСЯ" to="СОБĐĐ ĐЕМСЯ" />
+    <Word from="БЫЯСНĐТЬ" to="ВЫЯСНĐТЬ" />
+    <Word from="СЗМ" to="СĐĐś" />
+    <Word from="РЗСПОЗНЗТЬ" to="Đ ĐСПОЗНĐТЬ" />
+    <Word from="УЗНЗТЬ" to="ĐŁĐ—ĐťĐТЬ" />
+    <Word from="КЭЖЄТСЯ" to="ĐšĐЖЕТСЯ" />
+    <Word from="ОРЄĐТЗЛЬНЬІЄ" to="ОРБĐТĐЛЬНЫЕ" />
+    <Word from="ЛЄТЭТЄЛЬНЬІЄ" to="ЛЕТĐТЕЛЬНЫЕ" />
+    <Word from="ЗППЗРЕТЬІ" to="ĐППĐĐ ĐТЫ" />
+    <Word from="Đ–Đ„" to="Đ–Đ•" />
+    <Word from="ТЗКЗЯ" to="ТĐĐšĐĐŻ" />
+    <Word from="МЗЛЄНЬКЗЯ" to="ĐśĐЛЕНЬКĐĐŻ" />
+    <Word from="ПЛЭНЄТЗ" to="ПЛĐНЕТĐ" />
+    <Word from="СПЗІІЬКО" to="СТОЛЬКО" />
+    <Word from="бЬІЛ3" to="Đ‘Đ«Đ›Đ" />
+    <Word from="ĐЕСЧĐСЛЄННОЄ" to="БЕСЧĐСЛЕННОЕ" />
+    <Word from="МЗГНĐїНЬІХ" to="ĐśĐĐ“ĐťĐТНЫХ" />
+    <Word from="ПОСТраД3Đ›" to="ПОСТРĐĐ”ĐĐ›" />
+    <Word from="ДЗЖЄ" to="Đ”ĐĐ–Đ•" />
+    <Word from="РЗЗНЬІМĐ" to="Đ ĐЗНЫМĐ" />
+    <Word from="СУЩЄСТБОВЭНĐĐ„" to="СУЩЕСТВОВĐĐťĐĐ•" />
+    <Word from="ПЛаНЄїЬІ" to="ПЛĐНЕТЫ" />
+    <Word from="ПОДВЄРГЛЗСЬ" to="ПОДВЕРГЛĐСЬ" />
+    <Word from="ОПЗСІ-ІОСТĐ" to="ОПĐСНОСТĐ" />
+    <Word from="ПЛЗНЄТЄ" to="ПЛĐНЕТЕ" />
+    <Word from="Н0" to="НО" />
+    <Word from="бЬІ" to="БЫ" />
+    <Word from="ОТДЗЛЄННЫЄ" to="ОТДĐĐ›ĐННЫЕ" />
+    <Word from="ПОЛЯРНЬІЄ" to="ПОЛЯРНЫЕ" />
+    <Word from="ЦЄЛЬІ-О" to="ЦЕЛЬЮ" />
+    <Word from="ПЄЩЄРЗХ" to="ПЕЩЕРĐĐĄ" />
+    <Word from="НЗПОЛНЄННЬІХ" to="ĐťĐПОЛНЕННЫХ" />
+    <Word from="ĐСПЗРЄНĐĐŻĐśĐ" to="ĐСПĐĐ Đ•ĐťĐĐŻĐśĐ" />
+    <Word from="ĐśĐĐťĐЗТЮРНЬІЄ" to="ĐśĐĐťĐĐТЮРНЫЕ" />
+    <Word from="ТЭКЗЯ" to="ТĐĐšĐĐŻ" />
+    <Word from="ПрĐСП0СОбĐТЬСЯ" to="ПРĐСПОСОБĐТЬСЯ" />
+    <Word from="НЄОЄХОДĐМЬІЄ" to="НЕОБХОДĐМЫЕ" />
+    <Word from="ОРГВНĐЧЄСКĐĐ„" to="ОРГĐĐťĐЧЕСКĐĐ•" />
+    <Word from="МЗРСĐЗНСКĐĐ„" to="ĐśĐРСĐĐНСКĐĐ•" />
+    <Word from="МЄСТЄ" to="МЕСТЕ" />
+    <Word from="І\/ІĐККЕЙШ" to="ĐśĐККЕЙН" />
+    <Word from="НЗХОДЯЩĐЄСЯ" to="ĐťĐХОДЯЩĐЕСЯ" />
+    <Word from="НЄЗКТĐВНОМ" to="НЕĐКТĐВНОМ" />
+    <Word from="ЗЭСНЯТЬ" to="Đ—ĐСНЯТЬ" />
+    <Word from="ОРГЗНĐЗМЬІ" to="ОРГĐĐťĐЗМЫ" />
+    <Word from="Đ’Đ—Đ•ĐМОДЄЙСТВОВЕТЬ" to="Đ’Đ—ĐĐМОДЕЙСТВОВĐТЬ" />
+    <Word from="ПУТЄШЄСТБĐĐ„" to="ПУТЕШЕСТВĐĐ•" />
+    <Word from="ĐźŃСїЬІННЫХ" to="ПУСТЫННЫХ" />
+    <Word from="ТЗКĐĐĄ" to="ТĐĐšĐĐĄ" />
+    <Word from="ПЄРЄТЗСКĐĐ’Đ—Đ„Đś" to="ПЕРЕТĐСКĐĐ’ĐĐ•Đś" />
+    <Word from="ЧТ0" to="ЧТО" />
+    <Word from="ВЄСЬМЗ" to="ВЕСЬМĐ" />
+    <Word from="ПОЛОСЗМĐ" to="ПОЛОСĐĐśĐ" />
+    <Word from="ОрїЭНĐЗМЬІ" to="ОРГĐĐťĐЗМЫ" />
+    <Word from="ĐžĐЛЗСТĐ" to="ОБЛĐСТĐ" />
+    <Word from="ЯБЛЯЮТСЯ" to="ЯВЛЯЮТСЯ" />
+    <Word from="ЦЄЛЬЮ" to="ЦЕЛЬЮ" />
+    <Word from="ПОĐСКОБ" to="ПОĐСКОВ" />
+    <Word from="ДОКЗЗЗТЄІІЬСТВ" to="ДОКĐĐ—ĐТЕЛЬСТВ" />
+    <Word from="МОЖЄТ" to="МОЖЕТ" />
+    <Word from="НЭХОДĐТЬСЯ" to="ĐťĐХОДĐТЬСЯ" />
+    <Word from="ОЧЄНЬ" to="ОЧЕНЬ" />
+    <Word from="СРЗВНĐТЬ" to="СРĐĐ’ĐťĐТЬ" />
+    <Word from="ОЄНЗРУЖĐĐ›" to="ОБНĐĐ ĐŁĐ–ĐĐ›" />
+    <Word from="ЛЬДЗ" to="ЛЬДĐ" />
+    <Word from="ПОТЄПЛЄНĐЄІĐ" to="ПОТЕПЛЕНĐĐ•Đś" />
+    <Word from="ПОХОЛОДЗНĐĐ„Đ‘Đ”" to="ПОХОЛОДĐĐťĐĐ•Đś" />
+    <Word from="КЭК" to="ĐšĐĐš" />
+    <Word from="ТЄЛО" to="ТЕЛО" />
+    <Word from="бОЛЬШЄ" to="БОЛЬШЕ" />
+    <Word from="НЭКЛОНЯЄТСЯ" to="ĐťĐКЛОНЯЕТСЯ" />
+    <Word from="СОІІНЦУ" to="СОЛНЦУ" />
+    <Word from="СТ3бĐĐ›ĐĐ—ĐрОБЗТЬ" to="СТĐĐ‘ĐĐ›ĐĐ—ĐРОВĐТЬ" />
+    <Word from="СТЭБĐЛЬНЭ" to="СТĐĐ‘ĐЛЬНĐ" />
+    <Word from="ĐśĐЛІІĐОНОВ" to="ĐśĐЛЛĐОНОВ" />
+    <Word from="НЗЗЭД" to="ĐťĐĐ—ĐĐ”" />
+    <Word from="ТЄПЛ0" to="ТЕПЛО" />
+    <Word from="ПОІІЯРНЫХ" to="ПОЛЯРНЫХ" />
+    <Word from="СОІІЕНЫМĐ" to="СОЛЕНЫМĐ" />
+    <Word from="КЕКĐĐśĐ" to="ĐšĐĐšĐĐśĐ" />
+    <Word from="киŃлютнюŃггь" to="киŃлотноŃŃ‚ŃŚ" />
+    <Word from="ТЗМ" to="ТĐĐś" />
+    <Word from="ОРГЗНĐЗМЫ" to="ОРГĐĐťĐЗМЫ" />
+    <Word from="СУЩЄСТВОВЄТЬ" to="СУЩЕСТВОВĐТЬ" />
+    <Word from="Đ’ĐťĐМЗНĐĐ„" to="Đ’ĐťĐĐśĐĐťĐĐ•" />
+    <Word from="СДЄЛЗЄТ" to="СДЕЛĐЕТ" />
+    <Word from="ПОЗНЭКОМĐТЬСЯ" to="ПОЗНĐКОМĐТЬСЯ" />
+    <Word from="НЭШĐĐś" to="ĐťĐШĐĐś" />
+    <Word from="ДОКЗЗЭТЄЛЬСТБО" to="ДОКĐĐ—ĐТЕЛЬСТВО" />
+    <Word from="Đ©Đ—Đ—Đ©Đ„ĐťĐĐŻ" to="Đ’Đ ĐĐ©Đ•ĐťĐĐŻ" />
+    <Word from="бЬІЛ0" to="БЫЛО" />
+    <Word from="ОЄЛЕСТЯХ" to="ОБЛĐСТЯХ" />
+    <Word from="бЬІЛĐ" to="Đ‘Đ«Đ›Đ" />
+    <Word from="РЭЗМЬІШЛЯІІĐ" to="Đ ĐЗМЫШЛЯЛĐ" />
+    <Word from="КОЛĐЧЄСТБЄ" to="КОЛĐЧЕСТВЕ" />
+    <Word from="ЩЄІІОЧНЫЄ" to="ЩЕЛОЧНЫЕ" />
+    <Word from="НЄКОТЩЗЬІЄ" to="НЕКОТОРЫЕ" />
+    <Word from="ПрĐБІ1Đ•ĐšŃŃ—" to="ПРĐВЛЕКУТ" />
+    <Word from="НЗЗЬІВЭЄМЫЄ" to="ĐťĐĐ—Đ«Đ’ĐЕМЫЕ" />
+    <Word from="Чї06Ы" to="ЧТОБЫ" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords>
+    <WordPart from="Đ„" to="Đ•" />
+    <WordPart from="ЬІ" to="Ы" />
+    <WordPart from="КЗ" to="ĐšĐ" />
+    <WordPart from="ЛЗ" to="Đ›Đ" />
+    <WordPart from="НЗ" to="ĐťĐ" />
+    <WordPart from="ШЗ" to="ШĐ" />
+    <WordPart from="І\/І" to="М" />
+  </PartialWords>
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml
new file mode 100644
index 000000000..938e90a89
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/spa_OCRFixReplaceList.xml
@@ -0,0 +1,952 @@
+<OCRFixReplaceList>
+  <WholeWords>
+    <!-- Abreviaturas simples -->
+    <Word from="KBs" to="kB" />
+    <Word from="Vd" to="Ud" />
+    <Word from="N°" to="N.°" />
+    <Word from="n°" to="n.°" />
+    <Word from="nro." to="n.°" />
+    <Word from="Nro." to="N.°" />
+    <!-- Ortografía básica -->
+    <Word from="aca" to="acá" />
+    <Word from="actuas" to="actĂşas" />
+    <Word from="actues" to="actĂşes" />
+    <Word from="adios" to="adiĂłs" />
+    <Word from="agarrenla" to="agárrenla" />
+    <Word from="agarrenlo" to="agárrenlo" />
+    <Word from="agarrandose" to="agarrándose" />
+    <Word from="algun" to="algĂşn" />
+    <Word from="alli" to="allĂ­" />
+    <Word from="alla" to="allá" />
+    <Word from="alejate" to="aléjate" />
+    <Word from="ahi" to="ahĂ­" />
+    <Word from="angel" to="ángel" />
+    <Word from="angeles" to="ángeles" />
+    <Word from="ansian" to="ansĂ­an" />
+    <Word from="apagala" to="apágala" />
+    <Word from="aqui" to="aquĂ­" />
+    <Word from="asi" to="asĂ­" />
+    <Word from="bahia" to="bahĂ­a" />
+    <Word from="busqueda" to="bĂşsqueda" />
+    <Word from="busquedas" to="bĂşsquedas" />
+    <Word from="callate" to="cállate" />
+    <Word from="carcel" to="cárcel" />
+    <Word from="camara" to="cámara" />
+    <Word from="caido" to="caĂ­do" />
+    <Word from="cabron" to="cabrĂłn" />
+    <Word from="camion" to="camiĂłn" />
+    <Word from="codigo" to="cĂłdigo" />
+    <Word from="codigos" to="cĂłdigos" />
+    <Word from="comence" to="comencé" />
+    <Word from="comprate" to="cĂłmprate" />
+    <Word from="consegui" to="conseguĂ­" />
+    <Word from="confias" to="confĂ­as" />
+    <Word from="convertira" to="convertirá" />
+    <Word from="corazon" to="corazĂłn" />
+    <Word from="crei" to="creĂ­" />
+    <Word from="creia" to="creĂ­a" />
+    <Word from="creido" to="creĂ­do" />
+    <Word from="creiste" to="creĂ­ste" />
+    <Word from="cubrenos" to="cĂşbrenos" />
+    <Word from="comio" to="comiĂł" />
+    <Word from="dara" to="dará" />
+    <Word from="dia" to="dĂ­a" />
+    <Word from="dias" to="dĂ­as" />
+    <Word from="debio" to="debiĂł" />
+    <Word from="demelo" to="démelo" />
+    <Word from="dimelo" to="dĂ­melo" />
+    <Word from="denoslo" to="dénoslo" />
+    <Word from="deselo" to="déselo" />
+    <Word from="decia" to="decĂ­a" />
+    <Word from="decian" to="decĂ­an" />
+    <Word from="detras" to="detrás" />
+    <Word from="deberia" to="deberĂ­a" />
+    <Word from="deberas" to="deberás" />
+    <Word from="deberias" to="deberĂ­as" />
+    <Word from="deberian" to="deberĂ­an" />
+    <Word from="deberiamos" to="deberĂ­amos" />
+    <Word from="dejame" to="déjame" />
+    <Word from="dejate" to="déjate" />
+    <Word from="dejalo" to="déjalo" />
+    <Word from="dejarian" to="dejarĂ­an" />
+    <Word from="damela" to="dámela" />
+    <Word from="despues" to="después" />
+    <Word from="diciendome" to="diciéndome" />
+    <Word from="dificil" to="difĂ­cil" />
+    <Word from="dificiles" to="difĂ­ciles" />
+    <Word from="disculpate" to="discĂşlpate" />
+    <Word from="dolares" to="dĂłlares" />
+    <Word from="hechar" to="echar" />
+    <Word from="examenes" to="exámenes" />
+    <Word from="empezo" to="empezĂł" />
+    <Word from="empujon" to="empujĂłn" />
+    <Word from="empujalo" to="empĂşjalo" />
+    <Word from="energia" to="energĂ­a" />
+    <Word from="enfrian" to="enfrĂ­an" />
+    <Word from="escondanme" to="escĂłndanme" />
+    <Word from="esperame" to="espérame" />
+    <Word from="estara" to="estará" />
+    <Word from="estare" to="estaré" />
+    <Word from="estaria" to="estarĂ­a" />
+    <Word from="estan" to="están" />
+    <Word from="estaran" to="estarán" />
+    <Word from="estabamos" to="estábamos" />
+    <Word from="estuvieramos" to="estuviéramos" />
+    <Word from="exito" to="Ă©xito" />
+    <Word from="facil" to="fácil" />
+    <Word from="fiscalia" to="fiscalĂ­a" />
+    <Word from="fragil" to="frágil" />
+    <Word from="fragiles" to="frágiles" />
+    <Word from="frances" to="francés" />
+    <Word from="gustaria" to="gustarĂ­a" />
+    <Word from="habia" to="habĂ­a" />
+    <Word from="habias" to="habĂ­as" />
+    <Word from="habian" to="habĂ­an" />
+    <Word from="habrian" to="habrĂ­an" />
+    <Word from="habrias" to="habrĂ­as" />
+    <Word from="hagalo" to="hágalo" />
+    <Word from="haria" to="harĂ­a" />
+    <Word from="increible" to="increĂ­ble" />
+    <Word from="incredulo" to="incrédulo" />
+    <Word from="intentalo" to="inténtalo" />
+    <Word from="ire" to="iré" />
+    <Word from="jovenes" to="jĂłvenes" />
+    <Word from="ladron" to="ladrĂłn" />
+    <Word from="linea" to="lĂ­nea" />
+    <Word from="llamame" to="llámame" />
+    <Word from="llevalo" to="llévalo" />
+    <Word from="mama" to="mamá" />
+    <Word from="maricon" to="maricĂłn" />
+    <Word from="mayoria" to="mayorĂ­a" />
+    <Word from="metodo" to="método" />
+    <Word from="metodos" to="métodos" />
+    <Word from="mio" to="mĂ­o" />
+    <Word from="mostro" to="mostrĂł" />
+    <Word from="morira" to="morirá" />
+    <Word from="muevete" to="muévete" />
+    <Word from="murio" to="muriĂł" />
+    <Word from="numero" to="nĂşmero" />
+    <Word from="numeros" to="nĂşmeros" />
+    <Word from="ningun" to="ningĂşn" />
+    <Word from="oido" to="oĂ­do" />
+    <Word from="oidos" to="oĂ­dos" />
+    <Word from="oimos" to="oĂ­mos" />
+    <Word from="oiste" to="oĂ­ste" />
+    <Word from="pasale" to="pásale" />
+    <Word from="pasame" to="pásame" />
+    <Word from="paraiso" to="paraĂ­so" />
+    <Word from="parate" to="párate" />
+    <Word from="pense" to="pensé" />
+    <Word from="peluqueria" to="peluquerĂ­a" />
+    <Word from="platano" to="plátano" />
+    <Word from="plastico" to="plástico" />
+    <Word from="plasticos" to="plásticos" />
+    <Word from="policia" to="policĂ­a" />
+    <Word from="policias" to="policĂ­as" />
+    <Word from="poster" to="pĂłster" />
+    <Word from="podia" to="podĂ­a" />
+    <Word from="podias" to="podĂ­as" />
+    <Word from="podria" to="podrĂ­a" />
+    <Word from="podrian" to="podrĂ­an" />
+    <Word from="podrias" to="podrĂ­as" />
+    <Word from="podriamos" to="podrĂ­amos" />
+    <Word from="prometio" to="prometiĂł" />
+    <Word from="proposito" to="propĂłsito" />
+    <Word from="pideselo" to="pĂ­deselo" />
+    <Word from="ponganse" to="pĂłnganse" />
+    <Word from="prometeme" to="prométeme" />
+    <Word from="publico" to="pĂşblico" />
+    <Word from="publicos" to="pĂşblicos" />
+    <Word from="publicamente" to="pĂşblicamente" />
+    <Word from="quedate" to="quédate" />
+    <Word from="queria" to="querĂ­a" />
+    <Word from="querrias" to="querrĂ­as" />
+    <Word from="querian" to="querĂ­an" />
+    <Word from="rapido" to="rápido" />
+    <Word from="rapidamente" to="rápidamente" />
+    <Word from="razon" to="razĂłn" />
+    <Word from="rehusen" to="rehĂşsen" />
+    <Word from="rie" to="rĂ­e" />
+    <Word from="rias" to="rĂ­as" />
+    <Word from="rindete" to="rĂ­ndete" />
+    <Word from="sacame" to="sácame" />
+    <Word from="sentian" to="sentĂ­an" />
+    <Word from="sientate" to="siéntate" />
+    <Word from="sera" to="será" />
+    <Word from="soplon" to="soplĂłn" />
+    <Word from="sueltalo" to="suéltalo" />
+    <Word from="tambien" to="también" />
+    <Word from="teoria" to="teorĂ­a" />
+    <Word from="tendra" to="tendrá" />
+    <Word from="telefono" to="teléfono" />
+    <Word from="tipica" to="tĂ­pica" />
+    <Word from="todavia" to="todavĂ­a" />
+    <Word from="tomalo" to="tĂłmalo" />
+    <Word from="tonterias" to="tonterĂ­as" />
+    <Word from="torci" to="torcĂ­" />
+    <Word from="traelos" to="tráelos" />
+    <Word from="traiganlo" to="tráiganlo" />
+    <Word from="traiganlos" to="tráiganlos" />
+    <Word from="trio" to="trĂ­o" />
+    <Word from="tuvieramos" to="tuviéramos" />
+    <Word from="union" to="uniĂłn" />
+    <Word from="ultimo" to="Ăşltimo" />
+    <Word from="ultima" to="Ăşltima" />
+    <Word from="ultimos" to="Ăşltimos" />
+    <Word from="ultimas" to="Ăşltimas" />
+    <Word from="unica" to="Ăşnica" />
+    <Word from="unico" to="Ăşnico" />
+    <Word from="vamonos" to="vámonos" />
+    <Word from="vayanse" to="váyanse" />
+    <Word from="victima" to="vĂ­ctima" />
+    <Word from="vivira" to="vivirá" />
+    <Word from="volvio" to="volviĂł" />
+    <Word from="volvia" to="volvĂ­a" />
+    <Word from="volvian" to="volvĂ­an" />
+    <!-- Palabras con eír/oír más usadas -->
+    <Word from="reir" to="reĂ­r" />
+    <Word from="freir" to="freĂ­r" />
+    <Word from="sonreir" to="sonreĂ­r" />
+    <Word from="hazmerreir" to="hazmerreĂ­r" />
+    <Word from="oir" to="oĂ­r" />
+    <Word from="oirlo" to="oĂ­rlo" />
+    <Word from="oirte" to="oĂ­rte" />
+    <Word from="oirse" to="oĂ­rse" />
+    <Word from="oirme" to="oĂ­rme" />
+    <Word from="oirle" to="oĂ­rle" />
+    <Word from="oirla" to="oĂ­rla" />
+    <Word from="oirles" to="oĂ­rles" />
+    <Word from="oirnos" to="oĂ­rnos" />
+    <Word from="oirlas" to="oĂ­rlas" />
+    <!-- Palabras que no llevan acento -->
+    <Word from="bién" to="bien" />
+    <Word from="crĂ­men" to="crimen" />
+    <Word from="fué" to="fue" />
+    <Word from="fuĂ­" to="fui" />
+    <Word from="quiéres" to="quieres" />
+    <Word from="tĂ­" to="ti" />
+    <Word from="dĂ­" to="di" />
+    <Word from="vá" to="va" />
+    <Word from="vé" to="ve" />
+    <Word from="vĂ­" to="vi" />
+    <Word from="viĂł" to="vio" />
+    <Word from="Ăł" to="o" />
+    <Word from="clĂłn" to="clon" />
+    <Word from="diĂł" to="dio" />
+    <Word from="guiĂłn" to="guion" />
+    <Word from="dĂłn" to="don" />
+    <Word from="fé" to="fe" />
+    <Word from="áquel" to="aquel" />
+    <!-- Palabras donde se puede prescindir de la tilde diacrĂ­tica -->
+    <Word from="Ă©ste" to="este" />
+    <Word from="Ă©sta" to="esta" />
+    <Word from="Ă©stos" to="estos" />
+    <Word from="Ă©stas" to="estas" />
+    <Word from="Ă©se" to="ese" />
+    <Word from="Ă©sa" to="esa" />
+    <Word from="Ă©sos" to="esos" />
+    <Word from="Ă©sas" to="esas" />
+    <Word from="sĂłlo" to="solo" />
+    <!-- Errores no relacionados con los tildes -->
+    <Word from="coktel" to="cĂłctel" />
+    <Word from="cocktel" to="cĂłctel" />
+    <Word from="conciente" to="consciente" />
+    <Word from="comenzé" to="comencé" />
+    <Word from="desilucionarte" to="desilusionarte" />
+    <Word from="dijieron" to="dijeron" />
+    <Word from="empezé" to="empecé" />
+    <Word from="hize" to="hice" />
+    <Word from="ilucionarte" to="ilusionarte" />
+    <Word from="inconciente" to="inconsciente" />
+    <Word from="quize" to="quise" />
+    <Word from="quizo" to="quiso" />
+    <Word from="verguenza" to="vergĂĽenza" />
+    <!-- Errores en nombres propios o de paĂ­ses -->
+    <Word from="Nuñez" to="Núñez" />
+    <Word from="Ivan" to="Iván" />
+    <Word from="Japon" to="JapĂłn" />
+    <Word from="Monica" to="MĂłnica" />
+    <Word from="Maria" to="MarĂ­a" />
+    <Word from="Jose" to="José" />
+    <Word from="Ramon" to="RamĂłn" />
+    <Word from="Garcia" to="GarcĂ­a" />
+    <Word from="Gonzalez" to="González" />
+    <Word from="Jesus" to="JesĂşs" />
+    <Word from="Alvarez" to="Ălvarez" />
+    <Word from="Damian" to="Damián" />
+    <Word from="Rene" to="René" />
+    <Word from="Nicolas" to="Nicolás" />
+    <Word from="Jonas" to="Jonás" />
+    <Word from="Lopez" to="LĂłpez" />
+    <Word from="Hernandez" to="Hernández" />
+    <Word from="Bermudez" to="BermĂşdez" />
+    <Word from="Fernandez" to="Fernández" />
+    <Word from="Suarez" to="Suárez" />
+    <Word from="Sofia" to="SofĂ­a" />
+    <Word from="Seneca" to="SĂ©neca" />
+    <Word from="Tokyo" to="Tokio" />
+    <Word from="Canada" to="Canadá" />
+    <Word from="Paris" to="ParĂ­s" />
+    <Word from="Turquia" to="TurquĂ­a" />
+    <Word from="Mexico" to="MĂ©xico" />
+    <Word from="Mejico" to="MĂ©xico" />
+    <Word from="Matias" to="MatĂ­as" />
+    <Word from="Valentin" to="ValentĂ­n" />
+    <Word from="mejicano" to="mexicano" />
+    <Word from="mejicanos" to="mexicanos" />
+    <Word from="mejicana" to="mexicana" />
+    <Word from="mejicanas" to="mexicanas" />
+    <!-- Creados por SE -->
+    <Word from="io" to="lo" />
+    <Word from="ia" to="la" />
+    <Word from="ie" to="le" />
+    <Word from="Io" to="lo" />
+    <Word from="Ia" to="la" />
+    <Word from="AI" to="Al" />
+    <Word from="Ie" to="le" />
+    <Word from="EI" to="El" />
+    <Word from="subafluente" to="subafluente" />
+    <Word from="aflójalo" to="aflójalo" />
+    <Word from="Aflójalo" to="Aflójalo" />
+    <Word from="perdi" to="perdĂ­" />
+    <Word from="Podria" to="PodrĂ­a" />
+    <Word from="confia" to="confĂ­a" />
+    <Word from="pasaria" to="pasarĂ­a" />
+    <Word from="Podias" to="PodĂ­as" />
+    <Word from="responsabke" to="responsable" />
+    <Word from="Todavia" to="TodavĂ­a" />
+    <Word from="envien" to="envĂ­en" />
+    <Word from="Queria" to="QuerĂ­a" />
+    <Word from="tio" to="tĂ­o" />
+    <Word from="traido" to="traĂ­do" />
+    <Word from="Asi" to="AsĂ­" />
+    <Word from="elegi" to="elegĂ­" />
+    <Word from="habria" to="habrĂ­a" />
+    <Word from="encantaria" to="encantarĂ­a" />
+    <Word from="leido" to="leĂ­do" />
+    <Word from="conocias" to="conocĂ­as" />
+    <Word from="harias" to="harĂ­as" />
+    <Word from="Aqui" to="AquĂ­" />
+    <Word from="decidi" to="decidĂ­" />
+    <Word from="mia" to="mĂ­a" />
+    <Word from="Crei" to="CreĂ­" />
+    <Word from="podiamos" to="podĂ­amos" />
+    <Word from="avisame" to="avĂ­same" />
+    <Word from="debia" to="debĂ­a" />
+    <Word from="pensarias" to="pensarĂ­as" />
+    <Word from="reuniamos" to="reunĂ­amos" />
+    <Word from="POĂŹ" to="por" />
+    <Word from="vendria" to="vendrĂ­a" />
+    <Word from="caida" to="caĂ­da" />
+    <Word from="venian" to="venĂ­an" />
+    <Word from="compañias" to="compañías" />
+    <Word from="leiste" to="leĂ­ste" />
+    <Word from="Leiste" to="LeĂ­ste" />
+    <Word from="fiaria" to="fiarĂ­a" />
+    <Word from="Hungria" to="HungrĂ­a" />
+    <Word from="fotografia" to="fotografĂ­a" />
+    <Word from="cafeteria" to="cafeterĂ­a" />
+    <Word from="Digame" to="DĂ­game" />
+    <Word from="debias" to="debĂ­as" />
+    <Word from="tendria" to="tendrĂ­a" />
+    <Word from="CĂŹGO" to="creo" />
+    <Word from="anteg" to="antes" />
+    <Word from="SĂłIo" to="Solo" />
+    <Word from="Ilamándola" to="llamándola" />
+    <Word from="Cáflaté" to="Cállate" />
+    <Word from="Ilamaste" to="llamaste" />
+    <Word from="daria" to="darĂ­a" />
+    <Word from="Iargaba" to="largaba" />
+    <Word from="Yati" to="Y a ti" />
+    <Word from="querias" to="querĂ­as" />
+    <Word from="Iimpiarlo" to="limpiarlo" />
+    <Word from="Iargado" to="largado" />
+    <Word from="galeria" to="galerĂ­a" />
+    <Word from="Bartomeu" to="Bertomeu" />
+    <Word from="Iocalizarlo" to="localizarlo" />
+    <Word from="Ilámame" to="llámame" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords />
+  <PartialLines>
+    <!-- Varios -->
+    <LinePart from="de gratis" to="gratis" />
+    <LinePart from="si quiera" to="siquiera" />
+    <LinePart from="Cada una de los" to="Cada uno de los" />
+    <LinePart from="Cada uno de las" to="Cada una de las" />
+    <!-- Uso incorrecto de haber / a ver -->
+    <LinePart from="haber que" to="a ver qué" />
+    <LinePart from="haber qué" to="a ver qué" />
+    <LinePart from="Haber si" to="A ver si" />
+    <!-- Ponombres exclamativos o interrogativos Parte 1 -->
+    <LinePart from=" que hora" to=" qué hora" />
+    <LinePart from="yo que se" to="yo qué sé" />
+    <LinePart from="Yo que se" to="Yo qué sé" />
+    <!-- Acentos al final de los signos de exclamaciĂłn -->
+    <LinePart from=" tu!" to=" tĂş!" />
+    <LinePart from=" si!" to=" sĂ­!" />
+    <LinePart from=" mi!" to=" mĂ­!" />
+    <LinePart from=" el!" to=" Ă©l!" />
+    <!-- Acentos al final de los signos de interrogaciĂłn -->
+    <LinePart from=" tu?" to=" tĂş?" />
+    <LinePart from=" si?" to=" sĂ­?" />
+    <LinePart from=" mi?" to=" mĂ­?" />
+    <LinePart from=" el?" to=" Ă©l?" />
+    <LinePart from=" aun?" to=" aĂşn?" />
+    <LinePart from=" mas?" to=" más?" />
+    <LinePart from=" que?" to=" qué?" />
+    <LinePart from=" paso?" to=" pasĂł?" />
+    <LinePart from=" cuando?" to=" cuándo?" />
+    <LinePart from=" cuanto?" to=" cuánto?" />
+    <LinePart from=" cuanta?" to=" cuánta?" />
+    <LinePart from=" cuantas?" to=" cuántas?" />
+    <LinePart from=" cuantos?" to=" cuántos?" />
+    <LinePart from=" donde?" to=" dĂłnde?" />
+    <LinePart from=" quien?" to=" quién?" />
+    <LinePart from=" como?" to=" cĂłmo?" />
+    <LinePart from=" adonde?" to=" adĂłnde?" />
+    <LinePart from=" cual?" to=" cuál?" />
+    <!-- Acentos en los signos de interrogaciĂłn completos -->
+    <LinePart from="ÂżSi?" to="ÂżSĂ­?" />
+    <LinePart from="¿esta bien?" to="¿está bien?" />
+    <!-- Enunciados que son a la vez interrogativos y exclamativos -->
+    <LinePart from="¿Pero qué haces?" to="¡¿Pero qué haces?!" />
+    <LinePart from="¿pero qué haces?" to="¡¿pero qué haces?!" />
+    <LinePart from="¿Es que no me has escuchado?" to="¡¿Es que no me has escuchado?!" />
+    <LinePart from="¡¿es que no me has escuchado?!" to="¡¿es que no me has escuchado?!" />
+    <!-- Acentos al principio de los signos de interrogaciĂłn con minĂşsculas -->
+    <LinePart from="Âżaun" to="ÂżaĂşn" />
+    <LinePart from="Âżtu " to="ÂżtĂş " />
+    <LinePart from="¿que " to="¿qué " />
+    <LinePart from="¿sabes que" to="¿sabes qué" />
+    <LinePart from="Âżsabes adonde" to="Âżsabes adĂłnde" />
+    <LinePart from="¿sabes cual" to="¿sabes cuál" />
+    <LinePart from="¿sabes quien" to="¿sabes quién" />
+    <LinePart from="Âżsabes como" to="Âżsabes cĂłmo" />
+    <LinePart from="¿sabes cuan" to="¿sabes cuán" />
+    <LinePart from="¿sabes cuanto" to="¿sabes cuánto" />
+    <LinePart from="¿sabes cuanta" to="¿sabes cuánta" />
+    <LinePart from="¿sabes cuantos" to="¿sabes cuántos" />
+    <LinePart from="¿sabes cuantas" to="¿sabes cuántas" />
+    <LinePart from="¿sabes cuando" to="¿sabes cuándo" />
+    <LinePart from="Âżsabes donde" to="Âżsabes dĂłnde" />
+    <LinePart from="¿sabe que" to="¿sabe qué" />
+    <LinePart from="Âżsabe adonde" to="Âżsabe adĂłnde" />
+    <LinePart from="¿sabe cual" to="¿sabe cuál" />
+    <LinePart from="¿sabe quien" to="¿sabe quién" />
+    <LinePart from="Âżsabe como" to="Âżsabe cĂłmo" />
+    <LinePart from="¿sabe cuan" to="¿sabe cuán" />
+    <LinePart from="¿sabe cuanto" to="¿sabe cuánto" />
+    <LinePart from="¿sabe cuanta" to="¿sabe cuánta" />
+    <LinePart from="¿sabe cuantos" to="¿sabe cuántos" />
+    <LinePart from="¿sabe cuantas" to="¿sabe cuántas" />
+    <LinePart from="¿sabe cuando" to="¿sabe cuándo" />
+    <LinePart from="Âżsabe donde" to="Âżsabe dĂłnde" />
+    <LinePart from="¿saben que" to="¿saben qué" />
+    <LinePart from="Âżsaben adonde" to="Âżsaben adĂłnde" />
+    <LinePart from="¿saben cual" to="¿saben cuál" />
+    <LinePart from="¿saben quien" to="¿saben quién" />
+    <LinePart from="Âżsaben como" to="Âżsaben cĂłmo" />
+    <LinePart from="¿saben cuan" to="¿saben cuán" />
+    <LinePart from="¿saben cuanto" to="¿saben cuánto" />
+    <LinePart from="¿saben cuanta" to="¿saben cuánta" />
+    <LinePart from="¿saben cuantos" to="¿saben cuántos" />
+    <LinePart from="¿saben cuantas" to="¿saben cuántas" />
+    <LinePart from="¿saben cuando" to="¿saben cuándo" />
+    <LinePart from="Âżsaben donde" to="Âżsaben dĂłnde" />
+    <LinePart from="¿de que" to="¿de qué" />
+    <LinePart from="Âżde donde" to="Âżde dĂłnde" />
+    <LinePart from="¿de cual" to="¿de cuál" />
+    <LinePart from="¿de quien" to="¿de quién" />
+    <LinePart from="¿de cuanto" to="¿de cuánto" />
+    <LinePart from="¿de cuanta" to="¿de cuánta" />
+    <LinePart from="¿de cuantos" to="¿de cuántos" />
+    <LinePart from="¿de cuantas" to="¿de cuántas" />
+    <LinePart from="¿de cuando" to="¿de cuándo" />
+    <LinePart from="¿sobre que" to="¿sobre qué" />
+    <LinePart from="Âżcomo " to="ÂżcĂłmo " />
+    <LinePart from="¿cual " to="¿cuál " />
+    <LinePart from="¿en cual" to="¿en cuál" />
+    <LinePart from="¿cuando" to="¿cuándo" />
+    <LinePart from="¿hasta cual" to="¿hasta cuál" />
+    <LinePart from="¿hasta quien" to="¿hasta quién" />
+    <LinePart from="¿hasta cuanto" to="¿hasta cuánto" />
+    <LinePart from="¿hasta cuantas" to="¿hasta cuántas" />
+    <LinePart from="¿hasta cuantos" to="¿hasta cuántos" />
+    <LinePart from="¿hasta cuando" to="¿hasta cuándo" />
+    <LinePart from="Âżhasta donde" to="Âżhasta dĂłnde" />
+    <LinePart from="¿hasta que" to="¿hasta qué" />
+    <LinePart from="Âżhasta adonde" to="Âżhasta adĂłnde" />
+    <LinePart from="¿desde que" to="¿desde qué" />
+    <LinePart from="¿desde cuando" to="¿desde cuándo" />
+    <LinePart from="¿desde quien" to="¿desde quién" />
+    <LinePart from="Âżdesde donde" to="Âżdesde dĂłnde" />
+    <LinePart from="¿cuanto" to="¿cuánto" />
+    <LinePart from="¿cuantos" to="¿cuántos" />
+    <LinePart from="Âżdonde" to="ÂżdĂłnde" />
+    <LinePart from="Âżadonde" to="ÂżadĂłnde" />
+    <LinePart from="¿con que" to="¿con qué" />
+    <LinePart from="¿con cual" to="¿con cuál" />
+    <LinePart from="¿con quien" to="¿con quién" />
+    <LinePart from="¿con cuantos" to="¿con cuántos" />
+    <LinePart from="¿con cuantas" to="¿con cuántas" />
+    <LinePart from="¿con cuanta" to="¿con cuánta" />
+    <LinePart from="¿con cuanto" to="¿con cuánto" />
+    <LinePart from="Âżpara donde" to="Âżpara dĂłnde" />
+    <LinePart from="Âżpara adonde" to="Âżpara adĂłnde" />
+    <LinePart from="¿para cuando" to="¿para cuándo" />
+    <LinePart from="¿para que" to="¿para qué" />
+    <LinePart from="¿para quien" to="¿para quién" />
+    <LinePart from="¿para cuanto" to="¿para cuánto" />
+    <LinePart from="¿para cuanta" to="¿para cuánta" />
+    <LinePart from="¿para cuantos" to="¿para cuántos" />
+    <LinePart from="¿para cuantas" to="¿para cuántas" />
+    <LinePart from="Âża donde" to="Âża dĂłnde" />
+    <LinePart from="¿a que" to="¿a qué" />
+    <LinePart from="¿a cual" to="¿a cuál" />
+    <LinePart from="Âża quien" to="Âża quien" />
+    <LinePart from="Âża como" to="Âża cĂłmo" />
+    <LinePart from="¿a cuanto" to="¿a cuánto" />
+    <LinePart from="¿a cuanta" to="¿a cuánta" />
+    <LinePart from="¿a cuantos" to="¿a cuántos" />
+    <LinePart from="¿a cuantas" to="¿a cuántas" />
+    <LinePart from="¿por que" to="¿por qué" />
+    <LinePart from="¿por cual" to="¿por cuál" />
+    <LinePart from="¿por quien" to="¿por quién" />
+    <LinePart from="¿por cuanto" to="¿por cuánto" />
+    <LinePart from="¿por cuanta" to="¿por cuánta" />
+    <LinePart from="¿por cuantos" to="¿por cuántos" />
+    <LinePart from="¿por cuantas" to="¿por cuántas" />
+    <LinePart from="Âżpor donde" to="Âżpor dĂłnde" />
+    <LinePart from="¿porque" to="¿por qué" />
+    <LinePart from="¿porqué" to="¿por qué" />
+    <LinePart from="¿y que" to="¿y qué" />
+    <LinePart from="Âży como" to="Âży cĂłmo" />
+    <LinePart from="¿y cuando" to="¿y cuándo" />
+    <LinePart from="¿y cual" to="¿y cuál" />
+    <LinePart from="¿y quien" to="¿y quién" />
+    <LinePart from="¿y cuanto" to="¿y cuánto" />
+    <LinePart from="¿y cuanta" to="¿y cuánta" />
+    <LinePart from="¿y cuantos" to="¿y cuántos" />
+    <LinePart from="¿y cuantas" to="¿y cuántas" />
+    <LinePart from="Âży donde" to="Âży dĂłnde" />
+    <LinePart from="Âży adonde" to="Âży adĂłnde" />
+    <LinePart from="¿quien " to="¿quién " />
+    <LinePart from="¿esta " to="¿está " />
+    <LinePart from="¿estas " to="¿estás " />
+    <!-- Acentos al principio de los signos de interrogaciĂłn con mayĂşsculas -->
+    <LinePart from="ÂżAun" to="ÂżAĂşn" />
+    <LinePart from="¿Que " to="¿Qué " />
+    <LinePart from="¿Sabes que" to="¿Sabes qué" />
+    <LinePart from="ÂżSabes adonde" to="ÂżSabes adĂłnde" />
+    <LinePart from="¿Sabes cual" to="¿Sabes cuál" />
+    <LinePart from="¿Sabes quien" to="¿Sabes quién" />
+    <LinePart from="ÂżSabes como" to="ÂżSabes cĂłmo" />
+    <LinePart from="¿Sabes cuan" to="¿Sabes cuán" />
+    <LinePart from="¿Sabes cuanto" to="¿Sabes cuánto" />
+    <LinePart from="¿Sabes cuanta" to="¿Sabes cuánta" />
+    <LinePart from="¿Sabes cuantos" to="¿Sabes cuántos" />
+    <LinePart from="¿Sabes cuantas" to="¿Sabes cuántas" />
+    <LinePart from="¿Sabes cuando" to="¿Sabes cuándo" />
+    <LinePart from="ÂżSabes donde" to="ÂżSabes dĂłnde" />
+    <LinePart from="¿Sabe que" to="¿Sabe qué" />
+    <LinePart from="ÂżSabe adonde" to="ÂżSabe adĂłnde" />
+    <LinePart from="¿Sabe cual" to="¿Sabe cuál" />
+    <LinePart from="¿Sabe quien" to="¿Sabe quién" />
+    <LinePart from="ÂżSabe como" to="ÂżSabe cĂłmo" />
+    <LinePart from="¿Sabe cuan" to="¿Sabe cuán" />
+    <LinePart from="¿Sabe cuanto" to="¿Sabe cuánto" />
+    <LinePart from="¿Sabe cuanta" to="¿Sabe cuánta" />
+    <LinePart from="¿Sabe cuantos" to="¿Sabe cuántos" />
+    <LinePart from="¿Sabe cuantas" to="¿Sabe cuántas" />
+    <LinePart from="¿Sabe cuando" to="¿Sabe cuándo" />
+    <LinePart from="ÂżSabe donde" to="ÂżSabe dĂłnde" />
+    <LinePart from="¿Saben que" to="¿Saben qué" />
+    <LinePart from="ÂżSaben adonde" to="ÂżSaben adĂłnde" />
+    <LinePart from="¿Saben cual" to="¿Saben cuál" />
+    <LinePart from="¿Saben quien" to="¿Saben quién" />
+    <LinePart from="ÂżSaben como" to="ÂżSaben cĂłmo" />
+    <LinePart from="¿Saben cuan" to="¿Saben cuán" />
+    <LinePart from="¿Saben cuanto" to="¿Saben cuánto" />
+    <LinePart from="¿Saben cuanta" to="¿Saben cuánta" />
+    <LinePart from="¿Saben cuantos" to="¿Saben cuántos" />
+    <LinePart from="¿Saben cuantas" to="¿Saben cuántas" />
+    <LinePart from="¿Saben cuando" to="¿Saben cuándo" />
+    <LinePart from="ÂżSaben donde" to="ÂżSaben dĂłnde" />
+    <LinePart from="¿De que" to="¿De qué" />
+    <LinePart from="ÂżDe donde" to="ÂżDe dĂłnde" />
+    <LinePart from="¿De cual" to="¿De cuál" />
+    <LinePart from="¿De quien" to="¿De quién" />
+    <LinePart from="¿De cuanto" to="¿De cuánto" />
+    <LinePart from="¿De cuanta" to="¿De cuánta" />
+    <LinePart from="¿De cuantos" to="¿De cuántos" />
+    <LinePart from="¿De cuantas" to="¿De cuántas" />
+    <LinePart from="¿De cuando" to="¿De cuándo" />
+    <LinePart from="¿Desde que" to="¿Desde qué" />
+    <LinePart from="¿Desde cuando" to="¿Desde cuándo" />
+    <LinePart from="¿Desde quien" to="¿Desde quién" />
+    <LinePart from="ÂżDesde donde" to="ÂżDesde dĂłnde" />
+    <LinePart from="¿Sobre que" to="¿Sobre qué" />
+    <LinePart from="ÂżComo " to="ÂżCĂłmo " />
+    <LinePart from="¿Cual " to="¿Cuál " />
+    <LinePart from="¿En cual" to="¿En cuál" />
+    <LinePart from="¿Cuando" to="¿Cuándo" />
+    <LinePart from="¿Hasta cual" to="¿Hasta cuál" />
+    <LinePart from="¿Hasta quien" to="¿Hasta quién" />
+    <LinePart from="¿Hasta cuanto" to="¿Hasta cuánto" />
+    <LinePart from="¿Hasta cuantas" to="¿Hasta cuántas" />
+    <LinePart from="¿Hasta cuantos" to="¿Hasta cuántos" />
+    <LinePart from="¿Hasta cuando" to="¿Hasta cuándo" />
+    <LinePart from="ÂżHasta donde" to="ÂżHasta dĂłnde" />
+    <LinePart from="¿Hasta que" to="¿Hasta qué" />
+    <LinePart from="ÂżHasta adonde" to="ÂżHasta adĂłnde" />
+    <LinePart from="¿Cuanto" to="¿Cuánto" />
+    <LinePart from="¿Cuantos" to="¿Cuántos" />
+    <LinePart from="ÂżDonde" to="ÂżDĂłnde" />
+    <LinePart from="ÂżAdonde" to="ÂżAdĂłnde" />
+    <LinePart from="¿Con que" to="¿Con qué" />
+    <LinePart from="¿Con cual" to="¿Con cuál" />
+    <LinePart from="¿Con quien" to="¿Con quién" />
+    <LinePart from="¿Con cuantos" to="¿Con cuántos" />
+    <LinePart from="¿Con cuanta" to="¿Con cuántas" />
+    <LinePart from="¿Con cuanta" to="¿Con cuánta" />
+    <LinePart from="¿Con cuanto" to="¿Con cuánto" />
+    <LinePart from="ÂżPara donde" to="ÂżPara dĂłnde" />
+    <LinePart from="ÂżPara adonde" to="ÂżPara adĂłnde" />
+    <LinePart from="¿Para cuando" to="¿Para cuándo" />
+    <LinePart from="¿Para que" to="¿Para qué" />
+    <LinePart from="¿Para quien" to="¿Para quién" />
+    <LinePart from="¿Para cuanto" to="¿Para cuánto" />
+    <LinePart from="¿Para cuanta" to="¿Para cuánta" />
+    <LinePart from="¿Para cuantos" to="¿Para cuántos" />
+    <LinePart from="¿Para cuantas" to="¿Para cuántas" />
+    <LinePart from="ÂżA donde" to="ÂżA dĂłnde" />
+    <LinePart from="¿A que" to="¿A qué" />
+    <LinePart from="¿A cual" to="¿A cuál" />
+    <LinePart from="ÂżA quien" to="ÂżA quien" />
+    <LinePart from="ÂżA como" to="ÂżA cĂłmo" />
+    <LinePart from="¿A cuanto" to="¿A cuánto" />
+    <LinePart from="¿A cuanta" to="¿A cuánta" />
+    <LinePart from="¿A cuantos" to="¿A cuántos" />
+    <LinePart from="¿A cuantas" to="¿A cuántas" />
+    <LinePart from="¿Por que" to="¿Por qué" />
+    <LinePart from="¿Por cual" to="¿Por cuál" />
+    <LinePart from="¿Por quien" to="¿Por quién" />
+    <LinePart from="¿Por cuanto" to="¿Por cuánto" />
+    <LinePart from="¿Por cuanta" to="¿Por cuánta" />
+    <LinePart from="¿Por cuantos" to="¿Por cuántos" />
+    <LinePart from="¿Por cuantas" to="¿Por cuántas" />
+    <LinePart from="ÂżPor donde" to="ÂżPor dĂłnde" />
+    <LinePart from="¿Porque" to="¿Por qué" />
+    <LinePart from="¿Porqué" to="¿Por qué" />
+    <LinePart from="¿Y que" to="¿Y qué" />
+    <LinePart from="ÂżY como" to="ÂżY cĂłmo" />
+    <LinePart from="¿Y cuando" to="¿Y cuándo" />
+    <LinePart from="¿Y cual" to="¿Y cuál" />
+    <LinePart from="¿Y quien" to="¿Y quién" />
+    <LinePart from="¿Y cuanto" to="¿Y cuánto" />
+    <LinePart from="¿Y cuanta" to="¿Y cuánta" />
+    <LinePart from="¿Y cuantos" to="¿Y cuántos" />
+    <LinePart from="¿Y cuantas" to="¿Y cuántas" />
+    <LinePart from="ÂżY donde" to="ÂżY dĂłnde" />
+    <LinePart from="ÂżY adonde" to="ÂżY adĂłnde" />
+    <LinePart from="¿Quien " to="¿Quién " />
+    <LinePart from="¿Esta " to="¿Está " />
+    <!-- Tilde diacrĂ­tica en oraciones interrogativas o exclamativas indirectas -->
+    <LinePart from="el porque" to="el porqué" />
+    <LinePart from="su porque" to="su porqué" />
+    <LinePart from="los porqués" to="los porqués" />
+    <!-- aĂşn -->
+    <LinePart from="aun," to="aĂşn," />
+    <LinePart from="aun no" to="aĂşn no" />
+    <!-- dé -->
+    <LinePart from=" de y " to=" dé y " />
+    <LinePart from=" nos de " to=" nos dé " />
+    <!-- tĂş -->
+    <LinePart from=" tu ya " to=" tĂş ya " />
+    <LinePart from="Tu ya " to="TĂş ya " />
+    <!-- casos especĂ­ficos antes de la coma -->
+    <LinePart from=" de, " to=" dé," />
+    <LinePart from=" mi, " to=" mĂ­," />
+    <LinePart from=" tu, " to=" tĂş," />
+    <LinePart from=" el, " to=" Ă©l," />
+    <LinePart from=" te, " to=" té," />
+    <LinePart from=" mas, " to=" más," />
+    <LinePart from=" quien, " to=" quién," />
+    <LinePart from=" cual," to=" cuál," />
+    <LinePart from="porque, " to="porqué," />
+    <LinePart from="cuanto, " to="cuánto," />
+    <LinePart from="cuando, " to="cuándo," />
+    <!-- sé -->
+    <LinePart from=" se," to=" sé," />
+    <LinePart from="se donde" to="sé dónde" />
+    <LinePart from="se cuando" to="sé cuándo" />
+    <LinePart from="se adonde" to="sé adónde" />
+    <LinePart from="se como" to="sé cómo" />
+    <LinePart from="se cual" to="sé cuál" />
+    <LinePart from="se quien" to="sé quién" />
+    <LinePart from="se cuanto" to="sé cuánto" />
+    <LinePart from="se cuanta" to="sé cuánta" />
+    <LinePart from="se cuantos" to="sé cuántos" />
+    <LinePart from="se cuantas" to="sé cuántas" />
+    <LinePart from="se cuan" to="sé cuán" />
+    <!-- si/sĂ­ -->
+    <LinePart from=" el si " to=" el sĂ­ " />
+    <LinePart from="si mismo" to="sĂ­ mismo" />
+    <LinePart from="si misma" to="sĂ­ misma" />
+    <!-- Errores de "l" en vez de "i" en casos especĂ­ficos -->
+    <LinePart from=" llegal" to=" ilegal" />
+    <LinePart from=" lluminar" to=" iluminar" />
+    <LinePart from="sllbato" to="silbato" />
+    <LinePart from="sllenclo" to="silencio" />
+    <LinePart from="clemencla" to="clemencia" />
+    <LinePart from="socledad" to="sociedad" />
+    <LinePart from="tlene" to="tiene" />
+    <LinePart from="tlempo" to="tiempo" />
+    <LinePart from="equlvocaba" to="equivocaba" />
+    <LinePart from="qulnce" to="quince" />
+    <LinePart from="comlen" to="comien" />
+    <LinePart from="historl" to="histori" />
+    <LinePart from="misterl" to="misteri" />
+    <LinePart from="vivencl" to="vivenci" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines>
+    <Ending from=".»." to="»." />
+  </EndLines>
+  <WholeLines>
+    <!-- Todas las lĂ­neas -->
+    <Line from="No" to="No." />
+  </WholeLines>
+  <RegularExpressions>
+    <!-- Abreviaturas compuestas -->
+    <RegEx find="\b[Ss](r|ra|rta)\b\.?" replaceWith="S$1." />
+    <RegEx find="\b[Dd](r|ra)\b\.?" replaceWith="D$1." />
+    <RegEx find="\b[Uu](d|ds)\b\.?" replaceWith="U$1." />
+    <RegEx find="(\d)(\s){0,1}([Aa])(\.){0,1}([Mm])(\.){0,1}(\W){0,1}" replaceWith="$1 a. m.$7" />
+    <RegEx find="(\d)(\s){0,1}([Pp])(\.){0,1}([Mm])(\.){0,1}(\W){0,1}" replaceWith="$1 p. m.$7" />
+    <RegEx find="(\d)(\s){0,1}(h)(s\b|r\b|rs\b){0,1}(\.){0,1}(\W){0,1}" replaceWith="$1 $3$6" />
+    <RegEx find="(\d)(\s){0,1}([Kk])(m\b|ms\b)(\.){0,1}(\W){0,1}" replaceWith="$1 km$6" />
+    <RegEx find="(\d)(\s){0,1}(s)(g\b|eg\b){0,1}(\.){0,1}(\W){0,1}" replaceWith="$1 s$6" />
+    <RegEx find="(\d)(\s){0,1}([Kk])(g\b|gs\b)(\.){0,1}(\W){0,1}" replaceWith="$1 kg$6" />
+    <RegEx find="(\d)(\s){0,1}(m)(t\b|ts\b){0,1}(\.){0,1}(\W){0,1}" replaceWith="$1 m$6" />
+    <RegEx find="(\d)KBs(\W){0,1}" replaceWith="$1 kB$2" />
+    <RegEx find="([Nn])°(\s){0,1}(\d)" replaceWith="$1.° $3" />
+    <RegEx find="([Nn])ro(\.){0,1}(\s){0,1}(\d)" replaceWith="$1.° $4" />
+    <!-- Signos invertidos -->
+    <RegEx find="\?Âż(\W|\w)" replaceWith="? Âż$1" />
+    <RegEx find="\!¡(\W|\w)" replaceWith="! ¡$1" />
+    <RegEx find="\?¿¿(\W|\w)" replaceWith="? ¿$1" />
+    <RegEx find="\!¡¡(\W|\w)" replaceWith="! ¡$1" />
+    <!-- Inicio de lĂ­nea -->
+    <RegEx find="^_(\s)" replaceWith="-$1" />
+    <RegEx find="^_(\w)" replaceWith="- $1" />
+    <!-- Uso de comillas segĂşn la recomendaciĂłn de la RAE y la Wikipedia -->
+    <RegEx find="(«[^“«»]+)«" replaceWith="$1“" />
+    <RegEx find="(“[^«»”]+)»" replaceWith="$1”" />
+    <RegEx find="`" replaceWith="â€" />
+    <RegEx find="´" replaceWith="’" />
+    <RegEx find="([\wá-ú])(\.)(«|»)" replaceWith="$1»." />
+    <RegEx find="«(\?)" replaceWith="»?" />
+    <RegEx find="«(\!)" replaceWith="»!" />
+    <RegEx find="«\s" replaceWith="» " />
+    <RegEx find="«(\))" replaceWith="»)" />
+    <RegEx find="(\?)«" replaceWith="?»" />
+    <RegEx find="(\!)«" replaceWith="!»" />
+    <RegEx find="«(,)" replaceWith="»," />
+    <RegEx find="«(;)" replaceWith="»;" />
+    <RegEx find="«(:)" replaceWith="»:" />
+    <RegEx find="(¿)»" replaceWith="¿«" />
+    <RegEx find="(¡)»" replaceWith="¡«" />
+    <!-- Uso de comillas (ANSI) según la recomendación de la RAE («\x22» es el carácter «"») -->
+    <RegEx find="([\wá-ú])([\.,]) ?[\x22»]" replaceWith="$1»$2" />
+    <RegEx find="([\wá-ú])\?[\x22»](\s|$)" replaceWith="$1?».$2" />
+    <RegEx find="^(\.\.\.)(\s){0,1}\x22" replaceWith="$1«" />
+    <RegEx find="«\x22" replaceWith="«" />
+    <RegEx find="\x22»" replaceWith="»" />
+    <RegEx find="^\x22{2,}" replaceWith="«" />
+    <RegEx find="\x22{2,}$" replaceWith="»" />
+    <RegEx find="\x22\r" replaceWith="»" />
+    <RegEx find="^\x22" replaceWith="«" />
+    <RegEx find="\x22$" replaceWith="»." />
+    <RegEx find="([\wá-ú])\.[\x22»]" replaceWith="$1»." />
+    <RegEx find="\s\x22" replaceWith=" «" />
+    <RegEx find="\x22\s" replaceWith="» " />
+    <RegEx find="\x22(,)" replaceWith="»," />
+    <RegEx find="\x22(\.)" replaceWith="»." />
+    <RegEx find="\x22(;)" replaceWith="»;" />
+    <RegEx find="\x22(:)" replaceWith="»:" />
+    <RegEx find="(\!)\x22" replaceWith="!»" />
+    <RegEx find="\x22(\!)" replaceWith="»!" />
+    <RegEx find="(\?)\x22" replaceWith="?»" />
+    <RegEx find="\x22(\?)" replaceWith="»?" />
+    <RegEx find="\x22(¿)" replaceWith="«¿" />
+    <RegEx find="(¿)\x22" replaceWith="¿«" />
+    <RegEx find="\x22(¡)" replaceWith="«¡" />
+    <RegEx find="(¡)\x22" replaceWith="¡«" />
+    <RegEx find="\x22(\))" replaceWith="»)" />
+    <RegEx find="(\))\x22" replaceWith=")»" />
+    <RegEx find="(\()\x22" replaceWith="(«" />
+    <!-- Uso de comillas (Unicode) según la recomendación de la RAE («\u0022» es el carácter «"») -->
+    <RegEx find="^(\.\.\.)(\s){0,1}\u0022" replaceWith="$1«" />
+    <RegEx find="^\u0022{2,}" replaceWith="«" />
+    <RegEx find="\u0022{2,}$" replaceWith="»" />
+    <RegEx find="\u0022\r" replaceWith="»" />
+    <RegEx find="^\u0022" replaceWith="«" />
+    <RegEx find="\u0022$" replaceWith="»" />
+    <RegEx find="(\w)(\.)\u0022" replaceWith="$1»." />
+    <RegEx find="\s\u0022" replaceWith=" «" />
+    <RegEx find="\u0022\s" replaceWith="» " />
+    <RegEx find="\u0022(,)" replaceWith="»," />
+    <RegEx find="\u0022(\.)" replaceWith="»." />
+    <RegEx find="\u0022(;)" replaceWith="»;" />
+    <RegEx find="\u0022(:)" replaceWith="»:" />
+    <RegEx find="(\!)\u0022" replaceWith="!»" />
+    <RegEx find="\u0022(\!)" replaceWith="»!" />
+    <RegEx find="(\?)\u0022" replaceWith="?»" />
+    <RegEx find="\u0022(\?)" replaceWith="»?" />
+    <RegEx find="\u0022(¿)" replaceWith="«¿" />
+    <RegEx find="(¿)\u0022" replaceWith="¿«" />
+    <RegEx find="\u0022(¡)" replaceWith="«¡" />
+    <RegEx find="(¡)\u0022" replaceWith="¡«" />
+    <RegEx find="\u0022(\))" replaceWith="»)" />
+    <RegEx find="(\))\u0022" replaceWith=")»" />
+    <RegEx find="(\()\u0022" replaceWith="(«" />
+    <!-- NumeraciĂłn -->
+    <RegEx find="([0-9])\.([0-9])\b" replaceWith="$1,$2" />
+    <RegEx find="(^|\s|[¡¿«])([0-9])(,|\.)?([0-9]{3})\b" replaceWith="$1$2$4" />
+    <RegEx find="(\d)\s(?=\d{2}\b)" replaceWith="$1-" />
+    <!-- "1 :", "2 :"... "n :" a "n:" -->
+    <RegEx find="(\d) ([:;])" replaceWith="$1$2" />
+    <!-- Corregir las comas y puntos por ej. «, ,» por «,» & «,,,» o similar por «...» -->
+    <RegEx find="(\.\.\.+)$" replaceWith="..." />
+    <RegEx find="(, ,+)$" replaceWith="," />
+    <RegEx find="(,\s),+\s" replaceWith="$1" />
+    <RegEx find="(\.\.\.),$" replaceWith="$1" />
+    <RegEx find="([\wá-ú])(\.\.)$" replaceWith="$1." />
+    <!-- Puntos innecesarios (complemento) -->
+    <RegEx find="([\w\W]\.{3})([¡¿])" replaceWith="$1 $2" />
+    <RegEx find="(\w)\.\.(\s)" replaceWith="$1.$2" />
+    <RegEx find="([\wá-ú\x22»])\.([\?\!])" replaceWith="$1$2" />
+    <RegEx find="([\:\;])\." replaceWith="$1" />
+    <RegEx find="\.([\:\;])" replaceWith="$1" />
+    <RegEx find="\:+" replaceWith=":" />
+    <!-- Terminaciones ciĂłn/siĂłn -->
+    <RegEx find="([sc]i)o(n)\b" replaceWith="$1Ăł$2" />
+    <RegEx find="([SC]I)O(N)\b" replaceWith="$1Ă“$2" />
+    <!-- "i" en vez de "l" en terminaciones «clón» -->
+    <RegEx find="clĂłn\b" replaceWith="ciĂłn" />
+    <!-- "si" en vez de "sl" -->
+    <RegEx find="\b([Ss])(l)\b" replaceWith="$1i" />
+    <!-- Para corregir por ej. raclones, perforaclones, opclones, etc -->
+    <RegEx find="([Rr]ac)l(o)" replaceWith="$1i$2" />
+    <RegEx find="([Oo]pc)l(o)" replaceWith="$1i$2" />
+    <!-- Para corregir por ej. tenldo, vĂ­ctlmas, olvldarlo, legĂ­tlmo, etc -->
+    <RegEx find="([BbCcDdFfHhMmNnRrSsTtVv])l([bcdhmnrstv])" replaceWith="$1i$2" />
+    <!-- Corrige los errores en el ripeo de la «o» mayúscula por el cero «0» y viceversa -->
+    <RegEx find="(\d)O" replaceWith="$1 0" />
+    <RegEx find="(\d)[,\.]O" replaceWith="$1.0" />
+    <RegEx find="([A-Z])0" replaceWith="$1O" />
+    <RegEx find="\b0([A-Za-z])" replaceWith="O$1" />
+    <!-- Signos musicales -->
+    <RegEx find="[♪♫âşâąâ™ĄÂ©â®âŻÎŁâžâ‰ˇâ‡’Ď€#](\r\n)[♪♫âşâąâ™ĄÂ©â®âŻÎŁâžâ‰ˇâ‡’Ď€#]" replaceWith="$1" />
+    <!-- Tilde diacrĂ­tica antes del punto -->
+    <RegEx find="(\s)([dst])e\.(\s|\$)" replaceWith="$1$2Ă©.$3" />
+    <RegEx find="(\s)mi\.(\s|\$)" replaceWith="$1mĂ­.$2" />
+    <RegEx find="(\s)el\.(\s|\$)" replaceWith="$1Ă©l.$2" />
+    <RegEx find="(\s)tu\.(\s|\$)" replaceWith="$1tĂş.$2" />
+    <RegEx find="(\s)si\.(\s|\$)" replaceWith="$1sĂ­.$2" />
+    <RegEx find="(\s)aun\.(\s|\$)" replaceWith="$1aĂşn.$2" />
+    <RegEx find="(\s)mas\.(\s|\$)" replaceWith="$1más.$2" />
+    <RegEx find="(\s)quien\.(\s|\$)" replaceWith="$1quién.$2" />
+    <RegEx find="(\s)cual\.(\s|\$)" replaceWith="$1cuál.$2" />
+    <RegEx find="(\s)que\.(\s|\$)" replaceWith="$1qué.$2" />
+    <RegEx find="(\s)porque\.(\s|\$)" replaceWith="$1porqué.$2" />
+    <RegEx find="(\s)cuanto\.(\s|\$)" replaceWith="$1cuánto.$2" />
+    <RegEx find="(\s)cuando\.(\s|\$)" replaceWith="$1cuándo.$2" />
+    <!-- Prefijos; palabras compuestas (simple) -->
+    <RegEx find="(\b[Ee]x|\b[Ss]uper|\b[Aa]nti|\b[Pp]os|\b[Pp]re|\b[Pp]ro|\b[Vv]ice)[\s\x2D]([a-zá-ú]{3,20})(\b)" replaceWith="$1$2" />
+    <!-- Prefijos; palabras compuestas (nĂşmeros) -->
+    <RegEx find="(\b[Ss]ub|\b[Ss]uper)[\s\x2D](\d{2})(\b)" replaceWith="$1-$2$3" />
+    <!-- Prefijos; palabras compuestas (mayĂşsculas) -->
+    <RegEx find="(\b[Aa]nti|\b[Mm]ini|\b[Pp]os|\b[Pp]ro)\s([A-Z]{1,10})([A-Z][a-zá-ú]){0,10}(\b)" replaceWith="$1-$2$3" />
+    <!-- Casos de mayĂşsculas con dos puntos -->
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(a)" replaceWith="$1A" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(b)" replaceWith="$1B" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(c)" replaceWith="$1C" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(d)" replaceWith="$1D" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(e)" replaceWith="$1E" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(f)" replaceWith="$1F" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(g)" replaceWith="$1G" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(h)" replaceWith="$1H" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(i)" replaceWith="$1I" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(j)" replaceWith="$1J" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(k)" replaceWith="$1K" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(l)" replaceWith="$1L" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(m)" replaceWith="$1M" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(n)" replaceWith="$1N" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(ñ)" replaceWith="$1Ñ" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(o)" replaceWith="$1O" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(p)" replaceWith="$1P" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(q)" replaceWith="$1Q" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(r)" replaceWith="$1R" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(s)" replaceWith="$1S" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(t)" replaceWith="$1T" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(u)" replaceWith="$1U" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(v)" replaceWith="$1V" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(w)" replaceWith="$1W" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(x)" replaceWith="$1X" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(y)" replaceWith="$1Y" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(z)" replaceWith="$1Z" />
+    <RegEx find="([\wá-Ăş]:\s[«\x22]?)(á)" replaceWith="$1Ă" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(é)" replaceWith="$1É" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(í)" replaceWith="$1Í" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(ó)" replaceWith="$1Ó" />
+    <RegEx find="([\wá-ú]:\s[«\x22]?)(ú)" replaceWith="$1Ú" />
+    <!-- Usos correctos de la coma -->
+    <RegEx find="(\b[Pp]ero),(\s)([¡¿])" replaceWith="$1$2$3" />
+    <RegEx find="(\b[Aa]unque),(\s|$)" replaceWith="$1$2" />
+    <!-- Vocativos -->
+    <RegEx find="(\bHola|\bBueno|\bBien|\bVen|\bVen acá|\besto|\bBuenos días|\bFeliz cumpleaños|\bsiento)\s([A-Z][a-zá-ú]{3,12}\b|seño(r|ra|rita)\b|hij(o|a) mío\b|amig(o|a)\b)" replaceWith="$1, $2" />
+    <!-- «aún» cuando son sinónimos de «incluso» o «hasta» -->
+    <RegEx find="(\W|^)(\b[Aa])Ăş(n)(\s)(asĂ­\b|cuando\b|los\b|las\b|negar(te|se)\b)" replaceWith="$1$2u$3$4$5" />
+    <RegEx find="(\b[Nn]i)(\s)(a)Ăş(n)(\W|$)" replaceWith="$1$2$3u$4$5" />
+    <!-- «sí» -->
+    <RegEx find="\b([Ss])i(:|;|\.)" replaceWith="$1Ă­$2" />
+    <!-- «sé» -->
+    <RegEx find="(\b[Ll]o|\b[Ll]a|\b[Ll]e)(\s)se(\W|$)" replaceWith="$1$2sé$3" />
+    <RegEx find="[Ss]e\s(dónde\b|cuándo\b|adónde\b|cómo\b|cuál\b|quién\b|cuánto\b|cuánta\b|cuántos\b|cuántas\b|cuán\b)" replaceWith="sé $1" />
+    <!-- «té» -->
+    <RegEx find="\b([Tt])e\s(verde\b|negro\b|perla\b|de manzanilla\b|de lim[Ăło]n\b|de jazm[Ă­i]n\b)" replaceWith="$1Ă© $2" />
+    <!-- ApĂłstrofo -->
+    <RegEx find="(\b[A-Z][a-zá-ú]{3,12})\s(’|')(\d\d(\s|$))" replaceWith="$1 $3" />
+    <RegEx find="(\b[A-Z]{2,5})(’|')(s)" replaceWith="(Ej. Devedés)$1$3" />
+    <RegEx find="(\b\d{1,2})(’|')(\d{2})\s(s|m)(\W|$)" replaceWith="$1,$3 $4$5" />
+    <RegEx find="(\b\d{1,2})(’|')(\d{2})\s(h)(\W|$)" replaceWith="$1:$3 $4$5" />
+    <!-- Porcentaje (debe llevar espacio) -->
+    <RegEx find="(\b\d{1,3})%(\W)" replaceWith="$1 %$2" />
+    <!-- Haz/has -->
+    <RegEx find="(\b)([Hh])as\s(la\b|lo\b|clic\b)(\W)" replaceWith="$1$2az $3$4" />
+    <RegEx find="(\b)([Hh])az\s(de\b)(\W)" replaceWith="$1$2as $3$4" />
+    <RegEx find="(\b)([Hh])as(le\b|nos\b|me\b)(\W)" replaceWith="$1$2az$3$4" />
+    <!-- Quitar itálicas en 3 o menos letras -->
+    <RegEx find="\x3ci\x3e(.{1,3})\x3c\/i\x3e" replaceWith="$1" />
+    <!-- Miscelánea -->
+    <RegEx find="(\b[Cc]erca|\b[Ee]ncima|\b[Dd]ebajo|\b[Dd]etrás|\b[Dd]elante)(\s)mío" replaceWith="$1 de mí" />
+    <RegEx find="(\b[Cc]erca|\b[Ee]ncima|\b[Dd]ebajo|\b[Dd]etrás|\b[Dd]elante)(\s)tuyo" replaceWith="$1 de ti" />
+    <!-- Punto antes de «¿» y «¡» -->
+    <RegEx find="([\wá-ú»])\s(?=(Âż|¡)[A-ZĂ-Ăš])" replaceWith="$1. " />
+    <!-- Espacios después del guión -->
+    <RegEx find="(^|\n)(-)([^\s])" replaceWith="$1$2 $3" />
+    <!-- Punto antes del guiĂłn -->
+    <RegEx find="([^\.\?\!]) - " replaceWith="$1. - " />
+    <!-- Terminaciones en «ólogo», «ílogo» y «álogo» -->
+    <RegEx find="\Bo(log[ao]s?\b)" replaceWith="Ăł$1" />
+    <RegEx find="\Ba(log[ao]s?\b)" replaceWith="á$1" />
+    <RegEx find="\Bi(log[ao]s?\b)" replaceWith="Ă­$1" />
+
+    <RegEx find="\bIes\b" replaceWith="les" />
+    <RegEx find="\bIos\b" replaceWith="los" />
+  </RegularExpressions>
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml
new file mode 100644
index 000000000..7b682c6fd
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/srp_OCRFixReplaceList.xml
@@ -0,0 +1,268 @@
+<!-- Credit goes to: MilanRS [http://www.prijevodi-online.org] -->
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="ču" to="ću" />
+    <Word from="češ" to="ćeš" />
+    <Word from="če" to="će" />
+    <Word from="ćš" to="ćeš" />
+    <Word from="ćmo" to="ćemo" />
+    <Word from="ćte" to="ćete" />
+    <Word from="čemo" to="ćemo" />
+    <Word from="čete" to="ćete" />
+    <Word from="djete" to="dijete" />
+    <Word from="Hey" to="Hej" />
+    <Word from="hey" to="hej" />
+    <Word from="htjeo" to="htio" />
+    <Word from="iči" to="ići" />
+    <Word from="jel" to="je l'" />
+    <Word from="Jel" to="Je l'" />
+    <Word from="Nebi" to="Ne bi" />
+    <Word from="Nebih" to="Ne bih" />
+    <Word from="nebi" to="ne bi" />
+    <Word from="nebih" to="ne bih" />
+    <Word from="nedaj" to="ne daj" />
+    <Word from="Nedaj" to="Ne daj" />
+    <Word from="nedam" to="ne dam" />
+    <Word from="Nedam" to="Ne dam" />
+    <Word from="nedaš" to="ne daš" />
+    <Word from="Nedaš" to="Ne daš" />
+    <Word from="nemogu" to="ne mogu" />
+    <Word from="Nemogu" to="Ne mogu" />
+    <Word from="nemora" to="ne mora" />
+    <Word from="Nemora" to="Ne mora" />
+    <Word from="nemoraš" to="ne moraš" />
+    <Word from="Nemoraš" to="Ne moraš" />
+    <Word from="predamnom" to="preda mnom" />
+    <Word from="Predamnom" to="Preda mnom" />
+    <Word from="Rješit" to="Riješit" />
+    <Word from="samnom" to="sa mnom" />
+    <Word from="Samnom" to="Sa mnom" />
+    <Word from="smjeo" to="smio" />
+    <Word from="uopče" to="uopće" />
+    <Word from="Uopče" to="Uopće" />
+    <Word from="umijesto" to="umjesto" />
+    <Word from="Umijesto" to="Umjesto" />
+    <Word from="uspiješan" to="uspješan" />
+    <Word from="uvjek" to="uvijek" />
+    <Word from="Uvjek" to="Uvijek" />
+    <Word from="valda" to="valjda" />
+    <Word from="zamnom" to="za mnom" />
+    <Word from="Zamnom" to="Za mnom" />
+    <Word from="Ĺľelila" to="Ĺľeljela" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords>
+    <WordPart from="¤" to="o" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="IVI" to="M" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="lVl" to="M" />
+  </PartialWords>
+  <PartialLines>
+    <LinePart from="bi smo" to="bismo" />
+    <LinePart from="dali je" to="da li je" />
+    <LinePart from="dali si" to="da li si" />
+    <LinePart from="Dali si" to="Da li si" />
+    <LinePart from="Jel sam ti" to="Jesam li ti" />
+    <LinePart from="Jel si" to="Jesi li" />
+    <LinePart from="Jel' si" to="Jesi li" />
+    <LinePart from="Je I'" to="Jesi li" />
+    <LinePart from="Jel si to" to="Jesi li to" />
+    <LinePart from="Jel' si to" to="Da li si to" />
+    <LinePart from="jel si to" to="da li si to" />
+    <LinePart from="jel' si to" to="jesi li to" />
+    <LinePart from="Jel si ti" to="Da li si ti" />
+    <LinePart from="Jel' si ti" to="Da li si ti" />
+    <LinePart from="jel si ti" to="da li si ti" />
+    <LinePart from="jel' si ti" to="da li si ti" />
+    <LinePart from="jel ste " to="jeste li " />
+    <LinePart from="Jel ste" to="Jeste li" />
+    <LinePart from="jel' ste " to="jeste li " />
+    <LinePart from="Jel' ste " to="Jeste li " />
+    <LinePart from="Jel su " to="Jesu li " />
+    <LinePart from="Jel da " to="Zar ne" />
+    <LinePart from="jel da " to="zar ne" />
+    <LinePart from="jel'da " to="zar ne" />
+    <LinePart from="Jeli sve " to="Je li sve" />
+    <LinePart from="Jeli on " to="Je li on" />
+    <LinePart from="Jeli ti " to="Je li ti" />
+    <LinePart from="jeli ti " to="je li ti" />
+    <LinePart from="Jeli to " to="Je li to" />
+    <LinePart from="Nebrini" to="Ne brini" />
+    <LinePart from="ne ću" to="neću" />
+    <LinePart from="od kako" to="otkako" />
+    <LinePart from="Si dobro" to="Jesi li dobro" />
+    <LinePart from="Svo vreme" to="Sve vrijeme" />
+    <LinePart from="Svo vrijeme" to="Sve vrijeme" />
+    <LinePart from="Cijelo vrijeme" to="Sve vrijeme" />
+  </PartialLines>
+  <PartialLinesAlways />
+  <BeginLines />
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions>
+    <RegEx find="ÄŤ" replaceWith="č" />
+    <RegEx find="Ă„" replaceWith="ÄŤ" />
+    <RegEx find="ć" replaceWith="ć" />
+    <RegEx find="Ă„â€" replaceWith="Ä‘" />
+    <RegEx find="Ĺľ" replaceWith="ž" />
+    <RegEx find="Ă…Âľ" replaceWith="Ĺľ" />
+    <RegEx find="š" replaceWith="š" />
+    <RegEx find="Å¡" replaceWith="š" />
+    <RegEx find="Ă„Ĺš" replaceWith="ÄŚ" />
+    <RegEx find="Ă„Ĺ’" replaceWith="ÄŚ" /> 
+    <RegEx find="Ć" replaceWith="Ć" />
+    <RegEx find="Äą " replaceWith="Ĺ " />
+    <RegEx find="Ă… " replaceWith="Ĺ " />
+    <RegEx find="Ĺ˝" replaceWith="Ž" />
+    <RegEx find="Ž" replaceWith="Ž" />
+    <RegEx find="Ä‘Ĺľ" replaceWith="dĹľ" />
+    <RegEx find="ajsmiješnij" replaceWith="ajsmješnij" />
+    <RegEx find="boži[čć]([aeiu]|em|ima)?\b" replaceWith="Božić$1" />
+    <RegEx find=" g-dine\.$" replaceWith=" gospodine." />
+    <RegEx find=" g-dine +(?=[A-ZÄŚÄĹ Ĺ˝])" replaceWith=" g. " />
+    <RegEx find="([gG])dine? +(?=[A-ZÄŚÄĹ Ĺ˝])" replaceWith="$1. " />
+    <RegEx find="([gG])-Ä‘o +(?=[A-ZÄŚÄĹ Ĺ˝])" replaceWith="$1gÄ‘o " />
+    <RegEx find="gdina +(?=[A-ZÄŚÄĹ Ĺ˝])" replaceWith="g. " />
+    <RegEx find=" gosp +" replaceWith=" g. " />
+    <RegEx find="([hH])oč" replaceWith="$1oć" />
+    <RegEx find="Jel si sigur" replaceWith="Jesi li sigur" />
+    <RegEx find="Jel' si sigur" replaceWith="Jesi li sigur" />
+    <RegEx find="\b([jJ])el\?" replaceWith="$1e l'?" />
+    <RegEx find="\bJel'" replaceWith="Je l'" />
+    <RegEx find="([kK]alib(?:ar|r[aeui]))\. *([0-9])" replaceWith="$1 .$2" />
+    <RegEx find="([mM])jenja(?!ÄŤ)" replaceWith="$1ijenja" />
+    <RegEx find="oguč" replaceWith="oguć" />
+    <RegEx find="\b([nN])eč([ue]š?|emo|ete)\b" replaceWith="$1eć$2" />
+    <RegEx find="emo[zĹľ]e" replaceWith="e moĹľe" />
+    <RegEx find="\b([nN])ezna([šm]o?|t[ei]|ju|jući|vši)?\b" replaceWith="$1e zna$2" />
+    <RegEx find="najcijenjen" replaceWith="najcjenjen" />
+    <RegEx find="N[jJ]u Jork" replaceWith="Njujork" />
+    <RegEx find="([oO])d([kp])" replaceWith="$1t$2" />
+    <RegEx find="ruĹľij" replaceWith="ruĹľj" />
+    <RegEx find="([oO])sječa" replaceWith="$1sjeća" />
+    <RegEx find="([pPdD])onje([lt])" replaceWith="$1onije$2" />
+    <RegEx find="([pP])objedi([mšto])" replaceWith="$1obijedi$2" />
+    <RegEx find="ed([ph])" replaceWith="et$1" />
+    <RegEx find="rimjeti" replaceWith="rimijeti" />
+    <RegEx find="romjeni([mštol])" replaceWith="romijeni$1" />
+    <RegEx find="azumijeć" replaceWith="azumjeć" />
+    <RegEx find="([Cc])jepljen" replaceWith="$1ijepljen" />
+    <RegEx find="rimjenjen" replaceWith="rimijenjen" />
+    <RegEx find="([^d])rješit" replaceWith="$1riješit" />
+    <RegEx find="lijede[čć]([aeiu]|e[mg])" replaceWith="ljedeć$1" />
+    <RegEx find="([sS])mješno" replaceWith="$1miješno" />
+    <RegEx find="spijeh" replaceWith="spjeh" />
+    <RegEx find="spiješn" replaceWith="spješn" />
+    <RegEx find="\b([vV])eč([aiu]|[ei][mg]|ih|ima|in[iu]|uom|o[mj])?\b" replaceWith="$1eć$2" />
+    <RegEx find="([zZ])ahtjeva([ojlmšt])" replaceWith="$1ahtijeva$2" />
+    <RegEx find="([ks]ao)\.:" replaceWith="$1:" />
+    <RegEx find="(?&lt;=[a-zčđšž])Ij(?=[a-zčđšž])" replaceWith="lj" />
+    <RegEx find="(?&lt;=[^A-ZÄŚÄĹ Ĺ˝a-zčđšž])Iju(?=bav|d|t)" replaceWith="lju" />
+    <!-- 10kg » 10 kg   |  20cm » 20 cm   |  44dag » 44 dag -->
+    <RegEx find="\b(\d+)([a-z]{2,4})\b" replaceWith="$1 $2" />
+    <!-- 10m » 10 m -->
+    <RegEx find="([\d]){1}?m" replaceWith="$1 m" />
+    <!-- kad ima razmak između tagova </i> <i> -->
+    <!-- <RegEx find="(&gt;) +(&lt;)" replaceWith="$1$2" /> -->
+    <!-- ',"' to '",' -->
+    <RegEx find="(?&lt;=\w),&quot;(?=\s|$)" replaceWith="&quot;," />
+    <RegEx find=",\.{3}|\.{3},|\.{2} \." replaceWith="..." />
+    <!-- "1 :", "2 :"... "n :" to "n:" -->
+    <RegEx find="([0-9]) +: +(\D)" replaceWith="$1: $2" />
+    <!-- Two or more consecutive "," to "..." -->
+    <RegEx find=",{2,}" replaceWith="..." />
+    <!-- Two or more consecutive "-" to "..." -->
+    <RegEx find="-{2,}" replaceWith="..." />
+    <RegEx find="([^().])\.{2}([^().:])" replaceWith="$1...$2" />
+    <!-- separator stotica i decimalnog ostatka 1,499,000.00 -> 1.499.000,00 -->
+    <RegEx find="([0-9]{3})\.([0-9]{2}[^0-9])" replaceWith="$1,$2" />
+    <RegEx find="([0-9]),([0-9]{3}\D)" replaceWith="$1.$2" />
+    <!-- Apostrophes -->
+    <RegEx find="´´" replaceWith="&quot;" />
+    <!-- <RegEx find="[´`]" replaceWith="'" /> -->
+    <!-- <RegEx find="[“”]" replaceWith="&quot;" /> -->
+    <RegEx find="''" replaceWith="&quot;" />
+    <!-- Two or more consecutive '"' to one '"' -->
+    <RegEx find="&quot;{2,}" replaceWith="&quot;" />
+    <!-- Fix zero and capital 'o' ripping mistakes -->
+    <RegEx find="(?&lt;=[0-9]\.?)O" replaceWith="0" />
+    <RegEx find="\b0(?=[A-ZÄŚÄĹ Ĺ˝a-zčđšž])" replaceWith="O" />
+    <!-- Brisanje crte - na poÄŤetku 1. reda (i kada ima dva reda) -->
+    <RegEx find="\A- ?([A-ZÄŚÄĹ Ĺ˝a-zčđšž0-9„'&quot;]|\.{3})" replaceWith="$1" />
+    <RegEx find="\A(&lt;[ibu]&gt;)- ?" replaceWith="$1" />
+    <RegEx find="  - " replaceWith=" -" />
+    <!-- Brisanje razmaka iza crte - na poÄŤetku 2. reda -->
+    <RegEx find="(?&lt;=\n(&lt;[ibu]&gt;)?)- (?=[A-ZÄŚÄŠŽčš0-9„'&quot;&lt;])" replaceWith="-" />
+    <!-- Korigovanje crte - kad je u sredini prvog reda -->
+    <RegEx find="([.!?&quot;&gt;]) - ([A-ZÄŚÄŠŽčš'&quot;&lt;])" replaceWith="$1 -$2" />
+    <!-- Zatvoren tag pa razmak poslije crtice -->
+    <RegEx find="(&gt;) - ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="$1 -$2" />
+    <!-- Zatvoren tag pa crtica razmak -->
+    <RegEx find="(&gt;)- ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="$1-$2" />
+    <!-- Zagrada pa crtica razmak -->
+    <RegEx find="\(- ([A-ZÄŚÄŠŽčš„'&quot;])" replaceWith="(-$1" />
+    <!-- Smart space after dot -->
+    <!-- osim kad je zadnje t (rijeÄŤ kolt) -->
+    <RegEx find="(?&lt;=[a-su-zá-úñä-ü])\.(?=[^\s\n().:?!*^“”'&quot;&lt;])" replaceWith=". " />
+    <!-- Oznaka za kalibar. Npr. "Colt .45" -->
+    <!-- Da bi radilo, da bi ovaj razmak bio dozvoljen, odÄŤekirajte "Razmaci ispred taÄŤke" -->
+    <RegEx find="t\.(?=[0-9]{2})" replaceWith="t ." />
+    <!-- Joey(j)a -->
+    <RegEx find="(?&lt;=\b[A-Z][a-z])eyj(?=[a-z])" replaceWith="ey" />
+    <!-- Sređuje zarez sa razmakom -->
+    <RegEx find="(?&lt;=[A-ZÄŚÄĹ Ĺ˝a-zčđšžá-úñä-ĂĽ&quot;]),(?=[^\s(),?!“&lt;])" replaceWith=", " />
+    <RegEx find=" +,(?=[A-ZÄŚÄĹ Ĺ˝a-zčđšž])" replaceWith=", " />
+    <RegEx find=" +, +" replaceWith=", " />
+    <RegEx find=" +,$" replaceWith="," />
+    <RegEx find="([?!])-" replaceWith="$1 -" />
+    <!-- Space after last of some consecutive dots (eg. "...") -->
+    <RegEx find="(?&lt;=[a-zčđšž])(\.{3}|!)(?=[a-zčđšž])" replaceWith="$1 " />
+    <!-- Delete space after "..." that is at the beginning of the line. You may delete this line if you don't like it -->
+    <!-- <RegEx find="^\.{3} +" replaceWith="..." /> -->
+    <!-- "tekst ... tekst" mijenja u "tekst... tekst" -->
+    <RegEx find="(?&lt;=[A-ZÄŚÄĹ Ĺ˝a-zčđšž]) +\.{3} +" replaceWith="... " />
+    <RegEx find="(?&lt;=\S)\. +&quot;" replaceWith=".&quot;" />
+    <RegEx find="&quot; +\." replaceWith="&quot;." />
+    <RegEx find="(?&lt;=\S\.{3}) +&quot;(?=\s|$)" replaceWith="&quot;" />
+    <RegEx find=" +\.{3}$" replaceWith="..." />
+    <RegEx find="(?&lt;=[a-zčđšž])(?: +\.{3}|\.{2}$)" replaceWith="..." />
+    <!-- Razmak ispred zagrade -->
+    <RegEx find="(?&lt;=[A-ZÄŚÄĹ Ĺ˝a-zčđšž])\(" replaceWith=" (" />
+    <!-- Razmak iza upitnika -->
+    <RegEx find="\?(?=[A-ZÄŚÄŠŽčš])" replaceWith="? " />
+    <RegEx find="(?&lt;=^|&gt;)\.{3} +(?=[A-ZÄŚÄŠŽčš])" replaceWith="..." />
+    <!-- Brise ... kad je na poÄŤ. reda "... -->
+    <RegEx find="^&quot;\.{3} +" replaceWith="&quot;" />
+    <RegEx find="(?&lt;=[0-9])\$" replaceWith=" $$" />
+    <!-- ti š -> t š by Strider -->
+    <!-- Zamijeni sva "**ti šu*" s "**t šu*" i "**ti še*" s "**t še*" -->
+    <!-- <RegEx find="([a-z])ti (š+[eu])" replaceWith="$1t $2" /> -->
+    <!-- <RegEx find="([A-Za-z])ti( |\r?\n)(š[eu])" replaceWith="$1t$2$3" /> -->
+    <!-- <RegEx find="(?i)\b(ni)t (š[eu])" replaceWith="$1ti $2" /> -->
+    <!-- <RegEx find="\. +Mr. " replaceWith=". G. " /> -->
+    <!-- <RegEx find="\. +Mrs. " replaceWith=". GÄ‘a " /> -->
+    <!-- <RegEx find="\. +Miss " replaceWith=". GÄ‘ica " /> -->
+    <!-- <RegEx find=", +Mrs. " replaceWith=", gđo " /> -->
+    <!-- <RegEx find=", +Miss " replaceWith=", gđice " /> -->
+    <!-- Razmak poslije <i> i poslije .. -->
+    <RegEx find="^(&lt;[ibu]&gt;) +" replaceWith="$1" />
+    <RegEx find="^\.{2} +" replaceWith="..." />
+    <!-- Razmak ? "</i> -->
+    <RegEx find="([.?!]) +(&quot;&lt;)" replaceWith="$1$2" />
+    <!-- Bez razmaka kod Npr.: -->
+    <RegEx find="(?&lt;=[Nn]pr\.) *: *" replaceWith=": " />
+    <RegEx find="\. ," replaceWith=".," />
+    <RegEx find="([?!])\." replaceWith="$1" />
+    <!-- Da ne kvari potpise sa ..:: -->
+    <RegEx find="\.{3}::" replaceWith="..::" />
+    <RegEx find="::\.{3}" replaceWith="::.." />
+    <RegEx find="\.{2} +::" replaceWith="..::" />
+    <!-- Skracenice bez razmaka -->
+    <RegEx find="d\. o\.o\." replaceWith="d.o.o." />
+    <!-- Kad red poÄŤinje sa ...pa malo slovo -->
+    <!-- <RegEx find="^\.{3}([a-zčđšž&quot;&lt;])" replaceWith="$1" /> -->
+    <!-- <RegEx find=" +([.?!])" replaceWith="$1" /> -->
+  </RegularExpressions>
+</OCRFixReplaceList>
diff --git a/libs/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml b/libs/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml
new file mode 100644
index 000000000..9eadfca8a
--- /dev/null
+++ b/libs/subzero/modification/dictionaries/xml/swe_OCRFixReplaceList.xml
@@ -0,0 +1,452 @@
+<?xml version="1.0" encoding="utf-8"?>
+<OCRFixReplaceList>
+  <WholeWords>
+    <Word from="lârt" to="lärt" />
+    <Word from="hedervårda" to="hedervärda" />
+    <Word from="stormâstare" to="stormästare" />
+    <Word from="Avfârd" to="Avfärd" />
+    <Word from="tâlten" to="tälten" />
+    <Word from="ârjag" to="är jag" />
+    <Word from="ärjag" to="är jag" />
+    <Word from="jâmlikar" to="jämlikar" />
+    <Word from="Riskakofl" to="Riskakor" />
+    <Word from="Karamellen/" to="Karamellen" />
+    <Word from="LngenĂĽng" to="Ingenting" />
+    <Word from="ärju" to="är ju" />
+    <Word from="Sá" to="Så" />
+    <Word from="närjag" to="när jag" />
+    <Word from="alltjag" to="allt jag" />
+    <Word from="görjag" to="gör jag" />
+    <Word from="trorjag" to="tror jag" />
+    <Word from="varju" to="var ju" />
+    <Word from="görju" to="gör ju" />
+    <Word from="kanju" to="kan ju" />
+    <Word from="blirjag" to="blir jag" />
+    <Word from="sägerjag" to="säger jag" />
+    <Word from="behĂĄllerjag" to="behĂĄller jag" />
+    <Word from="prøblem" to="problem" />
+    <Word from="räddadeju" to="räddade ju" />
+    <Word from="honøm" to="honom" />
+    <Word from="Ln" to="In" />
+    <Word from="svårflörtad" to="svårflörtad" />
+    <Word from="øch" to="och" />
+    <Word from="flörtar" to="flörtar" />
+    <Word from="kännerjag" to="känner jag" />
+    <Word from="flickan" to="flickan" />
+    <Word from="snø" to="snö" />
+    <Word from="gerju" to="ger ju" />
+    <Word from="køntakter" to="kontakter" />
+    <Word from="ølycka" to="olycka" />
+    <Word from="nølla" to="nolla" />
+    <Word from="sinnenajublar" to="sinnena jublar" />
+    <Word from="ijobbet" to="i jobbet" />
+    <Word from="FĂĄrjag" to="FĂĄr jag" />
+    <Word from="Ar" to="Ă„r" />
+    <Word from="liggerju" to="ligger ju" />
+    <Word from="um" to="om" />
+    <Word from="lbland" to="Ibland" />
+    <Word from="skjuterjag" to="skjuter jag" />
+    <Word from="VaddĂĄ" to="Vad dĂĄ" />
+    <Word from="pratarjämt" to="pratar jämt" />
+    <Word from="harju" to="har ju" />
+    <Word from="sitterjag" to="sitter jag" />
+    <Word from="häfla" to="härja" />
+    <Word from="sď¬Ă¤l" to="stjäl" />
+    <Word from="FÖU" to="Följ" />
+    <Word from="varförjag" to="varför jag" />
+    <Word from="sď¬Ă¤rna" to="stjärna" />
+    <Word from="böflar" to="börjar" />
+    <Word from="böflan" to="början" />
+    <Word from="stäri" to="står" />
+    <Word from="pä" to="på" />
+    <Word from="harjag" to="har jag" />
+    <Word from="attjag" to="att jag" />
+    <Word from="Verkarjag" to="Verkar jag" />
+    <Word from="Kännerjag" to="Känner jag" />
+    <Word from="därjag" to="där jag" />
+    <Word from="tuď¬" to="tuff" />
+    <Word from="lurarjag" to="lurar jag" />
+    <Word from="varjättebra" to="var jättebra" />
+    <Word from="allvan" to="allvar" />
+    <Word from="dethär" to="det här" />
+    <Word from="vafle" to="varje" />
+    <Word from="FöUer" to="Följer" />
+    <Word from="personalmötetl" to="personalmötet!" />
+    <Word from="harjust" to="har just" />
+    <Word from="ärjätteduktig" to="är jätteduktig" />
+    <Word from="därja" to="där ja" />
+    <Word from="lngenĂĽng" to="lngenting" />
+    <Word from="iluften" to="i luften" />
+    <Word from="ösen" to="öser" />
+    <Word from="tvâ" to="två" />
+    <Word from="Uejerna" to="Tjejerna" />
+    <Word from="hĂĄn*" to="hĂĄrt" />
+    <Word from="Ă„rjag" to="Ă„r jag" />
+    <Word from="keL" to="Okej" />
+    <Word from="Förjag" to="För jag" />
+    <Word from="varjättekul" to="var jättekul" />
+    <Word from="kämpan" to="kämpar" />
+    <Word from="mycketjobb" to="mycket jobb" />
+    <Word from="Uus" to="ljus" />
+    <Word from="serjag" to="ser jag" />
+    <Word from="vetjag" to="vet jag" />
+    <Word from="fĂĄrjag" to="fĂĄr jag" />
+    <Word from="hurjag" to="hur jag" />
+    <Word from="försökerjag" to="försöker jag" />
+    <Word from="tánagel" to="tånagel" />
+    <Word from="vaĂĽe" to="varje" />
+    <Word from="Uudet" to="ljudet" />
+    <Word from="amhopa" to="allihopa" />
+    <Word from="Väü" to="Välj" />
+    <Word from="gäri" to="går" />
+    <Word from="rödüus" to="rödljus" />
+    <Word from="Uuset" to="ljuset" />
+    <Word from="RidĂ n" to="RidĂĄn" />
+    <Word from="viĂĽa" to="vilja" />
+    <Word from="gĂĄri" to="gĂĄr i" />
+    <Word from="HurdĂĄ" to="Hur dĂĄ" />
+    <Word from="inter\/juar" to="intervjuar" />
+    <Word from="menarjag" to="menar jag" />
+    <Word from="spyrjag" to="spyr jag" />
+    <Word from="briĂĽera" to="briljera" />
+    <Word from="Närjag" to="När jag" />
+    <Word from="ner\/ös" to="nervös" />
+    <Word from="ilivets" to="i livets" />
+    <Word from="nägot" to="något" />
+    <Word from="pĂ " to="pĂĄ" />
+    <Word from="Lnnan" to="Innan" />
+    <Word from="Uf" to="Ut" />
+    <Word from="lnnan" to="Innan" />
+    <Word from="DĂ ren" to="DĂĄren" />
+    <Word from="FĂ rjag" to="FĂĄr jag" />
+    <Word from="VadärdetdäL" to="Vad är det där" />
+    <Word from="smĂ tjuv" to="smĂĄtjuv" />
+    <Word from="tĂ grĂĄnare" to="tĂĄgrĂĄnare" />
+    <Word from="ditĂ t" to="ditĂĄt" />
+    <Word from="sä" to="så" />
+    <Word from="vàrdslösa" to="vårdslösa" />
+    <Word from="nĂ n" to="nĂĄn" />
+    <Word from="kommerjag" to="kommer jag" />
+    <Word from="ärjättebra" to="är jättebra" />
+    <Word from="ärjävligt" to="är jävligt" />
+    <Word from="Ă kerjag" to="ĂĄker jag" />
+    <Word from="ellerjapaner" to="eller japaner" />
+    <Word from="attjaga" to="att jaga" />
+    <Word from="eften" to="efter" />
+    <Word from="hästan" to="hästar" />
+    <Word from="Lntensivare" to="Intensivare" />
+    <Word from="frĂ garjag" to="frĂĄgar jag" />
+    <Word from="pen/ers" to="pervers" />
+    <Word from="rĂ barkade" to="rĂĄbarkade" />
+    <Word from="styrkon" to="styrkor" />
+    <Word from="DifĂĄf" to="DitĂĄt" />
+    <Word from="händen" to="händer" />
+    <Word from="föď¬a" to="följa" />
+    <Word from="Idioten/" to="Idioter!" />
+    <Word from="Varförjagade" to="Varför jagade" />
+    <Word from="därförjag" to="därför jag" />
+    <Word from="forjag" to="for jag" />
+    <Word from="Iivsgladje" to="livsglädje" />
+    <Word from="narjag" to="när jag" />
+    <Word from="sajag" to="sa jag" />
+    <Word from="genastja" to="genast ja" />
+    <Word from="rockumentàren" to="rockumentären" />
+    <Word from="turne" to="turné" />
+    <Word from="fickjag" to="fick jag" />
+    <Word from="sager" to="säger" />
+    <Word from="IjushĂĄrig" to="ljushĂĄrig" />
+    <Word from="tradgårdsolycka" to="trädgårdsolycka" />
+    <Word from="kvavdes" to="kvävdes" />
+    <Word from="dàrja" to="där ja" />
+    <Word from="hedersgaster" to="hedersgäster" />
+    <Word from="Nar" to="När" />
+    <Word from="smakiösa" to="smaklösa" />
+    <Word from="lan" to="Ian" />
+    <Word from="Lan" to="Ian" />
+    <Word from="eri" to="er i" />
+    <Word from="universitetsamne" to="universitetsämne" />
+    <Word from="garna" to="gärna" />
+    <Word from="ar" to="är" />
+    <Word from="baltdjur" to="bältdjur" />
+    <Word from="varjag" to="var jag" />
+    <Word from="àr" to="är" />
+    <Word from="förförstàrkare" to="förförstärkare" />
+    <Word from="arjattespeciell" to="är jättespeciell" />
+    <Word from="hàrgår" to="här går" />
+    <Word from="Ia" to="la" />
+    <Word from="Iimousinen" to="limousinen" />
+    <Word from="krickettra" to="kricketträ" />
+    <Word from="hårdrockvàrlden" to="hårdrockvärlden" />
+    <Word from="tràbit" to="träbit" />
+    <Word from="Mellanvastern" to="Mellanvästern" />
+    <Word from="arju" to="är ju" />
+    <Word from="turnen" to="turnén" />
+    <Word from="kanns" to="känns" />
+    <Word from="battre" to="bättre" />
+    <Word from="vàrldsturne" to="världsturne" />
+    <Word from="dar" to="där" />
+    <Word from="sjàlvantànder" to="självantänder" />
+    <Word from="jattelange" to="jättelänge" />
+    <Word from="berattade" to="berättade" />
+    <Word from="Sä" to="Så" />
+    <Word from="vandpunkten" to="vändpunkten" />
+    <Word from="Nàrjag" to="När jag" />
+    <Word from="lasa" to="läsa" />
+    <Word from="skitlàskigt" to="skitläskigt" />
+    <Word from="sambandsvàg" to="sambandsväg" />
+    <Word from="valdigt" to="väldigt" />
+    <Word from="Stamgaď¬el" to="Stämgaffel" />
+    <Word from="àrjag" to="är jag" />
+    <Word from="tajming" to="tajmning" />
+    <Word from="utgäng" to="utgång" />
+    <Word from="Hàråt" to="Häråt" />
+    <Word from="hàråt" to="häråt" />
+    <Word from="anvander" to="använder" />
+    <Word from="harjobbat" to="har jobbat" />
+    <Word from="imageide" to="imageidé" />
+    <Word from="klaď¬en" to="klaffen" />
+    <Word from="sjalv" to="själv" />
+    <Word from="dvarg" to="dvärg" />
+    <Word from="detjag" to="det jag" />
+    <Word from="dvargarna" to="dvärgarna" />
+    <Word from="fantasivàrld" to="fantasivärld" />
+    <Word from="ď¬olliga" to="Fjolliga" />
+    <Word from="mandoiinstràngar" to="mandollnsträngar" />
+    <Word from="mittjobb" to="mitt jobb" />
+    <Word from="Skajag" to="Ska jag" />
+    <Word from="landari" to="landar i" />
+    <Word from="gang" to="gäng" />
+    <Word from="Detjag" to="Det jag" />
+    <Word from="Narmre" to="Närmre" />
+    <Word from="Iåtjavelni" to="låtjäveln" />
+    <Word from="HĂĄllerjag" to="HĂĄller jag" />
+    <Word from="visionarer" to="visionärer" />
+    <Word from="TĂĽlvad" to="Till vad" />
+    <Word from="militàrbas" to="militärbas" />
+    <Word from="jattegiada" to="jätteglada" />
+    <Word from="Fastjag" to="Fast jag" />
+    <Word from="sĂĄjag" to="sĂĄ jag" />
+    <Word from="rockvarlden" to="rockvärlden" />
+    <Word from="saknarjag" to="saknar jag" />
+    <Word from="allafall" to="alla fall" />
+    <Word from="ď¬anta" to="fjanta" />
+    <Word from="Kràma" to="Kräma" />
+    <Word from="stammer" to="stämmer" />
+    <Word from="budbàrare" to="budbärare" />
+    <Word from="Iivsfiiosofi" to="livsfiiosofi" />
+    <Word from="förjämnan" to="för jämnan" />
+    <Word from="gillarjag" to="gillar jag" />
+    <Word from="Iarvat" to="larvat" />
+    <Word from="klararjag" to="klarar jag" />
+    <Word from="hattaď¬'Ă r" to="hattaffär" />
+    <Word from="DĂ " to="DĂĄ" />
+    <Word from="uppď¬nna" to="uppfinna" />
+    <Word from="RĂ ttfĂĄglar" to="RĂĄttfĂĄglar" />
+    <Word from="Sväüboda" to="Sväljboda" />
+    <Word from="Påböflar" to="Påbörjar" />
+    <Word from="slutarju" to="slutar ju" />
+    <Word from="niď¬skebuĂĽken" to="i fiskebutiken" />
+    <Word from="härjäkeln" to="här jäkeln" />
+    <Word from="HĂźppa" to="Hoppa" />
+    <Word from="förstörds" to="förstördes" />
+    <Word from="varjättegoda" to="var jättegoda" />
+    <Word from="Kor\/" to="Korv" />
+    <Word from="brüléel" to="brülée!" />
+    <Word from="Hei" to="Hej" />
+    <Word from="älskarjordgubbsglass" to="älskar jordgubbsglass" />
+    <Word from="Snöbom" to="Snöboll" />
+    <Word from="SnöboH" to="Snöboll" />
+    <Word from="Snöbol" to="Snöboll" />
+    <Word from="snöboH" to="snöboll" />
+    <Word from="Läggerpå" to="Lägger på" />
+    <Word from="lngefl" to="lnget!" />
+    <Word from="Sägerjättesmarta" to="Säger jättesmarta" />
+    <Word from="dopplen/äderradar" to="dopplerväderradar" />
+    <Word from="säkertjättefin" to="säkert jättefin" />
+    <Word from="ärjättefin" to="är jättefin" />
+    <Word from="verkarju" to="verkar ju" />
+    <Word from="blirju" to="blir ju" />
+    <Word from="kor\/" to="korv" />
+    <Word from="naturkatastroď¬" to="naturkatastrof!" />
+    <Word from="stickerjag" to="stickerj ag" />
+    <Word from="jättebuď¬Ă©" to="jättebuffĂ©" />
+    <Word from="beď¬nner" to="befinner" />
+    <Word from="Spflng" to="Spring" />
+    <Word from="trecď¬e" to="tredje" />
+    <Word from="ryckerjag" to="rycker jag" />
+    <Word from="skullejag" to="skulle jag" />
+    <Word from="vetju" to="vet ju" />
+    <Word from="afljag" to="att jag" />
+    <Word from="flnns" to="finns" />
+    <Word from="ärlång" to="är lång" />
+    <Word from="kåra" to="kära" />
+    <Word from="ärď¬na" to="är ď¬na" />
+    <Word from="äri" to="är i" />
+    <Word from="hörden" to="hör den" />
+    <Word from="ättjäg" to="att jäg" />
+    <Word from="gär" to="går" />
+    <Word from="föri" to="för i" />
+    <Word from="Hurvisste" to="Hur visste" />
+    <Word from="ď¬ck" to="fick" />
+    <Word from="ď¬nns" to="finns" />
+    <Word from="ď¬n" to="fin" />
+    <Word from="Fa" to="Bra." />
+    <Word from="bori" to="bor i" />
+    <Word from="fiendeplanl" to="fiendeplan!" />
+    <Word from="iförnamn" to="i förnamn" />
+    <Word from="detju" to="det ju" />
+    <Word from="NĂĽd" to="Niki" />
+    <Word from="hatarjag" to="hatar jag" />
+    <Word from="Klararjag" to="Klarar jag" />
+    <Word from="detaď¬er" to="detaljer" />
+    <Word from="vä/" to="väl" />
+    <Word from="smakarju" to="smakar ju" />
+    <Word from="Teachefl" to="Teacher!" />
+    <Word from="imorse" to="i morse" />
+    <Word from="drickerjag" to="dricker jag" />
+    <Word from="stĂĄri" to="stĂĄr i" />
+    <Word from="Harjag" to="Har jag" />
+    <Word from="Talarjag" to="Talar jag" />
+    <Word from="undrarjag" to="undrar jag" />
+    <Word from="ĂĄlderjag" to="ĂĄlder jag" />
+    <Word from="vaď¬e" to="varje" />
+    <Word from="förfalskningl" to="förfalskning!" />
+    <Word from="Viď¬iiiam" to="William" />
+    <Word from="V\ď¬lliams" to="Williams" />
+    <Word from="attjobba" to="att jobba" />
+    <Word from="intei" to="inte i" />
+    <Word from="närV\ď¬lliam" to="när William" />
+    <Word from="V\ď¬lliam" to="William" />
+    <Word from="Eď¬ersom" to="Eftersom" />
+    <Word from="Vlď¬lliam" to="William" />
+    <Word from="Iängejag" to="länge jag" />
+    <Word from="'ď¬digare" to="Tidigare" />
+    <Word from="börjadei" to="började i" />
+    <Word from="merjust" to="mer just" />
+    <Word from="eď¬erĂĄt" to="efterĂĄt" />
+    <Word from="gjordejag" to="gjorde jag" />
+    <Word from="hadeju" to="hade ju" />
+    <Word from="gĂĄrvi" to="gĂĄr vi" />
+    <Word from="köperjag" to="köper jag" />
+    <Word from="MĂĄstejag" to="MĂĄste jag" />
+    <Word from="kännerju" to="känner ju" />
+    <Word from="fln" to="fin" />
+    <Word from="treviig" to="trevlig" />
+    <Word from="Grattisl" to="Grattis!" />
+    <Word from="kande" to="kände" />
+    <Word from="'llden" to="Tiden" />
+    <Word from="sakjag" to="sak jag" />
+    <Word from="klartjag" to="klart jag" />
+    <Word from="häď¬igt" to="häftigt" />
+    <Word from="Iämnarjag" to="lämnar jag" />
+    <Word from="gickju" to="gick ju" />
+    <Word from="skajag" to="ska jag" />
+    <Word from="Görjag" to="Gör jag" />
+    <Word from="mĂĄstejag" to="mĂĄste jag" />
+    <Word from="gra\/iditet" to="graviditet" />
+    <Word from="hittadqdin" to="hittade din" />
+    <Word from="ärjobbigt" to="är jobbigt" />
+    <Word from="Overdrivet" to="Ă–verdrivet" />
+    <Word from="hOgtidlig" to="högtidlig" />
+    <Word from="Overtyga" to="Ă–vertyga" />
+    <Word from="SKILSMASSA" to="SKILSMĂ„SSA" />
+    <Word from="brukarju" to="brukar ju" />
+    <Word from="lsabel" to="Isabel" />
+    <Word from="kundejag" to="kunde jag" />
+    <Word from="ärläget" to="är läget" />
+    <Word from="blirinte" to="blir inte" />
+    <Word from="ijakt" to="i jakt" />
+    <Word from="avjordens" to="av jordens" />
+    <Word from="90000O" to="900000" />
+    <Word from="9O0" to="900" />
+    <Word from="ärpå" to="är på" />
+    <Word from="ärproteserna" to="är proteserna" />
+    <Word from="ärytterst" to="är ytterst" />
+    <Word from="beborjorden" to="bebor jorden" />
+    <Word from="filmjag" to="film jag" />
+    <Word from="fokuserarpĂĄ" to="fokuserar pĂĄ" />
+    <Word from="folkjag" to="folk jag" />
+    <Word from="föreställdejag" to="föreställde jag" />
+    <Word from="förpubliken" to="för publiken" />
+    <Word from="gilladejag" to="gillade jag" />
+    <Word from="hĂĄllerpĂĄ" to="hĂĄller pĂĄ" />
+    <Word from="harpĂĄ" to="har pĂĄ" />
+    <Word from="harplaner" to="har planer" />
+    <Word from="harprylar" to="har prylar" />
+    <Word from="kommerpubliken" to="kommer publiken" />
+    <Word from="kostymerpĂĄ" to="kostymer pĂĄ" />
+    <Word from="litarpĂĄ" to="litar pĂĄ" />
+    <Word from="lngen" to="Ingen" />
+    <Word from="lnom" to="Inom" />
+    <Word from="lnte" to="Inte" />
+    <Word from="ochjag" to="och jag" />
+    <Word from="Ochjag" to="Och jag" />
+    <Word from="ochjorden" to="och jorden" />
+    <Word from="omjag" to="om jag" />
+    <Word from="Omjag" to="Om jag" />
+    <Word from="passarperfekt" to="passar perfekt" />
+    <Word from="sättetjag" to="sättet jag" />
+    <Word from="silverpĂĄ" to="silver pĂĄ" />
+    <Word from="skruvarjag" to="skruvar jag" />
+    <Word from="somjag" to="som jag" />
+    <Word from="Somjag" to="Som jag" />
+    <Word from="talarpĂĄ" to="talar pĂĄ" />
+    <Word from="tänktejag" to="tänkte jag" />
+    <Word from="tapparjag" to="tappar jag" />
+    <Word from="tittarpĂĄ" to="tittar pĂĄ" />
+    <Word from="visstejag" to="visste jag" />
+    <Word from="medjetpacks" to="med jetpacks" />
+    <Word from="sätterpå" to="sätter på" />
+    <Word from="stĂĄrpĂĄ" to="stĂĄr pĂĄ" />
+    <Word from="tillhörpå" to="tillhör på" />
+  </WholeWords>
+  <PartialWordsAlways />
+  <PartialWords>
+    <!-- Will be used to check words not in dictionary -->
+    <!-- If new word(s) exists in spelling dictionary, it(they) is accepted -->
+    <WordPart from="¤" to="o" />
+    <WordPart from="ď¬" to="fi" />
+    <WordPart from="â" to="ä" />
+    <WordPart from="/" to="l" />
+    <WordPart from="vv" to="w" />
+    <WordPart from="IVI" to="M" />
+    <WordPart from="lVI" to="M" />
+    <WordPart from="IVl" to="M" />
+    <WordPart from="lVl" to="M" />
+    <WordPart from="m" to="rn" />
+    <WordPart from="l" to="i" />
+    <WordPart from="€" to="e" />
+    <WordPart from="I" to="l" />
+    <WordPart from="c" to="o" />
+    <WordPart from="i" to="t" />
+    <WordPart from="cc" to="oo" />
+    <WordPart from="ii" to="tt" />
+    <WordPart from="n/" to="ry" />
+    <WordPart from="ae" to="æ" />
+    <!-- "f " will be two words -->
+    <WordPart from="f" to="f " />
+    <WordPart from="c" to="e" />
+    <WordPart from="o" to="e" />
+    <WordPart from="I" to="t" />
+    <WordPart from="n" to="o" />
+    <WordPart from="s" to="e" />
+    <WordPart from="å" to="ä" />
+    <WordPart from="Ă " to="ĂĄ" />
+    <WordPart from="n/" to="rv" />
+    <WordPart from="djag" to="d jag" />
+    <WordPart from="sjag" to="s jag" />
+    <WordPart from="rjag" to="r jag" />
+    <WordPart from="tjag" to="t jag" />
+    <WordPart from="ejag" to="e jag" />
+    <WordPart from="ärp" to="är p" />
+  </PartialWords>
+  <PartialLines />
+  <PartialLinesAlways />
+  <BeginLines>
+    <Beginning from="Ln " to="In " />
+    <Beginning from="U ppfattat" to="Uppfattat" />
+  </BeginLines>
+  <EndLines />
+  <WholeLines />
+  <RegularExpressions />
+</OCRFixReplaceList>
\ No newline at end of file
diff --git a/libs/subzero/modification/main.py b/libs/subzero/modification/main.py
new file mode 100644
index 000000000..05c882d9e
--- /dev/null
+++ b/libs/subzero/modification/main.py
@@ -0,0 +1,381 @@
+# coding=utf-8
+
+import traceback
+import re
+import pysubs2
+import logging
+import time
+
+from mods import EMPTY_TAG_PROCESSOR, EmptyEntryError
+from registry import registry
+from subzero.language import Language
+
+logger = logging.getLogger(__name__)
+
+
+lowercase_re = re.compile(ur'(?sux)[a-zĂ -Ĺľ]')
+
+
+class SubtitleModifications(object):
+    debug = False
+    language = None
+    initialized_mods = {}
+    mods_used = []
+    only_uppercase = False
+    f = None
+
+    font_style_tag_start = u"{\\"
+
+    def __init__(self, debug=False):
+        self.debug = debug
+        self.initialized_mods = {}
+        self.mods_used = []
+
+    def load(self, fn=None, content=None, language=None, encoding="utf-8"):
+        """
+        
+        :param encoding: used for decoding the content when fn is given, not used in case content is given
+        :param language: babelfish.Language language of the subtitle
+        :param fn:  filename
+        :param content: unicode 
+        :return: 
+        """
+        if language:
+            self.language = Language.rebuild(language, forced=False)
+        self.initialized_mods = {}
+        try:
+            if fn:
+                self.f = pysubs2.load(fn, encoding=encoding)
+            elif content:
+                self.f = pysubs2.SSAFile.from_string(content)
+        except (IOError,
+                UnicodeDecodeError,
+                pysubs2.exceptions.UnknownFPSError,
+                pysubs2.exceptions.UnknownFormatIdentifierError,
+                pysubs2.exceptions.FormatAutodetectionError):
+            if fn:
+                logger.exception("Couldn't load subtitle: %s: %s", fn, traceback.format_exc())
+            elif content:
+                logger.exception("Couldn't load subtitle: %s", traceback.format_exc())
+
+        return bool(self.f)
+
+    @classmethod
+    def parse_identifier(cls, identifier):
+        # simple identifier
+        if identifier in registry.mods:
+            return identifier, {}
+
+        # identifier with params; identifier(param=value)
+        split_args = identifier[identifier.find("(")+1:-1].split(",")
+        args = dict((key, value) for key, value in [sub.split("=") for sub in split_args])
+        return identifier[:identifier.find("(")], args
+
+    @classmethod
+    def get_mod_class(cls, identifier):
+        identifier, args = cls.parse_identifier(identifier)
+        return registry.mods[identifier]
+
+    @classmethod
+    def get_mod_signature(cls, identifier, **kwargs):
+        return cls.get_mod_class(identifier).get_signature(**kwargs)
+
+    def prepare_mods(self, *mods):
+        parsed_mods = [(SubtitleModifications.parse_identifier(mod), mod) for mod in mods]
+        final_mods = {}
+        line_mods = []
+        non_line_mods = []
+        used_mods = []
+        mods_merged = {}
+        mods_merged_log = {}
+
+        for mod_data, orig_identifier in parsed_mods:
+            identifier, args = mod_data
+            if identifier not in registry.mods:
+                logger.error("Mod %s not loaded", identifier)
+                continue
+
+            mod_cls = registry.mods[identifier]
+            # exclusive mod, kill old, use newest
+            if identifier in final_mods and mod_cls.exclusive:
+                final_mods.pop(identifier)
+
+            # language-specific mod, check validity
+            if mod_cls.languages and self.language not in mod_cls.languages:
+                if self.debug:
+                    logger.debug("Skipping %s, because %r is not a valid language for this mod",
+                                 identifier, self.language)
+                continue
+
+            if mod_cls.only_uppercase and not self.only_uppercase:
+                if self.debug:
+                    logger.debug("Skipping %s, because the subtitle isn't all uppercase", identifier)
+                continue
+
+            # merge args of duplicate mods if possible
+            elif mod_cls.args_mergeable and identifier in mods_merged:
+                mods_merged[identifier] = mod_cls.merge_args(mods_merged[identifier], args)
+                mods_merged_log[identifier]["identifiers"].append(orig_identifier)
+                continue
+
+            if mod_cls.args_mergeable:
+                mods_merged[identifier] = mod_cls.merge_args(args, {})
+                mods_merged_log[identifier] = {"identifiers": [orig_identifier], "final_identifier": orig_identifier}
+                used_mods.append("%s_ORIG_POSITION" % identifier)
+                continue
+
+            final_mods[identifier] = args
+            used_mods.append(orig_identifier)
+
+        # finalize merged mods into final and used mods
+        for identifier, args in mods_merged.iteritems():
+            pos_preserve_index = used_mods.index("%s_ORIG_POSITION" % identifier)
+
+            # clear empty mods after merging
+            if not any(args.values()):
+                if self.debug:
+                    logger.debug("Skipping %s, empty args", identifier)
+
+                if pos_preserve_index > -1:
+                    used_mods.pop(pos_preserve_index)
+
+                mods_merged_log.pop(identifier)
+                continue
+
+            # clear empty args
+            final_mod_args = dict(filter(lambda (k, v): bool(v), args.iteritems()))
+
+            _data = SubtitleModifications.get_mod_signature(identifier, **final_mod_args)
+            if _data == mods_merged_log[identifier]["final_identifier"]:
+                mods_merged_log.pop(identifier)
+            else:
+                mods_merged_log[identifier]["final_identifier"] = _data
+
+            if pos_preserve_index > -1:
+                used_mods[pos_preserve_index] = _data
+            else:
+                # should never happen
+                used_mods.append(_data)
+            final_mods[identifier] = args
+
+        if self.debug:
+            for identifier, data in mods_merged_log.iteritems():
+                logger.debug("Merged %s to %s", data["identifiers"], data["final_identifier"])
+
+        # separate all mods into line and non-line mods
+        for identifier, args in final_mods.iteritems():
+            mod_cls = registry.mods[identifier]
+            if mod_cls.modifies_whole_file:
+                non_line_mods.append((identifier, args))
+            else:
+                line_mods.append((mod_cls.order, identifier, args))
+
+            # initialize the mods
+            if identifier not in self.initialized_mods:
+                self.initialized_mods[identifier] = mod_cls(self)
+
+        return line_mods, non_line_mods, used_mods
+
+    def detect_uppercase(self):
+        entries_used = 0
+        for entry in self.f:
+            entry_used = False
+            for sub in entry.text.strip().split("\N"):
+                # skip HI bracket entries, those might actually be lowercase
+                sub = sub.strip()
+                for processor in registry.mods["remove_HI"].processors[:4]:
+                    sub = processor.process(sub)
+
+                if sub.strip():
+                    if lowercase_re.search(sub):
+                        return False
+
+                    entry_used = True
+                else:
+                    # skip full entry
+                    break
+
+            if entry_used:
+                entries_used += 1
+
+            if entries_used == 40:
+                break
+
+        return True
+
+    def modify(self, *mods):
+        new_entries = []
+        start = time.time()
+        self.only_uppercase = self.detect_uppercase()
+
+        if self.only_uppercase and self.debug:
+            logger.debug("Full-uppercase subtitle found")
+
+        line_mods, non_line_mods, mods_used = self.prepare_mods(*mods)
+        self.mods_used = mods_used
+
+        # apply non-last file mods
+        if non_line_mods:
+            non_line_mods_start = time.time()
+            self.apply_non_line_mods(non_line_mods)
+
+            if self.debug:
+                logger.debug("Non-Line mods took %ss", time.time() - non_line_mods_start)
+
+        # sort line mods
+        line_mods.sort(key=lambda x: (x is None, x))
+
+        # apply line mods
+        if line_mods:
+            line_mods_start = time.time()
+            self.apply_line_mods(new_entries, line_mods)
+
+            if self.debug:
+                logger.debug("Line mods took %ss", time.time() - line_mods_start)
+
+            if new_entries:
+                self.f.events = new_entries
+
+        # apply last file mods
+        if non_line_mods:
+            non_line_mods_start = time.time()
+            self.apply_non_line_mods(non_line_mods, only_last=True)
+
+            if self.debug:
+                logger.debug("Final Non-Line mods took %ss", time.time() - non_line_mods_start)
+
+        if self.debug:
+            logger.debug("Subtitle Modification took %ss", time.time() - start)
+            logger.debug("Mods applied: %s" % self.mods_used)
+
+    def apply_non_line_mods(self, mods, only_last=False):
+        for identifier, args in mods:
+            mod = self.initialized_mods[identifier]
+            if (not only_last and not mod.apply_last) or (only_last and mod.apply_last):
+                if self.debug:
+                    logger.debug("Applying %s", identifier)
+                mod.modify(None, debug=self.debug, parent=self, **args)
+
+    def apply_line_mods(self, new_entries, mods):
+        for index, entry in enumerate(self.f, 1):
+            applied_mods = []
+            lines = []
+
+            line_count = 0
+            start_tags = []
+            end_tags = []
+
+            t = entry.text.strip()
+            if not t:
+                if self.debug:
+                    logger.debug(u"Skipping empty line: %s", index)
+                continue
+
+            skip_entry = False
+            for line in t.split(ur"\N"):
+                # don't bother the mods with surrounding tags
+                old_line = line
+                line = line.strip()
+                skip_line = False
+                line_count += 1
+
+                if not line:
+                    continue
+
+                # clean {\X0} tags before processing
+                # fixme: handle nested tags?
+                start_tag = u""
+                end_tag = u""
+                if line.startswith(self.font_style_tag_start):
+                    start_tag = line[:5]
+                    line = line[5:]
+                if line[-5:-3] == self.font_style_tag_start:
+                    end_tag = line[-5:]
+                    line = line[:-5]
+
+                for order, identifier, args in mods:
+                    mod = self.initialized_mods[identifier]
+
+                    try:
+                        line = mod.modify(line.strip(), entry=entry.text, debug=self.debug, parent=self, index=index,
+                                          **args)
+                    except EmptyEntryError:
+                        if self.debug:
+                            logger.debug(u"%d: %s: %r -> ''", index, identifier, entry.text)
+                        skip_entry = True
+                        break
+
+                    if not line:
+                        if self.debug:
+                            logger.debug(u"%d: %s: %r -> ''", index, identifier, old_line)
+                        skip_line = True
+                        break
+
+                    applied_mods.append(identifier)
+
+                if skip_entry:
+                    lines = []
+                    break
+
+                if skip_line:
+                    continue
+
+                if start_tag:
+                    start_tags.append(start_tag)
+
+                if end_tag:
+                    end_tags.append(end_tag)
+
+                # append new line and clean possibly newly added empty tags
+                cleaned_line = EMPTY_TAG_PROCESSOR.process(start_tag + line + end_tag, debug=self.debug).strip()
+                if cleaned_line:
+                    # we may have a single closing tag, if so, try appending it to the previous line
+                    if len(cleaned_line) == 5 and cleaned_line.startswith("{\\") and cleaned_line.endswith("0}"):
+                        if lines:
+                            prev_line = lines.pop()
+                            lines.append(prev_line + cleaned_line)
+                            continue
+
+                    lines.append(cleaned_line)
+                else:
+                    if self.debug:
+                        logger.debug(u"%d: Ditching now empty line (%r)", index, line)
+
+            if not lines:
+                # don't bother logging when the entry only had one line
+                if self.debug and line_count > 1:
+                    logger.debug(u"%d: %r -> ''", index, entry.text)
+                continue
+
+            new_text = ur"\N".join(lines)
+
+            # cheap man's approach to avoid open tags
+            add_start_tags = []
+            add_end_tags = []
+            if len(start_tags) != len(end_tags):
+                for tag in start_tags:
+                    end_tag = tag.replace("1", "0")
+                    if end_tag not in end_tags and new_text.count(tag) > new_text.count(end_tag):
+                        add_end_tags.append(end_tag)
+                for tag in end_tags:
+                    start_tag = tag.replace("0", "1")
+                    if start_tag not in start_tags and new_text.count(tag) > new_text.count(start_tag):
+                        add_start_tags.append(start_tag)
+
+                if add_end_tags or add_start_tags:
+                    entry.text = u"".join(add_start_tags) + new_text + u"".join(add_end_tags)
+                    if self.debug:
+                        logger.debug(u"Fixing tags: %s (%r -> %r)", str(add_start_tags+add_end_tags), new_text,
+                                     entry.text)
+                else:
+                    entry.text = new_text
+            else:
+                entry.text = new_text
+
+            new_entries.append(entry)
+
+SubMod = SubtitleModifications
+
+
+
+
diff --git a/libs/subzero/modification/mods/__init__.py b/libs/subzero/modification/mods/__init__.py
new file mode 100644
index 000000000..10d0553da
--- /dev/null
+++ b/libs/subzero/modification/mods/__init__.py
@@ -0,0 +1,109 @@
+# coding=utf-8
+import re
+import logging
+
+from subzero.modification.processors.re_processor import ReProcessor, NReProcessor
+
+logger = logging.getLogger(__name__)
+
+
+class SubtitleModification(object):
+    identifier = None
+    description = None
+    long_description = None
+    exclusive = False
+    advanced = False  # has parameters
+    args_mergeable = False
+    order = None
+    modifies_whole_file = False  # operates on the whole file, not individual entries
+    apply_last = False
+    only_uppercase = False
+    pre_processors = []
+    processors = []
+    post_processors = []
+    languages = []
+
+    def __init__(self, parent):
+        return
+
+    def _process(self, content, processors, debug=False, parent=None, index=None, **kwargs):
+        if not content:
+            return
+
+        # processors may be a list or a callable
+        #if callable(processors):
+        #    _processors = processors()
+        #else:
+        #    _processors = processors
+        _processors = processors
+
+        new_content = content
+        for processor in _processors:
+            if not processor.supported(parent):
+                if debug and processor.enabled:
+                    logger.debug("Processor not supported, skipping: %s", processor.name)
+                    processor.enabled = False
+                continue
+
+            old_content = new_content
+            new_content = processor.process(new_content, debug=debug, **kwargs)
+            if not new_content:
+                if debug:
+                    logger.debug("Processor returned empty line: %s", processor.name)
+                break
+            if debug:
+                if old_content == new_content:
+                    continue
+                logger.debug("%d: %s: %s -> %s", index, processor.name, repr(old_content), repr(new_content))
+
+        return new_content
+
+    def pre_process(self, content, debug=False, parent=None, **kwargs):
+        return self._process(content, self.pre_processors, debug=debug, parent=parent, **kwargs)
+
+    def process(self, content, debug=False, parent=None, **kwargs):
+        return self._process(content, self.processors, debug=debug, parent=parent, **kwargs)
+
+    def post_process(self, content, debug=False, parent=None, **kwargs):
+        return self._process(content, self.post_processors, debug=debug, parent=parent, **kwargs)
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        if not content:
+            return
+
+        new_content = content
+        for method in ("pre_process", "process", "post_process"):
+            if not new_content:
+                return
+            new_content = getattr(self, method)(new_content, debug=debug, parent=parent, **kwargs)
+
+        return new_content
+
+    @classmethod
+    def get_signature(cls, **kwargs):
+        string_args = ",".join(["%s=%s" % (key, value) for key, value in kwargs.iteritems()])
+        return "%s(%s)" % (cls.identifier, string_args)
+
+    @classmethod
+    def merge_args(cls, args1, args2):
+        raise NotImplementedError
+
+
+class SubtitleTextModification(SubtitleModification):
+    pass
+
+
+TAG = ur"(?:\s*{\\[iusb][0-1]}\s*)*"
+EMPTY_TAG_PROCESSOR = ReProcessor(re.compile(r'({\\\w1})[\s.,-_!?]*({\\\w0})'), "", name="empty_tag")
+
+empty_line_post_processors = [
+    # empty tag
+    EMPTY_TAG_PROCESSOR,
+
+    # empty line (needed?)
+    NReProcessor(re.compile(r'^[\s-]+$'), "", name="empty_line"),
+]
+
+
+class EmptyEntryError(Exception):
+    pass
diff --git a/libs/subzero/modification/mods/color.py b/libs/subzero/modification/mods/color.py
new file mode 100644
index 000000000..9e883b101
--- /dev/null
+++ b/libs/subzero/modification/mods/color.py
@@ -0,0 +1,51 @@
+# coding=utf-8
+
+import logging
+from collections import OrderedDict
+
+from subzero.modification.mods import SubtitleModification
+from subzero.modification import registry
+
+logger = logging.getLogger(__name__)
+
+
+COLOR_MAP = OrderedDict([
+    ("white", "#FFFFFF"),
+    ("light-grey", "#C0C0C0"),
+    ("red", "#FF0000"),
+    ("green", "#00FF00"),
+    ("yellow", "#FFFF00"),
+    ("blue", "#0000FF"),
+    ("magenta", "#FF00FF"),
+    ("cyan", "#00FFFF"),
+    ("black", "#000000"),
+    ("dark-red", "#800000"),
+    ("dark-green", "#008000"),
+    ("dark-yellow", "#808000"),
+    ("dark-blue", "#000080"),
+    ("dark-magenta", "#800080"),
+    ("dark-cyan", "#008080"),
+    ("dark-grey", "#808080"),
+])
+
+
+class Color(SubtitleModification):
+    identifier = "color"
+    description = "Change the color of the subtitle"
+    exclusive = True
+    advanced = True
+    modifies_whole_file = True
+    apply_last = True
+
+    colors = COLOR_MAP
+
+    long_description = "Adds the requested color to every line of the subtitle. Support depends on player."
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        color = self.colors.get(kwargs.get("name"))
+        if color:
+            for entry in parent.f:
+                entry.text = u'<font color="%s">%s</font>' % (color, entry.text)
+
+
+registry.register(Color)
diff --git a/libs/subzero/modification/mods/common.py b/libs/subzero/modification/mods/common.py
new file mode 100644
index 000000000..896a1f2f8
--- /dev/null
+++ b/libs/subzero/modification/mods/common.py
@@ -0,0 +1,185 @@
+# coding=utf-8
+
+import re
+
+from subzero.language import Language
+from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, SubtitleModification
+from subzero.modification.processors import FuncProcessor
+from subzero.modification.processors.re_processor import NReProcessor
+from subzero.modification import registry
+
+
+ENGLISH = Language("eng")
+
+
+class CommonFixes(SubtitleTextModification):
+    identifier = "common"
+    description = "Basic common fixes"
+    exclusive = True
+    order = 40
+
+    long_description = "Fix common and whitespace/punctuation issues in subtitles"
+
+    processors = [
+        # normalize hyphens
+        NReProcessor(re.compile(ur'(?u)([‑â€ďąďąŁ])'), u"-", name="CM_hyphens"),
+
+        # -- = em dash
+        NReProcessor(re.compile(r'(?u)(\w|\b|\s|^)(-\s?-{1,2})'), ur"\1—", name="CM_multidash"),
+
+        # line = _/-/\s
+        NReProcessor(re.compile(r'(?u)(^\W*[-_.:]+\W*$)'), "", name="CM_non_word_only"),
+
+        # line = : text
+        NReProcessor(re.compile(r'(?u)(^\W*:\s*(?=\w+))'), "", name="CM_empty_colon_start"),
+
+        # multi space
+        NReProcessor(re.compile(r'(?u)(\s{2,})'), " ", name="CM_multi_space"),
+
+        # fix music symbols
+        NReProcessor(re.compile(ur'(?u)(?:^[-\s]*[*#¶]+(?![^\s\-*#¶]))|(?:[*#¶]+\s*$)'), u"♪", name="CM_music_symbols"),
+
+        # '' = "
+        NReProcessor(re.compile(ur'(?u)([\'’ʼ❜â€â€›][\'’ʼ❜â€â€›]+)'), u'"', name="CM_double_apostrophe"),
+
+        # double quotes instead of single quotes inside words
+        NReProcessor(re.compile(ur'(?u)([A-zÀ-ž])"([A-zÀ-ž])'), ur"\1'\2", name="CM_double_as_single"),
+
+        # normalize quotes
+        NReProcessor(re.compile(ur'(?u)(\s*["”“‟„])\s*(["”“‟„]["”“‟„\s]*)'),
+                     lambda match: '"' + (" " if match.group(2).endswith(" ") else ""),
+                     name="CM_normalize_quotes"),
+
+        # normalize single quotes
+        NReProcessor(re.compile(ur'(?u)([\'’ʼ❜â€â€›])'), u"'", name="CM_normalize_squotes"),
+
+        # remove leading ...
+        NReProcessor(re.compile(r'(?u)^\.\.\.[\s]*'), "", name="CM_leading_ellipsis"),
+
+        # remove "downloaded from" tags
+        NReProcessor(re.compile(r'(?ui).+downloaded\s+from.+'), "", name="CM_crap"),
+
+        # no space after ellipsis
+        NReProcessor(re.compile(r'(?u)\.\.\.(?![\s.,!?\'"])(?!$)'), "... ", name="CM_ellipsis_no_space"),
+
+        # no space before spaced ellipsis
+        NReProcessor(re.compile(r'(?u)(?<=[^\s])(?<!\s)\. \. \.'), " . . .", name="CM_ellipsis_no_space2"),
+
+        # multiple spaces
+        NReProcessor(re.compile(r'(?u)[\s]{2,}'), " ", name="CM_multiple_spaces"),
+
+        # more than 3 dots
+        NReProcessor(re.compile(r'(?u)\.{3,}'), "...", name="CM_dots"),
+
+        # no space after starting dash
+        NReProcessor(re.compile(r'(?u)^-(?![\s-])'), "- ", name="CM_dash_space"),
+
+        # remove starting spaced dots (not matching ellipses)
+        NReProcessor(re.compile(r'(?u)^(?!\s?(\.\s\.\s\.)|(\s?\.{3}))(?=\.+\s+)[\s.]*'), "",
+                     name="CM_starting_spacedots"),
+
+        # space missing before doublequote
+        # ReProcessor(re.compile(r'(?u)(?<!^)(?<![\s(\["])("[^"]+")'), r' \1', name="CM_space_before_dblquote"),
+
+        # space missing after doublequote
+        # ReProcessor(re.compile(r'(?u)("[^"\s][^"]+")([^\s.,!?)\]]+)'), r"\1 \2", name="CM_space_after_dblquote"),
+
+        # space before ending doublequote?
+
+        # remove >>
+        NReProcessor(re.compile(r'(?u)^\s?>>\s*'), "", name="CM_leading_crocodiles"),
+
+        # replace uppercase I with lowercase L in words
+        NReProcessor(re.compile(ur'(?u)([a-zĂ -Ĺľ]+)(I+)'),
+                     lambda match: ur'%s%s' % (match.group(1), "l" * len(match.group(2))),
+                     name="CM_uppercase_i_in_word"),
+
+        # fix spaces in numbers (allows for punctuation: ,.:' (comma/dot only fixed if after space, those may be
+        # countdowns otherwise); don't break up ellipses
+        NReProcessor(
+            re.compile(r'(?u)(\b[0-9]+[0-9:\']*(?<!\.\.)\s+(?!\.\.)[0-9,.:\'\s]*(?=[0-9]+)[0-9,.:\'])'),
+            lambda match: match.group(1).replace(" ", "") if match.group(1).count(" ") == 1 else match.group(1),
+            name="CM_spaces_in_numbers"),
+
+        # uppercase after dot
+        NReProcessor(re.compile(ur'(?u)((?<!(?=\s*[A-ZĂ€-Ĺ˝-_0-9.]\s*))(?:[^.\s])+\.\s+)([a-zĂ -Ĺľ])'),
+                     lambda match: ur'%s%s' % (match.group(1), match.group(2).upper()), name="CM_uppercase_after_dot"),
+
+        # remove double interpunction
+        NReProcessor(re.compile(ur'(?u)(\s*[,!?])\s*([,.!?][,.!?\s]*)'),
+                     lambda match: match.group(1).strip() + (" " if match.group(2).endswith(" ") else ""),
+                     name="CM_double_interpunct"),
+
+        # remove spaces before punctuation; don't break spaced ellipses
+        NReProcessor(re.compile(r'(?u)(?:(?<=^)|(?<=\w)) +([!?.,](?![!?.,]| \.))'), r"\1", name="CM_punctuation_space"),
+
+        # add space after punctuation
+        NReProcessor(re.compile(r'(?u)([!?.,:])([A-zÀ-ž]{2,})'), r"\1 \2", name="CM_punctuation_space2"),
+
+        # fix lowercase I in english
+        NReProcessor(re.compile(r'(?u)(\b)i(\b)'), r"\1I\2", name="CM_EN_lowercase_i",
+                     supported=lambda p: p.language == ENGLISH),
+    ]
+
+    post_processors = empty_line_post_processors
+
+
+class RemoveTags(SubtitleModification):
+    identifier = "remove_tags"
+    description = "Remove all style tags"
+    exclusive = True
+    modifies_whole_file = True
+
+    long_description = "Removes all possible style tags from the subtitle, such as font, bold, color etc."
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        for entry in parent.f:
+            # this actually plaintexts the entry and by re-assigning it to plaintext, it replaces \n with \N again
+            entry.plaintext = entry.plaintext
+
+
+class ReverseRTL(SubtitleModification):
+    identifier = "reverse_rtl"
+    description = "Reverse punctuation in RTL languages"
+    exclusive = True
+    order = 50
+    languages = [Language(l) for l in ('heb', 'ara', 'fas')]
+
+    long_description = "Some playback devices don't properly handle right-to-left markers for punctuation. " \
+                       "Physically swap punctuation. Applicable to languages: hebrew, arabic, farsi, persian"
+
+    processors = [
+        # new? (?u)(^([\s.!?]*)(.+?)(\s*)(-?\s*)$); \5\4\3\2
+        #NReProcessor(re.compile(ur"(?u)((?=(?<=\b|^)|(?<=\s))([.!?-]+)([^.!?-]+)(?=\b|$|\s))"), r"\3\2",
+        #             name="CM_RTL_reverse")
+        NReProcessor(re.compile(ur"(?u)(^([\s.!?:,'-]*)(.+?)(\s*)(-?\s*)$)"), r"\5\4\3\2",
+                     name="CM_RTL_reverse")
+    ]
+
+
+split_upper_re = re.compile(ur"(\s*[.!?♪\-]\s*)")
+
+
+class FixUppercase(SubtitleModification):
+    identifier = "fix_uppercase"
+    description = "Fixes all-uppercase subtitles"
+    modifies_whole_file = True
+    exclusive = True
+    order = 41
+    only_uppercase = True
+    apply_last = True
+
+    long_description = "Some subtitles are in all-uppercase letters. This at least makes them readable."
+
+    def capitalize(self, c):
+        return u"".join([s.capitalize() for s in split_upper_re.split(c)])
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        for entry in parent.f:
+            entry.plaintext = self.capitalize(entry.plaintext)
+
+
+registry.register(CommonFixes)
+registry.register(RemoveTags)
+registry.register(ReverseRTL)
+registry.register(FixUppercase)
diff --git a/libs/subzero/modification/mods/fps.py b/libs/subzero/modification/mods/fps.py
new file mode 100644
index 000000000..b209eddff
--- /dev/null
+++ b/libs/subzero/modification/mods/fps.py
@@ -0,0 +1,25 @@
+# coding=utf-8
+
+import logging
+
+from subzero.modification.mods import SubtitleModification
+from subzero.modification import registry
+
+logger = logging.getLogger(__name__)
+
+
+class ChangeFPS(SubtitleModification):
+    identifier = "change_FPS"
+    description = "Change the FPS of the subtitle"
+    exclusive = True
+    advanced = True
+    modifies_whole_file = True
+
+    long_description = "Re-syncs the subtitle to the framerate of the current media file."
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        fps_from = kwargs.get("from")
+        fps_to = kwargs.get("to")
+        parent.f.transform_framerate(float(fps_from), float(fps_to))
+
+registry.register(ChangeFPS)
diff --git a/libs/subzero/modification/mods/hearing_impaired.py b/libs/subzero/modification/mods/hearing_impaired.py
new file mode 100644
index 000000000..10dade9ee
--- /dev/null
+++ b/libs/subzero/modification/mods/hearing_impaired.py
@@ -0,0 +1,92 @@
+# coding=utf-8
+import re
+
+from subzero.modification.mods import SubtitleTextModification, empty_line_post_processors, EmptyEntryError, TAG
+from subzero.modification.processors.re_processor import NReProcessor
+from subzero.modification import registry
+
+
+class FullBracketEntryProcessor(NReProcessor):
+    def process(self, content, debug=False, **kwargs):
+        entry = kwargs.get("entry")
+        if entry:
+            rep_content = super(FullBracketEntryProcessor, self).process(entry, debug=debug, **kwargs)
+            if not rep_content.strip():
+                raise EmptyEntryError()
+        return content
+
+
+class HearingImpaired(SubtitleTextModification):
+    identifier = "remove_HI"
+    description = "Remove Hearing Impaired tags"
+    exclusive = True
+    order = 20
+
+    long_description = "Removes tags, text and characters from subtitles that are meant for hearing impaired people"
+
+    processors = [
+        # full bracket entry, single or multiline; starting with brackets and ending with brackets
+        FullBracketEntryProcessor(re.compile(ur'(?sux)^-?%(t)s[([].+(?=[^)\]]{3,}).+[)\]]%(t)s$' % {"t": TAG}),
+                                  "", name="HI_brackets_full"),
+
+        # brackets (only remove if at least 3 chars in brackets)
+        NReProcessor(re.compile(ur'(?sux)-?%(t)s[([][^([)\]]+?(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' %
+                                {"t": TAG}), "", name="HI_brackets"),
+
+        NReProcessor(re.compile(ur'(?sux)-?%(t)s[([]%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+%(t)s$' % {"t": TAG}),
+                     "", name="HI_bracket_open_start"),
+
+        NReProcessor(re.compile(ur'(?sux)-?%(t)s(?=[A-zÀ-ž"\'.]{3,})[^([)\]]+[)\]][\s:]*%(t)s' % {"t": TAG}), "",
+                     name="HI_bracket_open_end"),
+
+        # text before colon (and possible dash in front), max 11 chars after the first whitespace (if any)
+        # NReProcessor(re.compile(r'(?u)(^[A-z\-\'"_]+[\w\s]{0,11}:[^0-9{2}][\s]*)'), "", name="HI_before_colon"),
+
+        # starting text before colon (at least 3 chars)
+        #NReProcessor(re.compile(ur'(?u)(\b|^)([\s-]*(?=[A-zÀ-ž-_0-9"\']{3,})[A-zÀ-ž-_0-9"\']+:\s*)'), "",
+        #             name="HI_before_colon"),
+
+        # uppercase text before colon (at least 3 uppercase chars); at start or after a sentence,
+        # possibly with a dash in front; ignore anything ending with a quote
+        NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"\']))([\s-]*(?=[A-ZĂ€-Ĺ˝&+]\s*[A-ZĂ€-Ĺ˝&+]\s*[A-ZĂ€-Ĺ˝&+])'
+                                ur'[A-ZĂ€-Ĺ˝-_0-9\s\"\'&+]+:(?![\"\'’ʼ❜â€â€›â€ťâ€śâ€źâ€ž])(?:\s+|$))(?![0-9])'), "",
+                     name="HI_before_colon_caps"),
+
+        # any text before colon (at least 3 chars); at start or after a sentence,
+        # possibly with a dash in front; try not breaking actual sentences with a colon at the end by not matching if
+        # a space is inside the text; ignore anything ending with a quote
+        NReProcessor(re.compile(ur'(?u)(?:(?<=^)|(?<=[.\-!?\"]))([\s-]*((?=[A-zÀ-ž&+]\s*[A-zÀ-ž&+]\s*[A-zÀ-ž&+])'
+                                ur'[A-zĂ€-Ĺľ-_0-9\s\"\'&+]+:)(?![\"’ʼ❜â€â€›â€ťâ€śâ€źâ€ž])\s*)(?![0-9])'),
+                     lambda match:
+                     match.group(1) if (match.group(2).count(" ") > 0 or match.group(1).count("-") > 0)
+                     else "" if not match.group(1).startswith(" ") else " ",
+                     name="HI_before_colon_noncaps"),
+
+        # text in brackets at start, after optional dash, before colon or at end of line
+        # fixme: may be too aggressive
+        #NReProcessor(re.compile(ur'(?um)(^-?\s?[([][A-zÀ-ž-_\s]{3,}[)\]](?:(?=$)|:\s*))'), "",
+        #             name="HI_brackets_special"),
+
+        # all caps line (at least 4 consecutive uppercase chars)
+        NReProcessor(re.compile(ur'(?u)(^(?=.*[A-ZĂ€-Ĺ˝&+]{4,})[A-ZĂ€-Ĺ˝-_\s&+]+$)'), "", name="HI_all_caps",
+                     supported=lambda p: not p.only_uppercase),
+
+        # remove MAN:
+        NReProcessor(re.compile(ur'(?suxi)(.*MAN:\s*)'), "", name="HI_remove_man"),
+
+        # dash in front
+        # NReProcessor(re.compile(r'(?u)^\s*-\s*'), "", name="HI_starting_dash"),
+
+        # all caps at start before new sentence
+        NReProcessor(re.compile(ur'(?u)^(?=[A-ZĂ€-Ĺ˝]{4,})[A-ZĂ€-Ĺ˝-_\s]+\s([A-ZĂ€-Ĺ˝][a-zĂ -Ĺľ].+)'), r"\1",
+                     name="HI_starting_upper_then_sentence", supported=lambda p: not p.only_uppercase),
+
+        # remove music symbols
+        NReProcessor(re.compile(ur'(?u)(^%(t)s[*#¶♫♪\s]*%(t)s[*#¶♫♪\s]+%(t)s[*#¶♫♪\s]*%(t)s$)' % {"t": TAG}),
+                     "", name="HI_music_symbols_only"),
+    ]
+
+    post_processors = empty_line_post_processors
+
+
+registry.register(HearingImpaired)
diff --git a/libs/subzero/modification/mods/ocr_fixes.py b/libs/subzero/modification/mods/ocr_fixes.py
new file mode 100644
index 000000000..ec57ca006
--- /dev/null
+++ b/libs/subzero/modification/mods/ocr_fixes.py
@@ -0,0 +1,55 @@
+# coding=utf-8
+import logging
+
+import re
+
+from subzero.modification.mods import SubtitleTextModification
+from subzero.modification.processors.string_processor import MultipleLineProcessor, WholeLineProcessor
+from subzero.modification.processors.re_processor import MultipleWordReProcessor, NReProcessor
+from subzero.modification import registry
+from subzero.modification.dictionaries.data import data as OCR_fix_data
+
+logger = logging.getLogger(__name__)
+
+
+class FixOCR(SubtitleTextModification):
+    identifier = "OCR_fixes"
+    description = "Fix common OCR issues"
+    exclusive = True
+    order = 10
+    data_dict = None
+
+    long_description = "Fix issues that happen when a subtitle gets converted from bitmap to text through OCR"
+
+    def __init__(self, parent):
+        super(FixOCR, self).__init__(parent)
+        data_dict = OCR_fix_data.get(parent.language.alpha3t)
+        if not data_dict:
+            logger.debug("No SnR-data available for language %s", parent.language)
+            return
+
+        self.data_dict = data_dict
+        self.processors = self.get_processors()
+
+    def get_processors(self):
+        if not self.data_dict:
+            return []
+
+        return [
+            # remove broken HI tag colons (ANNOUNCER'., ". instead of :) after at least 3 uppercase chars
+            # don't modify stuff inside quotes
+            NReProcessor(re.compile(ur'(?u)(^[^"\'’ʼ❜â€â€›â€ťâ€śâ€źâ€ž]*(?<=[A-ZĂ€-Ĺ˝]{3})[A-ZĂ€-Ĺ˝-_\s0-9]+)'
+                                    ur'(["\'’ʼ❜â€â€›â€ťâ€śâ€źâ€ž]*[.,‚،âąă€;]+)(\s*)(?!["\'’ʼ❜â€â€›â€ťâ€śâ€źâ€ž])'),
+                         r"\1:\3", name="OCR_fix_HI_colons", supported=lambda p: not p.only_uppercase),
+            # fix F'bla
+            NReProcessor(re.compile(ur'(?u)(\bF)(\')([A-zÀ-ž]*\b)'), r"\1\3", name="OCR_fix_F"),
+            WholeLineProcessor(self.data_dict["WholeLines"], name="OCR_replace_line"),
+            MultipleWordReProcessor(self.data_dict["WholeWords"], name="OCR_replace_word"),
+            MultipleWordReProcessor(self.data_dict["BeginLines"], name="OCR_replace_beginline"),
+            MultipleWordReProcessor(self.data_dict["EndLines"], name="OCR_replace_endline"),
+            MultipleWordReProcessor(self.data_dict["PartialLines"], name="OCR_replace_partialline"),
+            MultipleLineProcessor(self.data_dict["PartialWordsAlways"], name="OCR_replace_partialwordsalways")
+        ]
+
+
+registry.register(FixOCR)
diff --git a/libs/subzero/modification/mods/offset.py b/libs/subzero/modification/mods/offset.py
new file mode 100644
index 000000000..2e342c0a1
--- /dev/null
+++ b/libs/subzero/modification/mods/offset.py
@@ -0,0 +1,41 @@
+# coding=utf-8
+
+import logging
+
+from subzero.modification.mods import SubtitleModification
+from subzero.modification import registry
+
+logger = logging.getLogger(__name__)
+
+
+class ShiftOffset(SubtitleModification):
+    identifier = "shift_offset"
+    description = "Change the timing of the subtitle"
+    exclusive = False
+    advanced = True
+    args_mergeable = True
+    modifies_whole_file = True
+
+    long_description = "Adds or substracts a certain amount of time from the whole subtitle to match your media"
+
+    @classmethod
+    def merge_args(cls, args1, args2):
+        new_args = dict((key, int(value)) for key, value in args1.iteritems())
+
+        for key, value in args2.iteritems():
+            if not int(value):
+                continue
+
+            if key in new_args:
+                new_args[key] += int(value)
+            else:
+                new_args[key] = int(value)
+
+        return dict(filter(lambda (k, v): bool(v), new_args.iteritems()))
+
+    def modify(self, content, debug=False, parent=None, **kwargs):
+        parent.f.shift(h=int(kwargs.get("h", 0)), m=int(kwargs.get("m", 0)), s=int(kwargs.get("s", 0)),
+                       ms=int(kwargs.get("ms", 0)))
+
+
+registry.register(ShiftOffset)
diff --git a/libs/subzero/modification/processors/__init__.py b/libs/subzero/modification/processors/__init__.py
new file mode 100644
index 000000000..7cfb0aa33
--- /dev/null
+++ b/libs/subzero/modification/processors/__init__.py
@@ -0,0 +1,43 @@
+# coding=utf-8
+
+
+class Processor(object):
+    """
+    Processor base class
+    """
+    name = None
+    parent = None
+    supported = None
+    enabled = True
+
+    def __init__(self, name=None, parent=None, supported=None):
+        self.name = name
+        self.parent = parent
+        self.supported = supported if supported else lambda parent: True
+
+    @property
+    def info(self):
+        return self.name
+
+    def process(self, content, debug=False, **kwargs):
+        return content
+
+    def __repr__(self):
+        return "Processor <%s %s>" % (self.__class__.__name__, self.info)
+
+    def __str__(self):
+        return repr(self)
+
+    def __unicode__(self):
+        return unicode(repr(self))
+
+
+class FuncProcessor(Processor):
+    func = None
+
+    def __init__(self, func, name=None, parent=None, supported=None):
+        super(FuncProcessor, self).__init__(name=name, supported=supported)
+        self.func = func
+
+    def process(self, content, debug=False, **kwargs):
+        return self.func(content)
diff --git a/libs/subzero/modification/processors/re_processor.py b/libs/subzero/modification/processors/re_processor.py
new file mode 100644
index 000000000..5ff76331e
--- /dev/null
+++ b/libs/subzero/modification/processors/re_processor.py
@@ -0,0 +1,48 @@
+# coding=utf-8
+import re
+import logging
+
+from subzero.modification.processors import Processor
+
+logger = logging.getLogger(__name__)
+
+
+class ReProcessor(Processor):
+    """
+    Regex processor
+    """
+    pattern = None
+    replace_with = None
+
+    def __init__(self, pattern, replace_with, name=None, supported=None):
+        super(ReProcessor, self).__init__(name=name, supported=supported)
+        self.pattern = pattern
+        self.replace_with = replace_with
+
+    def process(self, content, debug=False, **kwargs):
+        return self.pattern.sub(self.replace_with, content)
+
+
+class NReProcessor(ReProcessor):
+    pass
+
+
+class MultipleWordReProcessor(ReProcessor):
+    """
+    Expects a dictionary in the form of:
+    dict = {
+        "data": {"old_value": "new_value"},
+        "pattern": compiled re object that matches data.keys()
+    }
+    replaces found key in pattern with the corresponding value in data
+    """
+    def __init__(self, snr_dict, name=None, parent=None, supported=None):
+        super(ReProcessor, self).__init__(name=name, supported=supported)
+        self.snr_dict = snr_dict
+
+    def process(self, content, debug=False, **kwargs):
+        if not self.snr_dict["data"]:
+            return content
+
+        return self.snr_dict["pattern"].sub(lambda x: self.snr_dict["data"][x.group(0)], content)
+
diff --git a/libs/subzero/modification/processors/string_processor.py b/libs/subzero/modification/processors/string_processor.py
new file mode 100644
index 000000000..270fd76f8
--- /dev/null
+++ b/libs/subzero/modification/processors/string_processor.py
@@ -0,0 +1,84 @@
+# coding=utf-8
+
+import logging
+
+from subzero.modification.processors import Processor
+
+logger = logging.getLogger(__name__)
+
+
+class StringProcessor(Processor):
+    """
+    String replacement processor base
+    """
+
+    def __init__(self, search, replace, name=None, parent=None, supported=None):
+        super(StringProcessor, self).__init__(name=name, supported=supported)
+        self.search = search
+        self.replace = replace
+
+    def process(self, content, debug=False, **kwargs):
+        return content.replace(self.search, self.replace)
+
+
+class MultipleLineProcessor(Processor):
+    """
+    replaces stuff in whole lines
+    
+    takes a search/replace dict as first argument
+    Expects a dictionary in the form of:
+    dict = {
+        "data": {"old_value": "new_value"}
+    }
+    """
+    def __init__(self, snr_dict, name=None, parent=None, supported=None):
+        super(MultipleLineProcessor, self).__init__(name=name, supported=supported)
+        self.snr_dict = snr_dict
+
+    def process(self, content, debug=False, **kwargs):
+        if not self.snr_dict["data"]:
+            return content
+
+        for key, value in self.snr_dict["data"].iteritems():
+            if debug and key in content:
+                logger.debug(u"Replacing '%s' with '%s' in '%s'", key, value, content)
+
+            content = content.replace(key, value)
+
+        return content
+
+
+class WholeLineProcessor(MultipleLineProcessor):
+    def process(self, content, debug=False, **kwargs):
+        if not self.snr_dict["data"]:
+            return content
+        content = content.strip()
+
+        for key, value in self.snr_dict["data"].iteritems():
+            if content == key:
+                if debug:
+                    logger.debug(u"Replacing '%s' with '%s'", key, value)
+
+                content = value
+                break
+
+        return content
+
+
+class MultipleWordProcessor(MultipleLineProcessor):
+    """
+    replaces words
+
+    takes a search/replace dict as first argument
+    Expects a dictionary in the form of:
+    dict = {
+        "data": {"old_value": "new_value"}
+    }
+    """
+    def process(self, content, debug=False, **kwargs):
+        words = content.split(u" ")
+        new_words = []
+        for word in words:
+            new_words.append(self.snr_dict.get(word, word))
+
+        return u" ".join(new_words)
diff --git a/libs/subzero/modification/registry.py b/libs/subzero/modification/registry.py
new file mode 100644
index 000000000..7b240a69c
--- /dev/null
+++ b/libs/subzero/modification/registry.py
@@ -0,0 +1,17 @@
+# coding=utf-8
+from collections import OrderedDict
+
+
+class SubtitleModRegistry(object):
+    mods = None
+    mods_available = None
+
+    def __init__(self):
+        self.mods = OrderedDict()
+        self.mods_available = []
+
+    def register(self, mod):
+        self.mods[mod.identifier] = mod
+        self.mods_available.append(mod.identifier)
+
+registry = SubtitleModRegistry()
diff --git a/libs/subzero/prefs.py b/libs/subzero/prefs.py
new file mode 100644
index 000000000..252164fb9
--- /dev/null
+++ b/libs/subzero/prefs.py
@@ -0,0 +1,39 @@
+# coding=utf-8
+import traceback
+from constants import PLUGIN_IDENTIFIER
+
+
+def get_user_prefs(Prefs, Logger):
+    """
+    loads all user prefs regardless of whether they exist in DefaultPrefs or not
+    :param Prefs:
+    :param Logger:
+    :return:
+    """
+
+    try:
+        prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER]
+    except:
+        Logger.Error("Loading user prefs failed: %s", traceback.format_exc())
+        return {}
+
+    user_prefs = {}
+    try:
+        xml_path = prefs_set._user_file_path
+        if not Prefs._core.storage.file_exists(xml_path):
+            return {}
+        prefs_str = Prefs._core.storage.load(xml_path, mtime_key=prefs_set)
+        prefs_xml = Prefs._core.data.xml.from_string(prefs_str)
+        for el in prefs_xml:
+            user_prefs[str(el.tag)] = str(el.text)
+    except:
+        Logger.Error("Loading user prefs failed: %s", traceback.format_exc())
+    else:
+        return user_prefs
+    return {}
+
+
+def update_user_prefs(update_prefs, Prefs, Logger):
+    prefs_set = Prefs._sandbox.preferences._sets[PLUGIN_IDENTIFIER]
+    prefs_set.update_user_values(**update_prefs)
+    Logger.Info("User prefs updated")
diff --git a/libs/subzero/sandbox.py b/libs/subzero/sandbox.py
new file mode 100644
index 000000000..f409b1824
--- /dev/null
+++ b/libs/subzero/sandbox.py
@@ -0,0 +1,15 @@
+# coding=utf-8
+import sys
+
+
+def fix_environment_stuff(module, base):
+    # restore builtins
+    module.__builtins__ = [x for x in base.__class__.__base__.__subclasses__() if x.__name__ == 'catch_warnings'][0]()._module.__builtins__
+
+    # patch getfilesystemencoding for NVIDIA Shield
+    getfilesystemencoding_orig = sys.getfilesystemencoding
+
+    def getfilesystemencoding():
+        return getfilesystemencoding_orig() or "utf-8"
+
+    sys.getfilesystemencoding = getfilesystemencoding
diff --git a/libs/subzero/score_range.py b/libs/subzero/score_range.py
new file mode 100644
index 000000000..ec80d665f
--- /dev/null
+++ b/libs/subzero/score_range.py
@@ -0,0 +1,22 @@
+# coding=utf-8
+
+import sys
+from itertools import chain, combinations, permutations
+
+from subliminal.video import Episode
+
+
+def permute(x):
+    return [base_score + i + j for i in x for j in x]
+
+if __name__ == "__main__":
+    scores = Episode.scores
+    base_score_keys = ["series", "season", "episode"]
+    leftover_keys = list(set(scores.keys()) - set(base_score_keys))
+    base_score = sum([val for key, val in scores.items() if key in base_score_keys])
+    leftover_scores = set([score for key, score in scores.items() if key in leftover_keys])
+    print "base score:", base_score
+    print "leftover:", sorted(set(leftover_scores))
+    # print sum_possible_scores(base_score, leftover_scores)
+    # print list(permutations(leftover_scores))
+    print ",\n".join(map(lambda x: '"%s"' % x, ["66"] + sorted(set(permute(leftover_scores)))))
diff --git a/libs/subzero/subtitle_storage.py b/libs/subzero/subtitle_storage.py
new file mode 100644
index 000000000..186a03a38
--- /dev/null
+++ b/libs/subzero/subtitle_storage.py
@@ -0,0 +1,544 @@
+# coding=utf-8
+import datetime
+import gzip
+import hashlib
+import os
+import logging
+import traceback
+import types
+import zlib
+
+import sys
+
+from json_tricks.nonp import loads
+from subzero.lib.json import dumps
+from scandir import scandir, scandir_generic as _scandir_generic
+from constants import mode_map
+
+logger = logging.getLogger(__name__)
+
+
+class JSONStoredSubtitle(object):
+    score = None
+    storage_type = None
+    hash = None
+    provider_name = None
+    id = None
+    date_added = None
+    mode = "a"  # auto/manual/auto-better (a/m/b)
+    content = None
+    mods = None
+    encoding = None
+    last_mod = None  # file modification
+
+    def initialize(self, score, storage_type, hash, provider_name, id, date_added=None, mode="a", content=None,
+                 mods=None, encoding=None, last_mod=None):
+        self.score = int(score)
+        self.storage_type = storage_type
+        self.hash = hash
+        self.provider_name = provider_name
+        self.id = id
+        self.date_added = date_added or datetime.datetime.now()
+        self.mode = mode
+        self.content = content
+        self.mods = mods or []
+        self.encoding = encoding
+        self.last_mod = last_mod
+
+    def add_mod(self, identifier):
+        self.mods = self.mods or []
+        if identifier is None:
+            self.mods = []
+            return
+
+        self.mods.append(identifier)
+
+    @classmethod
+    def get_mode_verbose(cls, mode):
+        return mode_map.get(mode, "Unknown")
+
+    @property
+    def mode_verbose(self):
+        return self.get_mode_verbose(self.mode)
+
+    def serialize(self):
+        return self.__dict__
+
+    def deserialize(self, data):
+        if data["content"]:
+            # legacy: storage was unicode; content is always present in encoded form
+            if isinstance(data["content"], types.UnicodeType):
+                data["content"] = data["content"].encode(data["encoding"])
+
+        self.initialize(**data)
+
+    @property
+    def key(self):
+        return self.provider_name, self.id
+
+
+class JSONStoredVideoSubtitles(object):
+    """
+    manages stored subtitles for video_id per media_part/language combination
+    """
+    video_id = None  # rating_key
+    title = None
+    parts = None
+    version = None
+    item_type = None  # movie / episode
+    added_at = None
+
+    def initialize(self, plex_item, version=None):
+        self.video_id = str(plex_item.rating_key)
+
+        self.title = plex_item.title
+        self.parts = {}
+        self.version = version
+        self.item_type = plex_item.type
+        self.added_at = datetime.datetime.fromtimestamp(plex_item.added_at)
+
+    def deserialize(self, data):
+        parts = data.pop("parts")
+        self.parts = {}
+        self.__dict__.update(data)
+
+        if parts:
+            for part_id, part in parts.iteritems():
+                self.parts[part_id] = {}
+                for language, sub_data in part.iteritems():
+                    self.parts[part_id][language] = {}
+
+                    for sub_key, subtitle_data in sub_data.iteritems():
+                        if sub_key == "current":
+                            if not isinstance(subtitle_data, tuple):
+                                subtitle_data = tuple(subtitle_data.split("__"))
+                            self.parts[part_id][language]["current"] = subtitle_data
+                        elif sub_key == "blacklist":
+                            bl = dict((tuple([str(a) for a in k.split("__")]), v) for k, v in subtitle_data.iteritems())
+                            self.parts[part_id][language]["blacklist"] = bl
+                        else:
+                            sub = JSONStoredSubtitle()
+
+                            sub.initialize(**subtitle_data)
+                            if not isinstance(sub_key, tuple):
+                                sub_key = tuple(sub_key.split("__"))
+
+                            self.parts[part_id][language][sub_key] = sub
+
+    def serialize(self):
+        data = {"parts": {}}
+        for key, value in self.__dict__.iteritems():
+            if key != "parts":
+                data[key] = value
+
+        for part_id, part in self.parts.iteritems():
+            data["parts"][part_id] = {}
+            for language, sub_data in part.iteritems():
+                data["parts"][part_id][language] = {}
+
+                for sub_key, stored_subtitle in sub_data.iteritems():
+                    if sub_key == "current":
+                        data["parts"][part_id][language]["current"] = "__".join(stored_subtitle)
+                    elif sub_key == "blacklist":
+                        data["parts"][part_id][language]["blacklist"] = dict(("__".join(k), v) for k, v in
+                                                                             stored_subtitle.iteritems())
+                    else:
+                        if stored_subtitle.content and not stored_subtitle.encoding:
+                            continue
+
+                        serialized_sub = stored_subtitle.serialize()
+                        if serialized_sub:
+                            data["parts"][part_id][language]["__".join(sub_key)] = serialized_sub
+
+        return data
+
+    def add(self, part_id, lang, subtitle, storage_type, date_added=None, mode="a", last_mod=None, set_current=True):
+        part_id = str(part_id)
+        part = self.parts.get(part_id)
+        if not part:
+            self.parts[part_id] = {}
+            part = self.parts[part_id]
+
+        subs = part.get(lang)
+        if not subs:
+            part[lang] = {}
+            subs = part[lang]
+
+        sub_key = self.get_sub_key(subtitle.provider_name, subtitle.id)
+        subs[sub_key] = JSONStoredSubtitle()
+        subs[sub_key].initialize(subtitle.score, storage_type, hashlib.md5(subtitle.content).hexdigest(),
+                                 subtitle.provider_name, subtitle.id, date_added=date_added, mode=mode,
+                                 content=subtitle.content, mods=subtitle.mods, encoding="utf-8",
+                                 last_mod=last_mod)
+
+        if set_current:
+            logger.debug(u"Setting subtitle as current: %r", subtitle)
+            subs["current"] = sub_key
+
+        return True
+
+    def get_any(self, part_id, lang):
+        part_id = str(part_id)
+        part = self.parts.get(part_id)
+        if not part:
+            return
+
+        subs = part.get(str(lang))
+        if not subs:
+            return
+
+        if "current" in subs and subs["current"]:
+            return subs.get(subs["current"])
+
+    def get(self, part_id, lang, sub_key):
+        subs = self.get_all(part_id, lang)
+        if not subs:
+            return
+
+        return subs.get(sub_key)
+
+    def get_all(self, part_id, lang):
+        part_id = str(part_id)
+        part = self.parts.get(part_id)
+        if not part:
+            return
+
+        return part.get(str(lang))
+
+    def set_current(self, part_id, lang, sub_key):
+        subs = self.get_all(part_id, lang)
+        if not subs:
+            return
+
+        if sub_key not in subs:
+            logger.info("Tried setting unknown subtitle %s as current" % sub_key)
+            return
+
+        subs["current"] = sub_key
+        logger.debug("Set subtitle %s as current for %s, %s" % (sub_key, part_id, lang))
+
+    def get_by_provider(self, part_id, lang, provider_name):
+        out = []
+        all_subs = self.get_all(part_id, lang)
+        if not all_subs:
+            return out
+
+        for key, subtitle in all_subs.iteritems():
+            if key in ("current", "blacklist"):
+                continue
+
+            if subtitle.provider_name == provider_name:
+                out.append(subtitle)
+        return out
+
+    def count(self, part_id, lang):
+        part_id = str(part_id)
+        part = self.parts.get(part_id)
+        if not part:
+            return 0
+
+        subs = part.get(str(lang))
+        return len(filter(lambda key: key not in ("current", "blacklist"), subs.keys()))
+
+    def get_sub_key(self, provider_name, id):
+        return provider_name, str(id)
+
+    def get_blacklist(self, part_id, lang):
+        part_id = str(part_id)
+        part = self.parts.get(part_id)
+        if not part:
+            return {}, {}
+
+        subs = part.get(str(lang))
+        if not subs:
+            return {}, {}
+
+        current_bl = subs.get("blacklist", {})
+        return current_bl, subs
+
+    def blacklist(self, part_id, lang, sub_key, add=True):
+        current_bl, subs = self.get_blacklist(part_id, lang)
+        sub = subs.get(subs["current"])
+        if not sub:
+            return
+
+        if sub_key in current_bl:
+            if add:
+                return
+            else:
+                del current_bl[sub_key]
+                subs["blacklist"] = current_bl
+                return
+
+        current_bl[sub_key] = {"date_added": sub.date_added, "score": sub.score, "mode": sub.mode, "storage_type":
+            sub.storage_type}
+        subs["blacklist"] = current_bl
+
+    def __repr__(self):
+        return unicode(self)
+
+    def __unicode__(self):
+        return u"%s (%s)" % (self.title, self.video_id)
+
+    def __str__(self):
+        return str(self.video_id)
+
+
+class StoredSubtitlesManager(object):
+    """
+    manages the storage and retrieval of StoredVideoSubtitles instances for a given video_id
+    """
+    storage = None
+    version = 3
+    extension = ".json.gz"
+
+    def __init__(self, storage, threadkit, plexapi_item_getter):
+        self.storage = storage
+        self.get_item = plexapi_item_getter
+        self.threadkit = threadkit
+
+    def destroy(self):
+        self.storage = None
+        self.get_item = None
+        self.threadkit = None
+
+    def get_storage_filename(self, video_id):
+        return "subs_%s" % video_id
+
+    @property
+    def dataitems_path(self):
+        return os.path.join(getattr(self.storage, "_core").storage.data_path, "DataItems")
+
+    def get_json_data_path(self, bare_fn):
+        if not bare_fn.endswith(self.extension):
+            return os.path.join(self.dataitems_path, "%s%s" % (bare_fn, self.extension))
+        return os.path.join(self.dataitems_path, bare_fn)
+
+    def get_all_files(self, scandir_generic=False):
+        _scandir = _scandir_generic if scandir_generic else scandir
+        for entry in _scandir(self.dataitems_path):
+            if entry.is_file(follow_symlinks=False) and \
+                    entry.name.startswith("subs_") and \
+                    entry.name.endswith(self.extension):
+                yield entry.name
+
+    def get_recent_files(self, age_days=30):
+        fl = []
+        root = self.dataitems_path
+        recent_dt = datetime.datetime.now() - datetime.timedelta(days=age_days)
+
+        def run(scandir_generic=False):
+            for fn in self.get_all_files(scandir_generic=scandir_generic):
+                ctime = os.path.getctime(os.path.join(root, fn))
+                created = datetime.datetime.fromtimestamp(ctime)
+                if created > recent_dt:
+                    fl.append(fn)
+        try:
+            run()
+        except OSError:
+            run(scandir_generic=True)
+        return fl
+
+    def load_recent_files(self, age_days=30):
+        fl = self.get_recent_files(age_days=age_days)
+        out = {}
+        for fn in fl:
+            data = self.load(filename=fn)
+            if data:
+                out[fn] = data
+        return out
+
+    def delete_missing(self, wanted_languages=set(), scandir_generic=False):
+        deleted = []
+
+        def delete_fn(filename):
+            if filename.endswith(self.extension):
+                self.delete(self.get_json_data_path(filename))
+            else:
+                self.legacy_delete(filename)
+
+        for fn in self.get_all_files(scandir_generic=scandir_generic):
+            video_id = os.path.basename(fn).split(".")[0].split("subs_")[1]
+            item = self.get_item(video_id)
+
+            # item missing, delete storage
+            if not item:
+                delete_fn(fn)
+                deleted.append(video_id)
+
+            else:
+                known_parts = []
+
+                # wrong (legacy) info, delete storage
+                if not hasattr(item, "media"):
+                    delete_fn(fn)
+                    deleted.append(video_id)
+                    continue
+
+                for media in item.media:
+                    for part in media.parts:
+                        known_parts.append(str(part.id))
+                stored_subs = self.load(filename=fn)
+
+                if not stored_subs:
+                    continue
+
+                missing_parts = set(stored_subs.parts).difference(set(known_parts))
+
+                changed_any = False
+
+                # remove known info about deleted parts
+                if missing_parts:
+                    logger.debug("Parts removed: %s:%s, removing data", video_id, missing_parts)
+                    for missing_part in missing_parts:
+                        if missing_part in stored_subs.parts:
+                            try:
+                                del stored_subs.parts[missing_part]
+                                changed_any = True
+                            except:
+                                pass
+
+                # remove known info about non-existing languages
+                for part_id, part in stored_subs.parts.iteritems():
+                    missing_languages = set(part).difference(wanted_languages)
+                    if missing_languages:
+                        logger.debug("Languages removed: %s:%s:%s, removing data", video_id, part_id, missing_languages)
+                        for missing_language in missing_languages:
+                            try:
+                                del stored_subs.parts[part_id][missing_language]
+                                changed_any = True
+                            except:
+                                pass
+
+                if changed_any:
+                    self.save(stored_subs)
+                stored_subs = None
+                missing_parts = None
+                missing_languages = None
+
+        return deleted
+
+    def migrate_v2(self, subs_for_video):
+        plex_item = self.get_item(subs_for_video.video_id)
+        if not plex_item:
+            return False
+        subs_for_video.item_type = plex_item.type
+        subs_for_video.added_at = datetime.datetime.fromtimestamp(plex_item.added_at)
+        subs_for_video.version = 2
+        return True
+
+    def migrate_v3(self, subs_for_video):
+        subs_for_video.version = 3
+        return True
+
+    def load(self, video_id=None, filename=None):
+        subs_for_video = None
+        bare_fn = self.get_storage_filename(video_id) if video_id else filename
+        json_path = self.get_json_data_path(bare_fn)
+        basename = os.path.basename(json_path)
+
+        #logger.debug("Loading subtitle storage data file: %s", basename)
+
+        if os.path.exists(json_path):
+            # new style data
+            subs_for_video = JSONStoredVideoSubtitles()
+            try:
+                with self.threadkit.Lock(key="sub_storage_%s" % basename):
+                    if sys.platform == "win32":
+                        try:
+                            with open(json_path, 'rb') as f:
+                                s = zlib.decompress(f.read())
+                        except zlib.error:
+                            # fallback to old gzip win32 implementation
+                            with gzip.open(json_path, 'rb', compresslevel=6) as f:
+                                s = f.read()
+
+                    else:
+                        with gzip.open(json_path, 'rb', compresslevel=6) as f:
+                            s = f.read()
+
+                data = loads(s)
+            except:
+                logger.error("Couldn't load JSON data for %s: %s", bare_fn, traceback.format_exc())
+                return
+
+            subs_for_video.deserialize(data)
+            data = None
+
+        if not subs_for_video:
+            return
+
+        # apply possible migrations
+        cur_ver = old_ver = subs_for_video.version
+
+        if cur_ver < self.version:
+            success = False
+            while cur_ver < self.version:
+                cur_ver += 1
+                mig_func = "migrate_v%s" % cur_ver
+                if hasattr(self, mig_func):
+                    logger.info("Migrating subtitle storage for %s %s>%s" % (subs_for_video.video_id, old_ver, cur_ver))
+                    success = getattr(self, mig_func)(subs_for_video)
+                    if success is False:
+                        logger.error("Couldn't migrate %s, removing data", subs_for_video.video_id)
+                        self.delete(json_path)
+                        break
+
+            if cur_ver > old_ver and success:
+                logger.info("Storing migrated subtitle storage for %s" % subs_for_video.video_id)
+                self.save(subs_for_video)
+            elif not success:
+                logger.info("Migration of %s %s>%s failed" % (subs_for_video.video_id, old_ver, cur_ver))
+
+        return subs_for_video
+
+    def new(self, plex_item):
+        subs_for_video = JSONStoredVideoSubtitles()
+        subs_for_video.initialize(plex_item, version=self.version)
+        return subs_for_video
+
+    def load_or_new(self, plex_item, save=False):
+        subs_for_video = self.load(plex_item.rating_key)
+        if not subs_for_video:
+            logger.info("Creating new subtitle storage for: %s", plex_item.rating_key)
+            subs_for_video = self.new(plex_item)
+            if save:
+                self.save(subs_for_video)
+        return subs_for_video
+
+    def save(self, subs_for_video):
+        data = subs_for_video.serialize()
+        temp_fn = self.get_json_data_path(self.get_storage_filename(subs_for_video.video_id) + "_tmp")
+        fn = self.get_json_data_path(self.get_storage_filename(subs_for_video.video_id))
+        basename = os.path.basename(fn)
+        json_data = str(dumps(data, ensure_ascii=False))
+        with self.threadkit.Lock(key="sub_storage_%s" % basename):
+            if sys.platform == "win32":
+                try:
+                    f = open(temp_fn, "w+b")
+
+                    try:
+                        f.seek(0, os.SEEK_CUR)
+                        f.write(zlib.compress(json_data, 6))
+                        f.flush()
+                    except:
+                        logger.error("Something went wrong when writing to: %s: %s", basename, traceback.format_exc())
+                    finally:
+                        f.close()
+                except:
+                    logger.error("Something went REALLY wrong when writing to: %s: %s", basename,
+                                 traceback.format_exc())
+            else:
+                with gzip.open(temp_fn, "wb", compresslevel=6) as f:
+                    f.write(json_data)
+
+            os.rename(temp_fn, fn)
+
+    def delete(self, filename):
+        os.remove(filename)
+
+    def legacy_delete(self, filename):
+        try:
+            self.storage.Remove(filename)
+        except:
+            logger.error("Failed to delete item %s: %s" % (filename, traceback.format_exc()))
diff --git a/libs/subzero/util.py b/libs/subzero/util.py
new file mode 100644
index 000000000..25ab0cd60
--- /dev/null
+++ b/libs/subzero/util.py
@@ -0,0 +1,7 @@
+# coding=utf-8
+import os
+from subzero.lib.io import get_viable_encoding
+
+
+def get_root_path():
+    return os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(unicode(__file__, get_viable_encoding()))), ".."))
diff --git a/libs/subzero/video.py b/libs/subzero/video.py
new file mode 100644
index 000000000..cb5b8d172
--- /dev/null
+++ b/libs/subzero/video.py
@@ -0,0 +1,180 @@
+# coding=utf-8
+
+import logging
+import os
+
+from babelfish.exceptions import LanguageError
+from subzero.language import Language, language_from_stream
+from subliminal_patch import scan_video, refine, search_external_subtitles
+
+logger = logging.getLogger(__name__)
+
+
+def has_external_subtitle(part_id, stored_subs, language):
+    stored_sub = stored_subs.get_any(part_id, language)
+    if stored_sub and stored_sub.storage_type == "filesystem":
+        return True
+
+
+def set_existing_languages(video, video_info, external_subtitles=False, embedded_subtitles=False, known_embedded=None,
+                           stored_subs=None, languages=None, only_one=False):
+    logger.debug(u"Determining existing subtitles for %s", video.name)
+
+    # scan for external subtitles
+    external_langs_found = set(search_external_subtitles(video.name, languages=languages,
+                                                         only_one=only_one).values())
+
+    # found external subtitles should be considered?
+    if external_subtitles:
+        # |= is update, thanks plex
+        video.subtitle_languages.update(external_langs_found)
+
+    else:
+        # did we already download subtitles for this?
+        if stored_subs and external_langs_found:
+            for lang in external_langs_found:
+                if has_external_subtitle(video_info["plex_part"].id, stored_subs, lang):
+                    logger.info("Not re-downloading subtitle for language %s, it already exists on the filesystem",
+                                lang)
+                    video.subtitle_languages.add(lang)
+
+    # add known embedded subtitles
+    if embedded_subtitles and known_embedded:
+        # mp4 and stuff, check burned in
+        for language in known_embedded:
+            logger.debug('Found embedded subtitle %r', language)
+            video.subtitle_languages.add(language)
+
+
+def parse_video(fn, hints, skip_hashing=False, dry_run=False, providers=None):
+    logger.debug("Parsing video: %s, hints: %s", os.path.basename(fn), hints)
+    return scan_video(fn, hints=hints, dont_use_actual_file=dry_run, providers=providers,
+                      skip_hashing=skip_hashing)
+
+
+def refine_video(video, no_refining=False, refiner_settings=None):
+    refiner_settings = refiner_settings or {}
+    video_info = video.plexapi_metadata
+    hints = video.hints
+
+    if no_refining:
+        logger.debug("Taking parse_video shortcut")
+        return video
+
+    # refiners
+    refine_kwargs = {
+        "episode_refiners": ['sz_tvdb', 'sz_omdb',],
+        "movie_refiners": ['sz_omdb',],
+        "embedded_subtitles": False,
+    }
+    refine_kwargs.update(refiner_settings)
+
+    if "filebot" in refiner_settings:
+        # filebot always comes first
+        refine_kwargs["episode_refiners"].insert(0, "filebot")
+        refine_kwargs["movie_refiners"].insert(0, "filebot")
+
+    if "symlinks" in refiner_settings:
+        refine_kwargs["episode_refiners"].insert(0, "symlinks")
+        refine_kwargs["movie_refiners"].insert(0, "symlinks")
+
+    if "file_info_file" in refiner_settings:
+        # file_info_file always comes first
+        refine_kwargs["episode_refiners"].insert(0, "file_info_file")
+        refine_kwargs["movie_refiners"].insert(0, "file_info_file")
+
+    if "sonarr" in refiner_settings:
+        # drone always comes last
+        refine_kwargs["episode_refiners"].append("drone")
+
+    if "radarr" in refiner_settings:
+        refine_kwargs["movie_refiners"].append("drone")
+
+    # our own metadata refiner :)
+    if "stream" in video_info:
+        for key, value in video_info["stream"].iteritems():
+            if hasattr(video, key) and not getattr(video, key):
+                logger.info(u"Adding stream %s info: %s", key, value)
+                setattr(video, key, value)
+
+    plex_title = video_info.get("original_title") or video_info.get("title")
+    if hints["type"] == "episode":
+        plex_title = video_info.get("original_title") or video_info.get("series")
+
+    year = video_info.get("year")
+    if not video.year and year:
+        logger.info(u"Adding PMS year info: %s", year)
+        video.year = year
+
+    refine(video, **refine_kwargs)
+    logger.info(u"Using filename: %s", video.original_name)
+
+    if hints["type"] == "movie" and not video.imdb_id:
+        if plex_title:
+            logger.info(u"Adding PMS title/original_title info: %s", plex_title)
+            old_title = video.title
+            video.title = plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ")
+
+            # re-refine with new info
+            logger.info(u"Re-refining with movie title: '%s' instead of '%s'", plex_title, old_title)
+            refine(video, **refine_kwargs)
+
+            video.alternative_titles.append(old_title)
+
+        # still no match? add our own data
+        if not video.imdb_id:
+            video.imdb_id = video_info.get("imdb_id")
+            if video.imdb_id:
+                logger.info(u"Adding PMS imdb_id info: %s", video.imdb_id)
+
+    elif hints["type"] == "movie" and plex_title:
+        pt = plex_title.replace(" - ", " ").replace(" -", " ").replace("- ", " ")
+        if pt != video.title:
+            video.alternative_titles.append(pt)
+
+    if hints["type"] == "episode":
+        video.season = video_info.get("season", video.season)
+        video.episode = video_info.get("episode", video.episode)
+        if not video.series_tvdb_id and not video.tvdb_id and plex_title:
+            # add our title
+            logger.info(u"Adding PMS title/original_title info: %s", plex_title)
+            old_title = video.series
+            video.series = plex_title
+
+            # re-refine with new info
+            logger.info(u"Re-refining with series title: '%s' instead of '%s'", plex_title, old_title)
+            refine(video, **refine_kwargs)
+
+            video.alternative_series.append(old_title)
+
+        elif plex_title and video.series != plex_title:
+            video.alternative_series.append(plex_title)
+
+        # still no match? add our own data
+        if not video.series_tvdb_id or not video.tvdb_id:
+            logger.info(u"Adding PMS year info: %s", video_info.get("year"))
+            video.year = video_info.get("year")
+
+        if not video.series_tvdb_id and video_info.get("series_tvdb_id"):
+            logger.info(u"Adding PMS series_tvdb_id info: %s", video_info.get("series_tvdb_id"))
+            video.series_tvdb_id = video_info.get("series_tvdb_id")
+
+        if not video.tvdb_id and video_info.get("tvdb_id"):
+            logger.info(u"Adding PMS tvdb_id info: %s", video_info.get("tvdb_id"))
+            video.tvdb_id = video_info.get("tvdb_id")
+
+    # did it match?
+    if (hints["type"] == "episode" and not video.series_tvdb_id and not video.tvdb_id) \
+            or (hints["type"] == "movie" and not video.imdb_id):
+        logger.warning("Couldn't find corresponding series/movie in online databases, continuing")
+
+    # guess special
+    if hints["type"] == "episode":
+        if video.season == 0 or video.episode == 0:
+            video.is_special = True
+        else:
+            # check parent folder name
+            if os.path.dirname(video.name).split(os.path.sep)[-1].lower() in ("specials", "season 00"):
+                video.is_special = True
+
+    return video
diff --git a/libs/urllib3/__init__.py b/libs/urllib3/__init__.py
index 4bd533b5b..75725167e 100644
--- a/libs/urllib3/__init__.py
+++ b/libs/urllib3/__init__.py
@@ -23,16 +23,11 @@ from .util.retry import Retry
 
 # Set default logging handler to avoid "No handler found" warnings.
 import logging
-try:  # Python 2.7+
-    from logging import NullHandler
-except ImportError:
-    class NullHandler(logging.Handler):
-        def emit(self, record):
-            pass
+from logging import NullHandler
 
 __author__ = 'Andrey Petrov (andrey.petrov@shazow.net)'
 __license__ = 'MIT'
-__version__ = '1.23'
+__version__ = '1.24'
 
 __all__ = (
     'HTTPConnectionPool',
diff --git a/libs/urllib3/_collections.py b/libs/urllib3/_collections.py
index 6e36b84e5..34f23811c 100644
--- a/libs/urllib3/_collections.py
+++ b/libs/urllib3/_collections.py
@@ -14,10 +14,7 @@ except ImportError:  # Platform-specific: No threads available
             pass
 
 
-try:  # Python 2.7+
-    from collections import OrderedDict
-except ImportError:
-    from .packages.ordered_dict import OrderedDict
+from collections import OrderedDict
 from .exceptions import InvalidHeader
 from .packages.six import iterkeys, itervalues, PY3
 
diff --git a/libs/urllib3/connection.py b/libs/urllib3/connection.py
index a03b573f0..02b36654b 100644
--- a/libs/urllib3/connection.py
+++ b/libs/urllib3/connection.py
@@ -2,7 +2,6 @@ from __future__ import absolute_import
 import datetime
 import logging
 import os
-import sys
 import socket
 from socket import error as SocketError, timeout as SocketTimeout
 import warnings
@@ -78,9 +77,6 @@ class HTTPConnection(_HTTPConnection, object):
 
       - ``strict``: See the documentation on :class:`urllib3.connectionpool.HTTPConnectionPool`
       - ``source_address``: Set the source address for the current connection.
-
-        .. note:: This is ignored for Python 2.6. It is only applied for 2.7 and 3.x
-
       - ``socket_options``: Set specific options on the underlying socket. If not specified, then
         defaults are loaded from ``HTTPConnection.default_socket_options`` which includes disabling
         Nagle's algorithm (sets TCP_NODELAY to 1) unless the connection is behind a proxy.
@@ -108,21 +104,13 @@ class HTTPConnection(_HTTPConnection, object):
         if six.PY3:  # Python 3
             kw.pop('strict', None)
 
-        # Pre-set source_address in case we have an older Python like 2.6.
+        # Pre-set source_address.
         self.source_address = kw.get('source_address')
 
-        if sys.version_info < (2, 7):  # Python 2.6
-            # _HTTPConnection on Python 2.6 will balk at this keyword arg, but
-            # not newer versions. We can still use it when creating a
-            # connection though, so we pop it *after* we have saved it as
-            # self.source_address.
-            kw.pop('source_address', None)
-
         #: The socket options provided by the user. If no options are
         #: provided, we use the default options.
         self.socket_options = kw.pop('socket_options', self.default_socket_options)
 
-        # Superclass also sets self.source_address in Python 2.7+.
         _HTTPConnection.__init__(self, *args, **kw)
 
     @property
@@ -183,10 +171,7 @@ class HTTPConnection(_HTTPConnection, object):
 
     def _prepare_conn(self, conn):
         self.sock = conn
-        # the _tunnel_host attribute was added in python 2.6.3 (via
-        # http://hg.python.org/cpython/rev/0f57b30a152f) so pythons 2.6(0-2) do
-        # not have them.
-        if getattr(self, '_tunnel_host', None):
+        if self._tunnel_host:
             # TODO: Fix tunnel so it doesn't depend on self.sock state.
             self._tunnel()
             # Mark this connection as not reusable
@@ -217,13 +202,13 @@ class HTTPConnection(_HTTPConnection, object):
         self.endheaders()
 
         if body is not None:
-            stringish_types = six.string_types + (six.binary_type,)
+            stringish_types = six.string_types + (bytes,)
             if isinstance(body, stringish_types):
                 body = (body,)
             for chunk in body:
                 if not chunk:
                     continue
-                if not isinstance(chunk, six.binary_type):
+                if not isinstance(chunk, bytes):
                     chunk = chunk.encode('utf8')
                 len_str = hex(len(chunk))[2:]
                 self.send(len_str.encode('utf-8'))
@@ -242,7 +227,7 @@ class HTTPSConnection(HTTPConnection):
 
     def __init__(self, host, port=None, key_file=None, cert_file=None,
                  strict=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
-                 ssl_context=None, **kw):
+                 ssl_context=None, server_hostname=None, **kw):
 
         HTTPConnection.__init__(self, host, port, strict=strict,
                                 timeout=timeout, **kw)
@@ -250,6 +235,7 @@ class HTTPSConnection(HTTPConnection):
         self.key_file = key_file
         self.cert_file = cert_file
         self.ssl_context = ssl_context
+        self.server_hostname = server_hostname
 
         # Required property for Google AppEngine 1.9.0 which otherwise causes
         # HTTPS requests to go out as HTTP. (See Issue #356)
@@ -270,6 +256,7 @@ class HTTPSConnection(HTTPConnection):
             keyfile=self.key_file,
             certfile=self.cert_file,
             ssl_context=self.ssl_context,
+            server_hostname=self.server_hostname
         )
 
 
@@ -312,12 +299,9 @@ class VerifiedHTTPSConnection(HTTPSConnection):
     def connect(self):
         # Add certificate verification
         conn = self._new_conn()
-
         hostname = self.host
-        if getattr(self, '_tunnel_host', None):
-            # _tunnel_host was added in Python 2.6.3
-            # (See: http://hg.python.org/cpython/rev/0f57b30a152f)
 
+        if self._tunnel_host:
             self.sock = conn
             # Calls self._set_hostport(), so self.host is
             # self._tunnel_host below.
@@ -328,6 +312,10 @@ class VerifiedHTTPSConnection(HTTPSConnection):
             # Override the host with the one we're requesting data from.
             hostname = self._tunnel_host
 
+        server_hostname = hostname
+        if self.server_hostname is not None:
+            server_hostname = self.server_hostname
+
         is_time_off = datetime.date.today() < RECENT_DATE
         if is_time_off:
             warnings.warn((
@@ -352,7 +340,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
             certfile=self.cert_file,
             ca_certs=self.ca_certs,
             ca_cert_dir=self.ca_cert_dir,
-            server_hostname=hostname,
+            server_hostname=server_hostname,
             ssl_context=context)
 
         if self.assert_fingerprint:
@@ -373,7 +361,7 @@ class VerifiedHTTPSConnection(HTTPSConnection):
                     'for details.)'.format(hostname)),
                     SubjectAltNameWarning
                 )
-            _match_hostname(cert, self.assert_hostname or hostname)
+            _match_hostname(cert, self.assert_hostname or server_hostname)
 
         self.is_verified = (
             context.verify_mode == ssl.CERT_REQUIRED or
diff --git a/libs/urllib3/connectionpool.py b/libs/urllib3/connectionpool.py
index 8fcb0bce7..f7a8f193d 100644
--- a/libs/urllib3/connectionpool.py
+++ b/libs/urllib3/connectionpool.py
@@ -89,7 +89,7 @@ class ConnectionPool(object):
 
 
 # This is taken from http://hg.python.org/cpython/file/7aaba721ebc0/Lib/socket.py#l252
-_blocking_errnos = set([errno.EAGAIN, errno.EWOULDBLOCK])
+_blocking_errnos = {errno.EAGAIN, errno.EWOULDBLOCK}
 
 
 class HTTPConnectionPool(ConnectionPool, RequestMethods):
@@ -313,7 +313,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         # Catch possible read timeouts thrown as SSL errors. If not the
         # case, rethrow the original. We need to do this because of:
         # http://bugs.python.org/issue10272
-        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python 2.6
+        if 'timed out' in str(err) or 'did not complete (read)' in str(err):  # Python < 2.7.4
             raise ReadTimeoutError(self, url, "Read timed out. (read timeout=%s)" % timeout_value)
 
     def _make_request(self, conn, method, url, timeout=_Default, chunked=False,
@@ -375,7 +375,7 @@ class HTTPConnectionPool(ConnectionPool, RequestMethods):
         try:
             try:  # Python 2.7, use buffering of HTTP responses
                 httplib_response = conn.getresponse(buffering=True)
-            except TypeError:  # Python 2.6 and older, Python 3
+            except TypeError:  # Python 3
                 try:
                     httplib_response = conn.getresponse()
                 except Exception as e:
@@ -801,17 +801,7 @@ class HTTPSConnectionPool(HTTPConnectionPool):
         Establish tunnel connection early, because otherwise httplib
         would improperly set Host: header to proxy's IP:port.
         """
-        # Python 2.7+
-        try:
-            set_tunnel = conn.set_tunnel
-        except AttributeError:  # Platform-specific: Python 2.6
-            set_tunnel = conn._set_tunnel
-
-        if sys.version_info <= (2, 6, 4) and not self.proxy_headers:  # Python 2.6.4 and older
-            set_tunnel(self._proxy_host, self.port)
-        else:
-            set_tunnel(self._proxy_host, self.port, self.proxy_headers)
-
+        conn.set_tunnel(self._proxy_host, self.port, self.proxy_headers)
         conn.connect()
 
     def _new_conn(self):
diff --git a/libs/urllib3/contrib/_appengine_environ.py b/libs/urllib3/contrib/_appengine_environ.py
new file mode 100644
index 000000000..f3e00942c
--- /dev/null
+++ b/libs/urllib3/contrib/_appengine_environ.py
@@ -0,0 +1,30 @@
+"""
+This module provides means to detect the App Engine environment.
+"""
+
+import os
+
+
+def is_appengine():
+    return (is_local_appengine() or
+            is_prod_appengine() or
+            is_prod_appengine_mvms())
+
+
+def is_appengine_sandbox():
+    return is_appengine() and not is_prod_appengine_mvms()
+
+
+def is_local_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Development/' in os.environ['SERVER_SOFTWARE'])
+
+
+def is_prod_appengine():
+    return ('APPENGINE_RUNTIME' in os.environ and
+            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
+            not is_prod_appengine_mvms())
+
+
+def is_prod_appengine_mvms():
+    return os.environ.get('GAE_VM', False) == 'true'
diff --git a/libs/urllib3/contrib/appengine.py b/libs/urllib3/contrib/appengine.py
index 66922e06a..2952f114d 100644
--- a/libs/urllib3/contrib/appengine.py
+++ b/libs/urllib3/contrib/appengine.py
@@ -39,8 +39,8 @@ urllib3 on Google App Engine:
 """
 
 from __future__ import absolute_import
+import io
 import logging
-import os
 import warnings
 from ..packages.six.moves.urllib.parse import urljoin
 
@@ -53,11 +53,11 @@ from ..exceptions import (
     SSLError
 )
 
-from ..packages.six import BytesIO
 from ..request import RequestMethods
 from ..response import HTTPResponse
 from ..util.timeout import Timeout
 from ..util.retry import Retry
+from . import _appengine_environ
 
 try:
     from google.appengine.api import urlfetch
@@ -239,7 +239,7 @@ class AppEngineManager(RequestMethods):
         original_response = HTTPResponse(
             # In order for decoding to work, we must present the content as
             # a file-like object.
-            body=BytesIO(urlfetch_resp.content),
+            body=io.BytesIO(urlfetch_resp.content),
             msg=urlfetch_resp.header_msg,
             headers=urlfetch_resp.headers,
             status=urlfetch_resp.status_code,
@@ -247,7 +247,7 @@ class AppEngineManager(RequestMethods):
         )
 
         return HTTPResponse(
-            body=BytesIO(urlfetch_resp.content),
+            body=io.BytesIO(urlfetch_resp.content),
             headers=urlfetch_resp.headers,
             status=urlfetch_resp.status_code,
             original_response=original_response,
@@ -280,26 +280,10 @@ class AppEngineManager(RequestMethods):
         return retries
 
 
-def is_appengine():
-    return (is_local_appengine() or
-            is_prod_appengine() or
-            is_prod_appengine_mvms())
+# Alias methods from _appengine_environ to maintain public API interface.
 
-
-def is_appengine_sandbox():
-    return is_appengine() and not is_prod_appengine_mvms()
-
-
-def is_local_appengine():
-    return ('APPENGINE_RUNTIME' in os.environ and
-            'Development/' in os.environ['SERVER_SOFTWARE'])
-
-
-def is_prod_appengine():
-    return ('APPENGINE_RUNTIME' in os.environ and
-            'Google App Engine/' in os.environ['SERVER_SOFTWARE'] and
-            not is_prod_appengine_mvms())
-
-
-def is_prod_appengine_mvms():
-    return os.environ.get('GAE_VM', False) == 'true'
+is_appengine = _appengine_environ.is_appengine
+is_appengine_sandbox = _appengine_environ.is_appengine_sandbox
+is_local_appengine = _appengine_environ.is_local_appengine
+is_prod_appengine = _appengine_environ.is_prod_appengine
+is_prod_appengine_mvms = _appengine_environ.is_prod_appengine_mvms
diff --git a/libs/urllib3/contrib/ntlmpool.py b/libs/urllib3/contrib/ntlmpool.py
index 642e99ed2..8ea127c58 100644
--- a/libs/urllib3/contrib/ntlmpool.py
+++ b/libs/urllib3/contrib/ntlmpool.py
@@ -43,8 +43,7 @@ class NTLMConnectionPool(HTTPSConnectionPool):
         log.debug('Starting NTLM HTTPS connection no. %d: https://%s%s',
                   self.num_connections, self.host, self.authurl)
 
-        headers = {}
-        headers['Connection'] = 'Keep-Alive'
+        headers = {'Connection': 'Keep-Alive'}
         req_header = 'Authorization'
         resp_header = 'www-authenticate'
 
diff --git a/libs/urllib3/contrib/pyopenssl.py b/libs/urllib3/contrib/pyopenssl.py
index 4d4b1aff9..7c0e9465d 100644
--- a/libs/urllib3/contrib/pyopenssl.py
+++ b/libs/urllib3/contrib/pyopenssl.py
@@ -163,6 +163,9 @@ def _dnsname_to_stdlib(name):
     from ASCII bytes. We need to idna-encode that string to get it back, and
     then on Python 3 we also need to convert to unicode via UTF-8 (the stdlib
     uses PyUnicode_FromStringAndSize on it, which decodes via UTF-8).
+
+    If the name cannot be idna-encoded then we return None signalling that
+    the name given should be skipped.
     """
     def idna_encode(name):
         """
@@ -172,14 +175,19 @@ def _dnsname_to_stdlib(name):
         """
         import idna
 
-        for prefix in [u'*.', u'.']:
-            if name.startswith(prefix):
-                name = name[len(prefix):]
-                return prefix.encode('ascii') + idna.encode(name)
-        return idna.encode(name)
+        try:
+            for prefix in [u'*.', u'.']:
+                if name.startswith(prefix):
+                    name = name[len(prefix):]
+                    return prefix.encode('ascii') + idna.encode(name)
+            return idna.encode(name)
+        except idna.core.IDNAError:
+            return None
 
     name = idna_encode(name)
-    if sys.version_info >= (3, 0):
+    if name is None:
+        return None
+    elif sys.version_info >= (3, 0):
         name = name.decode('utf-8')
     return name
 
@@ -223,9 +231,10 @@ def get_subj_alt_name(peer_cert):
     # Sadly the DNS names need to be idna encoded and then, on Python 3, UTF-8
     # decoded. This is pretty frustrating, but that's what the standard library
     # does with certificates, and so we need to attempt to do the same.
+    # We also want to skip over names which cannot be idna encoded.
     names = [
-        ('DNS', _dnsname_to_stdlib(name))
-        for name in ext.get_values_for_type(x509.DNSName)
+        ('DNS', name) for name in map(_dnsname_to_stdlib, ext.get_values_for_type(x509.DNSName))
+        if name is not None
     ]
     names.extend(
         ('IP Address', str(name))
diff --git a/libs/urllib3/packages/backports/makefile.py b/libs/urllib3/packages/backports/makefile.py
index 75b80dcf8..740db377d 100644
--- a/libs/urllib3/packages/backports/makefile.py
+++ b/libs/urllib3/packages/backports/makefile.py
@@ -16,7 +16,7 @@ def backport_makefile(self, mode="r", buffering=None, encoding=None,
     """
     Backport of ``socket.makefile`` from Python 3.5.
     """
-    if not set(mode) <= set(["r", "w", "b"]):
+    if not set(mode) <= {"r", "w", "b"}:
         raise ValueError(
             "invalid mode %r (only r, w, b allowed)" % (mode,)
         )
diff --git a/libs/urllib3/packages/ssl_match_hostname/_implementation.py b/libs/urllib3/packages/ssl_match_hostname/_implementation.py
index 1fd42f38a..d6e66c019 100644
--- a/libs/urllib3/packages/ssl_match_hostname/_implementation.py
+++ b/libs/urllib3/packages/ssl_match_hostname/_implementation.py
@@ -9,8 +9,7 @@ import sys
 # ipaddress has been backported to 2.6+ in pypi.  If it is installed on the
 # system, use it to handle IPAddress ServerAltnames (this was added in
 # python-3.5) otherwise only do DNS matching.  This allows
-# backports.ssl_match_hostname to continue to be used all the way back to
-# python-2.4.
+# backports.ssl_match_hostname to continue to be used in Python 2.7.
 try:
     import ipaddress
 except ImportError:
diff --git a/libs/urllib3/poolmanager.py b/libs/urllib3/poolmanager.py
index 506a3c9b8..fe5491cfd 100644
--- a/libs/urllib3/poolmanager.py
+++ b/libs/urllib3/poolmanager.py
@@ -47,6 +47,7 @@ _key_fields = (
     'key__socks_options',  # dict
     'key_assert_hostname',  # bool or string
     'key_assert_fingerprint',  # str
+    'key_server_hostname', #str
 )
 
 #: The namedtuple class used to construct keys for the connection pool.
diff --git a/libs/urllib3/request.py b/libs/urllib3/request.py
index 1be333411..8f2f44bb2 100644
--- a/libs/urllib3/request.py
+++ b/libs/urllib3/request.py
@@ -36,7 +36,7 @@ class RequestMethods(object):
         explicitly.
     """
 
-    _encode_url_methods = set(['DELETE', 'GET', 'HEAD', 'OPTIONS'])
+    _encode_url_methods = {'DELETE', 'GET', 'HEAD', 'OPTIONS'}
 
     def __init__(self, headers=None):
         self.headers = headers or {}
diff --git a/libs/urllib3/response.py b/libs/urllib3/response.py
index 9873cb942..f0cfbb549 100644
--- a/libs/urllib3/response.py
+++ b/libs/urllib3/response.py
@@ -11,7 +11,7 @@ from .exceptions import (
     BodyNotHttplibCompatible, ProtocolError, DecodeError, ReadTimeoutError,
     ResponseNotChunked, IncompleteRead, InvalidHeader
 )
-from .packages.six import string_types as basestring, binary_type, PY3
+from .packages.six import string_types as basestring, PY3
 from .packages.six.moves import http_client as httplib
 from .connection import HTTPException, BaseSSLError
 from .util.response import is_fp_closed, is_response_to_head
@@ -23,7 +23,7 @@ class DeflateDecoder(object):
 
     def __init__(self):
         self._first_try = True
-        self._data = binary_type()
+        self._data = b''
         self._obj = zlib.decompressobj()
 
     def __getattr__(self, name):
@@ -69,7 +69,7 @@ class GzipDecoder(object):
         return getattr(self._obj, name)
 
     def decompress(self, data):
-        ret = binary_type()
+        ret = b''
         if self._state == GzipDecoderState.SWALLOW_DATA or not data:
             return ret
         while True:
@@ -90,7 +90,31 @@ class GzipDecoder(object):
             self._obj = zlib.decompressobj(16 + zlib.MAX_WBITS)
 
 
+class MultiDecoder(object):
+    """
+    From RFC7231:
+        If one or more encodings have been applied to a representation, the
+        sender that applied the encodings MUST generate a Content-Encoding
+        header field that lists the content codings in the order in which
+        they were applied.
+    """
+
+    def __init__(self, modes):
+        self._decoders = [_get_decoder(m.strip()) for m in modes.split(',')]
+
+    def flush(self):
+        return self._decoders[0].flush()
+
+    def decompress(self, data):
+        for d in reversed(self._decoders):
+            data = d.decompress(data)
+        return data
+
+
 def _get_decoder(mode):
+    if ',' in mode:
+        return MultiDecoder(mode)
+
     if mode == 'gzip':
         return GzipDecoder()
 
@@ -159,7 +183,7 @@ class HTTPResponse(io.IOBase):
         self.msg = msg
         self._request_url = request_url
 
-        if body and isinstance(body, (basestring, binary_type)):
+        if body and isinstance(body, (basestring, bytes)):
             self._body = body
 
         self._pool = pool
@@ -283,8 +307,13 @@ class HTTPResponse(io.IOBase):
         # Note: content-encoding value should be case-insensitive, per RFC 7230
         # Section 3.2
         content_encoding = self.headers.get('content-encoding', '').lower()
-        if self._decoder is None and content_encoding in self.CONTENT_DECODERS:
-            self._decoder = _get_decoder(content_encoding)
+        if self._decoder is None:
+            if content_encoding in self.CONTENT_DECODERS:
+                self._decoder = _get_decoder(content_encoding)
+            elif ',' in content_encoding:
+                encodings = [e.strip() for e in content_encoding.split(',') if e.strip() in self.CONTENT_DECODERS]
+                if len(encodings):
+                    self._decoder = _get_decoder(content_encoding)
 
     def _decode(self, data, decode_content, flush_decoder):
         """
diff --git a/libs/urllib3/util/connection.py b/libs/urllib3/util/connection.py
index 5cf488f4b..5ad70b2f1 100644
--- a/libs/urllib3/util/connection.py
+++ b/libs/urllib3/util/connection.py
@@ -1,6 +1,7 @@
 from __future__ import absolute_import
 import socket
 from .wait import NoWayToWaitForSocketError, wait_for_read
+from ..contrib import _appengine_environ
 
 
 def is_connection_dropped(conn):  # Platform-specific
@@ -105,6 +106,13 @@ def _has_ipv6(host):
     sock = None
     has_ipv6 = False
 
+    # App Engine doesn't support IPV6 sockets and actually has a quota on the
+    # number of sockets that can be used, so just early out here instead of
+    # creating a socket needlessly.
+    # See https://github.com/urllib3/urllib3/issues/1446
+    if _appengine_environ.is_appengine_sandbox():
+        return False
+
     if socket.has_ipv6:
         # has_ipv6 returns true if cPython was compiled with IPv6 support.
         # It does not tell us if the system has IPv6 support enabled. To
diff --git a/libs/urllib3/util/response.py b/libs/urllib3/util/response.py
index 67cf730ab..3d5486485 100644
--- a/libs/urllib3/util/response.py
+++ b/libs/urllib3/util/response.py
@@ -59,8 +59,14 @@ def assert_header_parsing(headers):
     get_payload = getattr(headers, 'get_payload', None)
 
     unparsed_data = None
-    if get_payload:  # Platform-specific: Python 3.
-        unparsed_data = get_payload()
+    if get_payload:
+        # get_payload is actually email.message.Message.get_payload;
+        # we're only interested in the result if it's not a multipart message
+        if not headers.is_multipart():
+            payload = get_payload()
+
+            if isinstance(payload, (bytes, str)):
+                unparsed_data = payload
 
     if defects or unparsed_data:
         raise HeaderParsingError(defects=defects, unparsed_data=unparsed_data)
diff --git a/libs/urllib3/util/retry.py b/libs/urllib3/util/retry.py
index 7ad3dc660..e7d0abd61 100644
--- a/libs/urllib3/util/retry.py
+++ b/libs/urllib3/util/retry.py
@@ -115,7 +115,7 @@ class Retry(object):
         (most errors are resolved immediately by a second try without a
         delay). urllib3 will sleep for::
 
-            {backoff factor} * (2 ^ ({number of total retries} - 1))
+            {backoff factor} * (2 ** ({number of total retries} - 1))
 
         seconds. If the backoff_factor is 0.1, then :func:`.sleep` will sleep
         for [0.0s, 0.2s, 0.4s, ...] between retries. It will never be longer
diff --git a/libs/urllib3/util/ssl_.py b/libs/urllib3/util/ssl_.py
index 2893752a3..24ee26d63 100644
--- a/libs/urllib3/util/ssl_.py
+++ b/libs/urllib3/util/ssl_.py
@@ -56,9 +56,8 @@ except ImportError:
     OP_NO_COMPRESSION = 0x20000
 
 
-# Python 2.7 and earlier didn't have inet_pton on non-Linux
-# so we fallback on inet_aton in those cases. This means that
-# we can only detect IPv4 addresses in this case.
+# Python 2.7 doesn't have inet_pton on non-Linux so we fallback on inet_aton in
+# those cases. This means that we can only detect IPv4 addresses in this case.
 if hasattr(socket, 'inet_pton'):
     inet_pton = socket.inet_pton
 else:
@@ -67,7 +66,7 @@ else:
         import ipaddress
 
         def inet_pton(_, host):
-            if isinstance(host, six.binary_type):
+            if isinstance(host, bytes):
                 host = host.decode('ascii')
             return ipaddress.ip_address(host)
 
@@ -115,10 +114,7 @@ try:
 except ImportError:
     import sys
 
-    class SSLContext(object):  # Platform-specific: Python 2 & 3.1
-        supports_set_ciphers = ((2, 7) <= sys.version_info < (3,) or
-                                (3, 2) <= sys.version_info)
-
+    class SSLContext(object):  # Platform-specific: Python 2
         def __init__(self, protocol_version):
             self.protocol = protocol_version
             # Use default values from a real SSLContext
@@ -141,12 +137,6 @@ except ImportError:
                 raise SSLError("CA directories not supported in older Pythons")
 
         def set_ciphers(self, cipher_suite):
-            if not self.supports_set_ciphers:
-                raise TypeError(
-                    'Your version of Python does not support setting '
-                    'a custom cipher suite. Please upgrade to Python '
-                    '2.7, 3.2, or later if you need this functionality.'
-                )
             self.ciphers = cipher_suite
 
         def wrap_socket(self, socket, server_hostname=None, server_side=False):
@@ -167,10 +157,7 @@ except ImportError:
                 'ssl_version': self.protocol,
                 'server_side': server_side,
             }
-            if self.supports_set_ciphers:  # Platform-specific: Python 2.7+
-                return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
-            else:  # Platform-specific: Python 2.6
-                return wrap_socket(socket, **kwargs)
+            return wrap_socket(socket, ciphers=self.ciphers, **kwargs)
 
 
 def assert_fingerprint(cert, fingerprint):
@@ -291,9 +278,6 @@ def create_urllib3_context(ssl_version=None, cert_reqs=None,
 
     context.options |= options
 
-    if getattr(context, 'supports_set_ciphers', True):  # Platform-specific: Python 2.6
-        context.set_ciphers(ciphers or DEFAULT_CIPHERS)
-
     context.verify_mode = cert_reqs
     if getattr(context, 'check_hostname', None) is not None:  # Platform-specific: Python 3.2
         # We do our own verification, including fingerprints and alternative
@@ -316,8 +300,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
         A pre-made :class:`SSLContext` object. If none is provided, one will
         be created using :func:`create_urllib3_context`.
     :param ciphers:
-        A string of ciphers we wish the client to support. This is not
-        supported on Python 2.6 as the ssl module does not support it.
+        A string of ciphers we wish the client to support.
     :param ca_cert_dir:
         A directory containing CA certificates in multiple separate files, as
         supported by OpenSSL's -CApath flag or the capath argument to
@@ -334,7 +317,7 @@ def ssl_wrap_socket(sock, keyfile=None, certfile=None, cert_reqs=None,
     if ca_certs or ca_cert_dir:
         try:
             context.load_verify_locations(ca_certs, ca_cert_dir)
-        except IOError as e:  # Platform-specific: Python 2.6, 2.7, 3.2
+        except IOError as e:  # Platform-specific: Python 2.7
             raise SSLError(e)
         # Py33 raises FileNotFoundError which subclasses OSError
         # These are not equivalent unless we check the errno attribute
@@ -378,7 +361,7 @@ def is_ipaddress(hostname):
     :param str hostname: Hostname to examine.
     :return: True if the hostname is an IP address, False otherwise.
     """
-    if six.PY3 and isinstance(hostname, six.binary_type):
+    if six.PY3 and isinstance(hostname, bytes):
         # IDN A-label bytes are ASCII compatible.
         hostname = hostname.decode('ascii')
 
diff --git a/libs/urllib3/util/wait.py b/libs/urllib3/util/wait.py
index fa686eff4..4db71bafd 100644
--- a/libs/urllib3/util/wait.py
+++ b/libs/urllib3/util/wait.py
@@ -43,9 +43,6 @@ if sys.version_info >= (3, 5):
 else:
     # Old and broken Pythons.
     def _retry_on_intr(fn, timeout):
-        if timeout is not None and timeout <= 0:
-            return fn(timeout)
-
         if timeout is None:
             deadline = float("inf")
         else:
@@ -117,7 +114,7 @@ def _have_working_poll():
     # from libraries like eventlet/greenlet.
     try:
         poll_obj = select.poll()
-        poll_obj.poll(0)
+        _retry_on_intr(poll_obj.poll, 0)
     except (AttributeError, OSError):
         return False
     else:
diff --git a/libs/wcwidth/__init__.py b/libs/wcwidth/__init__.py
new file mode 100644
index 000000000..a22c719f4
--- /dev/null
+++ b/libs/wcwidth/__init__.py
@@ -0,0 +1,4 @@
+"""wcwidth module, https://github.com/jquast/wcwidth."""
+from .wcwidth import wcwidth, wcswidth  # noqa
+
+__all__ = ('wcwidth', 'wcswidth',)
diff --git a/libs/wcwidth/table_wide.py b/libs/wcwidth/table_wide.py
new file mode 100644
index 000000000..0356c8863
--- /dev/null
+++ b/libs/wcwidth/table_wide.py
@@ -0,0 +1,112 @@
+"""Wide_Eastasian table. Created by setup.py."""
+# Generated: 2016-07-02T04:20:28.048222
+# Source: EastAsianWidth-9.0.0.txt
+# Date:  2016-05-27, 17:00:00 GMT [KW, LI]
+WIDE_EASTASIAN = (
+    (0x1100, 0x115f,),  # Hangul Choseong Kiyeok  ..Hangul Choseong Filler
+    (0x231a, 0x231b,),  # Watch                   ..Hourglass
+    (0x2329, 0x232a,),  # Left-pointing Angle Brac..Right-pointing Angle Bra
+    (0x23e9, 0x23ec,),  # Black Right-pointing Dou..Black Down-pointing Doub
+    (0x23f0, 0x23f0,),  # Alarm Clock             ..Alarm Clock
+    (0x23f3, 0x23f3,),  # Hourglass With Flowing S..Hourglass With Flowing S
+    (0x25fd, 0x25fe,),  # White Medium Small Squar..Black Medium Small Squar
+    (0x2614, 0x2615,),  # Umbrella With Rain Drops..Hot Beverage
+    (0x2648, 0x2653,),  # Aries                   ..Pisces
+    (0x267f, 0x267f,),  # Wheelchair Symbol       ..Wheelchair Symbol
+    (0x2693, 0x2693,),  # Anchor                  ..Anchor
+    (0x26a1, 0x26a1,),  # High Voltage Sign       ..High Voltage Sign
+    (0x26aa, 0x26ab,),  # Medium White Circle     ..Medium Black Circle
+    (0x26bd, 0x26be,),  # Soccer Ball             ..Baseball
+    (0x26c4, 0x26c5,),  # Snowman Without Snow    ..Sun Behind Cloud
+    (0x26ce, 0x26ce,),  # Ophiuchus               ..Ophiuchus
+    (0x26d4, 0x26d4,),  # No Entry                ..No Entry
+    (0x26ea, 0x26ea,),  # Church                  ..Church
+    (0x26f2, 0x26f3,),  # Fountain                ..Flag In Hole
+    (0x26f5, 0x26f5,),  # Sailboat                ..Sailboat
+    (0x26fa, 0x26fa,),  # Tent                    ..Tent
+    (0x26fd, 0x26fd,),  # Fuel Pump               ..Fuel Pump
+    (0x2705, 0x2705,),  # White Heavy Check Mark  ..White Heavy Check Mark
+    (0x270a, 0x270b,),  # Raised Fist             ..Raised Hand
+    (0x2728, 0x2728,),  # Sparkles                ..Sparkles
+    (0x274c, 0x274c,),  # Cross Mark              ..Cross Mark
+    (0x274e, 0x274e,),  # Negative Squared Cross M..Negative Squared Cross M
+    (0x2753, 0x2755,),  # Black Question Mark Orna..White Exclamation Mark O
+    (0x2757, 0x2757,),  # Heavy Exclamation Mark S..Heavy Exclamation Mark S
+    (0x2795, 0x2797,),  # Heavy Plus Sign         ..Heavy Division Sign
+    (0x27b0, 0x27b0,),  # Curly Loop              ..Curly Loop
+    (0x27bf, 0x27bf,),  # Double Curly Loop       ..Double Curly Loop
+    (0x2b1b, 0x2b1c,),  # Black Large Square      ..White Large Square
+    (0x2b50, 0x2b50,),  # White Medium Star       ..White Medium Star
+    (0x2b55, 0x2b55,),  # Heavy Large Circle      ..Heavy Large Circle
+    (0x2e80, 0x2e99,),  # Cjk Radical Repeat      ..Cjk Radical Rap
+    (0x2e9b, 0x2ef3,),  # Cjk Radical Choke       ..Cjk Radical C-simplified
+    (0x2f00, 0x2fd5,),  # Kangxi Radical One      ..Kangxi Radical Flute
+    (0x2ff0, 0x2ffb,),  # Ideographic Description ..Ideographic Description
+    (0x3000, 0x303e,),  # Ideographic Space       ..Ideographic Variation In
+    (0x3041, 0x3096,),  # Hiragana Letter Small A ..Hiragana Letter Small Ke
+    (0x3099, 0x30ff,),  # Combining Katakana-hirag..Katakana Digraph Koto
+    (0x3105, 0x312d,),  # Bopomofo Letter B       ..Bopomofo Letter Ih
+    (0x3131, 0x318e,),  # Hangul Letter Kiyeok    ..Hangul Letter Araeae
+    (0x3190, 0x31ba,),  # Ideographic Annotation L..Bopomofo Letter Zy
+    (0x31c0, 0x31e3,),  # Cjk Stroke T            ..Cjk Stroke Q
+    (0x31f0, 0x321e,),  # Katakana Letter Small Ku..Parenthesized Korean Cha
+    (0x3220, 0x3247,),  # Parenthesized Ideograph ..Circled Ideograph Koto
+    (0x3250, 0x32fe,),  # Partnership Sign        ..Circled Katakana Wo
+    (0x3300, 0x4dbf,),  # Square Apaato           ..
+    (0x4e00, 0xa48c,),  # Cjk Unified Ideograph-4e..Yi Syllable Yyr
+    (0xa490, 0xa4c6,),  # Yi Radical Qot          ..Yi Radical Ke
+    (0xa960, 0xa97c,),  # Hangul Choseong Tikeut-m..Hangul Choseong Ssangyeo
+    (0xac00, 0xd7a3,),  # Hangul Syllable Ga      ..Hangul Syllable Hih
+    (0xf900, 0xfaff,),  # Cjk Compatibility Ideogr..
+    (0xfe10, 0xfe19,),  # Presentation Form For Ve..Presentation Form For Ve
+    (0xfe30, 0xfe52,),  # Presentation Form For Ve..Small Full Stop
+    (0xfe54, 0xfe66,),  # Small Semicolon         ..Small Equals Sign
+    (0xfe68, 0xfe6b,),  # Small Reverse Solidus   ..Small Commercial At
+    (0xff01, 0xff60,),  # Fullwidth Exclamation Ma..Fullwidth Right White Pa
+    (0xffe0, 0xffe6,),  # Fullwidth Cent Sign     ..Fullwidth Won Sign
+    (0x16fe0, 0x16fe0,),  # (nil)                   ..
+    (0x17000, 0x187ec,),  # (nil)                   ..
+    (0x18800, 0x18af2,),  # (nil)                   ..
+    (0x1b000, 0x1b001,),  # Katakana Letter Archaic ..Hiragana Letter Archaic
+    (0x1f004, 0x1f004,),  # Mahjong Tile Red Dragon ..Mahjong Tile Red Dragon
+    (0x1f0cf, 0x1f0cf,),  # Playing Card Black Joker..Playing Card Black Joker
+    (0x1f18e, 0x1f18e,),  # Negative Squared Ab     ..Negative Squared Ab
+    (0x1f191, 0x1f19a,),  # Squared Cl              ..Squared Vs
+    (0x1f200, 0x1f202,),  # Square Hiragana Hoka    ..Squared Katakana Sa
+    (0x1f210, 0x1f23b,),  # Squared Cjk Unified Ideo..
+    (0x1f240, 0x1f248,),  # Tortoise Shell Bracketed..Tortoise Shell Bracketed
+    (0x1f250, 0x1f251,),  # Circled Ideograph Advant..Circled Ideograph Accept
+    (0x1f300, 0x1f320,),  # Cyclone                 ..Shooting Star
+    (0x1f32d, 0x1f335,),  # Hot Dog                 ..Cactus
+    (0x1f337, 0x1f37c,),  # Tulip                   ..Baby Bottle
+    (0x1f37e, 0x1f393,),  # Bottle With Popping Cork..Graduation Cap
+    (0x1f3a0, 0x1f3ca,),  # Carousel Horse          ..Swimmer
+    (0x1f3cf, 0x1f3d3,),  # Cricket Bat And Ball    ..Table Tennis Paddle And
+    (0x1f3e0, 0x1f3f0,),  # House Building          ..European Castle
+    (0x1f3f4, 0x1f3f4,),  # Waving Black Flag       ..Waving Black Flag
+    (0x1f3f8, 0x1f43e,),  # Badminton Racquet And Sh..Paw Prints
+    (0x1f440, 0x1f440,),  # Eyes                    ..Eyes
+    (0x1f442, 0x1f4fc,),  # Ear                     ..Videocassette
+    (0x1f4ff, 0x1f53d,),  # Prayer Beads            ..Down-pointing Small Red
+    (0x1f54b, 0x1f54e,),  # Kaaba                   ..Menorah With Nine Branch
+    (0x1f550, 0x1f567,),  # Clock Face One Oclock   ..Clock Face Twelve-thirty
+    (0x1f57a, 0x1f57a,),  # (nil)                   ..
+    (0x1f595, 0x1f596,),  # Reversed Hand With Middl..Raised Hand With Part Be
+    (0x1f5a4, 0x1f5a4,),  # (nil)                   ..
+    (0x1f5fb, 0x1f64f,),  # Mount Fuji              ..Person With Folded Hands
+    (0x1f680, 0x1f6c5,),  # Rocket                  ..Left Luggage
+    (0x1f6cc, 0x1f6cc,),  # Sleeping Accommodation  ..Sleeping Accommodation
+    (0x1f6d0, 0x1f6d2,),  # Place Of Worship        ..
+    (0x1f6eb, 0x1f6ec,),  # Airplane Departure      ..Airplane Arriving
+    (0x1f6f4, 0x1f6f6,),  # (nil)                   ..
+    (0x1f910, 0x1f91e,),  # Zipper-mouth Face       ..
+    (0x1f920, 0x1f927,),  # (nil)                   ..
+    (0x1f930, 0x1f930,),  # (nil)                   ..
+    (0x1f933, 0x1f93e,),  # (nil)                   ..
+    (0x1f940, 0x1f94b,),  # (nil)                   ..
+    (0x1f950, 0x1f95e,),  # (nil)                   ..
+    (0x1f980, 0x1f991,),  # Crab                    ..
+    (0x1f9c0, 0x1f9c0,),  # Cheese Wedge            ..Cheese Wedge
+    (0x20000, 0x2fffd,),  # Cjk Unified Ideograph-20..
+    (0x30000, 0x3fffd,),  # (nil)                   ..
+)
diff --git a/libs/wcwidth/table_zero.py b/libs/wcwidth/table_zero.py
new file mode 100644
index 000000000..2dcc26724
--- /dev/null
+++ b/libs/wcwidth/table_zero.py
@@ -0,0 +1,289 @@
+"""Zero_Width table. Created by setup.py."""
+# Generated: 2016-07-02T04:20:28.075504
+# Source: DerivedGeneralCategory-9.0.0.txt
+# Date:  2016-06-01, 10:34:26 GMT
+ZERO_WIDTH = (
+    (0x0300, 0x036f,),  # Combining Grave Accent  ..Combining Latin Small Le
+    (0x0483, 0x0489,),  # Combining Cyrillic Titlo..Combining Cyrillic Milli
+    (0x0591, 0x05bd,),  # Hebrew Accent Etnahta   ..Hebrew Point Meteg
+    (0x05bf, 0x05bf,),  # Hebrew Point Rafe       ..Hebrew Point Rafe
+    (0x05c1, 0x05c2,),  # Hebrew Point Shin Dot   ..Hebrew Point Sin Dot
+    (0x05c4, 0x05c5,),  # Hebrew Mark Upper Dot   ..Hebrew Mark Lower Dot
+    (0x05c7, 0x05c7,),  # Hebrew Point Qamats Qata..Hebrew Point Qamats Qata
+    (0x0610, 0x061a,),  # Arabic Sign Sallallahou ..Arabic Small Kasra
+    (0x064b, 0x065f,),  # Arabic Fathatan         ..Arabic Wavy Hamza Below
+    (0x0670, 0x0670,),  # Arabic Letter Superscrip..Arabic Letter Superscrip
+    (0x06d6, 0x06dc,),  # Arabic Small High Ligatu..Arabic Small High Seen
+    (0x06df, 0x06e4,),  # Arabic Small High Rounde..Arabic Small High Madda
+    (0x06e7, 0x06e8,),  # Arabic Small High Yeh   ..Arabic Small High Noon
+    (0x06ea, 0x06ed,),  # Arabic Empty Centre Low ..Arabic Small Low Meem
+    (0x0711, 0x0711,),  # Syriac Letter Superscrip..Syriac Letter Superscrip
+    (0x0730, 0x074a,),  # Syriac Pthaha Above     ..Syriac Barrekh
+    (0x07a6, 0x07b0,),  # Thaana Abafili          ..Thaana Sukun
+    (0x07eb, 0x07f3,),  # Nko Combining Short High..Nko Combining Double Dot
+    (0x0816, 0x0819,),  # Samaritan Mark In       ..Samaritan Mark Dagesh
+    (0x081b, 0x0823,),  # Samaritan Mark Epentheti..Samaritan Vowel Sign A
+    (0x0825, 0x0827,),  # Samaritan Vowel Sign Sho..Samaritan Vowel Sign U
+    (0x0829, 0x082d,),  # Samaritan Vowel Sign Lon..Samaritan Mark Nequdaa
+    (0x0859, 0x085b,),  # Mandaic Affrication Mark..Mandaic Gemination Mark
+    (0x08d4, 0x08e1,),  # (nil)                   ..
+    (0x08e3, 0x0902,),  # Arabic Turned Damma Belo..Devanagari Sign Anusvara
+    (0x093a, 0x093a,),  # Devanagari Vowel Sign Oe..Devanagari Vowel Sign Oe
+    (0x093c, 0x093c,),  # Devanagari Sign Nukta   ..Devanagari Sign Nukta
+    (0x0941, 0x0948,),  # Devanagari Vowel Sign U ..Devanagari Vowel Sign Ai
+    (0x094d, 0x094d,),  # Devanagari Sign Virama  ..Devanagari Sign Virama
+    (0x0951, 0x0957,),  # Devanagari Stress Sign U..Devanagari Vowel Sign Uu
+    (0x0962, 0x0963,),  # Devanagari Vowel Sign Vo..Devanagari Vowel Sign Vo
+    (0x0981, 0x0981,),  # Bengali Sign Candrabindu..Bengali Sign Candrabindu
+    (0x09bc, 0x09bc,),  # Bengali Sign Nukta      ..Bengali Sign Nukta
+    (0x09c1, 0x09c4,),  # Bengali Vowel Sign U    ..Bengali Vowel Sign Vocal
+    (0x09cd, 0x09cd,),  # Bengali Sign Virama     ..Bengali Sign Virama
+    (0x09e2, 0x09e3,),  # Bengali Vowel Sign Vocal..Bengali Vowel Sign Vocal
+    (0x0a01, 0x0a02,),  # Gurmukhi Sign Adak Bindi..Gurmukhi Sign Bindi
+    (0x0a3c, 0x0a3c,),  # Gurmukhi Sign Nukta     ..Gurmukhi Sign Nukta
+    (0x0a41, 0x0a42,),  # Gurmukhi Vowel Sign U   ..Gurmukhi Vowel Sign Uu
+    (0x0a47, 0x0a48,),  # Gurmukhi Vowel Sign Ee  ..Gurmukhi Vowel Sign Ai
+    (0x0a4b, 0x0a4d,),  # Gurmukhi Vowel Sign Oo  ..Gurmukhi Sign Virama
+    (0x0a51, 0x0a51,),  # Gurmukhi Sign Udaat     ..Gurmukhi Sign Udaat
+    (0x0a70, 0x0a71,),  # Gurmukhi Tippi          ..Gurmukhi Addak
+    (0x0a75, 0x0a75,),  # Gurmukhi Sign Yakash    ..Gurmukhi Sign Yakash
+    (0x0a81, 0x0a82,),  # Gujarati Sign Candrabind..Gujarati Sign Anusvara
+    (0x0abc, 0x0abc,),  # Gujarati Sign Nukta     ..Gujarati Sign Nukta
+    (0x0ac1, 0x0ac5,),  # Gujarati Vowel Sign U   ..Gujarati Vowel Sign Cand
+    (0x0ac7, 0x0ac8,),  # Gujarati Vowel Sign E   ..Gujarati Vowel Sign Ai
+    (0x0acd, 0x0acd,),  # Gujarati Sign Virama    ..Gujarati Sign Virama
+    (0x0ae2, 0x0ae3,),  # Gujarati Vowel Sign Voca..Gujarati Vowel Sign Voca
+    (0x0b01, 0x0b01,),  # Oriya Sign Candrabindu  ..Oriya Sign Candrabindu
+    (0x0b3c, 0x0b3c,),  # Oriya Sign Nukta        ..Oriya Sign Nukta
+    (0x0b3f, 0x0b3f,),  # Oriya Vowel Sign I      ..Oriya Vowel Sign I
+    (0x0b41, 0x0b44,),  # Oriya Vowel Sign U      ..Oriya Vowel Sign Vocalic
+    (0x0b4d, 0x0b4d,),  # Oriya Sign Virama       ..Oriya Sign Virama
+    (0x0b56, 0x0b56,),  # Oriya Ai Length Mark    ..Oriya Ai Length Mark
+    (0x0b62, 0x0b63,),  # Oriya Vowel Sign Vocalic..Oriya Vowel Sign Vocalic
+    (0x0b82, 0x0b82,),  # Tamil Sign Anusvara     ..Tamil Sign Anusvara
+    (0x0bc0, 0x0bc0,),  # Tamil Vowel Sign Ii     ..Tamil Vowel Sign Ii
+    (0x0bcd, 0x0bcd,),  # Tamil Sign Virama       ..Tamil Sign Virama
+    (0x0c00, 0x0c00,),  # Telugu Sign Combining Ca..Telugu Sign Combining Ca
+    (0x0c3e, 0x0c40,),  # Telugu Vowel Sign Aa    ..Telugu Vowel Sign Ii
+    (0x0c46, 0x0c48,),  # Telugu Vowel Sign E     ..Telugu Vowel Sign Ai
+    (0x0c4a, 0x0c4d,),  # Telugu Vowel Sign O     ..Telugu Sign Virama
+    (0x0c55, 0x0c56,),  # Telugu Length Mark      ..Telugu Ai Length Mark
+    (0x0c62, 0x0c63,),  # Telugu Vowel Sign Vocali..Telugu Vowel Sign Vocali
+    (0x0c81, 0x0c81,),  # Kannada Sign Candrabindu..Kannada Sign Candrabindu
+    (0x0cbc, 0x0cbc,),  # Kannada Sign Nukta      ..Kannada Sign Nukta
+    (0x0cbf, 0x0cbf,),  # Kannada Vowel Sign I    ..Kannada Vowel Sign I
+    (0x0cc6, 0x0cc6,),  # Kannada Vowel Sign E    ..Kannada Vowel Sign E
+    (0x0ccc, 0x0ccd,),  # Kannada Vowel Sign Au   ..Kannada Sign Virama
+    (0x0ce2, 0x0ce3,),  # Kannada Vowel Sign Vocal..Kannada Vowel Sign Vocal
+    (0x0d01, 0x0d01,),  # Malayalam Sign Candrabin..Malayalam Sign Candrabin
+    (0x0d41, 0x0d44,),  # Malayalam Vowel Sign U  ..Malayalam Vowel Sign Voc
+    (0x0d4d, 0x0d4d,),  # Malayalam Sign Virama   ..Malayalam Sign Virama
+    (0x0d62, 0x0d63,),  # Malayalam Vowel Sign Voc..Malayalam Vowel Sign Voc
+    (0x0dca, 0x0dca,),  # Sinhala Sign Al-lakuna  ..Sinhala Sign Al-lakuna
+    (0x0dd2, 0x0dd4,),  # Sinhala Vowel Sign Ketti..Sinhala Vowel Sign Ketti
+    (0x0dd6, 0x0dd6,),  # Sinhala Vowel Sign Diga ..Sinhala Vowel Sign Diga
+    (0x0e31, 0x0e31,),  # Thai Character Mai Han-a..Thai Character Mai Han-a
+    (0x0e34, 0x0e3a,),  # Thai Character Sara I   ..Thai Character Phinthu
+    (0x0e47, 0x0e4e,),  # Thai Character Maitaikhu..Thai Character Yamakkan
+    (0x0eb1, 0x0eb1,),  # Lao Vowel Sign Mai Kan  ..Lao Vowel Sign Mai Kan
+    (0x0eb4, 0x0eb9,),  # Lao Vowel Sign I        ..Lao Vowel Sign Uu
+    (0x0ebb, 0x0ebc,),  # Lao Vowel Sign Mai Kon  ..Lao Semivowel Sign Lo
+    (0x0ec8, 0x0ecd,),  # Lao Tone Mai Ek         ..Lao Niggahita
+    (0x0f18, 0x0f19,),  # Tibetan Astrological Sig..Tibetan Astrological Sig
+    (0x0f35, 0x0f35,),  # Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung
+    (0x0f37, 0x0f37,),  # Tibetan Mark Ngas Bzung ..Tibetan Mark Ngas Bzung
+    (0x0f39, 0x0f39,),  # Tibetan Mark Tsa -phru  ..Tibetan Mark Tsa -phru
+    (0x0f71, 0x0f7e,),  # Tibetan Vowel Sign Aa   ..Tibetan Sign Rjes Su Nga
+    (0x0f80, 0x0f84,),  # Tibetan Vowel Sign Rever..Tibetan Mark Halanta
+    (0x0f86, 0x0f87,),  # Tibetan Sign Lci Rtags  ..Tibetan Sign Yang Rtags
+    (0x0f8d, 0x0f97,),  # Tibetan Subjoined Sign L..Tibetan Subjoined Letter
+    (0x0f99, 0x0fbc,),  # Tibetan Subjoined Letter..Tibetan Subjoined Letter
+    (0x0fc6, 0x0fc6,),  # Tibetan Symbol Padma Gda..Tibetan Symbol Padma Gda
+    (0x102d, 0x1030,),  # Myanmar Vowel Sign I    ..Myanmar Vowel Sign Uu
+    (0x1032, 0x1037,),  # Myanmar Vowel Sign Ai   ..Myanmar Sign Dot Below
+    (0x1039, 0x103a,),  # Myanmar Sign Virama     ..Myanmar Sign Asat
+    (0x103d, 0x103e,),  # Myanmar Consonant Sign M..Myanmar Consonant Sign M
+    (0x1058, 0x1059,),  # Myanmar Vowel Sign Vocal..Myanmar Vowel Sign Vocal
+    (0x105e, 0x1060,),  # Myanmar Consonant Sign M..Myanmar Consonant Sign M
+    (0x1071, 0x1074,),  # Myanmar Vowel Sign Geba ..Myanmar Vowel Sign Kayah
+    (0x1082, 0x1082,),  # Myanmar Consonant Sign S..Myanmar Consonant Sign S
+    (0x1085, 0x1086,),  # Myanmar Vowel Sign Shan ..Myanmar Vowel Sign Shan
+    (0x108d, 0x108d,),  # Myanmar Sign Shan Counci..Myanmar Sign Shan Counci
+    (0x109d, 0x109d,),  # Myanmar Vowel Sign Aiton..Myanmar Vowel Sign Aiton
+    (0x135d, 0x135f,),  # Ethiopic Combining Gemin..Ethiopic Combining Gemin
+    (0x1712, 0x1714,),  # Tagalog Vowel Sign I    ..Tagalog Sign Virama
+    (0x1732, 0x1734,),  # Hanunoo Vowel Sign I    ..Hanunoo Sign Pamudpod
+    (0x1752, 0x1753,),  # Buhid Vowel Sign I      ..Buhid Vowel Sign U
+    (0x1772, 0x1773,),  # Tagbanwa Vowel Sign I   ..Tagbanwa Vowel Sign U
+    (0x17b4, 0x17b5,),  # Khmer Vowel Inherent Aq ..Khmer Vowel Inherent Aa
+    (0x17b7, 0x17bd,),  # Khmer Vowel Sign I      ..Khmer Vowel Sign Ua
+    (0x17c6, 0x17c6,),  # Khmer Sign Nikahit      ..Khmer Sign Nikahit
+    (0x17c9, 0x17d3,),  # Khmer Sign Muusikatoan  ..Khmer Sign Bathamasat
+    (0x17dd, 0x17dd,),  # Khmer Sign Atthacan     ..Khmer Sign Atthacan
+    (0x180b, 0x180d,),  # Mongolian Free Variation..Mongolian Free Variation
+    (0x1885, 0x1886,),  # Mongolian Letter Ali Gal..Mongolian Letter Ali Gal
+    (0x18a9, 0x18a9,),  # Mongolian Letter Ali Gal..Mongolian Letter Ali Gal
+    (0x1920, 0x1922,),  # Limbu Vowel Sign A      ..Limbu Vowel Sign U
+    (0x1927, 0x1928,),  # Limbu Vowel Sign E      ..Limbu Vowel Sign O
+    (0x1932, 0x1932,),  # Limbu Small Letter Anusv..Limbu Small Letter Anusv
+    (0x1939, 0x193b,),  # Limbu Sign Mukphreng    ..Limbu Sign Sa-i
+    (0x1a17, 0x1a18,),  # Buginese Vowel Sign I   ..Buginese Vowel Sign U
+    (0x1a1b, 0x1a1b,),  # Buginese Vowel Sign Ae  ..Buginese Vowel Sign Ae
+    (0x1a56, 0x1a56,),  # Tai Tham Consonant Sign ..Tai Tham Consonant Sign
+    (0x1a58, 0x1a5e,),  # Tai Tham Sign Mai Kang L..Tai Tham Consonant Sign
+    (0x1a60, 0x1a60,),  # Tai Tham Sign Sakot     ..Tai Tham Sign Sakot
+    (0x1a62, 0x1a62,),  # Tai Tham Vowel Sign Mai ..Tai Tham Vowel Sign Mai
+    (0x1a65, 0x1a6c,),  # Tai Tham Vowel Sign I   ..Tai Tham Vowel Sign Oa B
+    (0x1a73, 0x1a7c,),  # Tai Tham Vowel Sign Oa A..Tai Tham Sign Khuen-lue
+    (0x1a7f, 0x1a7f,),  # Tai Tham Combining Crypt..Tai Tham Combining Crypt
+    (0x1ab0, 0x1abe,),  # Combining Doubled Circum..Combining Parentheses Ov
+    (0x1b00, 0x1b03,),  # Balinese Sign Ulu Ricem ..Balinese Sign Surang
+    (0x1b34, 0x1b34,),  # Balinese Sign Rerekan   ..Balinese Sign Rerekan
+    (0x1b36, 0x1b3a,),  # Balinese Vowel Sign Ulu ..Balinese Vowel Sign Ra R
+    (0x1b3c, 0x1b3c,),  # Balinese Vowel Sign La L..Balinese Vowel Sign La L
+    (0x1b42, 0x1b42,),  # Balinese Vowel Sign Pepe..Balinese Vowel Sign Pepe
+    (0x1b6b, 0x1b73,),  # Balinese Musical Symbol ..Balinese Musical Symbol
+    (0x1b80, 0x1b81,),  # Sundanese Sign Panyecek ..Sundanese Sign Panglayar
+    (0x1ba2, 0x1ba5,),  # Sundanese Consonant Sign..Sundanese Vowel Sign Pan
+    (0x1ba8, 0x1ba9,),  # Sundanese Vowel Sign Pam..Sundanese Vowel Sign Pan
+    (0x1bab, 0x1bad,),  # Sundanese Sign Virama   ..Sundanese Consonant Sign
+    (0x1be6, 0x1be6,),  # Batak Sign Tompi        ..Batak Sign Tompi
+    (0x1be8, 0x1be9,),  # Batak Vowel Sign Pakpak ..Batak Vowel Sign Ee
+    (0x1bed, 0x1bed,),  # Batak Vowel Sign Karo O ..Batak Vowel Sign Karo O
+    (0x1bef, 0x1bf1,),  # Batak Vowel Sign U For S..Batak Consonant Sign H
+    (0x1c2c, 0x1c33,),  # Lepcha Vowel Sign E     ..Lepcha Consonant Sign T
+    (0x1c36, 0x1c37,),  # Lepcha Sign Ran         ..Lepcha Sign Nukta
+    (0x1cd0, 0x1cd2,),  # Vedic Tone Karshana     ..Vedic Tone Prenkha
+    (0x1cd4, 0x1ce0,),  # Vedic Sign Yajurvedic Mi..Vedic Tone Rigvedic Kash
+    (0x1ce2, 0x1ce8,),  # Vedic Sign Visarga Svari..Vedic Sign Visarga Anuda
+    (0x1ced, 0x1ced,),  # Vedic Sign Tiryak       ..Vedic Sign Tiryak
+    (0x1cf4, 0x1cf4,),  # Vedic Tone Candra Above ..Vedic Tone Candra Above
+    (0x1cf8, 0x1cf9,),  # Vedic Tone Ring Above   ..Vedic Tone Double Ring A
+    (0x1dc0, 0x1df5,),  # Combining Dotted Grave A..Combining Up Tack Above
+    (0x1dfb, 0x1dff,),  # (nil)                   ..Combining Right Arrowhea
+    (0x20d0, 0x20f0,),  # Combining Left Harpoon A..Combining Asterisk Above
+    (0x2cef, 0x2cf1,),  # Coptic Combining Ni Abov..Coptic Combining Spiritu
+    (0x2d7f, 0x2d7f,),  # Tifinagh Consonant Joine..Tifinagh Consonant Joine
+    (0x2de0, 0x2dff,),  # Combining Cyrillic Lette..Combining Cyrillic Lette
+    (0x302a, 0x302d,),  # Ideographic Level Tone M..Ideographic Entering Ton
+    (0x3099, 0x309a,),  # Combining Katakana-hirag..Combining Katakana-hirag
+    (0xa66f, 0xa672,),  # Combining Cyrillic Vzmet..Combining Cyrillic Thous
+    (0xa674, 0xa67d,),  # Combining Cyrillic Lette..Combining Cyrillic Payer
+    (0xa69e, 0xa69f,),  # Combining Cyrillic Lette..Combining Cyrillic Lette
+    (0xa6f0, 0xa6f1,),  # Bamum Combining Mark Koq..Bamum Combining Mark Tuk
+    (0xa802, 0xa802,),  # Syloti Nagri Sign Dvisva..Syloti Nagri Sign Dvisva
+    (0xa806, 0xa806,),  # Syloti Nagri Sign Hasant..Syloti Nagri Sign Hasant
+    (0xa80b, 0xa80b,),  # Syloti Nagri Sign Anusva..Syloti Nagri Sign Anusva
+    (0xa825, 0xa826,),  # Syloti Nagri Vowel Sign ..Syloti Nagri Vowel Sign
+    (0xa8c4, 0xa8c5,),  # Saurashtra Sign Virama  ..
+    (0xa8e0, 0xa8f1,),  # Combining Devanagari Dig..Combining Devanagari Sig
+    (0xa926, 0xa92d,),  # Kayah Li Vowel Ue       ..Kayah Li Tone Calya Plop
+    (0xa947, 0xa951,),  # Rejang Vowel Sign I     ..Rejang Consonant Sign R
+    (0xa980, 0xa982,),  # Javanese Sign Panyangga ..Javanese Sign Layar
+    (0xa9b3, 0xa9b3,),  # Javanese Sign Cecak Telu..Javanese Sign Cecak Telu
+    (0xa9b6, 0xa9b9,),  # Javanese Vowel Sign Wulu..Javanese Vowel Sign Suku
+    (0xa9bc, 0xa9bc,),  # Javanese Vowel Sign Pepe..Javanese Vowel Sign Pepe
+    (0xa9e5, 0xa9e5,),  # Myanmar Sign Shan Saw   ..Myanmar Sign Shan Saw
+    (0xaa29, 0xaa2e,),  # Cham Vowel Sign Aa      ..Cham Vowel Sign Oe
+    (0xaa31, 0xaa32,),  # Cham Vowel Sign Au      ..Cham Vowel Sign Ue
+    (0xaa35, 0xaa36,),  # Cham Consonant Sign La  ..Cham Consonant Sign Wa
+    (0xaa43, 0xaa43,),  # Cham Consonant Sign Fina..Cham Consonant Sign Fina
+    (0xaa4c, 0xaa4c,),  # Cham Consonant Sign Fina..Cham Consonant Sign Fina
+    (0xaa7c, 0xaa7c,),  # Myanmar Sign Tai Laing T..Myanmar Sign Tai Laing T
+    (0xaab0, 0xaab0,),  # Tai Viet Mai Kang       ..Tai Viet Mai Kang
+    (0xaab2, 0xaab4,),  # Tai Viet Vowel I        ..Tai Viet Vowel U
+    (0xaab7, 0xaab8,),  # Tai Viet Mai Khit       ..Tai Viet Vowel Ia
+    (0xaabe, 0xaabf,),  # Tai Viet Vowel Am       ..Tai Viet Tone Mai Ek
+    (0xaac1, 0xaac1,),  # Tai Viet Tone Mai Tho   ..Tai Viet Tone Mai Tho
+    (0xaaec, 0xaaed,),  # Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
+    (0xaaf6, 0xaaf6,),  # Meetei Mayek Virama     ..Meetei Mayek Virama
+    (0xabe5, 0xabe5,),  # Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
+    (0xabe8, 0xabe8,),  # Meetei Mayek Vowel Sign ..Meetei Mayek Vowel Sign
+    (0xabed, 0xabed,),  # Meetei Mayek Apun Iyek  ..Meetei Mayek Apun Iyek
+    (0xfb1e, 0xfb1e,),  # Hebrew Point Judeo-spani..Hebrew Point Judeo-spani
+    (0xfe00, 0xfe0f,),  # Variation Selector-1    ..Variation Selector-16
+    (0xfe20, 0xfe2f,),  # Combining Ligature Left ..Combining Cyrillic Titlo
+    (0x101fd, 0x101fd,),  # Phaistos Disc Sign Combi..Phaistos Disc Sign Combi
+    (0x102e0, 0x102e0,),  # Coptic Epact Thousands M..Coptic Epact Thousands M
+    (0x10376, 0x1037a,),  # Combining Old Permic Let..Combining Old Permic Let
+    (0x10a01, 0x10a03,),  # Kharoshthi Vowel Sign I ..Kharoshthi Vowel Sign Vo
+    (0x10a05, 0x10a06,),  # Kharoshthi Vowel Sign E ..Kharoshthi Vowel Sign O
+    (0x10a0c, 0x10a0f,),  # Kharoshthi Vowel Length ..Kharoshthi Sign Visarga
+    (0x10a38, 0x10a3a,),  # Kharoshthi Sign Bar Abov..Kharoshthi Sign Dot Belo
+    (0x10a3f, 0x10a3f,),  # Kharoshthi Virama       ..Kharoshthi Virama
+    (0x10ae5, 0x10ae6,),  # Manichaean Abbreviation ..Manichaean Abbreviation
+    (0x11001, 0x11001,),  # Brahmi Sign Anusvara    ..Brahmi Sign Anusvara
+    (0x11038, 0x11046,),  # Brahmi Vowel Sign Aa    ..Brahmi Virama
+    (0x1107f, 0x11081,),  # Brahmi Number Joiner    ..Kaithi Sign Anusvara
+    (0x110b3, 0x110b6,),  # Kaithi Vowel Sign U     ..Kaithi Vowel Sign Ai
+    (0x110b9, 0x110ba,),  # Kaithi Sign Virama      ..Kaithi Sign Nukta
+    (0x11100, 0x11102,),  # Chakma Sign Candrabindu ..Chakma Sign Visarga
+    (0x11127, 0x1112b,),  # Chakma Vowel Sign A     ..Chakma Vowel Sign Uu
+    (0x1112d, 0x11134,),  # Chakma Vowel Sign Ai    ..Chakma Maayyaa
+    (0x11173, 0x11173,),  # Mahajani Sign Nukta     ..Mahajani Sign Nukta
+    (0x11180, 0x11181,),  # Sharada Sign Candrabindu..Sharada Sign Anusvara
+    (0x111b6, 0x111be,),  # Sharada Vowel Sign U    ..Sharada Vowel Sign O
+    (0x111ca, 0x111cc,),  # Sharada Sign Nukta      ..Sharada Extra Short Vowe
+    (0x1122f, 0x11231,),  # Khojki Vowel Sign U     ..Khojki Vowel Sign Ai
+    (0x11234, 0x11234,),  # Khojki Sign Anusvara    ..Khojki Sign Anusvara
+    (0x11236, 0x11237,),  # Khojki Sign Nukta       ..Khojki Sign Shadda
+    (0x1123e, 0x1123e,),  # (nil)                   ..
+    (0x112df, 0x112df,),  # Khudawadi Sign Anusvara ..Khudawadi Sign Anusvara
+    (0x112e3, 0x112ea,),  # Khudawadi Vowel Sign U  ..Khudawadi Sign Virama
+    (0x11300, 0x11301,),  # Grantha Sign Combining A..Grantha Sign Candrabindu
+    (0x1133c, 0x1133c,),  # Grantha Sign Nukta      ..Grantha Sign Nukta
+    (0x11340, 0x11340,),  # Grantha Vowel Sign Ii   ..Grantha Vowel Sign Ii
+    (0x11366, 0x1136c,),  # Combining Grantha Digit ..Combining Grantha Digit
+    (0x11370, 0x11374,),  # Combining Grantha Letter..Combining Grantha Letter
+    (0x11438, 0x1143f,),  # (nil)                   ..
+    (0x11442, 0x11444,),  # (nil)                   ..
+    (0x11446, 0x11446,),  # (nil)                   ..
+    (0x114b3, 0x114b8,),  # Tirhuta Vowel Sign U    ..Tirhuta Vowel Sign Vocal
+    (0x114ba, 0x114ba,),  # Tirhuta Vowel Sign Short..Tirhuta Vowel Sign Short
+    (0x114bf, 0x114c0,),  # Tirhuta Sign Candrabindu..Tirhuta Sign Anusvara
+    (0x114c2, 0x114c3,),  # Tirhuta Sign Virama     ..Tirhuta Sign Nukta
+    (0x115b2, 0x115b5,),  # Siddham Vowel Sign U    ..Siddham Vowel Sign Vocal
+    (0x115bc, 0x115bd,),  # Siddham Sign Candrabindu..Siddham Sign Anusvara
+    (0x115bf, 0x115c0,),  # Siddham Sign Virama     ..Siddham Sign Nukta
+    (0x115dc, 0x115dd,),  # Siddham Vowel Sign Alter..Siddham Vowel Sign Alter
+    (0x11633, 0x1163a,),  # Modi Vowel Sign U       ..Modi Vowel Sign Ai
+    (0x1163d, 0x1163d,),  # Modi Sign Anusvara      ..Modi Sign Anusvara
+    (0x1163f, 0x11640,),  # Modi Sign Virama        ..Modi Sign Ardhacandra
+    (0x116ab, 0x116ab,),  # Takri Sign Anusvara     ..Takri Sign Anusvara
+    (0x116ad, 0x116ad,),  # Takri Vowel Sign Aa     ..Takri Vowel Sign Aa
+    (0x116b0, 0x116b5,),  # Takri Vowel Sign U      ..Takri Vowel Sign Au
+    (0x116b7, 0x116b7,),  # Takri Sign Nukta        ..Takri Sign Nukta
+    (0x1171d, 0x1171f,),  # Ahom Consonant Sign Medi..Ahom Consonant Sign Medi
+    (0x11722, 0x11725,),  # Ahom Vowel Sign I       ..Ahom Vowel Sign Uu
+    (0x11727, 0x1172b,),  # Ahom Vowel Sign Aw      ..Ahom Sign Killer
+    (0x11c30, 0x11c36,),  # (nil)                   ..
+    (0x11c38, 0x11c3d,),  # (nil)                   ..
+    (0x11c3f, 0x11c3f,),  # (nil)                   ..
+    (0x11c92, 0x11ca7,),  # (nil)                   ..
+    (0x11caa, 0x11cb0,),  # (nil)                   ..
+    (0x11cb2, 0x11cb3,),  # (nil)                   ..
+    (0x11cb5, 0x11cb6,),  # (nil)                   ..
+    (0x16af0, 0x16af4,),  # Bassa Vah Combining High..Bassa Vah Combining High
+    (0x16b30, 0x16b36,),  # Pahawh Hmong Mark Cim Tu..Pahawh Hmong Mark Cim Ta
+    (0x16f8f, 0x16f92,),  # Miao Tone Right         ..Miao Tone Below
+    (0x1bc9d, 0x1bc9e,),  # Duployan Thick Letter Se..Duployan Double Mark
+    (0x1d167, 0x1d169,),  # Musical Symbol Combining..Musical Symbol Combining
+    (0x1d17b, 0x1d182,),  # Musical Symbol Combining..Musical Symbol Combining
+    (0x1d185, 0x1d18b,),  # Musical Symbol Combining..Musical Symbol Combining
+    (0x1d1aa, 0x1d1ad,),  # Musical Symbol Combining..Musical Symbol Combining
+    (0x1d242, 0x1d244,),  # Combining Greek Musical ..Combining Greek Musical
+    (0x1da00, 0x1da36,),  # Signwriting Head Rim    ..Signwriting Air Sucking
+    (0x1da3b, 0x1da6c,),  # Signwriting Mouth Closed..Signwriting Excitement
+    (0x1da75, 0x1da75,),  # Signwriting Upper Body T..Signwriting Upper Body T
+    (0x1da84, 0x1da84,),  # Signwriting Location Hea..Signwriting Location Hea
+    (0x1da9b, 0x1da9f,),  # Signwriting Fill Modifie..Signwriting Fill Modifie
+    (0x1daa1, 0x1daaf,),  # Signwriting Rotation Mod..Signwriting Rotation Mod
+    (0x1e000, 0x1e006,),  # (nil)                   ..
+    (0x1e008, 0x1e018,),  # (nil)                   ..
+    (0x1e01b, 0x1e021,),  # (nil)                   ..
+    (0x1e023, 0x1e024,),  # (nil)                   ..
+    (0x1e026, 0x1e02a,),  # (nil)                   ..
+    (0x1e8d0, 0x1e8d6,),  # Mende Kikakui Combining ..Mende Kikakui Combining
+    (0x1e944, 0x1e94a,),  # (nil)                   ..
+    (0xe0100, 0xe01ef,),  # Variation Selector-17   ..Variation Selector-256
+)
diff --git a/libs/wcwidth/tests/__init__.py b/libs/wcwidth/tests/__init__.py
new file mode 100644
index 000000000..381300347
--- /dev/null
+++ b/libs/wcwidth/tests/__init__.py
@@ -0,0 +1 @@
+"""This file intentionally left blank."""
diff --git a/libs/wcwidth/tests/test_core.py b/libs/wcwidth/tests/test_core.py
new file mode 100644
index 000000000..13e2505a9
--- /dev/null
+++ b/libs/wcwidth/tests/test_core.py
@@ -0,0 +1,138 @@
+# coding: utf-8
+"""Core tests module for wcwidth."""
+import wcwidth
+
+
+def test_hello_jp():
+    u"""
+    Width of Japanese phrase: ă‚łăłă‹ăăŹ, セカイ!
+
+    Given a phrase of 5 and 3 Katakana ideographs, joined with
+    3 English-ASCII punctuation characters, totaling 11, this
+    phrase consumes 19 cells of a terminal emulator.
+    """
+    # given,
+    phrase = u'ă‚łăłă‹ăăŹ, セカイ!'
+    expect_length_each = (2, 2, 2, 2, 2, 1, 1, 2, 2, 2, 1)
+    expect_length_phrase = sum(expect_length_each)
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase)
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_wcswidth_substr():
+    """
+    Test wcswidth() optional 2nd parameter, ``n``.
+
+    ``n`` determines at which position of the string
+    to stop counting length.
+    """
+    # given,
+    phrase = u'ă‚łăłă‹ăăŹ, セカイ!'
+    end = 7
+    expect_length_each = (2, 2, 2, 2, 2, 1, 1,)
+    expect_length_phrase = sum(expect_length_each)
+
+    # exercise,
+    length_phrase = wcwidth.wcswidth(phrase, end)
+
+    # verify,
+    assert length_phrase == expect_length_phrase
+
+
+def test_null_width_0():
+    """NULL (0) reports width 0."""
+    # given,
+    phrase = u'abc\x00def'
+    expect_length_each = (1, 1, 1, 0, 1, 1, 1)
+    expect_length_phrase = sum(expect_length_each)
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_control_c0_width_negative_1():
+    """CSI (Control sequence initiate) reports width -1."""
+    # given,
+    phrase = u'\x1b[0m'
+    expect_length_each = (-1, 1, 1, 1)
+    expect_length_phrase = -1
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_combining_width_negative_1():
+    """Simple test combining reports total width of 4."""
+    # given,
+    phrase = u'--\u05bf--'
+    expect_length_each = (1, 1, 0, 1, 1)
+    expect_length_phrase = 4
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_combining_cafe():
+    u"""Phrase cafe + COMBINING ACUTE ACCENT is café of length 4."""
+    phrase = u"cafe\u0301"
+    expect_length_each = (1, 1, 1, 1, 0)
+    expect_length_phrase = 4
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_combining_enclosing():
+    u"""CYRILLIC CAPITAL LETTER A + COMBINING CYRILLIC HUNDRED THOUSANDS SIGN is ĐŇ of length 1."""
+    phrase = u"\u0410\u0488"
+    expect_length_each = (1, 0)
+    expect_length_phrase = 1
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
+
+
+def test_combining_spacing():
+    u"""Balinese kapal (ship) is ᬓᬨᬮ᭄ of length 4."""
+    phrase = u"\u1B13\u1B28\u1B2E\u1B44"
+    expect_length_each = (1, 1, 1, 1)
+    expect_length_phrase = 4
+
+    # exercise,
+    length_each = tuple(map(wcwidth.wcwidth, phrase))
+    length_phrase = wcwidth.wcswidth(phrase, len(phrase))
+
+    # verify,
+    assert length_each == expect_length_each
+    assert length_phrase == expect_length_phrase
diff --git a/libs/wcwidth/wcwidth.py b/libs/wcwidth/wcwidth.py
new file mode 100644
index 000000000..a5754c846
--- /dev/null
+++ b/libs/wcwidth/wcwidth.py
@@ -0,0 +1,207 @@
+"""
+This is an implementation of wcwidth() and wcswidth().
+
+Defined in IEEE Std 1002.1-2001.
+
+https://github.com/jquast/wcwidth
+
+from Markus Kuhn's C code at:
+
+    http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+
+This is an implementation of wcwidth() and wcswidth() (defined in
+IEEE Std 1002.1-2001) for Unicode.
+
+http://www.opengroup.org/onlinepubs/007904975/functions/wcwidth.html
+http://www.opengroup.org/onlinepubs/007904975/functions/wcswidth.html
+
+In fixed-width output devices, Latin characters all occupy a single
+"cell" position of equal width, whereas ideographic CJK characters
+occupy two such cells. Interoperability between terminal-line
+applications and (teletype-style) character terminals using the
+UTF-8 encoding requires agreement on which character should advance
+the cursor by how many cell positions. No established formal
+standards exist at present on which Unicode character shall occupy
+how many cell positions on character terminals. These routines are
+a first attempt of defining such behavior based on simple rules
+applied to data provided by the Unicode Consortium.
+
+For some graphical characters, the Unicode standard explicitly
+defines a character-cell width via the definition of the East Asian
+FullWidth (F), Wide (W), Half-width (H), and Narrow (Na) classes.
+In all these cases, there is no ambiguity about which width a
+terminal shall use. For characters in the East Asian Ambiguous (A)
+class, the width choice depends purely on a preference of backward
+compatibility with either historic CJK or Western practice.
+Choosing single-width for these characters is easy to justify as
+the appropriate long-term solution, as the CJK practice of
+displaying these characters as double-width comes from historic
+implementation simplicity (8-bit encoded characters were displayed
+single-width and 16-bit ones double-width, even for Greek,
+Cyrillic, etc.) and not any typographic considerations.
+
+Much less clear is the choice of width for the Not East Asian
+(Neutral) class. Existing practice does not dictate a width for any
+of these characters. It would nevertheless make sense
+typographically to allocate two character cells to characters such
+as for instance EM SPACE or VOLUME INTEGRAL, which cannot be
+represented adequately with a single-width glyph. The following
+routines at present merely assign a single-cell width to all
+neutral characters, in the interest of simplicity. This is not
+entirely satisfactory and should be reconsidered before
+establishing a formal standard in this area. At the moment, the
+decision which Not East Asian (Neutral) characters should be
+represented by double-width glyphs cannot yet be answered by
+applying a simple rule from the Unicode database content. Setting
+up a proper standard for the behavior of UTF-8 character terminals
+will require a careful analysis not only of each Unicode character,
+but also of each presentation form, something the author of these
+routines has avoided to do so far.
+
+http://www.unicode.org/unicode/reports/tr11/
+
+Markus Kuhn -- 2007-05-26 (Unicode 5.0)
+
+Permission to use, copy, modify, and distribute this software
+for any purpose and without fee is hereby granted. The author
+disclaims all warranties with regard to this software.
+
+Latest version: http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c
+"""
+
+from __future__ import division
+from .table_wide import WIDE_EASTASIAN
+from .table_zero import ZERO_WIDTH
+
+
+def _bisearch(ucs, table):
+    """
+    Auxiliary function for binary search in interval table.
+
+    :arg int ucs: Ordinal value of unicode character.
+    :arg list table: List of starting and ending ranges of ordinal values,
+        in form of ``[(start, end), ...]``.
+    :rtype: int
+    :returns: 1 if ordinal value ucs is found within lookup table, else 0.
+    """
+    lbound = 0
+    ubound = len(table) - 1
+
+    if ucs < table[0][0] or ucs > table[ubound][1]:
+        return 0
+    while ubound >= lbound:
+        mid = (lbound + ubound) // 2
+        if ucs > table[mid][1]:
+            lbound = mid + 1
+        elif ucs < table[mid][0]:
+            ubound = mid - 1
+        else:
+            return 1
+
+    return 0
+
+
+def wcwidth(wc):
+    r"""
+    Given one unicode character, return its printable length on a terminal.
+
+    The wcwidth() function returns 0 if the wc argument has no printable effect
+    on a terminal (such as NUL '\0'), -1 if wc is not printable, or has an
+    indeterminate effect on the terminal, such as a control character.
+    Otherwise, the number of column positions the character occupies on a
+    graphic terminal (1 or 2) is returned.
+
+    The following have a column width of -1:
+
+        - C0 control characters (U+001 through U+01F).
+
+        - C1 control characters and DEL (U+07F through U+0A0).
+
+    The following have a column width of 0:
+
+        - Non-spacing and enclosing combining characters (general
+          category code Mn or Me in the Unicode database).
+
+        - NULL (U+0000, 0).
+
+        - COMBINING GRAPHEME JOINER (U+034F).
+
+        - ZERO WIDTH SPACE (U+200B) through
+          RIGHT-TO-LEFT MARK (U+200F).
+
+        - LINE SEPERATOR (U+2028) and
+          PARAGRAPH SEPERATOR (U+2029).
+
+        - LEFT-TO-RIGHT EMBEDDING (U+202A) through
+          RIGHT-TO-LEFT OVERRIDE (U+202E).
+
+        - WORD JOINER (U+2060) through
+          INVISIBLE SEPARATOR (U+2063).
+
+    The following have a column width of 1:
+
+        - SOFT HYPHEN (U+00AD) has a column width of 1.
+
+        - All remaining characters (including all printable
+          ISO 8859-1 and WGL4 characters, Unicode control characters,
+          etc.) have a column width of 1.
+
+    The following have a column width of 2:
+
+        - Spacing characters in the East Asian Wide (W) or East Asian
+          Full-width (F) category as defined in Unicode Technical
+          Report #11 have a column width of 2.
+    """
+    # pylint: disable=C0103
+    #         Invalid argument name "wc"
+    ucs = ord(wc)
+
+    # NOTE: created by hand, there isn't anything identifiable other than
+    # general Cf category code to identify these, and some characters in Cf
+    # category code are of non-zero width.
+
+    # pylint: disable=too-many-boolean-expressions
+    #          Too many boolean expressions in if statement (7/5)
+    if (ucs == 0 or
+            ucs == 0x034F or
+            0x200B <= ucs <= 0x200F or
+            ucs == 0x2028 or
+            ucs == 0x2029 or
+            0x202A <= ucs <= 0x202E or
+            0x2060 <= ucs <= 0x2063):
+        return 0
+
+    # C0/C1 control characters
+    if ucs < 32 or 0x07F <= ucs < 0x0A0:
+        return -1
+
+    # combining characters with zero width
+    if _bisearch(ucs, ZERO_WIDTH):
+        return 0
+
+    return 1 + _bisearch(ucs, WIDE_EASTASIAN)
+
+
+def wcswidth(pwcs, n=None):
+    """
+    Given a unicode string, return its printable length on a terminal.
+
+    Return the width, in cells, necessary to display the first ``n``
+    characters of the unicode string ``pwcs``.  When ``n`` is None (default),
+    return the length of the entire string.
+
+    Returns ``-1`` if a non-printable character is encountered.
+    """
+    # pylint: disable=C0103
+    #         Invalid argument name "n"
+
+    end = len(pwcs) if n is None else n
+    idx = slice(0, end)
+    width = 0
+    for char in pwcs[idx]:
+        wcw = wcwidth(char)
+        if wcw < 0:
+            return -1
+        else:
+            width += wcw
+    return width
diff --git a/libs/webencodings/__init__.py b/libs/webencodings/__init__.py
new file mode 100644
index 000000000..d21d697c8
--- /dev/null
+++ b/libs/webencodings/__init__.py
@@ -0,0 +1,342 @@
+# coding: utf-8
+"""
+
+    webencodings
+    ~~~~~~~~~~~~
+
+    This is a Python implementation of the `WHATWG Encoding standard
+    <http://encoding.spec.whatwg.org/>`. See README for details.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+from .labels import LABELS
+
+
+VERSION = '0.5.1'
+
+
+# Some names in Encoding are not valid Python aliases. Remap these.
+PYTHON_NAMES = {
+    'iso-8859-8-i': 'iso-8859-8',
+    'x-mac-cyrillic': 'mac-cyrillic',
+    'macintosh': 'mac-roman',
+    'windows-874': 'cp874'}
+
+CACHE = {}
+
+
+def ascii_lower(string):
+    r"""Transform (only) ASCII letters to lower case: A-Z is mapped to a-z.
+
+    :param string: An Unicode string.
+    :returns: A new Unicode string.
+
+    This is used for `ASCII case-insensitive
+    <http://encoding.spec.whatwg.org/#ascii-case-insensitive>`_
+    matching of encoding labels.
+    The same matching is also used, among other things,
+    for `CSS keywords <http://dev.w3.org/csswg/css-values/#keywords>`_.
+
+    This is different from the :meth:`~py:str.lower` method of Unicode strings
+    which also affect non-ASCII characters,
+    sometimes mapping them into the ASCII range:
+
+        >>> keyword = u'Bac\N{KELVIN SIGN}ground'
+        >>> assert keyword.lower() == u'background'
+        >>> assert ascii_lower(keyword) != keyword.lower()
+        >>> assert ascii_lower(keyword) == u'bac\N{KELVIN SIGN}ground'
+
+    """
+    # This turns out to be faster than unicode.translate()
+    return string.encode('utf8').lower().decode('utf8')
+
+
+def lookup(label):
+    """
+    Look for an encoding by its label.
+    This is the spec’s `get an encoding
+    <http://encoding.spec.whatwg.org/#concept-encoding-get>`_ algorithm.
+    Supported labels are listed there.
+
+    :param label: A string.
+    :returns:
+        An :class:`Encoding` object, or :obj:`None` for an unknown label.
+
+    """
+    # Only strip ASCII whitespace: U+0009, U+000A, U+000C, U+000D, and U+0020.
+    label = ascii_lower(label.strip('\t\n\f\r '))
+    name = LABELS.get(label)
+    if name is None:
+        return None
+    encoding = CACHE.get(name)
+    if encoding is None:
+        if name == 'x-user-defined':
+            from .x_user_defined import codec_info
+        else:
+            python_name = PYTHON_NAMES.get(name, name)
+            # Any python_name value that gets to here should be valid.
+            codec_info = codecs.lookup(python_name)
+        encoding = Encoding(name, codec_info)
+        CACHE[name] = encoding
+    return encoding
+
+
+def _get_encoding(encoding_or_label):
+    """
+    Accept either an encoding object or label.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :returns: An :class:`Encoding` object.
+    :raises: :exc:`~exceptions.LookupError` for an unknown label.
+
+    """
+    if hasattr(encoding_or_label, 'codec_info'):
+        return encoding_or_label
+
+    encoding = lookup(encoding_or_label)
+    if encoding is None:
+        raise LookupError('Unknown encoding label: %r' % encoding_or_label)
+    return encoding
+
+
+class Encoding(object):
+    """Reresents a character encoding such as UTF-8,
+    that can be used for decoding or encoding.
+
+    .. attribute:: name
+
+        Canonical name of the encoding
+
+    .. attribute:: codec_info
+
+        The actual implementation of the encoding,
+        a stdlib :class:`~codecs.CodecInfo` object.
+        See :func:`codecs.register`.
+
+    """
+    def __init__(self, name, codec_info):
+        self.name = name
+        self.codec_info = codec_info
+
+    def __repr__(self):
+        return '<Encoding %s>' % self.name
+
+
+#: The UTF-8 encoding. Should be used for new content and formats.
+UTF8 = lookup('utf-8')
+
+_UTF16LE = lookup('utf-16le')
+_UTF16BE = lookup('utf-16be')
+
+
+def decode(input, fallback_encoding, errors='replace'):
+    """
+    Decode a single string.
+
+    :param input: A byte string
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return:
+        A ``(output, encoding)`` tuple of an Unicode string
+        and an :obj:`Encoding`.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    fallback_encoding = _get_encoding(fallback_encoding)
+    bom_encoding, input = _detect_bom(input)
+    encoding = bom_encoding or fallback_encoding
+    return encoding.codec_info.decode(input, errors)[0], encoding
+
+
+def _detect_bom(input):
+    """Return (bom_encoding, input), with any BOM removed from the input."""
+    if input.startswith(b'\xFF\xFE'):
+        return _UTF16LE, input[2:]
+    if input.startswith(b'\xFE\xFF'):
+        return _UTF16BE, input[2:]
+    if input.startswith(b'\xEF\xBB\xBF'):
+        return UTF8, input[3:]
+    return None, input
+
+
+def encode(input, encoding=UTF8, errors='strict'):
+    """
+    Encode a single string.
+
+    :param input: An Unicode string.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :return: A byte string.
+
+    """
+    return _get_encoding(encoding).codec_info.encode(input, errors)[0]
+
+
+def iter_decode(input, fallback_encoding, errors='replace'):
+    """
+    "Pull"-based decoder.
+
+    :param input:
+        An iterable of byte strings.
+
+        The input is first consumed just enough to determine the encoding
+        based on the precense of a BOM,
+        then consumed on demand when the return value is.
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns:
+        An ``(output, encoding)`` tuple.
+        :obj:`output` is an iterable of Unicode strings,
+        :obj:`encoding` is the :obj:`Encoding` that is being used.
+
+    """
+
+    decoder = IncrementalDecoder(fallback_encoding, errors)
+    generator = _iter_decode_generator(input, decoder)
+    encoding = next(generator)
+    return generator, encoding
+
+
+def _iter_decode_generator(input, decoder):
+    """Return a generator that first yields the :obj:`Encoding`,
+    then yields output chukns as Unicode strings.
+
+    """
+    decode = decoder.decode
+    input = iter(input)
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            assert decoder.encoding is not None
+            yield decoder.encoding
+            yield output
+            break
+    else:
+        # Input exhausted without determining the encoding
+        output = decode(b'', final=True)
+        assert decoder.encoding is not None
+        yield decoder.encoding
+        if output:
+            yield output
+        return
+
+    for chunck in input:
+        output = decode(chunck)
+        if output:
+            yield output
+    output = decode(b'', final=True)
+    if output:
+        yield output
+
+
+def iter_encode(input, encoding=UTF8, errors='strict'):
+    """
+    “Pull”-based encoder.
+
+    :param input: An iterable of Unicode strings.
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+    :returns: An iterable of byte strings.
+
+    """
+    # Fail early if `encoding` is an invalid label.
+    encode = IncrementalEncoder(encoding, errors).encode
+    return _iter_encode_generator(input, encode)
+
+
+def _iter_encode_generator(input, encode):
+    for chunck in input:
+        output = encode(chunck)
+        if output:
+            yield output
+    output = encode('', final=True)
+    if output:
+        yield output
+
+
+class IncrementalDecoder(object):
+    """
+    “Push”-based decoder.
+
+    :param fallback_encoding:
+        An :class:`Encoding` object or a label string.
+        The encoding to use if :obj:`input` does note have a BOM.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    """
+    def __init__(self, fallback_encoding, errors='replace'):
+        # Fail early if `encoding` is an invalid label.
+        self._fallback_encoding = _get_encoding(fallback_encoding)
+        self._errors = errors
+        self._buffer = b''
+        self._decoder = None
+        #: The actual :class:`Encoding` that is being used,
+        #: or :obj:`None` if that is not determined yet.
+        #: (Ie. if there is not enough input yet to determine
+        #: if there is a BOM.)
+        self.encoding = None  # Not known yet.
+
+    def decode(self, input, final=False):
+        """Decode one chunk of the input.
+
+        :param input: A byte string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: An Unicode string.
+
+        """
+        decoder = self._decoder
+        if decoder is not None:
+            return decoder(input, final)
+
+        input = self._buffer + input
+        encoding, input = _detect_bom(input)
+        if encoding is None:
+            if len(input) < 3 and not final:  # Not enough data yet.
+                self._buffer = input
+                return ''
+            else:  # No BOM
+                encoding = self._fallback_encoding
+        decoder = encoding.codec_info.incrementaldecoder(self._errors).decode
+        self._decoder = decoder
+        self.encoding = encoding
+        return decoder(input, final)
+
+
+class IncrementalEncoder(object):
+    """
+    “Push”-based encoder.
+
+    :param encoding: An :class:`Encoding` object or a label string.
+    :param errors: Type of error handling. See :func:`codecs.register`.
+    :raises: :exc:`~exceptions.LookupError` for an unknown encoding label.
+
+    .. method:: encode(input, final=False)
+
+        :param input: An Unicode string.
+        :param final:
+            Indicate that no more input is available.
+            Must be :obj:`True` if this is the last call.
+        :returns: A byte string.
+
+    """
+    def __init__(self, encoding=UTF8, errors='strict'):
+        encoding = _get_encoding(encoding)
+        self.encode = encoding.codec_info.incrementalencoder(errors).encode
diff --git a/libs/webencodings/labels.py b/libs/webencodings/labels.py
new file mode 100644
index 000000000..29cbf91ef
--- /dev/null
+++ b/libs/webencodings/labels.py
@@ -0,0 +1,231 @@
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+    'unicode-1-1-utf-8':   'utf-8',
+    'utf-8':               'utf-8',
+    'utf8':                'utf-8',
+    '866':                 'ibm866',
+    'cp866':               'ibm866',
+    'csibm866':            'ibm866',
+    'ibm866':              'ibm866',
+    'csisolatin2':         'iso-8859-2',
+    'iso-8859-2':          'iso-8859-2',
+    'iso-ir-101':          'iso-8859-2',
+    'iso8859-2':           'iso-8859-2',
+    'iso88592':            'iso-8859-2',
+    'iso_8859-2':          'iso-8859-2',
+    'iso_8859-2:1987':     'iso-8859-2',
+    'l2':                  'iso-8859-2',
+    'latin2':              'iso-8859-2',
+    'csisolatin3':         'iso-8859-3',
+    'iso-8859-3':          'iso-8859-3',
+    'iso-ir-109':          'iso-8859-3',
+    'iso8859-3':           'iso-8859-3',
+    'iso88593':            'iso-8859-3',
+    'iso_8859-3':          'iso-8859-3',
+    'iso_8859-3:1988':     'iso-8859-3',
+    'l3':                  'iso-8859-3',
+    'latin3':              'iso-8859-3',
+    'csisolatin4':         'iso-8859-4',
+    'iso-8859-4':          'iso-8859-4',
+    'iso-ir-110':          'iso-8859-4',
+    'iso8859-4':           'iso-8859-4',
+    'iso88594':            'iso-8859-4',
+    'iso_8859-4':          'iso-8859-4',
+    'iso_8859-4:1988':     'iso-8859-4',
+    'l4':                  'iso-8859-4',
+    'latin4':              'iso-8859-4',
+    'csisolatincyrillic':  'iso-8859-5',
+    'cyrillic':            'iso-8859-5',
+    'iso-8859-5':          'iso-8859-5',
+    'iso-ir-144':          'iso-8859-5',
+    'iso8859-5':           'iso-8859-5',
+    'iso88595':            'iso-8859-5',
+    'iso_8859-5':          'iso-8859-5',
+    'iso_8859-5:1988':     'iso-8859-5',
+    'arabic':              'iso-8859-6',
+    'asmo-708':            'iso-8859-6',
+    'csiso88596e':         'iso-8859-6',
+    'csiso88596i':         'iso-8859-6',
+    'csisolatinarabic':    'iso-8859-6',
+    'ecma-114':            'iso-8859-6',
+    'iso-8859-6':          'iso-8859-6',
+    'iso-8859-6-e':        'iso-8859-6',
+    'iso-8859-6-i':        'iso-8859-6',
+    'iso-ir-127':          'iso-8859-6',
+    'iso8859-6':           'iso-8859-6',
+    'iso88596':            'iso-8859-6',
+    'iso_8859-6':          'iso-8859-6',
+    'iso_8859-6:1987':     'iso-8859-6',
+    'csisolatingreek':     'iso-8859-7',
+    'ecma-118':            'iso-8859-7',
+    'elot_928':            'iso-8859-7',
+    'greek':               'iso-8859-7',
+    'greek8':              'iso-8859-7',
+    'iso-8859-7':          'iso-8859-7',
+    'iso-ir-126':          'iso-8859-7',
+    'iso8859-7':           'iso-8859-7',
+    'iso88597':            'iso-8859-7',
+    'iso_8859-7':          'iso-8859-7',
+    'iso_8859-7:1987':     'iso-8859-7',
+    'sun_eu_greek':        'iso-8859-7',
+    'csiso88598e':         'iso-8859-8',
+    'csisolatinhebrew':    'iso-8859-8',
+    'hebrew':              'iso-8859-8',
+    'iso-8859-8':          'iso-8859-8',
+    'iso-8859-8-e':        'iso-8859-8',
+    'iso-ir-138':          'iso-8859-8',
+    'iso8859-8':           'iso-8859-8',
+    'iso88598':            'iso-8859-8',
+    'iso_8859-8':          'iso-8859-8',
+    'iso_8859-8:1988':     'iso-8859-8',
+    'visual':              'iso-8859-8',
+    'csiso88598i':         'iso-8859-8-i',
+    'iso-8859-8-i':        'iso-8859-8-i',
+    'logical':             'iso-8859-8-i',
+    'csisolatin6':         'iso-8859-10',
+    'iso-8859-10':         'iso-8859-10',
+    'iso-ir-157':          'iso-8859-10',
+    'iso8859-10':          'iso-8859-10',
+    'iso885910':           'iso-8859-10',
+    'l6':                  'iso-8859-10',
+    'latin6':              'iso-8859-10',
+    'iso-8859-13':         'iso-8859-13',
+    'iso8859-13':          'iso-8859-13',
+    'iso885913':           'iso-8859-13',
+    'iso-8859-14':         'iso-8859-14',
+    'iso8859-14':          'iso-8859-14',
+    'iso885914':           'iso-8859-14',
+    'csisolatin9':         'iso-8859-15',
+    'iso-8859-15':         'iso-8859-15',
+    'iso8859-15':          'iso-8859-15',
+    'iso885915':           'iso-8859-15',
+    'iso_8859-15':         'iso-8859-15',
+    'l9':                  'iso-8859-15',
+    'iso-8859-16':         'iso-8859-16',
+    'cskoi8r':             'koi8-r',
+    'koi':                 'koi8-r',
+    'koi8':                'koi8-r',
+    'koi8-r':              'koi8-r',
+    'koi8_r':              'koi8-r',
+    'koi8-u':              'koi8-u',
+    'csmacintosh':         'macintosh',
+    'mac':                 'macintosh',
+    'macintosh':           'macintosh',
+    'x-mac-roman':         'macintosh',
+    'dos-874':             'windows-874',
+    'iso-8859-11':         'windows-874',
+    'iso8859-11':          'windows-874',
+    'iso885911':           'windows-874',
+    'tis-620':             'windows-874',
+    'windows-874':         'windows-874',
+    'cp1250':              'windows-1250',
+    'windows-1250':        'windows-1250',
+    'x-cp1250':            'windows-1250',
+    'cp1251':              'windows-1251',
+    'windows-1251':        'windows-1251',
+    'x-cp1251':            'windows-1251',
+    'ansi_x3.4-1968':      'windows-1252',
+    'ascii':               'windows-1252',
+    'cp1252':              'windows-1252',
+    'cp819':               'windows-1252',
+    'csisolatin1':         'windows-1252',
+    'ibm819':              'windows-1252',
+    'iso-8859-1':          'windows-1252',
+    'iso-ir-100':          'windows-1252',
+    'iso8859-1':           'windows-1252',
+    'iso88591':            'windows-1252',
+    'iso_8859-1':          'windows-1252',
+    'iso_8859-1:1987':     'windows-1252',
+    'l1':                  'windows-1252',
+    'latin1':              'windows-1252',
+    'us-ascii':            'windows-1252',
+    'windows-1252':        'windows-1252',
+    'x-cp1252':            'windows-1252',
+    'cp1253':              'windows-1253',
+    'windows-1253':        'windows-1253',
+    'x-cp1253':            'windows-1253',
+    'cp1254':              'windows-1254',
+    'csisolatin5':         'windows-1254',
+    'iso-8859-9':          'windows-1254',
+    'iso-ir-148':          'windows-1254',
+    'iso8859-9':           'windows-1254',
+    'iso88599':            'windows-1254',
+    'iso_8859-9':          'windows-1254',
+    'iso_8859-9:1989':     'windows-1254',
+    'l5':                  'windows-1254',
+    'latin5':              'windows-1254',
+    'windows-1254':        'windows-1254',
+    'x-cp1254':            'windows-1254',
+    'cp1255':              'windows-1255',
+    'windows-1255':        'windows-1255',
+    'x-cp1255':            'windows-1255',
+    'cp1256':              'windows-1256',
+    'windows-1256':        'windows-1256',
+    'x-cp1256':            'windows-1256',
+    'cp1257':              'windows-1257',
+    'windows-1257':        'windows-1257',
+    'x-cp1257':            'windows-1257',
+    'cp1258':              'windows-1258',
+    'windows-1258':        'windows-1258',
+    'x-cp1258':            'windows-1258',
+    'x-mac-cyrillic':      'x-mac-cyrillic',
+    'x-mac-ukrainian':     'x-mac-cyrillic',
+    'chinese':             'gbk',
+    'csgb2312':            'gbk',
+    'csiso58gb231280':     'gbk',
+    'gb2312':              'gbk',
+    'gb_2312':             'gbk',
+    'gb_2312-80':          'gbk',
+    'gbk':                 'gbk',
+    'iso-ir-58':           'gbk',
+    'x-gbk':               'gbk',
+    'gb18030':             'gb18030',
+    'hz-gb-2312':          'hz-gb-2312',
+    'big5':                'big5',
+    'big5-hkscs':          'big5',
+    'cn-big5':             'big5',
+    'csbig5':              'big5',
+    'x-x-big5':            'big5',
+    'cseucpkdfmtjapanese': 'euc-jp',
+    'euc-jp':              'euc-jp',
+    'x-euc-jp':            'euc-jp',
+    'csiso2022jp':         'iso-2022-jp',
+    'iso-2022-jp':         'iso-2022-jp',
+    'csshiftjis':          'shift_jis',
+    'ms_kanji':            'shift_jis',
+    'shift-jis':           'shift_jis',
+    'shift_jis':           'shift_jis',
+    'sjis':                'shift_jis',
+    'windows-31j':         'shift_jis',
+    'x-sjis':              'shift_jis',
+    'cseuckr':             'euc-kr',
+    'csksc56011987':       'euc-kr',
+    'euc-kr':              'euc-kr',
+    'iso-ir-149':          'euc-kr',
+    'korean':              'euc-kr',
+    'ks_c_5601-1987':      'euc-kr',
+    'ks_c_5601-1989':      'euc-kr',
+    'ksc5601':             'euc-kr',
+    'ksc_5601':            'euc-kr',
+    'windows-949':         'euc-kr',
+    'csiso2022kr':         'iso-2022-kr',
+    'iso-2022-kr':         'iso-2022-kr',
+    'utf-16be':            'utf-16be',
+    'utf-16':              'utf-16le',
+    'utf-16le':            'utf-16le',
+    'x-user-defined':      'x-user-defined',
+}
diff --git a/libs/webencodings/mklabels.py b/libs/webencodings/mklabels.py
new file mode 100644
index 000000000..295dc928b
--- /dev/null
+++ b/libs/webencodings/mklabels.py
@@ -0,0 +1,59 @@
+"""
+
+    webencodings.mklabels
+    ~~~~~~~~~~~~~~~~~~~~~
+
+    Regenarate the webencodings.labels module.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+import json
+try:
+    from urllib import urlopen
+except ImportError:
+    from urllib.request import urlopen
+
+
+def assert_lower(string):
+    assert string == string.lower()
+    return string
+
+
+def generate(url):
+    parts = ['''\
+"""
+
+    webencodings.labels
+    ~~~~~~~~~~~~~~~~~~~
+
+    Map encoding labels to their name.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+# XXX Do not edit!
+# This file is automatically generated by mklabels.py
+
+LABELS = {
+''']
+    labels = [
+        (repr(assert_lower(label)).lstrip('u'),
+         repr(encoding['name']).lstrip('u'))
+        for category in json.loads(urlopen(url).read().decode('ascii'))
+        for encoding in category['encodings']
+        for label in encoding['labels']]
+    max_len = max(len(label) for label, name in labels)
+    parts.extend(
+        '    %s:%s %s,\n' % (label, ' ' * (max_len - len(label)), name)
+        for label, name in labels)
+    parts.append('}')
+    return ''.join(parts)
+
+
+if __name__ == '__main__':
+    print(generate('http://encoding.spec.whatwg.org/encodings.json'))
diff --git a/libs/webencodings/tests.py b/libs/webencodings/tests.py
new file mode 100644
index 000000000..e12c10d03
--- /dev/null
+++ b/libs/webencodings/tests.py
@@ -0,0 +1,153 @@
+# coding: utf-8
+"""
+
+    webencodings.tests
+    ~~~~~~~~~~~~~~~~~~
+
+    A basic test suite for Encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+from . import (lookup, LABELS, decode, encode, iter_decode, iter_encode,
+               IncrementalDecoder, IncrementalEncoder, UTF8)
+
+
+def assert_raises(exception, function, *args, **kwargs):
+    try:
+        function(*args, **kwargs)
+    except exception:
+        return
+    else:  # pragma: no cover
+        raise AssertionError('Did not raise %s.' % exception)
+
+
+def test_labels():
+    assert lookup('utf-8').name == 'utf-8'
+    assert lookup('Utf-8').name == 'utf-8'
+    assert lookup('UTF-8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8').name == 'utf-8'
+    assert lookup('utf8 ').name == 'utf-8'
+    assert lookup(' \r\nutf8\t').name == 'utf-8'
+    assert lookup('u8') is None  # Python label.
+    assert lookup('utf-8 ') is None  # Non-ASCII white space.
+
+    assert lookup('US-ASCII').name == 'windows-1252'
+    assert lookup('iso-8859-1').name == 'windows-1252'
+    assert lookup('latin1').name == 'windows-1252'
+    assert lookup('LATIN1').name == 'windows-1252'
+    assert lookup('latin-1') is None
+    assert lookup('LATÄ°N1') is None  # ASCII-only case insensitivity.
+
+
+def test_all_labels():
+    for label in LABELS:
+        assert decode(b'', label) == ('', lookup(label))
+        assert encode('', label) == b''
+        for repeat in [0, 1, 12]:
+            output, _ = iter_decode([b''] * repeat, label)
+            assert list(output) == []
+            assert list(iter_encode([''] * repeat, label)) == []
+        decoder = IncrementalDecoder(label)
+        assert decoder.decode(b'') == ''
+        assert decoder.decode(b'', final=True) == ''
+        encoder = IncrementalEncoder(label)
+        assert encoder.encode('') == b''
+        assert encoder.encode('', final=True) == b''
+    # All encoding names are valid labels too:
+    for name in set(LABELS.values()):
+        assert lookup(name).name == name
+
+
+def test_invalid_label():
+    assert_raises(LookupError, decode, b'\xEF\xBB\xBF\xc3\xa9', 'invalid')
+    assert_raises(LookupError, encode, 'Ă©', 'invalid')
+    assert_raises(LookupError, iter_decode, [], 'invalid')
+    assert_raises(LookupError, iter_encode, [], 'invalid')
+    assert_raises(LookupError, IncrementalDecoder, 'invalid')
+    assert_raises(LookupError, IncrementalEncoder, 'invalid')
+
+
+def test_decode():
+    assert decode(b'\x80', 'latin1') == ('€', lookup('latin1'))
+    assert decode(b'\x80', lookup('latin1')) == ('€', lookup('latin1'))
+    assert decode(b'\xc3\xa9', 'utf8') == ('Ă©', lookup('utf8'))
+    assert decode(b'\xc3\xa9', UTF8) == ('Ă©', lookup('utf8'))
+    assert decode(b'\xc3\xa9', 'ascii') == ('Ă©', lookup('ascii'))
+    assert decode(b'\xEF\xBB\xBF\xc3\xa9', 'ascii') == ('Ă©', lookup('utf8'))  # UTF-8 with BOM
+
+    assert decode(b'\xFE\xFF\x00\xe9', 'ascii') == ('Ă©', lookup('utf-16be'))  # UTF-16-BE with BOM
+    assert decode(b'\xFF\xFE\xe9\x00', 'ascii') == ('Ă©', lookup('utf-16le'))  # UTF-16-LE with BOM
+    assert decode(b'\xFE\xFF\xe9\x00', 'ascii') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\xFF\xFE\x00\xe9', 'ascii') == ('\ue900', lookup('utf-16le'))
+
+    assert decode(b'\x00\xe9', 'UTF-16BE') == ('Ă©', lookup('utf-16be'))
+    assert decode(b'\xe9\x00', 'UTF-16LE') == ('Ă©', lookup('utf-16le'))
+    assert decode(b'\xe9\x00', 'UTF-16') == ('Ă©', lookup('utf-16le'))
+
+    assert decode(b'\xe9\x00', 'UTF-16BE') == ('\ue900', lookup('utf-16be'))
+    assert decode(b'\x00\xe9', 'UTF-16LE') == ('\ue900', lookup('utf-16le'))
+    assert decode(b'\x00\xe9', 'UTF-16') == ('\ue900', lookup('utf-16le'))
+
+
+def test_encode():
+    assert encode('Ă©', 'latin1') == b'\xe9'
+    assert encode('Ă©', 'utf8') == b'\xc3\xa9'
+    assert encode('Ă©', 'utf8') == b'\xc3\xa9'
+    assert encode('Ă©', 'utf-16') == b'\xe9\x00'
+    assert encode('Ă©', 'utf-16le') == b'\xe9\x00'
+    assert encode('Ă©', 'utf-16be') == b'\x00\xe9'
+
+
+def test_iter_decode():
+    def iter_decode_to_string(input, fallback_encoding):
+        output, _encoding = iter_decode(input, fallback_encoding)
+        return ''.join(output)
+    assert iter_decode_to_string([], 'latin1') == ''
+    assert iter_decode_to_string([b''], 'latin1') == ''
+    assert iter_decode_to_string([b'\xe9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([b'hello'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'he', b'llo'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'hell', b'o'], 'latin1') == 'hello'
+    assert iter_decode_to_string([b'\xc3\xa9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF\xc3\xa9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'\xc3', b'\xa9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([
+        b'\xEF\xBB\xBF', b'a', b'\xc3'], 'latin1') == 'a\uFFFD'
+    assert iter_decode_to_string([
+        b'', b'\xEF', b'', b'', b'\xBB\xBF\xc3', b'\xa9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([b'\xEF\xBB\xBF'], 'latin1') == ''
+    assert iter_decode_to_string([b'\xEF\xBB'], 'latin1') == 'ï»'
+    assert iter_decode_to_string([b'\xFE\xFF\x00\xe9'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([b'\xFF\xFE\xe9\x00'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([
+        b'', b'\xFF', b'', b'', b'\xFE\xe9', b'\x00'], 'latin1') == 'Ă©'
+    assert iter_decode_to_string([
+        b'', b'h\xe9', b'llo'], 'x-user-defined') == 'h\uF7E9llo'
+
+
+def test_iter_encode():
+    assert b''.join(iter_encode([], 'latin1')) == b''
+    assert b''.join(iter_encode([''], 'latin1')) == b''
+    assert b''.join(iter_encode(['Ă©'], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'Ă©', '', ''], 'latin1')) == b'\xe9'
+    assert b''.join(iter_encode(['', 'Ă©', '', ''], 'utf-16')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'Ă©', '', ''], 'utf-16le')) == b'\xe9\x00'
+    assert b''.join(iter_encode(['', 'Ă©', '', ''], 'utf-16be')) == b'\x00\xe9'
+    assert b''.join(iter_encode([
+        '', 'h\uF7E9', '', 'llo'], 'x-user-defined')) == b'h\xe9llo'
+
+
+def test_x_user_defined():
+    encoded = b'2,\x0c\x0b\x1aO\xd9#\xcb\x0f\xc9\xbbt\xcf\xa8\xca'
+    decoded = '2,\x0c\x0b\x1aO\uf7d9#\uf7cb\x0f\uf7c9\uf7bbt\uf7cf\uf7a8\uf7ca'
+    encoded = b'aa'
+    decoded = 'aa'
+    assert decode(encoded, 'x-user-defined') == (decoded, lookup('x-user-defined'))
+    assert encode(decoded, 'x-user-defined') == encoded
diff --git a/libs/webencodings/x_user_defined.py b/libs/webencodings/x_user_defined.py
new file mode 100644
index 000000000..d16e32602
--- /dev/null
+++ b/libs/webencodings/x_user_defined.py
@@ -0,0 +1,325 @@
+# coding: utf-8
+"""
+
+    webencodings.x_user_defined
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+    An implementation of the x-user-defined encoding.
+
+    :copyright: Copyright 2012 by Simon Sapin
+    :license: BSD, see LICENSE for details.
+
+"""
+
+from __future__ import unicode_literals
+
+import codecs
+
+
+### Codec APIs
+
+class Codec(codecs.Codec):
+
+    def encode(self, input, errors='strict'):
+        return codecs.charmap_encode(input, errors, encoding_table)
+
+    def decode(self, input, errors='strict'):
+        return codecs.charmap_decode(input, errors, decoding_table)
+
+
+class IncrementalEncoder(codecs.IncrementalEncoder):
+    def encode(self, input, final=False):
+        return codecs.charmap_encode(input, self.errors, encoding_table)[0]
+
+
+class IncrementalDecoder(codecs.IncrementalDecoder):
+    def decode(self, input, final=False):
+        return codecs.charmap_decode(input, self.errors, decoding_table)[0]
+
+
+class StreamWriter(Codec, codecs.StreamWriter):
+    pass
+
+
+class StreamReader(Codec, codecs.StreamReader):
+    pass
+
+
+### encodings module API
+
+codec_info = codecs.CodecInfo(
+    name='x-user-defined',
+    encode=Codec().encode,
+    decode=Codec().decode,
+    incrementalencoder=IncrementalEncoder,
+    incrementaldecoder=IncrementalDecoder,
+    streamreader=StreamReader,
+    streamwriter=StreamWriter,
+)
+
+
+### Decoding Table
+
+# Python 3:
+# for c in range(256): print('    %r' % chr(c if c < 128 else c + 0xF700))
+decoding_table = (
+    '\x00'
+    '\x01'
+    '\x02'
+    '\x03'
+    '\x04'
+    '\x05'
+    '\x06'
+    '\x07'
+    '\x08'
+    '\t'
+    '\n'
+    '\x0b'
+    '\x0c'
+    '\r'
+    '\x0e'
+    '\x0f'
+    '\x10'
+    '\x11'
+    '\x12'
+    '\x13'
+    '\x14'
+    '\x15'
+    '\x16'
+    '\x17'
+    '\x18'
+    '\x19'
+    '\x1a'
+    '\x1b'
+    '\x1c'
+    '\x1d'
+    '\x1e'
+    '\x1f'
+    ' '
+    '!'
+    '"'
+    '#'
+    '$'
+    '%'
+    '&'
+    "'"
+    '('
+    ')'
+    '*'
+    '+'
+    ','
+    '-'
+    '.'
+    '/'
+    '0'
+    '1'
+    '2'
+    '3'
+    '4'
+    '5'
+    '6'
+    '7'
+    '8'
+    '9'
+    ':'
+    ';'
+    '<'
+    '='
+    '>'
+    '?'
+    '@'
+    'A'
+    'B'
+    'C'
+    'D'
+    'E'
+    'F'
+    'G'
+    'H'
+    'I'
+    'J'
+    'K'
+    'L'
+    'M'
+    'N'
+    'O'
+    'P'
+    'Q'
+    'R'
+    'S'
+    'T'
+    'U'
+    'V'
+    'W'
+    'X'
+    'Y'
+    'Z'
+    '['
+    '\\'
+    ']'
+    '^'
+    '_'
+    '`'
+    'a'
+    'b'
+    'c'
+    'd'
+    'e'
+    'f'
+    'g'
+    'h'
+    'i'
+    'j'
+    'k'
+    'l'
+    'm'
+    'n'
+    'o'
+    'p'
+    'q'
+    'r'
+    's'
+    't'
+    'u'
+    'v'
+    'w'
+    'x'
+    'y'
+    'z'
+    '{'
+    '|'
+    '}'
+    '~'
+    '\x7f'
+    '\uf780'
+    '\uf781'
+    '\uf782'
+    '\uf783'
+    '\uf784'
+    '\uf785'
+    '\uf786'
+    '\uf787'
+    '\uf788'
+    '\uf789'
+    '\uf78a'
+    '\uf78b'
+    '\uf78c'
+    '\uf78d'
+    '\uf78e'
+    '\uf78f'
+    '\uf790'
+    '\uf791'
+    '\uf792'
+    '\uf793'
+    '\uf794'
+    '\uf795'
+    '\uf796'
+    '\uf797'
+    '\uf798'
+    '\uf799'
+    '\uf79a'
+    '\uf79b'
+    '\uf79c'
+    '\uf79d'
+    '\uf79e'
+    '\uf79f'
+    '\uf7a0'
+    '\uf7a1'
+    '\uf7a2'
+    '\uf7a3'
+    '\uf7a4'
+    '\uf7a5'
+    '\uf7a6'
+    '\uf7a7'
+    '\uf7a8'
+    '\uf7a9'
+    '\uf7aa'
+    '\uf7ab'
+    '\uf7ac'
+    '\uf7ad'
+    '\uf7ae'
+    '\uf7af'
+    '\uf7b0'
+    '\uf7b1'
+    '\uf7b2'
+    '\uf7b3'
+    '\uf7b4'
+    '\uf7b5'
+    '\uf7b6'
+    '\uf7b7'
+    '\uf7b8'
+    '\uf7b9'
+    '\uf7ba'
+    '\uf7bb'
+    '\uf7bc'
+    '\uf7bd'
+    '\uf7be'
+    '\uf7bf'
+    '\uf7c0'
+    '\uf7c1'
+    '\uf7c2'
+    '\uf7c3'
+    '\uf7c4'
+    '\uf7c5'
+    '\uf7c6'
+    '\uf7c7'
+    '\uf7c8'
+    '\uf7c9'
+    '\uf7ca'
+    '\uf7cb'
+    '\uf7cc'
+    '\uf7cd'
+    '\uf7ce'
+    '\uf7cf'
+    '\uf7d0'
+    '\uf7d1'
+    '\uf7d2'
+    '\uf7d3'
+    '\uf7d4'
+    '\uf7d5'
+    '\uf7d6'
+    '\uf7d7'
+    '\uf7d8'
+    '\uf7d9'
+    '\uf7da'
+    '\uf7db'
+    '\uf7dc'
+    '\uf7dd'
+    '\uf7de'
+    '\uf7df'
+    '\uf7e0'
+    '\uf7e1'
+    '\uf7e2'
+    '\uf7e3'
+    '\uf7e4'
+    '\uf7e5'
+    '\uf7e6'
+    '\uf7e7'
+    '\uf7e8'
+    '\uf7e9'
+    '\uf7ea'
+    '\uf7eb'
+    '\uf7ec'
+    '\uf7ed'
+    '\uf7ee'
+    '\uf7ef'
+    '\uf7f0'
+    '\uf7f1'
+    '\uf7f2'
+    '\uf7f3'
+    '\uf7f4'
+    '\uf7f5'
+    '\uf7f6'
+    '\uf7f7'
+    '\uf7f8'
+    '\uf7f9'
+    '\uf7fa'
+    '\uf7fb'
+    '\uf7fc'
+    '\uf7fd'
+    '\uf7fe'
+    '\uf7ff'
+)
+
+### Encoding table
+encoding_table = codecs.charmap_build(decoding_table)
diff --git a/libs/websocket/__init__.py b/libs/websocket/__init__.py
new file mode 100644
index 000000000..cc2d3d432
--- /dev/null
+++ b/libs/websocket/__init__.py
@@ -0,0 +1,29 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+from ._abnf import *
+from ._app import WebSocketApp
+from ._core import *
+from ._exceptions import *
+from ._logging import *
+from ._socket import *
+
+__version__ = "0.44.0"
diff --git a/libs/websocket/_abnf.py b/libs/websocket/_abnf.py
new file mode 100644
index 000000000..203504f6d
--- /dev/null
+++ b/libs/websocket/_abnf.py
@@ -0,0 +1,426 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+import array
+import os
+import struct
+
+import six
+
+from ._exceptions import *
+from ._utils import validate_utf8
+from threading import Lock
+
+try:
+    # If wsaccel is available we use compiled routines to mask data.
+    from wsaccel.xormask import XorMaskerSimple
+
+    def _mask(_m, _d):
+        return XorMaskerSimple(_m).process(_d)
+
+except ImportError:
+    # wsaccel is not available, we rely on python implementations.
+    def _mask(_m, _d):
+        for i in range(len(_d)):
+            _d[i] ^= _m[i % 4]
+
+        if six.PY3:
+            return _d.tobytes()
+        else:
+            return _d.tostring()
+
+__all__ = [
+    'ABNF', 'continuous_frame', 'frame_buffer',
+    'STATUS_NORMAL',
+    'STATUS_GOING_AWAY',
+    'STATUS_PROTOCOL_ERROR',
+    'STATUS_UNSUPPORTED_DATA_TYPE',
+    'STATUS_STATUS_NOT_AVAILABLE',
+    'STATUS_ABNORMAL_CLOSED',
+    'STATUS_INVALID_PAYLOAD',
+    'STATUS_POLICY_VIOLATION',
+    'STATUS_MESSAGE_TOO_BIG',
+    'STATUS_INVALID_EXTENSION',
+    'STATUS_UNEXPECTED_CONDITION',
+    'STATUS_BAD_GATEWAY',
+    'STATUS_TLS_HANDSHAKE_ERROR',
+]
+
+# closing frame status codes.
+STATUS_NORMAL = 1000
+STATUS_GOING_AWAY = 1001
+STATUS_PROTOCOL_ERROR = 1002
+STATUS_UNSUPPORTED_DATA_TYPE = 1003
+STATUS_STATUS_NOT_AVAILABLE = 1005
+STATUS_ABNORMAL_CLOSED = 1006
+STATUS_INVALID_PAYLOAD = 1007
+STATUS_POLICY_VIOLATION = 1008
+STATUS_MESSAGE_TOO_BIG = 1009
+STATUS_INVALID_EXTENSION = 1010
+STATUS_UNEXPECTED_CONDITION = 1011
+STATUS_BAD_GATEWAY = 1014
+STATUS_TLS_HANDSHAKE_ERROR = 1015
+
+VALID_CLOSE_STATUS = (
+    STATUS_NORMAL,
+    STATUS_GOING_AWAY,
+    STATUS_PROTOCOL_ERROR,
+    STATUS_UNSUPPORTED_DATA_TYPE,
+    STATUS_INVALID_PAYLOAD,
+    STATUS_POLICY_VIOLATION,
+    STATUS_MESSAGE_TOO_BIG,
+    STATUS_INVALID_EXTENSION,
+    STATUS_UNEXPECTED_CONDITION,
+    STATUS_BAD_GATEWAY,
+)
+
+
+class ABNF(object):
+    """
+    ABNF frame class.
+    see http://tools.ietf.org/html/rfc5234
+    and http://tools.ietf.org/html/rfc6455#section-5.2
+    """
+
+    # operation code values.
+    OPCODE_CONT = 0x0
+    OPCODE_TEXT = 0x1
+    OPCODE_BINARY = 0x2
+    OPCODE_CLOSE = 0x8
+    OPCODE_PING = 0x9
+    OPCODE_PONG = 0xa
+
+    # available operation code value tuple
+    OPCODES = (OPCODE_CONT, OPCODE_TEXT, OPCODE_BINARY, OPCODE_CLOSE,
+               OPCODE_PING, OPCODE_PONG)
+
+    # opcode human readable string
+    OPCODE_MAP = {
+        OPCODE_CONT: "cont",
+        OPCODE_TEXT: "text",
+        OPCODE_BINARY: "binary",
+        OPCODE_CLOSE: "close",
+        OPCODE_PING: "ping",
+        OPCODE_PONG: "pong"
+    }
+
+    # data length threshold.
+    LENGTH_7 = 0x7e
+    LENGTH_16 = 1 << 16
+    LENGTH_63 = 1 << 63
+
+    def __init__(self, fin=0, rsv1=0, rsv2=0, rsv3=0,
+                 opcode=OPCODE_TEXT, mask=1, data=""):
+        """
+        Constructor for ABNF.
+        please check RFC for arguments.
+        """
+        self.fin = fin
+        self.rsv1 = rsv1
+        self.rsv2 = rsv2
+        self.rsv3 = rsv3
+        self.opcode = opcode
+        self.mask = mask
+        if data is None:
+            data = ""
+        self.data = data
+        self.get_mask_key = os.urandom
+
+    def validate(self, skip_utf8_validation=False):
+        """
+        validate the ABNF frame.
+        skip_utf8_validation: skip utf8 validation.
+        """
+        if self.rsv1 or self.rsv2 or self.rsv3:
+            raise WebSocketProtocolException("rsv is not implemented, yet")
+
+        if self.opcode not in ABNF.OPCODES:
+            raise WebSocketProtocolException("Invalid opcode %r", self.opcode)
+
+        if self.opcode == ABNF.OPCODE_PING and not self.fin:
+            raise WebSocketProtocolException("Invalid ping frame.")
+
+        if self.opcode == ABNF.OPCODE_CLOSE:
+            l = len(self.data)
+            if not l:
+                return
+            if l == 1 or l >= 126:
+                raise WebSocketProtocolException("Invalid close frame.")
+            if l > 2 and not skip_utf8_validation and not validate_utf8(self.data[2:]):
+                raise WebSocketProtocolException("Invalid close frame.")
+
+            code = 256 * \
+                six.byte2int(self.data[0:1]) + six.byte2int(self.data[1:2])
+            if not self._is_valid_close_status(code):
+                raise WebSocketProtocolException("Invalid close opcode.")
+
+    @staticmethod
+    def _is_valid_close_status(code):
+        return code in VALID_CLOSE_STATUS or (3000 <= code < 5000)
+
+    def __str__(self):
+        return "fin=" + str(self.fin) \
+            + " opcode=" + str(self.opcode) \
+            + " data=" + str(self.data)
+
+    @staticmethod
+    def create_frame(data, opcode, fin=1):
+        """
+        create frame to send text, binary and other data.
+
+        data: data to send. This is string value(byte array).
+            if opcode is OPCODE_TEXT and this value is unicode,
+            data value is converted into unicode string, automatically.
+
+        opcode: operation code. please see OPCODE_XXX.
+
+        fin: fin flag. if set to 0, create continue fragmentation.
+        """
+        if opcode == ABNF.OPCODE_TEXT and isinstance(data, six.text_type):
+            data = data.encode("utf-8")
+        # mask must be set if send data from client
+        return ABNF(fin, 0, 0, 0, opcode, 1, data)
+
+    def format(self):
+        """
+        format this object to string(byte array) to send data to server.
+        """
+        if any(x not in (0, 1) for x in [self.fin, self.rsv1, self.rsv2, self.rsv3]):
+            raise ValueError("not 0 or 1")
+        if self.opcode not in ABNF.OPCODES:
+            raise ValueError("Invalid OPCODE")
+        length = len(self.data)
+        if length >= ABNF.LENGTH_63:
+            raise ValueError("data is too long")
+
+        frame_header = chr(self.fin << 7
+                           | self.rsv1 << 6 | self.rsv2 << 5 | self.rsv3 << 4
+                           | self.opcode)
+        if length < ABNF.LENGTH_7:
+            frame_header += chr(self.mask << 7 | length)
+            frame_header = six.b(frame_header)
+        elif length < ABNF.LENGTH_16:
+            frame_header += chr(self.mask << 7 | 0x7e)
+            frame_header = six.b(frame_header)
+            frame_header += struct.pack("!H", length)
+        else:
+            frame_header += chr(self.mask << 7 | 0x7f)
+            frame_header = six.b(frame_header)
+            frame_header += struct.pack("!Q", length)
+
+        if not self.mask:
+            return frame_header + self.data
+        else:
+            mask_key = self.get_mask_key(4)
+            return frame_header + self._get_masked(mask_key)
+
+    def _get_masked(self, mask_key):
+        s = ABNF.mask(mask_key, self.data)
+
+        if isinstance(mask_key, six.text_type):
+            mask_key = mask_key.encode('utf-8')
+
+        return mask_key + s
+
+    @staticmethod
+    def mask(mask_key, data):
+        """
+        mask or unmask data. Just do xor for each byte
+
+        mask_key: 4 byte string(byte).
+
+        data: data to mask/unmask.
+        """
+        if data is None:
+            data = ""
+
+        if isinstance(mask_key, six.text_type):
+            mask_key = six.b(mask_key)
+
+        if isinstance(data, six.text_type):
+            data = six.b(data)
+
+        _m = array.array("B", mask_key)
+        _d = array.array("B", data)
+        return _mask(_m, _d)
+
+
+class frame_buffer(object):
+    _HEADER_MASK_INDEX = 5
+    _HEADER_LENGTH_INDEX = 6
+
+    def __init__(self, recv_fn, skip_utf8_validation):
+        self.recv = recv_fn
+        self.skip_utf8_validation = skip_utf8_validation
+        # Buffers over the packets from the layer beneath until desired amount
+        # bytes of bytes are received.
+        self.recv_buffer = []
+        self.clear()
+        self.lock = Lock()
+
+    def clear(self):
+        self.header = None
+        self.length = None
+        self.mask = None
+
+    def has_received_header(self):
+        return self.header is None
+
+    def recv_header(self):
+        header = self.recv_strict(2)
+        b1 = header[0]
+
+        if six.PY2:
+            b1 = ord(b1)
+
+        fin = b1 >> 7 & 1
+        rsv1 = b1 >> 6 & 1
+        rsv2 = b1 >> 5 & 1
+        rsv3 = b1 >> 4 & 1
+        opcode = b1 & 0xf
+        b2 = header[1]
+
+        if six.PY2:
+            b2 = ord(b2)
+
+        has_mask = b2 >> 7 & 1
+        length_bits = b2 & 0x7f
+
+        self.header = (fin, rsv1, rsv2, rsv3, opcode, has_mask, length_bits)
+
+    def has_mask(self):
+        if not self.header:
+            return False
+        return self.header[frame_buffer._HEADER_MASK_INDEX]
+
+    def has_received_length(self):
+        return self.length is None
+
+    def recv_length(self):
+        bits = self.header[frame_buffer._HEADER_LENGTH_INDEX]
+        length_bits = bits & 0x7f
+        if length_bits == 0x7e:
+            v = self.recv_strict(2)
+            self.length = struct.unpack("!H", v)[0]
+        elif length_bits == 0x7f:
+            v = self.recv_strict(8)
+            self.length = struct.unpack("!Q", v)[0]
+        else:
+            self.length = length_bits
+
+    def has_received_mask(self):
+        return self.mask is None
+
+    def recv_mask(self):
+        self.mask = self.recv_strict(4) if self.has_mask() else ""
+
+    def recv_frame(self):
+
+        with self.lock:
+            # Header
+            if self.has_received_header():
+                self.recv_header()
+            (fin, rsv1, rsv2, rsv3, opcode, has_mask, _) = self.header
+
+            # Frame length
+            if self.has_received_length():
+                self.recv_length()
+            length = self.length
+
+            # Mask
+            if self.has_received_mask():
+                self.recv_mask()
+            mask = self.mask
+
+            # Payload
+            payload = self.recv_strict(length)
+            if has_mask:
+                payload = ABNF.mask(mask, payload)
+
+            # Reset for next frame
+            self.clear()
+
+            frame = ABNF(fin, rsv1, rsv2, rsv3, opcode, has_mask, payload)
+            frame.validate(self.skip_utf8_validation)
+
+        return frame
+
+    def recv_strict(self, bufsize):
+        shortage = bufsize - sum(len(x) for x in self.recv_buffer)
+        while shortage > 0:
+            # Limit buffer size that we pass to socket.recv() to avoid
+            # fragmenting the heap -- the number of bytes recv() actually
+            # reads is limited by socket buffer and is relatively small,
+            # yet passing large numbers repeatedly causes lots of large
+            # buffers allocated and then shrunk, which results in
+            # fragmentation.
+            bytes_ = self.recv(min(16384, shortage))
+            self.recv_buffer.append(bytes_)
+            shortage -= len(bytes_)
+
+        unified = six.b("").join(self.recv_buffer)
+
+        if shortage == 0:
+            self.recv_buffer = []
+            return unified
+        else:
+            self.recv_buffer = [unified[bufsize:]]
+            return unified[:bufsize]
+
+
+class continuous_frame(object):
+
+    def __init__(self, fire_cont_frame, skip_utf8_validation):
+        self.fire_cont_frame = fire_cont_frame
+        self.skip_utf8_validation = skip_utf8_validation
+        self.cont_data = None
+        self.recving_frames = None
+
+    def validate(self, frame):
+        if not self.recving_frames and frame.opcode == ABNF.OPCODE_CONT:
+            raise WebSocketProtocolException("Illegal frame")
+        if self.recving_frames and \
+                frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY):
+            raise WebSocketProtocolException("Illegal frame")
+
+    def add(self, frame):
+        if self.cont_data:
+            self.cont_data[1] += frame.data
+        else:
+            if frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY):
+                self.recving_frames = frame.opcode
+            self.cont_data = [frame.opcode, frame.data]
+
+        if frame.fin:
+            self.recving_frames = None
+
+    def is_fire(self, frame):
+        return frame.fin or self.fire_cont_frame
+
+    def extract(self, frame):
+        data = self.cont_data
+        self.cont_data = None
+        frame.data = data[1]
+        if not self.fire_cont_frame and data[0] == ABNF.OPCODE_TEXT and not self.skip_utf8_validation and not validate_utf8(frame.data):
+            raise WebSocketPayloadException(
+                "cannot decode: " + repr(frame.data))
+
+        return [data[0], frame]
diff --git a/libs/websocket/_app.py b/libs/websocket/_app.py
new file mode 100644
index 000000000..178f516a5
--- /dev/null
+++ b/libs/websocket/_app.py
@@ -0,0 +1,274 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+
+"""
+WebSocketApp provides higher level APIs.
+"""
+import select
+import sys
+import threading
+import time
+import traceback
+
+import six
+
+from ._abnf import ABNF
+from ._core import WebSocket, getdefaulttimeout
+from ._exceptions import *
+from . import _logging
+
+
+__all__ = ["WebSocketApp"]
+
+
+class WebSocketApp(object):
+    """
+    Higher level of APIs are provided.
+    The interface is like JavaScript WebSocket object.
+    """
+
+    def __init__(self, url, header=None,
+                 on_open=None, on_message=None, on_error=None,
+                 on_close=None, on_ping=None, on_pong=None,
+                 on_cont_message=None,
+                 keep_running=True, get_mask_key=None, cookie=None,
+                 subprotocols=None,
+                 on_data=None):
+        """
+        url: websocket url.
+        header: custom header for websocket handshake.
+        on_open: callable object which is called at opening websocket.
+          this function has one argument. The argument is this class object.
+        on_message: callable object which is called when received data.
+         on_message has 2 arguments.
+         The 1st argument is this class object.
+         The 2nd argument is utf-8 string which we get from the server.
+        on_error: callable object which is called when we get error.
+         on_error has 2 arguments.
+         The 1st argument is this class object.
+         The 2nd argument is exception object.
+        on_close: callable object which is called when closed the connection.
+         this function has one argument. The argument is this class object.
+        on_cont_message: callback object which is called when receive continued
+         frame data.
+         on_cont_message has 3 arguments.
+         The 1st argument is this class object.
+         The 2nd argument is utf-8 string which we get from the server.
+         The 3rd argument is continue flag. if 0, the data continue
+         to next frame data
+        on_data: callback object which is called when a message received.
+          This is called before on_message or on_cont_message,
+          and then on_message or on_cont_message is called.
+          on_data has 4 argument.
+          The 1st argument is this class object.
+          The 2nd argument is utf-8 string which we get from the server.
+          The 3rd argument is data type. ABNF.OPCODE_TEXT or ABNF.OPCODE_BINARY will be came.
+          The 4th argument is continue flag. if 0, the data continue
+        keep_running: a boolean flag indicating whether the app's main loop
+          should keep running, defaults to True
+        get_mask_key: a callable to produce new mask keys,
+          see the WebSocket.set_mask_key's docstring for more information
+        subprotocols: array of available sub protocols. default is None.
+        """
+        self.url = url
+        self.header = header if header is not None else []
+        self.cookie = cookie
+        self.on_open = on_open
+        self.on_message = on_message
+        self.on_data = on_data
+        self.on_error = on_error
+        self.on_close = on_close
+        self.on_ping = on_ping
+        self.on_pong = on_pong
+        self.on_cont_message = on_cont_message
+        self.keep_running = keep_running
+        self.get_mask_key = get_mask_key
+        self.sock = None
+        self.last_ping_tm = 0
+        self.last_pong_tm = 0
+        self.subprotocols = subprotocols
+
+    def send(self, data, opcode=ABNF.OPCODE_TEXT):
+        """
+        send message.
+        data: message to send. If you set opcode to OPCODE_TEXT,
+              data must be utf-8 string or unicode.
+        opcode: operation code of data. default is OPCODE_TEXT.
+        """
+
+        if not self.sock or self.sock.send(data, opcode) == 0:
+            raise WebSocketConnectionClosedException(
+                "Connection is already closed.")
+
+    def close(self, **kwargs):
+        """
+        close websocket connection.
+        """
+        self.keep_running = False
+        if self.sock:
+            self.sock.close(**kwargs)
+
+    def _send_ping(self, interval, event):
+        while not event.wait(interval):
+            self.last_ping_tm = time.time()
+            if self.sock:
+                try:
+                    self.sock.ping()
+                except Exception as ex:
+                    _logging.warning("send_ping routine terminated: {}".format(ex))
+                    break
+
+    def run_forever(self, sockopt=None, sslopt=None,
+                    ping_interval=0, ping_timeout=None,
+                    http_proxy_host=None, http_proxy_port=None,
+                    http_no_proxy=None, http_proxy_auth=None,
+                    skip_utf8_validation=False,
+                    host=None, origin=None):
+        """
+        run event loop for WebSocket framework.
+        This loop is infinite loop and is alive during websocket is available.
+        sockopt: values for socket.setsockopt.
+            sockopt must be tuple
+            and each element is argument of sock.setsockopt.
+        sslopt: ssl socket optional dict.
+        ping_interval: automatically send "ping" command
+            every specified period(second)
+            if set to 0, not send automatically.
+        ping_timeout: timeout(second) if the pong message is not received.
+        http_proxy_host: http proxy host name.
+        http_proxy_port: http proxy port. If not set, set to 80.
+        http_no_proxy: host names, which doesn't use proxy.
+        skip_utf8_validation: skip utf8 validation.
+        host: update host header.
+        origin: update origin header.
+        """
+
+        if not ping_timeout or ping_timeout <= 0:
+            ping_timeout = None
+        if ping_timeout and ping_interval and ping_interval <= ping_timeout:
+            raise WebSocketException("Ensure ping_interval > ping_timeout")
+        if sockopt is None:
+            sockopt = []
+        if sslopt is None:
+            sslopt = {}
+        if self.sock:
+            raise WebSocketException("socket is already opened")
+        thread = None
+        close_frame = None
+
+        try:
+            self.sock = WebSocket(
+                self.get_mask_key, sockopt=sockopt, sslopt=sslopt,
+                fire_cont_frame=self.on_cont_message and True or False,
+                skip_utf8_validation=skip_utf8_validation)
+            self.sock.settimeout(getdefaulttimeout())
+            self.sock.connect(
+                self.url, header=self.header, cookie=self.cookie,
+                http_proxy_host=http_proxy_host,
+                http_proxy_port=http_proxy_port, http_no_proxy=http_no_proxy,
+                http_proxy_auth=http_proxy_auth, subprotocols=self.subprotocols,
+                host=host, origin=origin)
+            self._callback(self.on_open)
+
+            if ping_interval:
+                event = threading.Event()
+                thread = threading.Thread(
+                    target=self._send_ping, args=(ping_interval, event))
+                thread.setDaemon(True)
+                thread.start()
+
+            while self.sock.connected:
+                r, w, e = select.select(
+                    (self.sock.sock, ), (), (), ping_timeout or 10) # Use a 10 second timeout to avoid to wait forever on close
+                if not self.keep_running:
+                    break
+
+                if r:
+                    op_code, frame = self.sock.recv_data_frame(True)
+                    if op_code == ABNF.OPCODE_CLOSE:
+                        close_frame = frame
+                        break
+                    elif op_code == ABNF.OPCODE_PING:
+                        self._callback(self.on_ping, frame.data)
+                    elif op_code == ABNF.OPCODE_PONG:
+                        self.last_pong_tm = time.time()
+                        self._callback(self.on_pong, frame.data)
+                    elif op_code == ABNF.OPCODE_CONT and self.on_cont_message:
+                        self._callback(self.on_data, data,
+                                       frame.opcode, frame.fin)
+                        self._callback(self.on_cont_message,
+                                       frame.data, frame.fin)
+                    else:
+                        data = frame.data
+                        if six.PY3 and op_code == ABNF.OPCODE_TEXT:
+                            data = data.decode("utf-8")
+                        self._callback(self.on_data, data, frame.opcode, True)
+                        self._callback(self.on_message, data)
+
+                if ping_timeout and self.last_ping_tm \
+                        and time.time() - self.last_ping_tm > ping_timeout \
+                        and self.last_ping_tm - self.last_pong_tm > ping_timeout:
+                    raise WebSocketTimeoutException("ping/pong timed out")
+        except (Exception, KeyboardInterrupt, SystemExit) as e:
+            self._callback(self.on_error, e)
+            if isinstance(e, SystemExit):
+                # propagate SystemExit further
+                raise
+        finally:
+            if thread and thread.isAlive():
+                event.set()
+                thread.join()
+                self.keep_running = False
+            self.sock.close()
+            close_args = self._get_close_args(
+                close_frame.data if close_frame else None)
+            self._callback(self.on_close, *close_args)
+            self.sock = None
+
+    def _get_close_args(self, data):
+        """ this functions extracts the code, reason from the close body
+        if they exists, and if the self.on_close except three arguments """
+        import inspect
+        # if the on_close callback is "old", just return empty list
+        if sys.version_info < (3, 0):
+            if not self.on_close or len(inspect.getargspec(self.on_close).args) != 3:
+                return []
+        else:
+            if not self.on_close or len(inspect.getfullargspec(self.on_close).args) != 3:
+                return []
+
+        if data and len(data) >= 2:
+            code = 256 * six.byte2int(data[0:1]) + six.byte2int(data[1:2])
+            reason = data[2:].decode('utf-8')
+            return [code, reason]
+
+        return [None, None]
+
+    def _callback(self, callback, *args):
+        if callback:
+            try:
+                callback(self, *args)
+            except Exception as e:
+                _logging.error("error from callback {}: {}".format(callback, e))
+                if _logging.isEnabledForDebug():
+                    _, _, tb = sys.exc_info()
+                    traceback.print_tb(tb)
diff --git a/libs/websocket/_cookiejar.py b/libs/websocket/_cookiejar.py
new file mode 100644
index 000000000..8a30352e2
--- /dev/null
+++ b/libs/websocket/_cookiejar.py
@@ -0,0 +1,52 @@
+try:
+    import Cookie
+except:
+    import http.cookies as Cookie
+
+
+class SimpleCookieJar(object):
+    def __init__(self):
+        self.jar = dict()
+
+    def add(self, set_cookie):
+        if set_cookie:
+            try:
+                simpleCookie = Cookie.SimpleCookie(set_cookie)
+            except:
+                simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore'))
+
+            for k, v in simpleCookie.items():
+                domain = v.get("domain")
+                if domain:
+                    if not domain.startswith("."):
+                        domain = "." + domain
+                    cookie = self.jar.get(domain) if self.jar.get(domain) else Cookie.SimpleCookie()
+                    cookie.update(simpleCookie)
+                    self.jar[domain.lower()] = cookie
+
+    def set(self, set_cookie):
+        if set_cookie:
+            try:
+                simpleCookie = Cookie.SimpleCookie(set_cookie)
+            except:
+                simpleCookie = Cookie.SimpleCookie(set_cookie.encode('ascii', 'ignore'))
+
+            for k, v in simpleCookie.items():
+                domain = v.get("domain")
+                if domain:
+                    if not domain.startswith("."):
+                        domain = "." + domain
+                    self.jar[domain.lower()] = simpleCookie
+
+    def get(self, host):
+        if not host:
+            return ""
+
+        cookies = []
+        for domain, simpleCookie in self.jar.items():
+            host = host.lower()
+            if host.endswith(domain) or host == domain[1:]:
+                cookies.append(self.jar.get(domain))
+
+        return "; ".join(filter(None, ["%s=%s" % (k, v.value) for cookie in filter(None, sorted(cookies)) for k, v in
+                                       cookie.items()]))
diff --git a/libs/websocket/_core.py b/libs/websocket/_core.py
new file mode 100644
index 000000000..adcdb6beb
--- /dev/null
+++ b/libs/websocket/_core.py
@@ -0,0 +1,488 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+from __future__ import print_function
+
+import socket
+import struct
+import threading
+
+import six
+
+# websocket modules
+from ._abnf import *
+from ._exceptions import *
+from ._handshake import *
+from ._http import *
+from ._logging import *
+from ._socket import *
+from ._utils import *
+
+__all__ = ['WebSocket', 'create_connection']
+
+"""
+websocket python client.
+=========================
+
+This version support only hybi-13.
+Please see http://tools.ietf.org/html/rfc6455 for protocol.
+"""
+
+
+class WebSocket(object):
+    """
+    Low level WebSocket interface.
+    This class is based on
+      The WebSocket protocol draft-hixie-thewebsocketprotocol-76
+      http://tools.ietf.org/html/draft-hixie-thewebsocketprotocol-76
+
+    We can connect to the websocket server and send/receive data.
+    The following example is an echo client.
+
+    >>> import websocket
+    >>> ws = websocket.WebSocket()
+    >>> ws.connect("ws://echo.websocket.org")
+    >>> ws.send("Hello, Server")
+    >>> ws.recv()
+    'Hello, Server'
+    >>> ws.close()
+
+    get_mask_key: a callable to produce new mask keys, see the set_mask_key
+      function's docstring for more details
+    sockopt: values for socket.setsockopt.
+        sockopt must be tuple and each element is argument of sock.setsockopt.
+    sslopt: dict object for ssl socket option.
+    fire_cont_frame: fire recv event for each cont frame. default is False
+    enable_multithread: if set to True, lock send method.
+    skip_utf8_validation: skip utf8 validation.
+    """
+
+    def __init__(self, get_mask_key=None, sockopt=None, sslopt=None,
+                 fire_cont_frame=False, enable_multithread=False,
+                 skip_utf8_validation=False, **_):
+        """
+        Initialize WebSocket object.
+        """
+        self.sock_opt = sock_opt(sockopt, sslopt)
+        self.handshake_response = None
+        self.sock = None
+
+        self.connected = False
+        self.get_mask_key = get_mask_key
+        # These buffer over the build-up of a single frame.
+        self.frame_buffer = frame_buffer(self._recv, skip_utf8_validation)
+        self.cont_frame = continuous_frame(
+            fire_cont_frame, skip_utf8_validation)
+
+        if enable_multithread:
+            self.lock = threading.Lock()
+        else:
+            self.lock = NoLock()
+
+    def __iter__(self):
+        """
+        Allow iteration over websocket, implying sequential `recv` executions.
+        """
+        while True:
+            yield self.recv()
+
+    def __next__(self):
+        return self.recv()
+
+    def next(self):
+        return self.__next__()
+
+    def fileno(self):
+        return self.sock.fileno()
+
+    def set_mask_key(self, func):
+        """
+        set function to create musk key. You can customize mask key generator.
+        Mainly, this is for testing purpose.
+
+        func: callable object. the func takes 1 argument as integer.
+              The argument means length of mask key.
+              This func must return string(byte array),
+              which length is argument specified.
+        """
+        self.get_mask_key = func
+
+    def gettimeout(self):
+        """
+        Get the websocket timeout(second).
+        """
+        return self.sock_opt.timeout
+
+    def settimeout(self, timeout):
+        """
+        Set the timeout to the websocket.
+
+        timeout: timeout time(second).
+        """
+        self.sock_opt.timeout = timeout
+        if self.sock:
+            self.sock.settimeout(timeout)
+
+    timeout = property(gettimeout, settimeout)
+
+    def getsubprotocol(self):
+        """
+        get subprotocol
+        """
+        if self.handshake_response:
+            return self.handshake_response.subprotocol
+        else:
+            return None
+
+    subprotocol = property(getsubprotocol)
+
+    def getstatus(self):
+        """
+        get handshake status
+        """
+        if self.handshake_response:
+            return self.handshake_response.status
+        else:
+            return None
+
+    status = property(getstatus)
+
+    def getheaders(self):
+        """
+        get handshake response header
+        """
+        if self.handshake_response:
+            return self.handshake_response.headers
+        else:
+            return None
+
+    headers = property(getheaders)
+
+    def connect(self, url, **options):
+        """
+        Connect to url. url is websocket url scheme.
+        ie. ws://host:port/resource
+        You can customize using 'options'.
+        If you set "header" list object, you can set your own custom header.
+
+        >>> ws = WebSocket()
+        >>> ws.connect("ws://echo.websocket.org/",
+                ...     header=["User-Agent: MyProgram",
+                ...             "x-custom: header"])
+
+        timeout: socket timeout time. This value is integer.
+                 if you set None for this value,
+                 it means "use default_timeout value"
+
+        options: "header" -> custom http header list or dict.
+                 "cookie" -> cookie value.
+                 "origin" -> custom origin url.
+                 "host"   -> custom host header string.
+                 "http_proxy_host" - http proxy host name.
+                 "http_proxy_port" - http proxy port. If not set, set to 80.
+                 "http_no_proxy"   - host names, which doesn't use proxy.
+                 "http_proxy_auth" - http proxy auth information.
+                                     tuple of username and password.
+                                     default is None
+                 "subprotocols" - array of available sub protocols.
+                                  default is None.
+                 "socket" - pre-initialized stream socket.
+
+        """
+        self.sock, addrs = connect(url, self.sock_opt, proxy_info(**options),
+                                   options.pop('socket', None))
+
+        try:
+            self.handshake_response = handshake(self.sock, *addrs, **options)
+            self.connected = True
+        except:
+            if self.sock:
+                self.sock.close()
+                self.sock = None
+            raise
+
+    def send(self, payload, opcode=ABNF.OPCODE_TEXT):
+        """
+        Send the data as string.
+
+        payload: Payload must be utf-8 string or unicode,
+                  if the opcode is OPCODE_TEXT.
+                  Otherwise, it must be string(byte array)
+
+        opcode: operation code to send. Please see OPCODE_XXX.
+        """
+
+        frame = ABNF.create_frame(payload, opcode)
+        return self.send_frame(frame)
+
+    def send_frame(self, frame):
+        """
+        Send the data frame.
+
+        frame: frame data created  by ABNF.create_frame
+
+        >>> ws = create_connection("ws://echo.websocket.org/")
+        >>> frame = ABNF.create_frame("Hello", ABNF.OPCODE_TEXT)
+        >>> ws.send_frame(frame)
+        >>> cont_frame = ABNF.create_frame("My name is ", ABNF.OPCODE_CONT, 0)
+        >>> ws.send_frame(frame)
+        >>> cont_frame = ABNF.create_frame("Foo Bar", ABNF.OPCODE_CONT, 1)
+        >>> ws.send_frame(frame)
+
+        """
+        if self.get_mask_key:
+            frame.get_mask_key = self.get_mask_key
+        data = frame.format()
+        length = len(data)
+        trace("send: " + repr(data))
+
+        with self.lock:
+            while data:
+                l = self._send(data)
+                data = data[l:]
+
+        return length
+
+    def send_binary(self, payload):
+        return self.send(payload, ABNF.OPCODE_BINARY)
+
+    def ping(self, payload=""):
+        """
+        send ping data.
+
+        payload: data payload to send server.
+        """
+        if isinstance(payload, six.text_type):
+            payload = payload.encode("utf-8")
+        self.send(payload, ABNF.OPCODE_PING)
+
+    def pong(self, payload):
+        """
+        send pong data.
+
+        payload: data payload to send server.
+        """
+        if isinstance(payload, six.text_type):
+            payload = payload.encode("utf-8")
+        self.send(payload, ABNF.OPCODE_PONG)
+
+    def recv(self):
+        """
+        Receive string data(byte array) from the server.
+
+        return value: string(byte array) value.
+        """
+        opcode, data = self.recv_data()
+        if six.PY3 and opcode == ABNF.OPCODE_TEXT:
+            return data.decode("utf-8")
+        elif opcode == ABNF.OPCODE_TEXT or opcode == ABNF.OPCODE_BINARY:
+            return data
+        else:
+            return ''
+
+    def recv_data(self, control_frame=False):
+        """
+        Receive data with operation code.
+
+        control_frame: a boolean flag indicating whether to return control frame
+        data, defaults to False
+
+        return  value: tuple of operation code and string(byte array) value.
+        """
+        opcode, frame = self.recv_data_frame(control_frame)
+        return opcode, frame.data
+
+    def recv_data_frame(self, control_frame=False):
+        """
+        Receive data with operation code.
+
+        control_frame: a boolean flag indicating whether to return control frame
+        data, defaults to False
+
+        return  value: tuple of operation code and string(byte array) value.
+        """
+        while True:
+            frame = self.recv_frame()
+            if not frame:
+                # handle error:
+                # 'NoneType' object has no attribute 'opcode'
+                raise WebSocketProtocolException(
+                    "Not a valid frame %s" % frame)
+            elif frame.opcode in (ABNF.OPCODE_TEXT, ABNF.OPCODE_BINARY, ABNF.OPCODE_CONT):
+                self.cont_frame.validate(frame)
+                self.cont_frame.add(frame)
+
+                if self.cont_frame.is_fire(frame):
+                    return self.cont_frame.extract(frame)
+
+            elif frame.opcode == ABNF.OPCODE_CLOSE:
+                self.send_close()
+                return frame.opcode, frame
+            elif frame.opcode == ABNF.OPCODE_PING:
+                if len(frame.data) < 126:
+                    self.pong(frame.data)
+                else:
+                    raise WebSocketProtocolException(
+                        "Ping message is too long")
+                if control_frame:
+                    return frame.opcode, frame
+            elif frame.opcode == ABNF.OPCODE_PONG:
+                if control_frame:
+                    return frame.opcode, frame
+
+    def recv_frame(self):
+        """
+        receive data as frame from server.
+
+        return value: ABNF frame object.
+        """
+        return self.frame_buffer.recv_frame()
+
+    def send_close(self, status=STATUS_NORMAL, reason=six.b("")):
+        """
+        send close data to the server.
+
+        status: status code to send. see STATUS_XXX.
+
+        reason: the reason to close. This must be string or bytes.
+        """
+        if status < 0 or status >= ABNF.LENGTH_16:
+            raise ValueError("code is invalid range")
+        self.connected = False
+        self.send(struct.pack('!H', status) + reason, ABNF.OPCODE_CLOSE)
+
+    def close(self, status=STATUS_NORMAL, reason=six.b(""), timeout=3):
+        """
+        Close Websocket object
+
+        status: status code to send. see STATUS_XXX.
+
+        reason: the reason to close. This must be string.
+
+        timeout: timeout until receive a close frame.
+            If None, it will wait forever until receive a close frame.
+        """
+        if self.connected:
+            if status < 0 or status >= ABNF.LENGTH_16:
+                raise ValueError("code is invalid range")
+
+            try:
+                self.connected = False
+                self.send(struct.pack('!H', status) +
+                          reason, ABNF.OPCODE_CLOSE)
+                sock_timeout = self.sock.gettimeout()
+                self.sock.settimeout(timeout)
+                try:
+                    frame = self.recv_frame()
+                    if isEnabledForError():
+                        recv_status = struct.unpack("!H", frame.data)[0]
+                        if recv_status != STATUS_NORMAL:
+                            error("close status: " + repr(recv_status))
+                except:
+                    pass
+                self.sock.settimeout(sock_timeout)
+                self.sock.shutdown(socket.SHUT_RDWR)
+            except:
+                pass
+
+        self.shutdown()
+
+    def abort(self):
+        """
+        Low-level asynchronous abort, wakes up other threads that are waiting in recv_*
+        """
+        if self.connected:
+            self.sock.shutdown(socket.SHUT_RDWR)
+
+    def shutdown(self):
+        """close socket, immediately."""
+        if self.sock:
+            self.sock.close()
+            self.sock = None
+            self.connected = False
+
+    def _send(self, data):
+        return send(self.sock, data)
+
+    def _recv(self, bufsize):
+        try:
+            return recv(self.sock, bufsize)
+        except WebSocketConnectionClosedException:
+            if self.sock:
+                self.sock.close()
+            self.sock = None
+            self.connected = False
+            raise
+
+
+def create_connection(url, timeout=None, class_=WebSocket, **options):
+    """
+    connect to url and return websocket object.
+
+    Connect to url and return the WebSocket object.
+    Passing optional timeout parameter will set the timeout on the socket.
+    If no timeout is supplied,
+    the global default timeout setting returned by getdefauttimeout() is used.
+    You can customize using 'options'.
+    If you set "header" list object, you can set your own custom header.
+
+    >>> conn = create_connection("ws://echo.websocket.org/",
+         ...     header=["User-Agent: MyProgram",
+         ...             "x-custom: header"])
+
+
+    timeout: socket timeout time. This value is integer.
+             if you set None for this value,
+             it means "use default_timeout value"
+
+    class_: class to instantiate when creating the connection. It has to implement
+            settimeout and connect. It's __init__ should be compatible with
+            WebSocket.__init__, i.e. accept all of it's kwargs.
+    options: "header" -> custom http header list or dict.
+             "cookie" -> cookie value.
+             "origin" -> custom origin url.
+             "host"   -> custom host header string.
+             "http_proxy_host" - http proxy host name.
+             "http_proxy_port" - http proxy port. If not set, set to 80.
+             "http_no_proxy"   - host names, which doesn't use proxy.
+             "http_proxy_auth" - http proxy auth information.
+                                    tuple of username and password.
+                                    default is None
+             "enable_multithread" -> enable lock for multithread.
+             "sockopt" -> socket options
+             "sslopt" -> ssl option
+             "subprotocols" - array of available sub protocols.
+                              default is None.
+             "skip_utf8_validation" - skip utf8 validation.
+             "socket" - pre-initialized stream socket.
+    """
+    sockopt = options.pop("sockopt", [])
+    sslopt = options.pop("sslopt", {})
+    fire_cont_frame = options.pop("fire_cont_frame", False)
+    enable_multithread = options.pop("enable_multithread", False)
+    skip_utf8_validation = options.pop("skip_utf8_validation", False)
+    websock = class_(sockopt=sockopt, sslopt=sslopt,
+                     fire_cont_frame=fire_cont_frame,
+                     enable_multithread=enable_multithread,
+                     skip_utf8_validation=skip_utf8_validation, **options)
+    websock.settimeout(timeout if timeout is not None else getdefaulttimeout())
+    websock.connect(url, **options)
+    return websock
diff --git a/libs/websocket/_exceptions.py b/libs/websocket/_exceptions.py
new file mode 100644
index 000000000..9d1a3bcc5
--- /dev/null
+++ b/libs/websocket/_exceptions.py
@@ -0,0 +1,80 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+
+
+"""
+define websocket exceptions
+"""
+
+
+class WebSocketException(Exception):
+    """
+    websocket exception class.
+    """
+    pass
+
+
+class WebSocketProtocolException(WebSocketException):
+    """
+    If the websocket protocol is invalid, this exception will be raised.
+    """
+    pass
+
+
+class WebSocketPayloadException(WebSocketException):
+    """
+    If the websocket payload is invalid, this exception will be raised.
+    """
+    pass
+
+
+class WebSocketConnectionClosedException(WebSocketException):
+    """
+    If remote host closed the connection or some network error happened,
+    this exception will be raised.
+    """
+    pass
+
+
+class WebSocketTimeoutException(WebSocketException):
+    """
+    WebSocketTimeoutException will be raised at socket timeout during read/write data.
+    """
+    pass
+
+
+class WebSocketProxyException(WebSocketException):
+    """
+    WebSocketProxyException will be raised when proxy error occurred.
+    """
+    pass
+
+
+class WebSocketBadStatusException(WebSocketException):
+    """
+    WebSocketBadStatusException will be raised when we get bad handshake status code.
+    """
+
+    def __init__(self, message, status_code):
+        super(WebSocketBadStatusException, self).__init__(
+            message % status_code)
+        self.status_code = status_code
diff --git a/libs/websocket/_handshake.py b/libs/websocket/_handshake.py
new file mode 100644
index 000000000..d8116ed93
--- /dev/null
+++ b/libs/websocket/_handshake.py
@@ -0,0 +1,174 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+import hashlib
+import hmac
+import os
+
+import six
+
+from ._cookiejar import SimpleCookieJar
+from ._exceptions import *
+from ._http import *
+from ._logging import *
+from ._socket import *
+
+if six.PY3:
+    from base64 import encodebytes as base64encode
+else:
+    from base64 import encodestring as base64encode
+
+__all__ = ["handshake_response", "handshake"]
+
+if hasattr(hmac, "compare_digest"):
+    compare_digest = hmac.compare_digest
+else:
+    def compare_digest(s1, s2):
+        return s1 == s2
+
+# websocket supported version.
+VERSION = 13
+
+CookieJar = SimpleCookieJar()
+
+
+class handshake_response(object):
+
+    def __init__(self, status, headers, subprotocol):
+        self.status = status
+        self.headers = headers
+        self.subprotocol = subprotocol
+        CookieJar.add(headers.get("set-cookie"))
+
+
+def handshake(sock, hostname, port, resource, **options):
+    headers, key = _get_handshake_headers(resource, hostname, port, options)
+
+    header_str = "\r\n".join(headers)
+    send(sock, header_str)
+    dump("request header", header_str)
+
+    status, resp = _get_resp_headers(sock)
+    success, subproto = _validate(resp, key, options.get("subprotocols"))
+    if not success:
+        raise WebSocketException("Invalid WebSocket Header")
+
+    return handshake_response(status, resp, subproto)
+
+
+def _get_handshake_headers(resource, host, port, options):
+    headers = [
+        "GET %s HTTP/1.1" % resource,
+        "Upgrade: websocket",
+        "Connection: Upgrade"
+    ]
+    if port == 80 or port == 443:
+        hostport = host
+    else:
+        hostport = "%s:%d" % (host, port)
+
+    if "host" in options and options["host"]:
+        headers.append("Host: %s" % options["host"])
+    else:
+        headers.append("Host: %s" % hostport)
+
+    if "origin" in options and options["origin"]:
+        headers.append("Origin: %s" % options["origin"])
+    else:
+        headers.append("Origin: http://%s" % hostport)
+
+    key = _create_sec_websocket_key()
+    headers.append("Sec-WebSocket-Key: %s" % key)
+    headers.append("Sec-WebSocket-Version: %s" % VERSION)
+
+    subprotocols = options.get("subprotocols")
+    if subprotocols:
+        headers.append("Sec-WebSocket-Protocol: %s" % ",".join(subprotocols))
+
+    if "header" in options:
+        header = options["header"]
+        if isinstance(header, dict):
+            header = map(": ".join, header.items())
+        headers.extend(header)
+
+    server_cookie = CookieJar.get(host)
+    client_cookie = options.get("cookie", None)
+
+    cookie = "; ".join(filter(None, [server_cookie, client_cookie]))
+
+    if cookie:
+        headers.append("Cookie: %s" % cookie)
+
+    headers.append("")
+    headers.append("")
+
+    return headers, key
+
+
+def _get_resp_headers(sock, success_status=101):
+    status, resp_headers = read_headers(sock)
+    if status != success_status:
+        raise WebSocketBadStatusException("Handshake status %d", status)
+    return status, resp_headers
+
+_HEADERS_TO_CHECK = {
+    "upgrade": "websocket",
+    "connection": "upgrade",
+}
+
+
+def _validate(headers, key, subprotocols):
+    subproto = None
+    for k, v in _HEADERS_TO_CHECK.items():
+        r = headers.get(k, None)
+        if not r:
+            return False, None
+        r = r.lower()
+        if v != r:
+            return False, None
+
+    if subprotocols:
+        subproto = headers.get("sec-websocket-protocol", None).lower()
+        if not subproto or subproto not in [s.lower() for s in subprotocols]:
+            error("Invalid subprotocol: " + str(subprotocols))
+            return False, None
+
+    result = headers.get("sec-websocket-accept", None)
+    if not result:
+        return False, None
+    result = result.lower()
+
+    if isinstance(result, six.text_type):
+        result = result.encode('utf-8')
+
+    value = (key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11").encode('utf-8')
+    hashed = base64encode(hashlib.sha1(value).digest()).strip().lower()
+    success = compare_digest(hashed, result)
+
+    if success:
+        return True, subproto
+    else:
+        return False, None
+
+
+def _create_sec_websocket_key():
+    randomness = os.urandom(16)
+    return base64encode(randomness).decode('utf-8').strip()
diff --git a/libs/websocket/_http.py b/libs/websocket/_http.py
new file mode 100644
index 000000000..28391b4c7
--- /dev/null
+++ b/libs/websocket/_http.py
@@ -0,0 +1,245 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+import errno
+import os
+import socket
+import sys
+
+import six
+
+from ._exceptions import *
+from ._logging import *
+from ._socket import*
+from ._ssl_compat import *
+from ._url import *
+
+if six.PY3:
+    from base64 import encodebytes as base64encode
+else:
+    from base64 import encodestring as base64encode
+
+__all__ = ["proxy_info", "connect", "read_headers"]
+
+
+class proxy_info(object):
+
+    def __init__(self, **options):
+        self.host = options.get("http_proxy_host", None)
+        if self.host:
+            self.port = options.get("http_proxy_port", 0)
+            self.auth = options.get("http_proxy_auth", None)
+            self.no_proxy = options.get("http_no_proxy", None)
+        else:
+            self.port = 0
+            self.auth = None
+            self.no_proxy = None
+
+
+def connect(url, options, proxy, socket):
+    hostname, port, resource, is_secure = parse_url(url)
+
+    if socket:
+        return socket, (hostname, port, resource)
+
+    addrinfo_list, need_tunnel, auth = _get_addrinfo_list(
+        hostname, port, is_secure, proxy)
+    if not addrinfo_list:
+        raise WebSocketException(
+            "Host not found.: " + hostname + ":" + str(port))
+
+    sock = None
+    try:
+        sock = _open_socket(addrinfo_list, options.sockopt, options.timeout)
+        if need_tunnel:
+            sock = _tunnel(sock, hostname, port, auth)
+
+        if is_secure:
+            if HAVE_SSL:
+                sock = _ssl_socket(sock, options.sslopt, hostname)
+            else:
+                raise WebSocketException("SSL not available.")
+
+        return sock, (hostname, port, resource)
+    except:
+        if sock:
+            sock.close()
+        raise
+
+
+def _get_addrinfo_list(hostname, port, is_secure, proxy):
+    phost, pport, pauth = get_proxy_info(
+        hostname, is_secure, proxy.host, proxy.port, proxy.auth, proxy.no_proxy)
+    if not phost:
+        addrinfo_list = socket.getaddrinfo(
+            hostname, port, 0, 0, socket.SOL_TCP)
+        return addrinfo_list, False, None
+    else:
+        pport = pport and pport or 80
+        addrinfo_list = socket.getaddrinfo(phost, pport, 0, 0, socket.SOL_TCP)
+        return addrinfo_list, True, pauth
+
+
+def _open_socket(addrinfo_list, sockopt, timeout):
+    err = None
+    for addrinfo in addrinfo_list:
+        family = addrinfo[0]
+        sock = socket.socket(family)
+        sock.settimeout(timeout)
+        for opts in DEFAULT_SOCKET_OPTION:
+            sock.setsockopt(*opts)
+        for opts in sockopt:
+            sock.setsockopt(*opts)
+
+        address = addrinfo[4]
+        try:
+            sock.connect(address)
+        except socket.error as error:
+            error.remote_ip = str(address[0])
+            if error.errno in (errno.ECONNREFUSED, ):
+                err = error
+                continue
+            else:
+                raise
+        else:
+            break
+    else:
+        raise err
+
+    return sock
+
+
+def _can_use_sni():
+    return six.PY2 and sys.version_info >= (2, 7, 9) or sys.version_info >= (3, 2)
+
+
+def _wrap_sni_socket(sock, sslopt, hostname, check_hostname):
+    context = ssl.SSLContext(sslopt.get('ssl_version', ssl.PROTOCOL_SSLv23))
+
+    if sslopt.get('cert_reqs', ssl.CERT_NONE) != ssl.CERT_NONE:
+        context.load_verify_locations(cafile=sslopt.get('ca_certs', None), capath=sslopt.get('ca_cert_path', None))
+    if sslopt.get('certfile', None):
+        context.load_cert_chain(
+            sslopt['certfile'],
+            sslopt.get('keyfile', None),
+            sslopt.get('password', None),
+        )
+    # see
+    # https://github.com/liris/websocket-client/commit/b96a2e8fa765753e82eea531adb19716b52ca3ca#commitcomment-10803153
+    context.verify_mode = sslopt['cert_reqs']
+    if HAVE_CONTEXT_CHECK_HOSTNAME:
+        context.check_hostname = check_hostname
+    if 'ciphers' in sslopt:
+        context.set_ciphers(sslopt['ciphers'])
+    if 'cert_chain' in sslopt:
+        certfile, keyfile, password = sslopt['cert_chain']
+        context.load_cert_chain(certfile, keyfile, password)
+
+    return context.wrap_socket(
+        sock,
+        do_handshake_on_connect=sslopt.get('do_handshake_on_connect', True),
+        suppress_ragged_eofs=sslopt.get('suppress_ragged_eofs', True),
+        server_hostname=hostname,
+    )
+
+
+def _ssl_socket(sock, user_sslopt, hostname):
+    sslopt = dict(cert_reqs=ssl.CERT_REQUIRED)
+    sslopt.update(user_sslopt)
+
+    if os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE'):
+        certPath = os.environ.get('WEBSOCKET_CLIENT_CA_BUNDLE')
+    else:
+        certPath = os.path.join(
+            os.path.dirname(__file__), "cacert.pem")
+    if os.path.isfile(certPath) and user_sslopt.get('ca_cert', None) is None:
+        sslopt['ca_certs'] = certPath
+    elif os.path.isdir(certPath) and user_sslopt.get('ca_cert_path', None) is None:
+        sslopt['ca_cert_path'] = certPath
+
+    check_hostname = sslopt["cert_reqs"] != ssl.CERT_NONE and sslopt.pop(
+        'check_hostname', True)
+
+    if _can_use_sni():
+        sock = _wrap_sni_socket(sock, sslopt, hostname, check_hostname)
+    else:
+        sslopt.pop('check_hostname', True)
+        sock = ssl.wrap_socket(sock, **sslopt)
+
+    if not HAVE_CONTEXT_CHECK_HOSTNAME and check_hostname:
+        match_hostname(sock.getpeercert(), hostname)
+
+    return sock
+
+
+def _tunnel(sock, host, port, auth):
+    debug("Connecting proxy...")
+    connect_header = "CONNECT %s:%d HTTP/1.0\r\n" % (host, port)
+    # TODO: support digest auth.
+    if auth and auth[0]:
+        auth_str = auth[0]
+        if auth[1]:
+            auth_str += ":" + auth[1]
+        encoded_str = base64encode(auth_str.encode()).strip().decode()
+        connect_header += "Proxy-Authorization: Basic %s\r\n" % encoded_str
+    connect_header += "\r\n"
+    dump("request header", connect_header)
+
+    send(sock, connect_header)
+
+    try:
+        status, resp_headers = read_headers(sock)
+    except Exception as e:
+        raise WebSocketProxyException(str(e))
+
+    if status != 200:
+        raise WebSocketProxyException(
+            "failed CONNECT via proxy status: %r" % status)
+
+    return sock
+
+
+def read_headers(sock):
+    status = None
+    headers = {}
+    trace("--- response header ---")
+
+    while True:
+        line = recv_line(sock)
+        line = line.decode('utf-8').strip()
+        if not line:
+            break
+        trace(line)
+        if not status:
+
+            status_info = line.split(" ", 2)
+            status = int(status_info[1])
+        else:
+            kv = line.split(":", 1)
+            if len(kv) == 2:
+                key, value = kv
+                headers[key.lower()] = value.strip()
+            else:
+                raise WebSocketException("Invalid header")
+
+    trace("-----------------------")
+
+    return status, headers
diff --git a/libs/websocket/_logging.py b/libs/websocket/_logging.py
new file mode 100644
index 000000000..d406db6a9
--- /dev/null
+++ b/libs/websocket/_logging.py
@@ -0,0 +1,74 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+import logging
+
+_logger = logging.getLogger('websocket')
+_traceEnabled = False
+
+__all__ = ["enableTrace", "dump", "error", "warning", "debug", "trace",
+           "isEnabledForError", "isEnabledForDebug"]
+
+
+def enableTrace(traceable):
+    """
+    turn on/off the traceability.
+
+    traceable: boolean value. if set True, traceability is enabled.
+    """
+    global _traceEnabled
+    _traceEnabled = traceable
+    if traceable:
+        if not _logger.handlers:
+            _logger.addHandler(logging.StreamHandler())
+        _logger.setLevel(logging.DEBUG)
+
+
+def dump(title, message):
+    if _traceEnabled:
+        _logger.debug("--- " + title + " ---")
+        _logger.debug(message)
+        _logger.debug("-----------------------")
+
+
+def error(msg):
+    _logger.error(msg)
+
+
+def warning(msg):
+    _logger.warning(msg)
+
+
+def debug(msg):
+    _logger.debug(msg)
+
+
+def trace(msg):
+    if _traceEnabled:
+        _logger.debug(msg)
+
+
+def isEnabledForError():
+    return _logger.isEnabledFor(logging.ERROR)
+
+
+def isEnabledForDebug():
+    return _logger.isEnabledFor(logging.DEBUG)
diff --git a/libs/websocket/_socket.py b/libs/websocket/_socket.py
new file mode 100644
index 000000000..e2e1dd284
--- /dev/null
+++ b/libs/websocket/_socket.py
@@ -0,0 +1,125 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1335  USA
+
+"""
+import socket
+
+import six
+
+from ._exceptions import *
+from ._ssl_compat import *
+from ._utils import *
+
+DEFAULT_SOCKET_OPTION = [(socket.SOL_TCP, socket.TCP_NODELAY, 1)]
+if hasattr(socket, "SO_KEEPALIVE"):
+    DEFAULT_SOCKET_OPTION.append((socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1))
+if hasattr(socket, "TCP_KEEPIDLE"):
+    DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPIDLE, 30))
+if hasattr(socket, "TCP_KEEPINTVL"):
+    DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPINTVL, 10))
+if hasattr(socket, "TCP_KEEPCNT"):
+    DEFAULT_SOCKET_OPTION.append((socket.SOL_TCP, socket.TCP_KEEPCNT, 3))
+
+_default_timeout = None
+
+__all__ = ["DEFAULT_SOCKET_OPTION", "sock_opt", "setdefaulttimeout", "getdefaulttimeout",
+           "recv", "recv_line", "send"]
+
+
+class sock_opt(object):
+
+    def __init__(self, sockopt, sslopt):
+        if sockopt is None:
+            sockopt = []
+        if sslopt is None:
+            sslopt = {}
+        self.sockopt = sockopt
+        self.sslopt = sslopt
+        self.timeout = None
+
+
+def setdefaulttimeout(timeout):
+    """
+    Set the global timeout setting to connect.
+
+    timeout: default socket timeout time. This value is second.
+    """
+    global _default_timeout
+    _default_timeout = timeout
+
+
+def getdefaulttimeout():
+    """
+    Return the global timeout setting(second) to connect.
+    """
+    return _default_timeout
+
+
+def recv(sock, bufsize):
+    if not sock:
+        raise WebSocketConnectionClosedException("socket is already closed.")
+
+    try:
+        bytes_ = sock.recv(bufsize)
+    except socket.timeout as e:
+        message = extract_err_message(e)
+        raise WebSocketTimeoutException(message)
+    except SSLError as e:
+        message = extract_err_message(e)
+        if message == "The read operation timed out":
+            raise WebSocketTimeoutException(message)
+        else:
+            raise
+
+    if not bytes_:
+        raise WebSocketConnectionClosedException(
+            "Connection is already closed.")
+
+    return bytes_
+
+
+def recv_line(sock):
+    line = []
+    while True:
+        c = recv(sock, 1)
+        line.append(c)
+        if c == six.b("\n"):
+            break
+    return six.b("").join(line)
+
+
+def send(sock, data):
+    if isinstance(data, six.text_type):
+        data = data.encode('utf-8')
+
+    if not sock:
+        raise WebSocketConnectionClosedException("socket is already closed.")
+
+    try:
+        return sock.send(data)
+    except socket.timeout as e:
+        message = extract_err_message(e)
+        raise WebSocketTimeoutException(message)
+    except Exception as e:
+        message = extract_err_message(e)
+        if isinstance(message, str) and "timed out" in message:
+            raise WebSocketTimeoutException(message)
+        else:
+            raise
diff --git a/libs/websocket/_ssl_compat.py b/libs/websocket/_ssl_compat.py
new file mode 100644
index 000000000..030481628
--- /dev/null
+++ b/libs/websocket/_ssl_compat.py
@@ -0,0 +1,44 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1335  USA
+
+"""
+__all__ = ["HAVE_SSL", "ssl", "SSLError"]
+
+try:
+    import ssl
+    from ssl import SSLError
+    if hasattr(ssl, 'SSLContext') and hasattr(ssl.SSLContext, 'check_hostname'):
+        HAVE_CONTEXT_CHECK_HOSTNAME = True
+    else:
+        HAVE_CONTEXT_CHECK_HOSTNAME = False
+        if hasattr(ssl, "match_hostname"):
+            from ssl import match_hostname
+        else:
+            from backports.ssl_match_hostname import match_hostname
+        __all__.append("match_hostname")
+    __all__.append("HAVE_CONTEXT_CHECK_HOSTNAME")
+
+    HAVE_SSL = True
+except ImportError:
+    # dummy class of SSLError for ssl none-support environment.
+    class SSLError(Exception):
+        pass
+
+    HAVE_SSL = False
diff --git a/libs/websocket/_url.py b/libs/websocket/_url.py
new file mode 100644
index 000000000..f7bdf3467
--- /dev/null
+++ b/libs/websocket/_url.py
@@ -0,0 +1,160 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA  02110-1335  USA
+
+"""
+
+import os
+import socket
+import struct
+
+from six.moves.urllib.parse import urlparse
+
+
+__all__ = ["parse_url", "get_proxy_info"]
+
+
+def parse_url(url):
+    """
+    parse url and the result is tuple of
+    (hostname, port, resource path and the flag of secure mode)
+
+    url: url string.
+    """
+    if ":" not in url:
+        raise ValueError("url is invalid")
+
+    scheme, url = url.split(":", 1)
+
+    parsed = urlparse(url, scheme="ws")
+    if parsed.hostname:
+        hostname = parsed.hostname
+    else:
+        raise ValueError("hostname is invalid")
+    port = 0
+    if parsed.port:
+        port = parsed.port
+
+    is_secure = False
+    if scheme == "ws":
+        if not port:
+            port = 80
+    elif scheme == "wss":
+        is_secure = True
+        if not port:
+            port = 443
+    else:
+        raise ValueError("scheme %s is invalid" % scheme)
+
+    if parsed.path:
+        resource = parsed.path
+    else:
+        resource = "/"
+
+    if parsed.query:
+        resource += "?" + parsed.query
+
+    return hostname, port, resource, is_secure
+
+
+DEFAULT_NO_PROXY_HOST = ["localhost", "127.0.0.1"]
+
+
+def _is_ip_address(addr):
+    try:
+        socket.inet_aton(addr)
+    except socket.error:
+        return False
+    else:
+        return True
+
+
+def _is_subnet_address(hostname):
+    try:
+        addr, netmask = hostname.split("/")
+        return _is_ip_address(addr) and 0 <= int(netmask) < 32
+    except ValueError:
+        return False
+
+
+def _is_address_in_network(ip, net):
+    ipaddr = struct.unpack('I', socket.inet_aton(ip))[0]
+    netaddr, bits = net.split('/')
+    netmask = struct.unpack('I', socket.inet_aton(netaddr))[0] & ((2 << int(bits) - 1) - 1)
+    return ipaddr & netmask == netmask
+
+
+def _is_no_proxy_host(hostname, no_proxy):
+    if not no_proxy:
+        v = os.environ.get("no_proxy", "").replace(" ", "")
+        no_proxy = v.split(",")
+    if not no_proxy:
+        no_proxy = DEFAULT_NO_PROXY_HOST
+
+    if hostname in no_proxy:
+        return True
+    elif _is_ip_address(hostname):
+        return any([_is_address_in_network(hostname, subnet) for subnet in no_proxy if _is_subnet_address(subnet)])
+
+    return False
+
+
+def get_proxy_info(
+        hostname, is_secure, proxy_host=None, proxy_port=0, proxy_auth=None,
+        no_proxy=None):
+    """
+    try to retrieve proxy host and port from environment
+    if not provided in options.
+    result is (proxy_host, proxy_port, proxy_auth).
+    proxy_auth is tuple of username and password
+     of proxy authentication information.
+
+    hostname: websocket server name.
+
+    is_secure:  is the connection secure? (wss)
+                looks for "https_proxy" in env
+                before falling back to "http_proxy"
+
+    options:    "http_proxy_host" - http proxy host name.
+                "http_proxy_port" - http proxy port.
+                "http_no_proxy"   - host names, which doesn't use proxy.
+                "http_proxy_auth" - http proxy auth information.
+                                    tuple of username and password.
+                                    default is None
+    """
+    if _is_no_proxy_host(hostname, no_proxy):
+        return None, 0, None
+
+    if proxy_host:
+        port = proxy_port
+        auth = proxy_auth
+        return proxy_host, port, auth
+
+    env_keys = ["http_proxy"]
+    if is_secure:
+        env_keys.insert(0, "https_proxy")
+
+    for key in env_keys:
+        value = os.environ.get(key, None)
+        if value:
+            proxy = urlparse(value)
+            auth = (proxy.username, proxy.password) if proxy.username else None
+            return proxy.hostname, proxy.port, auth
+
+    return None, 0, None
diff --git a/libs/websocket/_utils.py b/libs/websocket/_utils.py
new file mode 100644
index 000000000..399fb89d9
--- /dev/null
+++ b/libs/websocket/_utils.py
@@ -0,0 +1,105 @@
+"""
+websocket - WebSocket client library for Python
+
+Copyright (C) 2010 Hiroki Ohtani(liris)
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Lesser General Public
+    License as published by the Free Software Foundation; either
+    version 2.1 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Lesser General Public License for more details.
+
+    You should have received a copy of the GNU Lesser General Public
+    License along with this library; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin Street, Fifth Floor,
+    Boston, MA 02110-1335  USA
+
+"""
+import six
+
+__all__ = ["NoLock", "validate_utf8", "extract_err_message"]
+
+
+class NoLock(object):
+
+    def __enter__(self):
+        pass
+
+    def __exit__(self, exc_type, exc_value, traceback):
+        pass
+
+try:
+    # If wsaccel is available we use compiled routines to validate UTF-8
+    # strings.
+    from wsaccel.utf8validator import Utf8Validator
+
+    def _validate_utf8(utfbytes):
+        return Utf8Validator().validate(utfbytes)[0]
+
+except ImportError:
+    # UTF-8 validator
+    # python implementation of http://bjoern.hoehrmann.de/utf-8/decoder/dfa/
+
+    _UTF8_ACCEPT = 0
+    _UTF8_REJECT = 12
+
+    _UTF8D = [
+        # The first part of the table maps bytes to character classes that
+        # to reduce the size of the transition table and create bitmasks.
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+        0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,  0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+        1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
+        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
+        8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,  2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+        10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8,
+
+        # The second part is a transition table that maps a combination
+        # of a state of the automaton and a character class to a state.
+        0,12,24,36,60,96,84,12,12,12,48,72, 12,12,12,12,12,12,12,12,12,12,12,12,
+        12, 0,12,12,12,12,12, 0,12, 0,12,12, 12,24,12,12,12,12,12,24,12,24,12,12,
+        12,12,12,12,12,12,12,24,12,12,12,12, 12,24,12,12,12,12,12,12,12,24,12,12,
+        12,12,12,12,12,12,12,36,12,36,12,12, 12,36,12,12,12,12,12,36,12,36,12,12,
+        12,36,12,12,12,12,12,12,12,12,12,12, ]
+
+    def _decode(state, codep, ch):
+        tp = _UTF8D[ch]
+
+        codep = (ch & 0x3f) | (codep << 6) if (
+            state != _UTF8_ACCEPT) else (0xff >> tp) & ch
+        state = _UTF8D[256 + state + tp]
+
+        return state, codep
+
+    def _validate_utf8(utfbytes):
+        state = _UTF8_ACCEPT
+        codep = 0
+        for i in utfbytes:
+            if six.PY2:
+                i = ord(i)
+            state, codep = _decode(state, codep, i)
+            if state == _UTF8_REJECT:
+                return False
+
+        return True
+
+
+def validate_utf8(utfbytes):
+    """
+    validate utf8 byte string.
+    utfbytes: utf byte string to check.
+    return value: if valid utf8 string, return true. Otherwise, return false.
+    """
+    return _validate_utf8(utfbytes)
+
+
+def extract_err_message(exception):
+    if exception.args:
+        return exception.args[0]
+    else:
+        return None
diff --git a/libs/websocket/cacert.pem b/libs/websocket/cacert.pem
new file mode 100644
index 000000000..e908bb6a1
--- /dev/null
+++ b/libs/websocket/cacert.pem
@@ -0,0 +1,4966 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Issuer: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Subject: CN=GTE CyberTrust Global Root O=GTE Corporation OU=GTE CyberTrust Solutions, Inc.
+# Label: "GTE CyberTrust Global Root"
+# Serial: 421
+# MD5 Fingerprint: ca:3d:d3:68:f1:03:5c:d0:32:fa:b8:2b:59:e8:5a:db
+# SHA1 Fingerprint: 97:81:79:50:d8:1c:96:70:cc:34:d8:09:cf:79:44:31:36:7e:f4:74
+# SHA256 Fingerprint: a5:31:25:18:8d:21:10:aa:96:4b:02:c7:b7:c6:da:32:03:17:08:94:e5:fb:71:ff:fb:66:67:d5:e6:81:0a:36
+-----BEGIN CERTIFICATE-----
+MIICWjCCAcMCAgGlMA0GCSqGSIb3DQEBBAUAMHUxCzAJBgNVBAYTAlVTMRgwFgYD
+VQQKEw9HVEUgQ29ycG9yYXRpb24xJzAlBgNVBAsTHkdURSBDeWJlclRydXN0IFNv
+bHV0aW9ucywgSW5jLjEjMCEGA1UEAxMaR1RFIEN5YmVyVHJ1c3QgR2xvYmFsIFJv
+b3QwHhcNOTgwODEzMDAyOTAwWhcNMTgwODEzMjM1OTAwWjB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCVD6C28FCc6HrH
+iM3dFw4usJTQGz0O9pTAipTHBsiQl8i4ZBp6fmw8U+E3KHNgf7KXUwefU/ltWJTS
+r41tiGeA5u2ylc9yMcqlHHK6XALnZELn+aks1joNrI1CqiQBOeacPwGFVw1Yh0X4
+04Wqk2kmhXBIgD8SFcd5tB8FLztimQIDAQABMA0GCSqGSIb3DQEBBAUAA4GBAG3r
+GwnpXtlR22ciYaQqPEh346B8pt5zohQDhT37qw4wxYMWM4ETCJ57NE7fQMh017l9
+3PR2VX2bY1QY6fDq81yx2YtCHrnAlU66+tXifPVoYb+O7AWXX1uw16OFNMQkpw0P
+lZPvy5TYnh+dXIVtx6quTx8itc2VrbqnzPmrC3p/
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Server CA"
+# Serial: 1
+# MD5 Fingerprint: c5:70:c4:a2:ed:53:78:0c:c8:10:53:81:64:cb:d0:1d
+# SHA1 Fingerprint: 23:e5:94:94:51:95:f2:41:48:03:b4:d5:64:d2:a3:a3:f5:d8:8b:8c
+# SHA256 Fingerprint: b4:41:0b:73:e2:e6:ea:ca:47:fb:c4:2f:8f:a4:01:8a:f4:38:1d:c5:4c:fa:a8:44:50:46:1e:ed:09:45:4d:e9
+-----BEGIN CERTIFICATE-----
+MIIDEzCCAnygAwIBAgIBATANBgkqhkiG9w0BAQQFADCBxDELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEm
+MCQGCSqGSIb3DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wHhcNOTYwODAx
+MDAwMDAwWhcNMjAxMjMxMjM1OTU5WjCBxDELMAkGA1UEBhMCWkExFTATBgNVBAgT
+DFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYDVQQKExRUaGF3
+dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNl
+cyBEaXZpc2lvbjEZMBcGA1UEAxMQVGhhd3RlIFNlcnZlciBDQTEmMCQGCSqGSIb3
+DQEJARYXc2VydmVyLWNlcnRzQHRoYXd0ZS5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
+gY0AMIGJAoGBANOkUG7I/1Zr5s9dtuoMaHVHoqrC2oQl/Kj0R1HahbUgdJSGHg91
+yekIYfUGbTBuFRkC6VLAYttNmZ7iagxEOM3+vuNkCXDF/rFrKbYvScg71CcEJRCX
+L+eQbcAoQpnXTEPew/UhbVSfXcNY4cDk2VuwuNy0e982OsK1ZiIS1ocNAgMBAAGj
+EzARMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEEBQADgYEAB/pMaVz7lcxG
+7oWDTSEwjsrZqG9JGubaUeNgcGyEYRGhGshIPllDfU+VPaGLtwtimHp1it2ITk6e
+QNuozDJ0uW8NxuOzRAvZim+aKZuZGCg70eNAKJpaPNW15yAbi8qkq43pUdniTCxZ
+qdq5snUb9kLy78fyGPmJvKP/iiMucEc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Subject: CN=Thawte Premium Server CA O=Thawte Consulting cc OU=Certification Services Division
+# Label: "Thawte Premium Server CA"
+# Serial: 1
+# MD5 Fingerprint: 06:9f:69:79:16:66:90:02:1b:8c:8c:a2:c3:07:6f:3a
+# SHA1 Fingerprint: 62:7f:8d:78:27:65:63:99:d2:7d:7f:90:44:c9:fe:b3:f3:3e:fa:9a
+# SHA256 Fingerprint: ab:70:36:36:5c:71:54:aa:29:c2:c2:9f:5d:41:91:16:3b:16:2a:22:25:01:13:57:d5:6d:07:ff:a7:bc:1f:72
+-----BEGIN CERTIFICATE-----
+MIIDJzCCApCgAwIBAgIBATANBgkqhkiG9w0BAQQFADCBzjELMAkGA1UEBhMCWkEx
+FTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJQ2FwZSBUb3duMR0wGwYD
+VQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UECxMfQ2VydGlmaWNhdGlv
+biBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhhd3RlIFByZW1pdW0gU2Vy
+dmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNlcnZlckB0aGF3dGUuY29t
+MB4XDTk2MDgwMTAwMDAwMFoXDTIwMTIzMTIzNTk1OVowgc4xCzAJBgNVBAYTAlpB
+MRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcTCUNhcGUgVG93bjEdMBsG
+A1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNVBAsTH0NlcnRpZmljYXRp
+b24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRoYXd0ZSBQcmVtaXVtIFNl
+cnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1zZXJ2ZXJAdGhhd3RlLmNv
+bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2aovXwlue2oFBYo847kkE
+VdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560ZXUCTe/LCaIhUdib0GfQ
+ug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j+ao6hnO2RlNYyIkFvYMR
+uHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
+9w0BAQQFAAOBgQAmSCwWwlj66BZ0DKqqX1Q/8tfJeGBeXm43YyJ3Nn6yF8Q0ufUI
+hfzJATj/Tb7yFkJD57taRvvBxhEf8UqwKEbJw8RCfbz6q1lu1bdRiBHjpIUZa4JM
+pAwSremkrj/xw0llmozFyD4lt5SZu5IycQfwhl7tUCemDaYj+bvLpgcUQg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Equifax OU=Equifax Secure Certificate Authority
+# Subject: O=Equifax OU=Equifax Secure Certificate Authority
+# Label: "Equifax Secure CA"
+# Serial: 903804111
+# MD5 Fingerprint: 67:cb:9d:c0:13:24:8a:82:9b:b2:17:1e:d1:1b:ec:d4
+# SHA1 Fingerprint: d2:32:09:ad:23:d3:14:23:21:74:e4:0d:7f:9d:62:13:97:86:63:3a
+# SHA256 Fingerprint: 08:29:7a:40:47:db:a2:36:80:c7:31:db:6e:31:76:53:ca:78:48:e1:be:bd:3a:0b:01:79:a7:07:f9:2c:f1:78
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJV
+UzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2Vy
+dGlmaWNhdGUgQXV0aG9yaXR5MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1
+MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoTB0VxdWlmYXgxLTArBgNVBAsTJEVx
+dWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCBnzANBgkqhkiG9w0B
+AQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPRfM6f
+BeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+A
+cJkVV5MW8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kC
+AwEAAaOCAQkwggEFMHAGA1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQ
+MA4GA1UEChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlm
+aWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoGA1UdEAQTMBGBDzIwMTgw
+ODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvSspXXR9gj
+IBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQF
+MAMBAf8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUA
+A4GBAFjOKer89961zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y
+7qj/WsjTVbJmcVfewCHrPSqnI0kBBIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh
+1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee9570+sB3c4
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 149843929435818692848040365716851702463
+# MD5 Fingerprint: 10:fc:63:5d:f6:26:3e:0d:f3:25:be:5f:79:cd:67:67
+# SHA1 Fingerprint: 74:2c:31:92:e6:07:e4:24:eb:45:49:54:2b:e1:bb:c5:3e:61:74:e2
+# SHA256 Fingerprint: e7:68:56:34:ef:ac:f6:9a:ce:93:9a:6b:25:5b:7b:4f:ab:ef:42:93:5b:50:a2:65:ac:b5:cb:60:27:e4:4e:70
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEHC65B0Q2Sk0tjjKewPMur8wDQYJKoZIhvcNAQECBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMTIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBAgUAA4GBALtMEivPLCYATxQT3ab7/AoRhIzzKBxnki98tsX63/Do
+lbwdj2wsqFHMc9ikwFPwTtYmwHYBV4GSXiHx0bH/59AhWM1pF+NEHJwZRDmJXNyc
+AA9WjQKZ7aKQRUzkuxCkPfAyAw7xzvjoyVGM5mKf5p/AfbdynMk2OmufTqj/ZA1k
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority - G2/(c) 1998 VeriSign, Inc. - For authorized use only/VeriSign Trust Network
+# Label: "Verisign Class 3 Public Primary Certification Authority - G2"
+# Serial: 167285380242319648451154478808036881606
+# MD5 Fingerprint: a2:33:9b:4c:74:78:73:d4:6c:e7:c1:f3:8d:cb:5c:e9
+# SHA1 Fingerprint: 85:37:1c:a6:e5:50:14:3d:ce:28:03:47:1b:de:3a:09:e8:f8:77:0f
+# SHA256 Fingerprint: 83:ce:3c:12:29:68:8a:59:3d:48:5f:81:97:3c:0f:91:95:43:1e:da:37:cc:5e:36:43:0e:79:c7:a8:88:63:8b
+-----BEGIN CERTIFICATE-----
+MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
+BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
+c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
+MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
+emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
+DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
+FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
+UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
+YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
+MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
+AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
+pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
+13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
+AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
+U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
+F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
+oJ2daZH9
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Subject: CN=GlobalSign Root CA O=GlobalSign nv-sa OU=Root CA
+# Label: "GlobalSign Root CA"
+# Serial: 4835703278459707669005204
+# MD5 Fingerprint: 3e:45:52:15:09:51:92:e1:b7:5d:37:9f:b1:87:29:8a
+# SHA1 Fingerprint: b1:bc:96:8b:d4:f4:9d:62:2a:a8:9a:81:f2:15:01:52:a4:1d:82:9c
+# SHA256 Fingerprint: eb:d4:10:40:e4:bb:3e:c7:42:c9:e3:81:d3:1e:f2:a4:1a:48:b6:68:5c:96:e7:ce:f3:c1:df:6c:d4:33:1c:99
+-----BEGIN CERTIFICATE-----
+MIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZIhvcNAQEFBQAwVzELMAkG
+A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv
+b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05ODA5MDExMjAw
+MDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i
+YWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQDExJHbG9iYWxT
+aWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDaDuaZ
+jc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzdzxtIK+6NiY6arymAZavp
+xy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS8pF94G3VNTCOXkNz8kHp
+1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUSPJJ4ltbcdG6TRGHRjcdG
+snUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7weNLWLBYy5d4ux2x8gkasJ
+U26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrXgzT/LCrBbBlDSgeF59N8
+9iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo//z9SzANBgkqhkiG9w0B
+AQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwrvQmeU79rXqoRSLblCKOz
+yj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQVvnGCv04zcQLcFGUl5gE
+38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzfvGn9LhJIZJrglfCm7ymP
+AbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4qxFYxldBniYUr+WymXUad
+DKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr6cf9tveCX4XSQRjbgbME
+HMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R2
+# Label: "GlobalSign Root CA - R2"
+# Serial: 4835703278459682885658125
+# MD5 Fingerprint: 94:14:77:7e:3e:5e:fd:8f:30:bd:41:b0:cf:e7:d0:30
+# SHA1 Fingerprint: 75:e0:ab:b6:13:85:12:27:1c:04:f8:5f:dd:de:38:e4:b7:24:2e:fe
+# SHA256 Fingerprint: ca:42:dd:41:74:5f:d0:b8:1e:b9:02:36:2c:f9:d8:bf:71:9d:a1:bd:1b:1e:fc:94:6f:5b:4c:99:f4:2c:1b:9e
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgILBAAAAAABD4Ym5g0wDQYJKoZIhvcNAQEFBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjIxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDYxMjE1MDgwMDAwWhcNMjExMjE1
+MDgwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMjETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAKbPJA6+Lm8omUVCxKs+IVSbC9N/hHD6ErPL
+v4dfxn+G07IwXNb9rfF73OX4YJYJkhD10FPe+3t+c4isUoh7SqbKSaZeqKeMWhG8
+eoLrvozps6yWJQeXSpkqBy+0Hne/ig+1AnwblrjFuTosvNYSuetZfeLQBoZfXklq
+tTleiDTsvHgMCJiEbKjNS7SgfQx5TfC4LcshytVsW33hoCmEofnTlEnLJGKRILzd
+C9XZzPnqJworc5HGnRusyMvo4KD0L5CLTfuwNhv2GXqF4G3yYROIXJ/gkwpRl4pa
+zq+r1feqCapgvdzZX99yqWATXgAByUr6P6TqBwMhAo6CygPCm48CAwEAAaOBnDCB
+mTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUm+IH
+V2ccHsBqBt5ZtJot39wZhi4wNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovL2NybC5n
+bG9iYWxzaWduLm5ldC9yb290LXIyLmNybDAfBgNVHSMEGDAWgBSb4gdXZxwewGoG
+3lm0mi3f3BmGLjANBgkqhkiG9w0BAQUFAAOCAQEAmYFThxxol4aR7OBKuEQLq4Gs
+J0/WwbgcQ3izDJr86iw8bmEbTUsp9Z8FHSbBuOmDAGJFtqkIk7mpM0sYmsL4h4hO
+291xNBrBVNpGP+DTKqttVCL1OmLNIG+6KYnX3ZHu01yiPqFbQfXf5WRDLenVOavS
+ot+3i9DAgBkcRcAtjOj4LaR0VknFBbVPFd5uRHg5h6h+u/N5GJG79G+dwfCMNYxd
+AfvDbbnvRG15RjF+Cv6pgsH/76tuIMRQyV+dTZsXjAzlAcmgQWpzU/qlULRuJQ/7
+TBj0/VLZjmmx6BEP3ojY+x1J96relc8geMJgEtslQIxq/H5COEBkEveegeGTLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 1 Policy Validation Authority
+# Label: "ValiCert Class 1 VA"
+# Serial: 1
+# MD5 Fingerprint: 65:58:ab:15:ad:57:6c:1e:a8:a7:b5:69:ac:bf:ff:eb
+# SHA1 Fingerprint: e5:df:74:3c:b6:01:c4:9b:98:43:dc:ab:8c:e8:6a:81:10:9f:e4:8e
+# SHA256 Fingerprint: f4:c1:49:55:1a:30:13:a3:5b:c7:bf:fe:17:a7:f3:44:9b:c1:ab:5b:5a:0a:e7:4b:06:c2:3b:90:00:4c:01:04
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNTIyMjM0OFoXDTE5MDYy
+NTIyMjM0OFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDEgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDYWYJ6ibiWuqYvaG9Y
+LqdUHAZu9OqNSLwxlBfw8068srg1knaw0KWlAdcAAxIiGQj4/xEjm84H9b9pGib+
+TunRf50sQB1ZaG6m+FiwnRqP0z/x3BkGgagO4DrdyFNFCQbmD3DD+kCmDuJWBQ8Y
+TfwggtFzVXSNdnKgHZ0dwN0/cQIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFBoPUn0
+LBwGlN+VYH+Wexf+T3GtZMjdd9LvWVXoP+iOBSoh8gfStadS/pyxtuJbdxdA6nLW
+I8sogTLDAHkY7FkXicnGah5xyf23dKUlRWnFSKsZ4UWKJWsZ7uW7EvV/96aNUcPw
+nXS3qT6gpf+2SQMT2iLM7XGCK5nPOrf1LXLI
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 2 Policy Validation Authority
+# Label: "ValiCert Class 2 VA"
+# Serial: 1
+# MD5 Fingerprint: a9:23:75:9b:ba:49:36:6e:31:c2:db:f2:e7:66:ba:87
+# SHA1 Fingerprint: 31:7a:2a:d0:7f:2b:33:5e:f5:a1:c3:4e:4b:57:e8:b7:d8:f1:fc:a6
+# SHA256 Fingerprint: 58:d0:17:27:9c:d4:dc:63:ab:dd:b1:96:a6:c9:90:6c:30:c4:e0:87:83:ea:e8:c1:60:99:54:d6:93:55:59:6b
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMTk1NFoXDTE5MDYy
+NjAwMTk1NFowgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDIgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOOnHK5avIWZJV16vY
+dA757tn2VUdZZUcOBVXc65g2PFxTXdMwzzjsvUGJ7SVCCSRrCl6zfN1SLUzm1NZ9
+WlmpZdRJEy0kTRxQb7XBhVQ7/nHk01xC+YDgkRoKWzk2Z/M/VXwbP7RfZHM047QS
+v4dk+NoS/zcnwbNDu+97bi5p9wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBADt/UG9v
+UJSZSWI4OB9L+KXIPqeCgfYrx+jFzug6EILLGACOTb2oWH+heQC1u+mNr0HZDzTu
+IYEZoDJJKPTEjlbVUjP9UNV+mWwD5MlM/Mtsq2azSiGM5bUMMj4QssxsodyamEwC
+W/POuZ6lcg5Ktz885hZo+L7tdEy8W9ViH0Pd
+-----END CERTIFICATE-----
+
+# Issuer: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Subject: CN=http://www.valicert.com/ O=ValiCert, Inc. OU=ValiCert Class 3 Policy Validation Authority
+# Label: "RSA Root Certificate 1"
+# Serial: 1
+# MD5 Fingerprint: a2:6f:53:b7:ee:40:db:4a:68:e7:fa:18:d9:10:4b:72
+# SHA1 Fingerprint: 69:bd:8c:f4:9c:d3:00:fb:59:2e:17:93:ca:55:6a:f3:ec:aa:35:fb
+# SHA256 Fingerprint: bc:23:f9:8a:31:3c:b9:2d:e3:bb:fc:3a:5a:9f:44:61:ac:39:49:4c:4a:e1:5a:9e:9d:f1:31:e9:9b:73:01:9a
+-----BEGIN CERTIFICATE-----
+MIIC5zCCAlACAQEwDQYJKoZIhvcNAQEFBQAwgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0
+IFZhbGlkYXRpb24gTmV0d29yazEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAz
+BgNVBAsTLFZhbGlDZXJ0IENsYXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9y
+aXR5MSEwHwYDVQQDExhodHRwOi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG
+9w0BCQEWEWluZm9AdmFsaWNlcnQuY29tMB4XDTk5MDYyNjAwMjIzM1oXDTE5MDYy
+NjAwMjIzM1owgbsxJDAiBgNVBAcTG1ZhbGlDZXJ0IFZhbGlkYXRpb24gTmV0d29y
+azEXMBUGA1UEChMOVmFsaUNlcnQsIEluYy4xNTAzBgNVBAsTLFZhbGlDZXJ0IENs
+YXNzIDMgUG9saWN5IFZhbGlkYXRpb24gQXV0aG9yaXR5MSEwHwYDVQQDExhodHRw
+Oi8vd3d3LnZhbGljZXJ0LmNvbS8xIDAeBgkqhkiG9w0BCQEWEWluZm9AdmFsaWNl
+cnQuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDjmFGWHOjVsQaBalfD
+cnWTq8+epvzzFlLWLU2fNUSoLgRNB0mKOCn1dzfnt6td3zZxFJmP3MKS8edgkpfs
+2Ejcv8ECIMYkpChMMFp2bbFc893enhBxoYjHW5tBbcqwuI4V7q0zK89HBFx1cQqY
+JJgpp0lZpd34t0NiYfPT4tBVPwIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAFa7AliE
+Zwgs3x/be0kz9dNnnfS0ChCzycUs4pJqcXgn8nCDQtM+z6lU9PHYkhaM0QTLS6vJ
+n0WuPIqpsHEzXcjFV9+vqDWzf4mH6eglkrh/hXqu1rweN1gqZ8mRzyqBPu3GOd/A
+PhmcGcwTTYJBtYze4D1gCCAPRX5ron+jjBXu
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 3 Public Primary Certification Authority - G3"
+# Serial: 206684696279472310254277870180966723415
+# MD5 Fingerprint: cd:68:b6:a7:c7:c4:ce:75:e0:1d:4f:57:44:61:92:09
+# SHA1 Fingerprint: 13:2d:0d:45:53:4b:69:97:cd:b2:d5:c3:39:e2:55:76:60:9b:5c:c6
+# SHA256 Fingerprint: eb:04:cf:5e:b1:f3:9a:fa:76:2f:2b:b1:20:f2:96:cb:a5:20:c1:b9:7d:b1:58:95:65:b8:1c:b9:a1:7b:72:44
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQCbfgZJoz5iudXukEhxKe9XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMu6nFL8eB8aHm8b
+N3O9+MlrlBIwT/A2R/XQkQr1F8ilYcEWQE37imGQ5XYgwREGfassbqb1EUGO+i2t
+KmFZpGcmTNDovFJbcCAEWNF6yaRpvIMXZK0Fi7zQWM6NjPXr8EJJC52XJ2cybuGu
+kxUccLwgTS8Y3pKI6GyFVxEa6X7jJhFUokWWVYPKMIno3Nij7SqAP395ZVc+FSBm
+CC+Vk7+qRy+oRpfwEuL+wgorUeZ25rdGt+INpsyow0xZVYnm6FNcHOqd8GIWC6fJ
+Xwzw3sJ2zq/3avL6QaaiMxTJ5Xpj055iN9WFZZ4O5lMkdBteHRJTW8cs54NJOxWu
+imi5V5cCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAERSWwauSCPc/L8my/uRan2Te
+2yFPhpk0djZX3dAVL8WtfxUfN2JzPtTnX84XA9s1+ivbrmAJXx5fj267Cz3qWhMe
+DGBvtcC1IyIuBwvLqXTLR7sdwdela8wv0kL9Sd2nic9TutoAWii/gt/4uhMdUIaC
+/Y4wjylGsB49Ndo4YhYYSq3mtlFs3q9i6wHQHiT+eo8SGhJouPtmmRQURVyu565p
+F4ErWjfJXir0xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGt
+TxzhT5yvDwyd93gN2PQ1VoDat20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 4 Public Primary Certification Authority - G3 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 1999 VeriSign, Inc. - For authorized use only
+# Label: "Verisign Class 4 Public Primary Certification Authority - G3"
+# Serial: 314531972711909413743075096039378935511
+# MD5 Fingerprint: db:c8:f2:27:2e:b1:ea:6a:29:23:5d:fe:56:3e:33:df
+# SHA1 Fingerprint: c8:ec:8c:87:92:69:cb:4b:ab:39:e9:8d:7e:57:67:f3:14:95:73:9d
+# SHA256 Fingerprint: e3:89:36:0d:0f:db:ae:b3:d2:50:58:4b:47:30:31:4e:22:2f:39:c1:56:a0:20:14:4e:8d:96:05:61:79:15:06
+-----BEGIN CERTIFICATE-----
+MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQsw
+CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZl
+cmlTaWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWdu
+LCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlT
+aWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3Jp
+dHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQswCQYD
+VQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
+aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJ
+bmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWdu
+IENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAK3LpRFpxlmr8Y+1
+GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaStBO3IFsJ
++mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0Gbd
+U6LM8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLm
+NxdLMEYH5IBtptiWLugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XY
+ufTsgsbSPZUd5cBPhMnZo0QoBmrXRazwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/
+ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEAj/ola09b5KROJ1WrIhVZPMq1
+CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXttmhwwjIDLk5Mq
+g6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
+fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c
+2NU8Qh0XwRJdRTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/
+bLvSHgCwIe34QWKCudiyxLtGUPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Secure Server Certification Authority O=Entrust.net OU=www.entrust.net/CPS incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Secure Server CA"
+# Serial: 927650371
+# MD5 Fingerprint: df:f2:80:73:cc:f1:e6:61:73:fc:f5:42:e9:c5:7c:ee
+# SHA1 Fingerprint: 99:a6:9b:e6:1a:fe:88:6b:4d:2b:82:00:7c:b8:54:fc:31:7e:15:39
+# SHA256 Fingerprint: 62:f2:40:27:8c:56:4c:4d:d8:bf:7d:9d:4f:6f:36:6e:a8:94:d2:2f:5f:34:d9:89:a9:83:ac:ec:2f:ff:ed:50
+-----BEGIN CERTIFICATE-----
+MIIE2DCCBEGgAwIBAgIEN0rSQzANBgkqhkiG9w0BAQUFADCBwzELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC0VudHJ1c3QubmV0MTswOQYDVQQLEzJ3d3cuZW50cnVzdC5u
+ZXQvQ1BTIGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxpYWIuKTElMCMGA1UECxMc
+KGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDE6MDgGA1UEAxMxRW50cnVzdC5u
+ZXQgU2VjdXJlIFNlcnZlciBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw05OTA1
+MjUxNjA5NDBaFw0xOTA1MjUxNjM5NDBaMIHDMQswCQYDVQQGEwJVUzEUMBIGA1UE
+ChMLRW50cnVzdC5uZXQxOzA5BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5j
+b3JwLiBieSByZWYuIChsaW1pdHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBF
+bnRydXN0Lm5ldCBMaW1pdGVkMTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUg
+U2VydmVyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGdMA0GCSqGSIb3DQEBAQUA
+A4GLADCBhwKBgQDNKIM0VBuJ8w+vN5Ex/68xYMmo6LIQaO2f55M28Qpku0f1BBc/
+I0dNxScZgSYMVHINiC3ZH5oSn7yzcdOAGT9HZnuMNSjSuQrfJNqc1lB5gXpa0zf3
+wkrYKZImZNHkmGw6AIr1NJtl+O3jEP/9uElY3KDegjlrgbEWGWG5VLbmQwIBA6OC
+AdcwggHTMBEGCWCGSAGG+EIBAQQEAwIABzCCARkGA1UdHwSCARAwggEMMIHeoIHb
+oIHYpIHVMIHSMQswCQYDVQQGEwJVUzEUMBIGA1UEChMLRW50cnVzdC5uZXQxOzA5
+BgNVBAsTMnd3dy5lbnRydXN0Lm5ldC9DUFMgaW5jb3JwLiBieSByZWYuIChsaW1p
+dHMgbGlhYi4pMSUwIwYDVQQLExwoYykgMTk5OSBFbnRydXN0Lm5ldCBMaW1pdGVk
+MTowOAYDVQQDEzFFbnRydXN0Lm5ldCBTZWN1cmUgU2VydmVyIENlcnRpZmljYXRp
+b24gQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMCmgJ6AlhiNodHRwOi8vd3d3LmVu
+dHJ1c3QubmV0L0NSTC9uZXQxLmNybDArBgNVHRAEJDAigA8xOTk5MDUyNTE2MDk0
+MFqBDzIwMTkwNTI1MTYwOTQwWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAU8Bdi
+E1U9s/8KAGv7UISX8+1i0BowHQYDVR0OBBYEFPAXYhNVPbP/CgBr+1CEl/PtYtAa
+MAwGA1UdEwQFMAMBAf8wGQYJKoZIhvZ9B0EABAwwChsEVjQuMAMCBJAwDQYJKoZI
+hvcNAQEFBQADgYEAkNwwAvpkdMKnCqV8IY00F6j7Rw7/JXyNEwr75Ji174z4xRAN
+95K+8cPV1ZVqBLssziY2ZcgxxufuP+NXdYR6Ee9GTxj005i7qIcyunL2POI9n9cd
+2cNgQ4xYDiKWL2KjLB+6rQXvqzJ4h6BUcxm1XAX5Uj5tLUUL9wqT6u0G+bI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Subject: CN=Entrust.net Certification Authority (2048) O=Entrust.net OU=www.entrust.net/CPS_2048 incorp. by ref. (limits liab.)/(c) 1999 Entrust.net Limited
+# Label: "Entrust.net Premium 2048 Secure Server CA"
+# Serial: 946069240
+# MD5 Fingerprint: ee:29:31:bc:32:7e:9a:e6:e8:b5:f7:51:b4:34:71:90
+# SHA1 Fingerprint: 50:30:06:09:1d:97:d4:f5:ae:39:f7:cb:e7:92:7d:7d:65:2d:34:31
+# SHA256 Fingerprint: 6d:c4:71:72:e0:1c:bc:b0:bf:62:58:0d:89:5f:e2:b8:ac:9a:d4:f8:73:80:1e:0c:10:b9:c8:37:d2:1e:b1:77
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIEOGPe+DANBgkqhkiG9w0BAQUFADCBtDEUMBIGA1UEChML
+RW50cnVzdC5uZXQxQDA+BgNVBAsUN3d3dy5lbnRydXN0Lm5ldC9DUFNfMjA0OCBp
+bmNvcnAuIGJ5IHJlZi4gKGxpbWl0cyBsaWFiLikxJTAjBgNVBAsTHChjKSAxOTk5
+IEVudHJ1c3QubmV0IExpbWl0ZWQxMzAxBgNVBAMTKkVudHJ1c3QubmV0IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5ICgyMDQ4KTAeFw05OTEyMjQxNzUwNTFaFw0yOTA3
+MjQxNDE1MTJaMIG0MRQwEgYDVQQKEwtFbnRydXN0Lm5ldDFAMD4GA1UECxQ3d3d3
+LmVudHJ1c3QubmV0L0NQU18yMDQ4IGluY29ycC4gYnkgcmVmLiAobGltaXRzIGxp
+YWIuKTElMCMGA1UECxMcKGMpIDE5OTkgRW50cnVzdC5uZXQgTGltaXRlZDEzMDEG
+A1UEAxMqRW50cnVzdC5uZXQgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgKDIwNDgp
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArU1LqRKGsuqjIAcVFmQq
+K0vRvwtKTY7tgHalZ7d4QMBzQshowNtTK91euHaYNZOLGp18EzoOH1u3Hs/lJBQe
+sYGpjX24zGtLA/ECDNyrpUAkAH90lKGdCCmziAv1h3edVc3kw37XamSrhRSGlVuX
+MlBvPci6Zgzj/L24ScF2iUkZ/cCovYmjZy/Gn7xxGWC4LeksyZB2ZnuU4q941mVT
+XTzWnLLPKQP5L6RQstRIzgUyVYr9smRMDuSYB3Xbf9+5CFVghTAp+XtIpGmG4zU/
+HoZdenoVve8AjhUiVBcAkCaTvA5JaJG/+EfTnZVCwQ5N328mz8MYIWJmQ3DW1cAH
+4QIDAQABo0IwQDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNV
+HQ4EFgQUVeSB0RGAvtiJuQijMfmhJAkWuXAwDQYJKoZIhvcNAQEFBQADggEBADub
+j1abMOdTmXx6eadNl9cZlZD7Bh/KM3xGY4+WZiT6QBshJ8rmcnPyT/4xmf3IDExo
+U8aAghOY+rat2l098c5u9hURlIIM7j+VrxGrD9cv3h8Dj1csHsm7mhpElesYT6Yf
+zX1XEC+bBAlahLVu2B064dae0Wx5XnkcFMXj0EyTO2U87d89vqbllRrDtRnDvV5b
+u/8j72gZyxKTJ1wDLW8w0B62GqzeWvfRqqgnpv55gcR5mTNXuhKwqeBCbJPKVt7+
+bYQLCIt+jerXmCHG8+c8eS9enNFMFY3h7CI3zJpDC5fcgJCNs2ebb0gIFVbPv/Er
+fF6adulZkMV8gzURZVE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Subject: CN=Baltimore CyberTrust Root O=Baltimore OU=CyberTrust
+# Label: "Baltimore CyberTrust Root"
+# Serial: 33554617
+# MD5 Fingerprint: ac:b6:94:a5:9c:17:e0:d7:91:52:9b:b1:97:06:a6:e4
+# SHA1 Fingerprint: d4:de:20:d0:5e:66:fc:53:fe:1a:50:88:2c:78:db:28:52:ca:e4:74
+# SHA256 Fingerprint: 16:af:57:a9:f6:76:b0:ab:12:60:95:aa:5e:ba:de:f2:2a:b3:11:19:d6:44:ac:95:cd:4b:93:db:f3:f2:6a:eb
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIEAgAAuTANBgkqhkiG9w0BAQUFADBaMQswCQYDVQQGEwJJ
+RTESMBAGA1UEChMJQmFsdGltb3JlMRMwEQYDVQQLEwpDeWJlclRydXN0MSIwIAYD
+VQQDExlCYWx0aW1vcmUgQ3liZXJUcnVzdCBSb290MB4XDTAwMDUxMjE4NDYwMFoX
+DTI1MDUxMjIzNTkwMFowWjELMAkGA1UEBhMCSUUxEjAQBgNVBAoTCUJhbHRpbW9y
+ZTETMBEGA1UECxMKQ3liZXJUcnVzdDEiMCAGA1UEAxMZQmFsdGltb3JlIEN5YmVy
+VHJ1c3QgUm9vdDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKMEuyKr
+mD1X6CZymrV51Cni4eiVgLGw41uOKymaZN+hXe2wCQVt2yguzmKiYv60iNoS6zjr
+IZ3AQSsBUnuId9Mcj8e6uYi1agnnc+gRQKfRzMpijS3ljwumUNKoUMMo6vWrJYeK
+mpYcqWe4PwzV9/lSEy/CG9VwcPCPwBLKBsua4dnKM3p31vjsufFoREJIE9LAwqSu
+XmD+tqYF/LTdB1kC1FkYmGP1pWPgkAx9XbIGevOF6uvUA65ehD5f/xXtabz5OTZy
+dc93Uk3zyZAsuT3lySNTPx8kmCFcB5kpvcY67Oduhjprl3RjM71oGDHweI12v/ye
+jl0qhqdNkNwnGjkCAwEAAaNFMEMwHQYDVR0OBBYEFOWdWTCCR1jMrPoIVDaGezq1
+BE3wMBIGA1UdEwEB/wQIMAYBAf8CAQMwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3
+DQEBBQUAA4IBAQCFDF2O5G9RaEIFoN27TyclhAO992T9Ldcw46QQF+vaKSm2eT92
+9hkTI7gQCvlYpNRhcL0EYWoSihfVCr3FvDB81ukMJY2GQE/szKN+OMY3EU/t3Wgx
+jkzSswF07r51XgdIGn9w/xZchMB5hbgF/X++ZRGjD8ACtPhSNzkE1akxehi/oCr0
+Epn3o0WC4zxe9Z2etciefC7IpJ5OCBRLbf1wbWsaY71k5h+3zvDyny67G7fyUIhz
+ksLi4xaNmjICq44Y3ekQEe5+NauQrz4wlHrQMz2nZQ/1/I6eYs9HRCwBXbsdtTLS
+R9I4LtD+gdwyah617jzV/OeBHRnDJELqYzmp
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure Global eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure Global eBusiness CA"
+# Serial: 1
+# MD5 Fingerprint: 8f:5d:77:06:27:c4:98:3c:5b:93:78:e7:d7:7d:9b:cc
+# SHA1 Fingerprint: 7e:78:4a:10:1c:82:65:cc:2d:e1:f1:6d:47:b4:40:ca:d9:0a:19:45
+# SHA256 Fingerprint: 5f:0b:62:ea:b5:e3:53:ea:65:21:65:16:58:fb:b6:53:59:f4:43:28:0a:4a:fb:d1:04:d7:7d:10:f9:f0:4c:07
+-----BEGIN CERTIFICATE-----
+MIICkDCCAfmgAwIBAgIBATANBgkqhkiG9w0BAQQFADBaMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEtMCsGA1UEAxMkRXF1aWZheCBT
+ZWN1cmUgR2xvYmFsIGVCdXNpbmVzcyBDQS0xMB4XDTk5MDYyMTA0MDAwMFoXDTIw
+MDYyMTA0MDAwMFowWjELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0VxdWlmYXggU2Vj
+dXJlIEluYy4xLTArBgNVBAMTJEVxdWlmYXggU2VjdXJlIEdsb2JhbCBlQnVzaW5l
+c3MgQ0EtMTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAuucXkAJlsTRVPEnC
+UdXfp9E3j9HngXNBUmCbnaEXJnitx7HoJpQytd4zjTov2/KaelpzmKNc6fuKcxtc
+58O/gGzNqfTWK8D3+ZmqY6KxRwIP1ORROhI8bIpaVIRw28HFkM9yRcuoWcDNM50/
+o5brhTMhHD4ePmBudpxnhcXIw2ECAwEAAaNmMGQwEQYJYIZIAYb4QgEBBAQDAgAH
+MA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUvqigdHJQa0S3ySPY+6j/s1dr
+aGwwHQYDVR0OBBYEFL6ooHRyUGtEt8kj2Puo/7NXa2hsMA0GCSqGSIb3DQEBBAUA
+A4GBADDiAVGqx+pf2rnQZQ8w1j7aDRRJbpGTJxQx78T3LUX47Me/okENI7SS+RkA
+Z70Br83gcfxaz2TE4JaY0KNA4gGK7ycH8WUBikQtBmV1UsCGECAhX2xrD2yuCRyv
+8qIYNMR1pHMc8Y3c7635s3a0kr/clRAevsvIO1qEYBlWlKlV
+-----END CERTIFICATE-----
+
+# Issuer: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Subject: CN=Equifax Secure eBusiness CA-1 O=Equifax Secure Inc.
+# Label: "Equifax Secure eBusiness CA 1"
+# Serial: 4
+# MD5 Fingerprint: 64:9c:ef:2e:44:fc:c6:8f:52:07:d0:51:73:8f:cb:3d
+# SHA1 Fingerprint: da:40:18:8b:91:89:a3:ed:ee:ae:da:97:fe:2f:9d:f5:b7:d1:8a:41
+# SHA256 Fingerprint: cf:56:ff:46:a4:a1:86:10:9d:d9:65:84:b5:ee:b5:8a:51:0c:42:75:b0:e5:f9:4f:40:bb:ae:86:5e:19:f6:73
+-----BEGIN CERTIFICATE-----
+MIICgjCCAeugAwIBAgIBBDANBgkqhkiG9w0BAQQFADBTMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5jLjEmMCQGA1UEAxMdRXF1aWZheCBT
+ZWN1cmUgZUJ1c2luZXNzIENBLTEwHhcNOTkwNjIxMDQwMDAwWhcNMjAwNjIxMDQw
+MDAwWjBTMQswCQYDVQQGEwJVUzEcMBoGA1UEChMTRXF1aWZheCBTZWN1cmUgSW5j
+LjEmMCQGA1UEAxMdRXF1aWZheCBTZWN1cmUgZUJ1c2luZXNzIENBLTEwgZ8wDQYJ
+KoZIhvcNAQEBBQADgY0AMIGJAoGBAM4vGbwXt3fek6lfWg0XTzQaDJj0ItlZ1MRo
+RvC0NcWFAyDGr0WlIVFFQesWWDYyb+JQYmT5/VGcqiTZ9J2DKocKIdMSODRsjQBu
+WqDZQu4aIZX5UkxVWsUPOE9G+m34LjXWHXzr4vCwdYDIqROsvojvOm6rXyo4YgKw
+Env+j6YDAgMBAAGjZjBkMBEGCWCGSAGG+EIBAQQEAwIABzAPBgNVHRMBAf8EBTAD
+AQH/MB8GA1UdIwQYMBaAFEp4MlIR21kWNl7fwRQ2QGpHfEyhMB0GA1UdDgQWBBRK
+eDJSEdtZFjZe38EUNkBqR3xMoTANBgkqhkiG9w0BAQQFAAOBgQB1W6ibAxHm6VZM
+zfmpTMANmvPMZWnmJXbMWbfWVMMdzZmsGd20hdXgPfxiIKeES1hl8eL5lSE/9dR+
+WB5Hh1Q+WKG1tfgq73HnvMP2sUlG4tega+VWeponmHxGYhTnyfxuAxJ5gDgdSIKN
+/Bf+KpYrtWKmpj29f5JZzVoqgrI3eQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Class 1 CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Low-Value Services Root"
+# Serial: 1
+# MD5 Fingerprint: 1e:42:95:02:33:92:6b:b9:5f:c0:7f:da:d6:b2:4b:fc
+# SHA1 Fingerprint: cc:ab:0e:a0:4c:23:01:d6:69:7b:dd:37:9f:cd:12:eb:24:e3:94:9d
+# SHA256 Fingerprint: 8c:72:09:27:9a:c0:4e:27:5e:16:d0:7f:d3:b7:75:e8:01:54:b5:96:80:46:e3:1f:52:dd:25:76:63:24:e9:a7
+-----BEGIN CERTIFICATE-----
+MIIEGDCCAwCgAwIBAgIBATANBgkqhkiG9w0BAQUFADBlMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwHhcNMDAwNTMw
+MTAzODMxWhcNMjAwNTMwMTAzODMxWjBlMQswCQYDVQQGEwJTRTEUMBIGA1UEChML
+QWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYD
+VQQDExhBZGRUcnVzdCBDbGFzcyAxIENBIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCWltQhSWDia+hBBwzexODcEyPNwTXH+9ZOEQpnXvUGW2ul
+CDtbKRY654eyNAbFvAWlA3yCyykQruGIgb3WntP+LVbBFc7jJp0VLhD7Bo8wBN6n
+tGO0/7Gcrjyvd7ZWxbWroulpOj0OM3kyP3CCkplhbY0wCI9xP6ZIVxn4JdxLZlyl
+dI+Yrsj5wAYi56xz36Uu+1LcsRVlIPo1Zmne3yzxbrww2ywkEtvrNTVokMsAsJch
+PXQhI2U0K7t4WaPW4XY5mqRJjox0r26kmqPZm9I4XJuiGMx1I4S+6+JNM3GOGvDC
++Mcdoq0Dlyz4zyXG9rgkMbFjXZJ/Y/AlyVMuH79NAgMBAAGjgdIwgc8wHQYDVR0O
+BBYEFJWxtPCUtr3H2tERCSG+wa9J/RB7MAsGA1UdDwQEAwIBBjAPBgNVHRMBAf8E
+BTADAQH/MIGPBgNVHSMEgYcwgYSAFJWxtPCUtr3H2tERCSG+wa9J/RB7oWmkZzBl
+MQswCQYDVQQGEwJTRTEUMBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFk
+ZFRydXN0IFRUUCBOZXR3b3JrMSEwHwYDVQQDExhBZGRUcnVzdCBDbGFzcyAxIENB
+IFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBACxtZBsfzQ3duQH6lmM0MkhHma6X
+7f1yFqZzR1r0693p9db7RcwpiURdv0Y5PejuvE1Uhh4dbOMXJ0PhiVYrqW9yTkkz
+43J8KiOavD7/KCrto/8cI7pDVwlnTUtiBi34/2ydYB7YHEt9tTEv2dB8Xfjea4MY
+eDdXL+gzB2ffHsdrKpV2ro9Xo/D0UrSpUwjP4E/TelOL/bscVjby/rK25Xa71SJl
+pz/+0WatC7xrmYbvP33zGDLKe8bjq2RGlfgmadlVg3sslgf/WSxEo8bl6ancoWOA
+WiFeIc9TVPC6b4nbqKqVz4vjccweGyBECMB6tkD9xOQ14R0WHNC8K47Wcdk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Subject: CN=AddTrust External CA Root O=AddTrust AB OU=AddTrust External TTP Network
+# Label: "AddTrust External Root"
+# Serial: 1
+# MD5 Fingerprint: 1d:35:54:04:85:78:b0:3f:42:42:4d:bf:20:73:0a:3f
+# SHA1 Fingerprint: 02:fa:f3:e2:91:43:54:68:60:78:57:69:4d:f5:e4:5b:68:85:18:68
+# SHA256 Fingerprint: 68:7f:a4:51:38:22:78:ff:f0:c8:b1:1f:8d:43:d5:76:67:1c:6e:b2:bc:ea:b4:13:fb:83:d9:65:d0:6d:2f:f2
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Public CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Public Services Root"
+# Serial: 1
+# MD5 Fingerprint: c1:62:3e:23:c5:82:73:9c:03:59:4b:2b:e9:77:49:7f
+# SHA1 Fingerprint: 2a:b6:28:48:5e:78:fb:f3:ad:9e:79:10:dd:6b:df:99:72:2c:96:e5
+# SHA256 Fingerprint: 07:91:ca:07:49:b2:07:82:aa:d3:c7:d7:bd:0c:df:c9:48:58:35:84:3e:b2:d7:99:60:09:ce:43:ab:6c:69:27
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIBATANBgkqhkiG9w0BAQUFADBkMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSAwHgYDVQQDExdBZGRUcnVzdCBQdWJsaWMgQ0EgUm9vdDAeFw0wMDA1MzAx
+MDQxNTBaFw0yMDA1MzAxMDQxNTBaMGQxCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtB
+ZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIDAeBgNV
+BAMTF0FkZFRydXN0IFB1YmxpYyBDQSBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOC
+AQ8AMIIBCgKCAQEA6Rowj4OIFMEg2Dybjxt+A3S72mnTRqX4jsIMEZBRpS9mVEBV
+6tsfSlbunyNu9DnLoblv8n75XYcmYZ4c+OLspoH4IcUkzBEMP9smcnrHAZcHF/nX
+GCwwfQ56HmIexkvA/X1id9NEHif2P0tEs7c42TkfYNVRknMDtABp4/MUTu7R3AnP
+dzRGULD4EfL+OHn3Bzn+UZKXC1sIXzSGAa2Il+tmzV7R/9x98oTaunet3IAIx6eH
+1lWfl2royBFkuucZKT8Rs3iQhCBSWxHveNCD9tVIkNAwHM+A+WD+eeSI8t0A65RF
+62WUaUC6wNW0uLp9BBGo6zEFlpROWCGOn9Bg/QIDAQABo4HRMIHOMB0GA1UdDgQW
+BBSBPjfYkrAfd59ctKtzquf2NGAv+jALBgNVHQ8EBAMCAQYwDwYDVR0TAQH/BAUw
+AwEB/zCBjgYDVR0jBIGGMIGDgBSBPjfYkrAfd59ctKtzquf2NGAv+qFopGYwZDEL
+MAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQLExRBZGRU
+cnVzdCBUVFAgTmV0d29yazEgMB4GA1UEAxMXQWRkVHJ1c3QgUHVibGljIENBIFJv
+b3SCAQEwDQYJKoZIhvcNAQEFBQADggEBAAP3FUr4JNojVhaTdt02KLmuG7jD8WS6
+IBh4lSknVwW8fCr0uVFV2ocC3g8WFzH4qnkuCRO7r7IgGRLlk/lL+YPoRNWyQSW/
+iHVv/xD8SlTQX/D67zZzfRs2RcYhbbQVuE7PnFylPVoAjgbjPGsye/Kf8Lb93/Ao
+GEjwxrzQvzSAlsJKsW2Ox5BF3i9nrEUEo3rcVZLJR2bYGozH7ZxOmuASu7VqTITh
+4SINhwBk/ox9Yjllpu9CtoAlEmEBqCQTcAARJl/6NVDFSMwGR+gn2HCNX2TmoUQm
+XiLsks3/QppEIW1cxeMiHV9HEufOX1362KqxMy3ZdvJOOjMMK7MtkAY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Subject: CN=AddTrust Qualified CA Root O=AddTrust AB OU=AddTrust TTP Network
+# Label: "AddTrust Qualified Certificates Root"
+# Serial: 1
+# MD5 Fingerprint: 27:ec:39:47:cd:da:5a:af:e2:9a:01:65:21:a9:4c:bb
+# SHA1 Fingerprint: 4d:23:78:ec:91:95:39:b5:00:7f:75:8f:03:3b:21:1e:c5:4d:8b:cf
+# SHA256 Fingerprint: 80:95:21:08:05:db:4b:bc:35:5e:44:28:d8:fd:6e:c2:cd:e3:ab:5f:b9:7a:99:42:98:8e:b8:f4:dc:d0:60:16
+-----BEGIN CERTIFICATE-----
+MIIEHjCCAwagAwIBAgIBATANBgkqhkiG9w0BAQUFADBnMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxHTAbBgNVBAsTFEFkZFRydXN0IFRUUCBOZXR3
+b3JrMSMwIQYDVQQDExpBZGRUcnVzdCBRdWFsaWZpZWQgQ0EgUm9vdDAeFw0wMDA1
+MzAxMDQ0NTBaFw0yMDA1MzAxMDQ0NTBaMGcxCzAJBgNVBAYTAlNFMRQwEgYDVQQK
+EwtBZGRUcnVzdCBBQjEdMBsGA1UECxMUQWRkVHJ1c3QgVFRQIE5ldHdvcmsxIzAh
+BgNVBAMTGkFkZFRydXN0IFF1YWxpZmllZCBDQSBSb290MIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA5B6a/twJWoekn0e+EV+vhDTbYjx5eLfpMLXsDBwq
+xBb/4Oxx64r1EW7tTw2R0hIYLUkVAcKkIhPHEWT/IhKauY5cLwjPcWqzZwFZ8V1G
+87B4pfYOQnrjfxvM0PC3KP0q6p6zsLkEqv32x7SxuCqg+1jxGaBvcCV+PmlKfw8i
+2O+tCBGaKZnhqkRFmhJePp1tUvznoD1oL/BLcHwTOK28FSXx1s6rosAx1i+f4P8U
+WfyEk9mHfExUE+uf0S0R+Bg6Ot4l2ffTQO2kBhLEO+GRwVY18BTcZTYJbqukB8c1
+0cIDMzZbdSZtQvESa0NvS3GU+jQd7RNuyoB/mC9suWXY6QIDAQABo4HUMIHRMB0G
+A1UdDgQWBBQ5lYtii1zJ1IC6WA+XPxUIQ8yYpzALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zCBkQYDVR0jBIGJMIGGgBQ5lYtii1zJ1IC6WA+XPxUIQ8yYp6Fr
+pGkwZzELMAkGA1UEBhMCU0UxFDASBgNVBAoTC0FkZFRydXN0IEFCMR0wGwYDVQQL
+ExRBZGRUcnVzdCBUVFAgTmV0d29yazEjMCEGA1UEAxMaQWRkVHJ1c3QgUXVhbGlm
+aWVkIENBIFJvb3SCAQEwDQYJKoZIhvcNAQEFBQADggEBABmrder4i2VhlRO6aQTv
+hsoToMeqT2QbPxj2qC0sVY8FtzDqQmodwCVRLae/DLPt7wh/bDxGGuoYQ992zPlm
+hpwsaPXpF/gxsxjE1kh9I0xowX67ARRvxdlu3rsEQmr49lx95dr6h+sNNVJn0J6X
+dgWTP5XHAeZpVTh/EGGZyeNfpso+gmNIquIISD6q8rKFYqa0p9m9N5xotS1WfbC3
+P6CxB9bpT9zeRXEwMn8bLgn5v1Kh7sKAPgZcLlVAwRv1cEWw3F369nJad9Jjzc9Y
+iQBCYz95OdBEsIJuQRno3eDBiFrRHnGTHyQwdOUeqN48Jzd/g66ed8/wMLH/S5no
+xqE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Subject: CN=Entrust Root Certification Authority O=Entrust, Inc. OU=www.entrust.net/CPS is incorporated by reference/(c) 2006 Entrust, Inc.
+# Label: "Entrust Root Certification Authority"
+# Serial: 1164660820
+# MD5 Fingerprint: d6:a5:c3:ed:5d:dd:3e:00:c1:3d:87:92:1f:1d:3f:e4
+# SHA1 Fingerprint: b3:1e:b1:b7:40:e3:6c:84:02:da:dc:37:d4:4d:f5:d4:67:49:52:f9
+# SHA256 Fingerprint: 73:c1:76:43:4f:1b:c6:d5:ad:f4:5b:0e:76:e7:27:28:7c:8d:e5:76:16:c1:e6:e6:14:1a:2b:2c:bc:7d:8e:4c
+-----BEGIN CERTIFICATE-----
+MIIEkTCCA3mgAwIBAgIERWtQVDANBgkqhkiG9w0BAQUFADCBsDELMAkGA1UEBhMC
+VVMxFjAUBgNVBAoTDUVudHJ1c3QsIEluYy4xOTA3BgNVBAsTMHd3dy5lbnRydXN0
+Lm5ldC9DUFMgaXMgaW5jb3Jwb3JhdGVkIGJ5IHJlZmVyZW5jZTEfMB0GA1UECxMW
+KGMpIDIwMDYgRW50cnVzdCwgSW5jLjEtMCsGA1UEAxMkRW50cnVzdCBSb290IENl
+cnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2MTEyNzIwMjM0MloXDTI2MTEyNzIw
+NTM0MlowgbAxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1FbnRydXN0LCBJbmMuMTkw
+NwYDVQQLEzB3d3cuZW50cnVzdC5uZXQvQ1BTIGlzIGluY29ycG9yYXRlZCBieSBy
+ZWZlcmVuY2UxHzAdBgNVBAsTFihjKSAyMDA2IEVudHJ1c3QsIEluYy4xLTArBgNV
+BAMTJEVudHJ1c3QgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASIwDQYJ
+KoZIhvcNAQEBBQADggEPADCCAQoCggEBALaVtkNC+sZtKm9I35RMOVcF7sN5EUFo
+Nu3s/poBj6E4KPz3EEZmLk0eGrEaTsbRwJWIsMn/MYszA9u3g3s+IIRe7bJWKKf4
+4LlAcTfFy0cOlypowCKVYhXbR9n10Cv/gkvJrT7eTNuQgFA/CYqEAOwwCj0Yzfv9
+KlmaI5UXLEWeH25DeW0MXJj+SKfFI0dcXv1u5x609mhF0YaDW6KKjbHjKYD+JXGI
+rb68j6xSlkuqUY3kEzEZ6E5Nn9uss2rVvDlUccp6en+Q3X0dgNmBu1kmwhH+5pPi
+94DkZfs0Nw4pgHBNrziGLp5/V6+eF67rHMsoIV+2HNjnogQi+dPa2MsCAwEAAaOB
+sDCBrTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zArBgNVHRAEJDAi
+gA8yMDA2MTEyNzIwMjM0MlqBDzIwMjYxMTI3MjA1MzQyWjAfBgNVHSMEGDAWgBRo
+kORnpKZTgMeGZqTx90tD+4S9bTAdBgNVHQ4EFgQUaJDkZ6SmU4DHhmak8fdLQ/uE
+vW0wHQYJKoZIhvZ9B0EABBAwDhsIVjcuMTo0LjADAgSQMA0GCSqGSIb3DQEBBQUA
+A4IBAQCT1DCw1wMgKtD5Y+iRDAUgqV8ZyntyTtSx29CW+1RaGSwMCPeyvIWonX9t
+O1KzKtvn1ISMY/YPyyYBkVBs9F8U4pN0wBOeMDpQ47RgxRzwIkSNcUesyBrJ6Zua
+AGAT/3B+XxFNSRuzFVJ7yVTav52Vr2ua2J7p8eRDjeIRRDq/r72DQnNSi6q7pynP
+9WQcCk3RvKqsnyrQ/39/2n3qse0wJcGE2jTSW3iDVuycNsMm4hH2Z0kdkquM++v/
+eu6FSqdQgPCnXEqULl8FmTxSQeDNtGPPAUO6nIPcj2A781q0tHuu2guQOHXvgR1m
+0vdXcDazv/wor3ElhVsT/h5/WrQ8
+-----END CERTIFICATE-----
+
+# Issuer: O=RSA Security Inc OU=RSA Security 2048 V3
+# Subject: O=RSA Security Inc OU=RSA Security 2048 V3
+# Label: "RSA Security 2048 v3"
+# Serial: 13297492616345471454730593562152402946
+# MD5 Fingerprint: 77:0d:19:b1:21:fd:00:42:9c:3e:0c:a5:dd:0b:02:8e
+# SHA1 Fingerprint: 25:01:90:19:cf:fb:d9:99:1c:b7:68:25:74:8d:94:5f:30:93:95:42
+# SHA256 Fingerprint: af:8b:67:62:a1:e5:28:22:81:61:a9:5d:5c:55:9e:e2:66:27:8f:75:d7:9e:83:01:89:a5:03:50:6a:bd:6b:4c
+-----BEGIN CERTIFICATE-----
+MIIDYTCCAkmgAwIBAgIQCgEBAQAAAnwAAAAKAAAAAjANBgkqhkiG9w0BAQUFADA6
+MRkwFwYDVQQKExBSU0EgU2VjdXJpdHkgSW5jMR0wGwYDVQQLExRSU0EgU2VjdXJp
+dHkgMjA0OCBWMzAeFw0wMTAyMjIyMDM5MjNaFw0yNjAyMjIyMDM5MjNaMDoxGTAX
+BgNVBAoTEFJTQSBTZWN1cml0eSBJbmMxHTAbBgNVBAsTFFJTQSBTZWN1cml0eSAy
+MDQ4IFYzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAt49VcdKA3Xtp
+eafwGFAyPGJn9gqVB93mG/Oe2dJBVGutn3y+Gc37RqtBaB4Y6lXIL5F4iSj7Jylg
+/9+PjDvJSZu1pJTOAeo+tWN7fyb9Gd3AIb2E0S1PRsNO3Ng3OTsor8udGuorryGl
+wSMiuLgbWhOHV4PR8CDn6E8jQrAApX2J6elhc5SYcSa8LWrg903w8bYqODGBDSnh
+AMFRD0xS+ARaqn1y07iHKrtjEAMqs6FPDVpeRrc9DvV07Jmf+T0kgYim3WBU6JU2
+PcYJk5qjEoAAVZkZR73QpXzDuvsf9/UP+Ky5tfQ3mBMY3oVbtwyCO4dvlTlYMNpu
+AWgXIszACwIDAQABo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIB
+BjAfBgNVHSMEGDAWgBQHw1EwpKrpRa41JPr/JCwz0LGdjDAdBgNVHQ4EFgQUB8NR
+MKSq6UWuNST6/yQsM9CxnYwwDQYJKoZIhvcNAQEFBQADggEBAF8+hnZuuDU8TjYc
+HnmYv/3VEhF5Ug7uMYm83X/50cYVIeiKAVQNOvtUudZj1LGqlk2iQk3UUx+LEN5/
+Zb5gEydxiKRz44Rj0aRV4VCT5hsOedBnvEbIvz8XDZXmxpBp3ue0L96VfdASPz0+
+f00/FGj1EVDVwfSQpQgdMWD/YIwjVAqv/qFuxdF6Kmh4zx6CCiC0H63lhbJqaHVO
+rSU3lIW+vaHU6rcMSzyd6BIA8F+sDeGscGNz9395nzIlQnQFgCi/vcEkllgVsRch
+6YlL2weIZ/QVrXA+L02FO8K32/6YaCOJ4XQP3vTFhGMpG8zLB8kApKnXwiJPZ9d3
+7CAFYd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA O=GeoTrust Inc.
+# Label: "GeoTrust Global CA"
+# Serial: 144470
+# MD5 Fingerprint: f7:75:ab:29:fb:51:4e:b7:77:5e:ff:05:3c:99:8e:f5
+# SHA1 Fingerprint: de:28:f4:a4:ff:e5:b9:2f:a3:c5:03:d1:a3:49:a7:f9:96:2a:82:12
+# SHA256 Fingerprint: ff:85:6a:2d:25:1d:cd:88:d3:66:56:f4:50:12:67:98:cf:ab:aa:de:40:79:9c:72:2d:e4:d2:b5:db:36:a7:3a
+-----BEGIN CERTIFICATE-----
+MIIDVDCCAjygAwIBAgIDAjRWMA0GCSqGSIb3DQEBBQUAMEIxCzAJBgNVBAYTAlVT
+MRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMRswGQYDVQQDExJHZW9UcnVzdCBHbG9i
+YWwgQ0EwHhcNMDIwNTIxMDQwMDAwWhcNMjIwNTIxMDQwMDAwWjBCMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEbMBkGA1UEAxMSR2VvVHJ1c3Qg
+R2xvYmFsIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2swYYzD9
+9BcjGlZ+W988bDjkcbd4kdS8odhM+KhDtgPpTSEHCIjaWC9mOSm9BXiLnTjoBbdq
+fnGk5sRgprDvgOSJKA+eJdbtg/OtppHHmMlCGDUUna2YRpIuT8rxh0PBFpVXLVDv
+iS2Aelet8u5fa9IAjbkU+BQVNdnARqN7csiRv8lVK83Qlz6cJmTM386DGXHKTubU
+1XupGc1V3sjs0l44U+VcT4wt/lAjNvxm5suOpDkZALeVAjmRCw7+OC7RHQWa9k0+
+bw8HHa8sHo9gOeL6NlMTOdReJivbPagUvTLrGAMoUgRx5aszPeE4uwc2hGKceeoW
+MPRfwCvocWvk+QIDAQABo1MwUTAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTA
+ephojYn7qwVkDBF9qn1luMrMTjAfBgNVHSMEGDAWgBTAephojYn7qwVkDBF9qn1l
+uMrMTjANBgkqhkiG9w0BAQUFAAOCAQEANeMpauUvXVSOKVCUn5kaFOSPeCpilKIn
+Z57QzxpeR+nBsqTP3UEaBU6bS+5Kb1VSsyShNwrrZHYqLizz/Tt1kL/6cdjHPTfS
+tQWVYrmm3ok9Nns4d0iXrKYgjy6myQzCsplFAMfOEVEiIuCl6rYVSAlk6l5PdPcF
+PseKUgzbFbS9bZvlxrFUaKnjaZC2mqUPuLk/IH2uSrW4nOQdtqvmlKXBx4Ot2/Un
+hw4EbNX/3aBd7YdStysVAq45pmp06drE57xNNB6pXE0zX5IJL4hmXXeXxx12E6nV
+5fEWCRE11azbJHFwLJhWC9kXtNHjUStedejV0NxPNO3CBWaAocvmMw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Global CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Global CA 2"
+# Serial: 1
+# MD5 Fingerprint: 0e:40:a7:6c:de:03:5d:8f:d1:0f:e4:d1:8d:f9:6c:a9
+# SHA1 Fingerprint: a9:e9:78:08:14:37:58:88:f2:05:19:b0:6d:2b:0d:2b:60:16:90:7d
+# SHA256 Fingerprint: ca:2d:82:a0:86:77:07:2f:8a:b6:76:4f:f0:35:67:6c:fe:3e:5e:32:5e:01:21:72:df:3f:92:09:6d:b7:9b:85
+-----BEGIN CERTIFICATE-----
+MIIDZjCCAk6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBEMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3QgR2xvYmFs
+IENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMTkwMzA0MDUwMDAwWjBEMQswCQYDVQQG
+EwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEdMBsGA1UEAxMUR2VvVHJ1c3Qg
+R2xvYmFsIENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDvPE1A
+PRDfO1MA4Wf+lGAVPoWI8YkNkMgoI5kF6CsgncbzYEbYwbLVjDHZ3CB5JIG/NTL8
+Y2nbsSpr7iFY8gjpeMtvy/wWUsiRxP89c96xPqfCfWbB9X5SJBri1WeR0IIQ13hL
+TytCOb1kLUCgsBDTOEhGiKEMuzozKmKY+wCdE1l/bztyqu6mD4b5BWHqZ38MN5aL
+5mkWRxHCJ1kDs6ZgwiFAVvqgx306E+PsV8ez1q6diYD3Aecs9pYrEw15LNnA5IZ7
+S4wMcoKK+xfNAGw6EzywhIdLFnopsk/bHdQL82Y3vdj2V7teJHq4PIu5+pIaGoSe
+2HSPqht/XvT+RSIhAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYE
+FHE4NvICMVNHK266ZUapEBVYIAUJMB8GA1UdIwQYMBaAFHE4NvICMVNHK266ZUap
+EBVYIAUJMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQUFAAOCAQEAA/e1K6td
+EPx7srJerJsOflN4WT5CBP51o62sgU7XAotexC3IUnbHLB/8gTKY0UvGkpMzNTEv
+/NgdRN3ggX+d6YvhZJFiCzkIjKx0nVnZellSlxG5FntvRdOW2TF9AjYPnDtuzywN
+A0ZF66D0f0hExghAzN4bcLUprbqLOzRldRtxIR0sFAqwlpW41uryZfspuk/qkZN0
+abby/+Ea0AzRdoXLiiW9l14sbxWZJue2Kf8i7MkCx1YAzUm5s2x7UwQa4qjJqhIF
+I8LO57sEAszAR6LkxCkvW0VXiVHuPOtSCP8HNR6fNWpHSlaY0VqFH4z1Ir+rzoPz
+4iIprn2DQKi6bA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA"
+# Serial: 1
+# MD5 Fingerprint: 92:65:58:8b:a2:1a:31:72:73:68:5c:b4:a5:7a:07:48
+# SHA1 Fingerprint: e6:21:f3:35:43:79:05:9a:4b:68:30:9d:8a:2f:74:22:15:87:ec:79
+# SHA256 Fingerprint: a0:45:9b:9f:63:b2:25:59:f5:fa:5d:4c:6d:b3:f9:f7:2f:f1:93:42:03:35:78:f0:73:bf:1d:1b:46:cb:b9:12
+-----BEGIN CERTIFICATE-----
+MIIFaDCCA1CgAwIBAgIBATANBgkqhkiG9w0BAQUFADBFMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEeMBwGA1UEAxMVR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBMB4XDTA0MDMwNDA1MDAwMFoXDTI5MDMwNDA1MDAwMFowRTELMAkGA1UE
+BhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xHjAcBgNVBAMTFUdlb1RydXN0
+IFVuaXZlcnNhbCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAKYV
+VaCjxuAfjJ0hUNfBvitbtaSeodlyWL0AG0y/YckUHUWCq8YdgNY96xCcOq9tJPi8
+cQGeBvV8Xx7BDlXKg5pZMK4ZyzBIle0iN430SppyZj6tlcDgFgDgEB8rMQ7XlFTT
+QjOgNB0eRXbdT8oYN+yFFXoZCPzVx5zw8qkuEKmS5j1YPakWaDwvdSEYfyh3peFh
+F7em6fgemdtzbvQKoiFs7tqqhZJmr/Z6a4LauiIINQ/PQvE1+mrufislzDoR5G2v
+c7J2Ha3QsnhnGqQ5HFELZ1aD/ThdDc7d8Lsrlh/eezJS/R27tQahsiFepdaVaH/w
+mZ7cRQg+59IJDTWU3YBOU5fXtQlEIGQWFwMCTFMNaN7VqnJNk22CDtucvc+081xd
+VHppCZbW2xHBjXWotM85yM48vCR85mLK4b19p71XZQvk/iXttmkQ3CgaRr0BHdCX
+teGYO8A3ZNY9lO4L4fUorgtWv3GLIylBjobFS1J72HGrH4oVpjuDWtdYAVHGTEHZ
+f9hBZ3KiKN9gg6meyHv8U3NyWfWTehd2Ds735VzZC1U0oqpbtWpU5xPKV+yXbfRe
+Bi9Fi1jUIxaS5BZuKGNZMN9QAZxjiRqf2xeUgnA3wySemkfWWspOqGmJch+RbNt+
+nhutxx9z3SxPGWX9f5NAEC7S8O08ni4oPmkmM8V7AgMBAAGjYzBhMA8GA1UdEwEB
+/wQFMAMBAf8wHQYDVR0OBBYEFNq7LqqwDLiIJlF0XG0D08DYj3rWMB8GA1UdIwQY
+MBaAFNq7LqqwDLiIJlF0XG0D08DYj3rWMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG
+9w0BAQUFAAOCAgEAMXjmx7XfuJRAyXHEqDXsRh3ChfMoWIawC/yOsjmPRFWrZIRc
+aanQmjg8+uUfNeVE44B5lGiku8SfPeE0zTBGi1QrlaXv9z+ZhP015s8xxtxqv6fX
+IwjhmF7DWgh2qaavdy+3YL1ERmrvl/9zlcGO6JP7/TG37FcREUWbMPEaiDnBTzyn
+ANXH/KttgCJwpQzgXQQpAvvLoJHRfNbDflDVnVi+QTjruXU8FdmbyUqDWcDaU/0z
+uzYYm4UPFd3uLax2k7nZAY1IEKj79TiG8dsKxr2EoyNB3tZ3b4XUhRxQ4K5RirqN
+Pnbiucon8l+f725ZDQbYKxek0nxru18UGkiPGkzns0ccjkxFKyDuSN/n3QmOGKja
+QI2SJhFTYXNd673nxE0pN2HrrDktZy4W1vUAg4WhzH92xH3kt0tm7wNFYGm2DFKW
+koRepqO1pD4r2czYG0eq8kTaT/kD6PAUyz/zg97QwVTjt+gKN02LIFkDMBmhLMi9
+ER/frslKxfMnZmaGrGiR/9nmUxwPi1xpZQomyB40w11Re9epnAahNt3ViZS82eQt
+DF4JbAiXfKM9fJP/P6EUp8+1Xevb2xzEdt+Iub1FBZUbrvxGakyvSOPOrg/Sfuvm
+bJxPgWp6ZKy7PtXny3YuxadIwVyQD8vIP/rmMuGNG2+k5o7Y+SlIis5z/iw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Subject: CN=GeoTrust Universal CA 2 O=GeoTrust Inc.
+# Label: "GeoTrust Universal CA 2"
+# Serial: 1
+# MD5 Fingerprint: 34:fc:b8:d0:36:db:9e:14:b3:c2:f2:db:8f:e4:94:c7
+# SHA1 Fingerprint: 37:9a:19:7b:41:85:45:35:0c:a6:03:69:f3:3c:2e:af:47:4f:20:79
+# SHA256 Fingerprint: a0:23:4f:3b:c8:52:7c:a5:62:8e:ec:81:ad:5d:69:89:5d:a5:68:0d:c9:1d:1c:b8:47:7f:33:f8:78:b9:5b:0b
+-----BEGIN CERTIFICATE-----
+MIIFbDCCA1SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBHMQswCQYDVQQGEwJVUzEW
+MBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1c3QgVW5pdmVy
+c2FsIENBIDIwHhcNMDQwMzA0MDUwMDAwWhcNMjkwMzA0MDUwMDAwWjBHMQswCQYD
+VQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjEgMB4GA1UEAxMXR2VvVHJ1
+c3QgVW5pdmVyc2FsIENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoIC
+AQCzVFLByT7y2dyxUxpZKeexw0Uo5dfR7cXFS6GqdHtXr0om/Nj1XqduGdt0DE81
+WzILAePb63p3NeqqWuDW6KFXlPCQo3RWlEQwAx5cTiuFJnSCegx2oG9NzkEtoBUG
+FF+3Qs17j1hhNNwqCPkuwwGmIkQcTAeC5lvO0Ep8BNMZcyfwqph/Lq9O64ceJHdq
+XbboW0W63MOhBW9Wjo8QJqVJwy7XQYci4E+GymC16qFjwAGXEHm9ADwSbSsVsaxL
+se4YuU6W3Nx2/zu+z18DwPw76L5GG//aQMJS9/7jOvdqdzXQ2o3rXhhqMcceujwb
+KNZrVMaqW9eiLBsZzKIC9ptZvTdrhrVtgrrY6slWvKk2WP0+GfPtDCapkzj4T8Fd
+IgbQl+rhrcZV4IErKIM6+vR7IVEAvlI4zs1meaj0gVbi0IMJR1FbUGrP20gaXT73
+y/Zl92zxlfgCOzJWgjl6W70viRu/obTo/3+NjN8D8WBOWBFM66M/ECuDmgFz2ZRt
+hAAnZqzwcEAJQpKtT5MNYQlRJNiS1QuUYbKHsu3/mjX/hVTK7URDrBs8FmtISgoc
+QIgfksILAAX/8sgCSqSqqcyZlpwvWOB94b67B9xfBHJcMTTD7F8t4D1kkCLm0ey4
+Lt1ZrtmhN79UNdxzMk+MBB4zsslG8dhcyFVQyWi9qLo2CQIDAQABo2MwYTAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAfBgNV
+HSMEGDAWgBR281Xh+qQ2+/CfXGJx7Tz0RzgQKzAOBgNVHQ8BAf8EBAMCAYYwDQYJ
+KoZIhvcNAQEFBQADggIBAGbBxiPz2eAubl/oz66wsCVNK/g7WJtAJDday6sWSf+z
+dXkzoS9tcBc0kf5nfo/sm+VegqlVHy/c1FEHEv6sFj4sNcZj/NwQ6w2jqtB8zNHQ
+L1EuxBRa3ugZ4T7GzKQp5y6EqgYweHZUcyiYWTjgAA1i00J9IZ+uPTqM1fp3DRgr
+Fg5fNuH8KrUwJM/gYwx7WBr+mbpCErGR9Hxo4sjoryzqyX6uuyo9DRXcNJW2GHSo
+ag/HtPQTxORb7QrSpJdMKu0vbBKJPfEncKpqA1Ihn0CoZ1Dy81of398j9tx4TuaY
+T1U6U+Pv8vSfx3zYWK8pIpe44L2RLrB27FcRz+8pRPPphXpgY+RdM4kX2TGq2tbz
+GDVyz4crL2MjhF2EjD9XoIj8mZEoJmmZ1I+XRL6O1UixpCgp8RW04eWe3fiPpm8m
+1wk8OhwRDqZsN/etRIcsKMfYdIKz0G9KV7s1KSegi+ghp4dkNl3M2Basx7InQJJV
+OCiNUW7dFGdTbHFcJoRNdVq2fmBWqU2t+5sel/MN2dKXVHfaPRK34B7vCAas+YWH
+6aLcr34YEoP9VhdBLtUpgn2Z9DH2canPLAEnpQW5qrJITirvn5NSUZU8UnOOVkwX
+QMAJKOSLakhT2+zNVVXxxvjpoixMptEmX36vWkzaH6byHCx+rgIW0lbQL1dTR+iS
+-----END CERTIFICATE-----
+
+# Issuer: CN=America Online Root Certification Authority 1 O=America Online Inc.
+# Subject: CN=America Online Root Certification Authority 1 O=America Online Inc.
+# Label: "America Online Root Certification Authority 1"
+# Serial: 1
+# MD5 Fingerprint: 14:f1:08:ad:9d:fa:64:e2:89:e7:1c:cf:a8:ad:7d:5e
+# SHA1 Fingerprint: 39:21:c1:15:c1:5d:0e:ca:5c:cb:5b:c4:f0:7d:21:d8:05:0b:56:6a
+# SHA256 Fingerprint: 77:40:73:12:c6:3a:15:3d:5b:c0:0b:4e:51:75:9c:df:da:c2:37:dc:2a:33:b6:79:46:e9:8e:9b:fa:68:0a:e3
+-----BEGIN CERTIFICATE-----
+MIIDpDCCAoygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAxMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MTExOTIwNDMwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKgv6KRpBgNHw+kqmP8ZonCaxlCyfqXfaE0bfA+2l2h9LaaLl+lk
+hsmj76CGv2BlnEtUiMJIxUo5vxTjWVXlGbR0yLQFOVwWpeKVBeASrlmLojNoWBym
+1BW32J/X3HGrfpq/m44zDyL9Hy7nBzbvYjnF3cu6JRQj3gzGPTzOggjmZj7aUTsW
+OqMFf6Dch9Wc/HKpoH145LcxVR5lu9RhsCFg7RAycsWSJR74kEoYeEfffjA3PlAb
+2xzTa5qGUwew76wGePiEmf4hjUyAtgyC9mZweRrTT6PP8c9GsEsPPt2IYriMqQko
+O3rHl+Ee5fSfwMCuJKDIodkP1nsmgmkyPacCAwEAAaNjMGEwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUAK3Zo/Z59m50qX8zPYEX10zPM94wHwYDVR0jBBgwFoAU
+AK3Zo/Z59m50qX8zPYEX10zPM94wDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB
+BQUAA4IBAQB8itEfGDeC4Liwo+1WlchiYZwFos3CYiZhzRAW18y0ZTTQEYqtqKkF
+Zu90821fnZmv9ov761KyBZiibyrFVL0lvV+uyIbqRizBs73B6UlwGBaXCBOMIOAb
+LjpHyx7kADCVW/RFo8AasAFOq73AI25jP4BKxQft3OJvx8Fi8eNy1gTIdGcL+oir
+oQHIb/AUr9KZzVGTfu0uOMe9zkZQPXLjeSWdm4grECDdpbgyn43gKd8hdIaC2y+C
+MMbHNYaz+ZZfRtsMRf3zUMNvxsNIrUam4SdHCh0Om7bCd39j8uB9Gr784N/Xx6ds
+sPmuujz9dLQR6FgNgLzTqIA6me11zEZ7
+-----END CERTIFICATE-----
+
+# Issuer: CN=America Online Root Certification Authority 2 O=America Online Inc.
+# Subject: CN=America Online Root Certification Authority 2 O=America Online Inc.
+# Label: "America Online Root Certification Authority 2"
+# Serial: 1
+# MD5 Fingerprint: d6:ed:3c:ca:e2:66:0f:af:10:43:0d:77:9b:04:09:bf
+# SHA1 Fingerprint: 85:b5:ff:67:9b:0c:79:96:1f:c8:6e:44:22:00:46:13:db:17:92:84
+# SHA256 Fingerprint: 7d:3b:46:5a:60:14:e5:26:c0:af:fc:ee:21:27:d2:31:17:27:ad:81:1c:26:84:2d:00:6a:f3:73:06:cc:80:bd
+-----BEGIN CERTIFICATE-----
+MIIFpDCCA4ygAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEc
+MBoGA1UEChMTQW1lcmljYSBPbmxpbmUgSW5jLjE2MDQGA1UEAxMtQW1lcmljYSBP
+bmxpbmUgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAyMB4XDTAyMDUyODA2
+MDAwMFoXDTM3MDkyOTE0MDgwMFowYzELMAkGA1UEBhMCVVMxHDAaBgNVBAoTE0Ft
+ZXJpY2EgT25saW5lIEluYy4xNjA0BgNVBAMTLUFtZXJpY2EgT25saW5lIFJvb3Qg
+Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgMjCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAMxBRR3pPU0Q9oyxQcngXssNt79Hc9PwVU3dxgz6sWYFas14tNwC
+206B89enfHG8dWOgXeMHDEjsJcQDIPT/DjsS/5uN4cbVG7RtIuOx238hZK+GvFci
+KtZHgVdEglZTvYYUAQv8f3SkWq7xuhG1m1hagLQ3eAkzfDJHA1zEpYNI9FdWboE2
+JxhP7JsowtS013wMPgwr38oE18aO6lhOqKSlGBxsRZijQdEt0sdtjRnxrXm3gT+9
+BoInLRBYBbV4Bbkv2wxrkJB+FFk4u5QkE+XRnRTf04JNRvCAOVIyD+OEsnpD8l7e
+Xz8d3eOyG6ChKiMDbi4BFYdcpnV1x5dhvt6G3NRI270qv0pV2uh9UPu0gBe4lL8B
+PeraunzgWGcXuVjgiIZGZ2ydEEdYMtA1fHkqkKJaEBEjNa0vzORKW6fIJ/KD3l67
+Xnfn6KVuY8INXWHQjNJsWiEOyiijzirplcdIz5ZvHZIlyMbGwcEMBawmxNJ10uEq
+Z8A9W6Wa6897GqidFEXlD6CaZd4vKL3Ob5Rmg0gp2OpljK+T2WSfVVcmv2/LNzGZ
+o2C7HK2JNDJiuEMhBnIMoVxtRsX6Kc8w3onccVvdtjc+31D1uAclJuW8tf48ArO3
++L5DwYcRlJ4jbBeKuIonDFRH8KmzwICMoCfrHRnjB453cMor9H124HhnAgMBAAGj
+YzBhMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFE1FwWg4u3OpaaEg5+31IqEj
+FNeeMB8GA1UdIwQYMBaAFE1FwWg4u3OpaaEg5+31IqEjFNeeMA4GA1UdDwEB/wQE
+AwIBhjANBgkqhkiG9w0BAQUFAAOCAgEAZ2sGuV9FOypLM7PmG2tZTiLMubekJcmn
+xPBUlgtk87FYT15R/LKXeydlwuXK5w0MJXti4/qftIe3RUavg6WXSIylvfEWK5t2
+LHo1YGwRgJfMqZJS5ivmae2p+DYtLHe/YUjRYwu5W1LtGLBDQiKmsXeu3mnFzccc
+obGlHBD7GL4acN3Bkku+KVqdPzW+5X1R+FXgJXUjhx5c3LqdsKyzadsXg8n33gy8
+CNyRnqjQ1xU3c6U1uPx+xURABsPr+CKAXEfOAuMRn0T//ZoyzH1kUQ7rVyZ2OuMe
+IjzCpjbdGe+n/BLzJsBZMYVMnNjP36TMzCmT/5RtdlwTCJfy7aULTd3oyWgOZtMA
+DjMSW7yV5TKQqLPGbIOtd+6Lfn6xqavT4fG2wLHqiMDn05DpKJKUe2h7lyoKZy2F
+AjgQ5ANh1NolNscIWC2hp1GvMApJ9aZphwctREZ2jirlmjvXGKL8nDgQzMY70rUX
+Om/9riW99XJZZLF0KjhfGEzfz3EEWjbUvy+ZnOjZurGV5gJLIaFb1cFPj65pbVPb
+AZO1XB4Y3WRayhgoPmMEEf0cjQAPuDffZ4qdZqkCapH/E8ovXYO8h5Ns3CRRFgQl
+Zvqz2cK6Kb6aSDiCmfS/O0oxGfm/jiEzFMpPVF/7zvuPcX/9XhmgD0uRuMRUvAaw
+RY8mkaKO/qk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Subject: CN=Visa eCommerce Root O=VISA OU=Visa International Service Association
+# Label: "Visa eCommerce Root"
+# Serial: 25952180776285836048024890241505565794
+# MD5 Fingerprint: fc:11:b8:d8:08:93:30:00:6d:23:f9:7e:eb:52:1e:02
+# SHA1 Fingerprint: 70:17:9b:86:8c:00:a4:fa:60:91:52:22:3f:9f:3e:32:bd:e0:05:62
+# SHA256 Fingerprint: 69:fa:c9:bd:55:fb:0a:c7:8d:53:bb:ee:5c:f1:d5:97:98:9f:d0:aa:ab:20:a2:51:51:bd:f1:73:3e:e7:d1:22
+-----BEGIN CERTIFICATE-----
+MIIDojCCAoqgAwIBAgIQE4Y1TR0/BvLB+WUF1ZAcYjANBgkqhkiG9w0BAQUFADBr
+MQswCQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRl
+cm5hdGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNv
+bW1lcmNlIFJvb3QwHhcNMDIwNjI2MDIxODM2WhcNMjIwNjI0MDAxNjEyWjBrMQsw
+CQYDVQQGEwJVUzENMAsGA1UEChMEVklTQTEvMC0GA1UECxMmVmlzYSBJbnRlcm5h
+dGlvbmFsIFNlcnZpY2UgQXNzb2NpYXRpb24xHDAaBgNVBAMTE1Zpc2EgZUNvbW1l
+cmNlIFJvb3QwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvV95WHm6h
+2mCxlCfLF9sHP4CFT8icttD0b0/Pmdjh28JIXDqsOTPHH2qLJj0rNfVIsZHBAk4E
+lpF7sDPwsRROEW+1QK8bRaVK7362rPKgH1g/EkZgPI2h4H3PVz4zHvtH8aoVlwdV
+ZqW1LS7YgFmypw23RuwhY/81q6UCzyr0TP579ZRdhE2o8mCP2w4lPJ9zcc+U30rq
+299yOIzzlr3xF7zSujtFWsan9sYXiwGd/BmoKoMWuDpI/k4+oKsGGelT84ATB+0t
+vz8KPFUgOSwsAGl0lUq8ILKpeeUYiZGo3BxN77t+Nwtd/jmliFKMAGzsGHxBvfaL
+dXe6YJ2E5/4tAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQD
+AgEGMB0GA1UdDgQWBBQVOIMPPyw/cDMezUb+B4wg4NfDtzANBgkqhkiG9w0BAQUF
+AAOCAQEAX/FBfXxcCLkr4NWSR/pnXKUTwwMhmytMiUbPWU3J/qVAtmPN3XEolWcR
+zCSs00Rsca4BIGsDoo8Ytyk6feUWYFN4PMCvFYP3j1IzJL1kk5fui/fbGKhtcbP3
+LBfQdCVp9/5rPJS+TUtBjE7ic9DjkCJzQ83z7+pzzkWKsKZJ/0x9nXGIxHYdkFsd
+7v3M9+79YKWxehZx0RbQfBI8bGmX265fOZpwLwU8GUYEmSA20GBuYQa7FkKMcPcw
+++DbZqMAAb3mLNqRX6BGi01qnD093QVG/na/oAo85ADmJ7f/hC3euiInlhBx6yLt
+398znM/jra6O1I7mT1GvFpLgXPYHDw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum CA O=Unizeto Sp. z o.o.
+# Subject: CN=Certum CA O=Unizeto Sp. z o.o.
+# Label: "Certum Root CA"
+# Serial: 65568
+# MD5 Fingerprint: 2c:8f:9f:66:1d:18:90:b1:47:26:9d:8e:86:82:8c:a9
+# SHA1 Fingerprint: 62:52:dc:40:f7:11:43:a2:2f:de:9e:f7:34:8e:06:42:51:b1:81:18
+# SHA256 Fingerprint: d8:e0:fe:bc:1d:b2:e3:8d:00:94:0f:37:d2:7d:41:34:4d:99:3e:73:4b:99:d5:65:6d:97:78:d4:d8:14:36:24
+-----BEGIN CERTIFICATE-----
+MIIDDDCCAfSgAwIBAgIDAQAgMA0GCSqGSIb3DQEBBQUAMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTAeFw0wMjA2MTExMDQ2MzlaFw0yNzA2MTExMDQ2MzlaMD4xCzAJBgNVBAYTAlBM
+MRswGQYDVQQKExJVbml6ZXRvIFNwLiB6IG8uby4xEjAQBgNVBAMTCUNlcnR1bSBD
+QTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAM6xwS7TT3zNJc4YPk/E
+jG+AanPIW1H4m9LcuwBcsaD8dQPugfCI7iNS6eYVM42sLQnFdvkrOYCJ5JdLkKWo
+ePhzQ3ukYbDYWMzhbGZ+nPMJXlVjhNWo7/OxLjBos8Q82KxujZlakE403Daaj4GI
+ULdtlkIJ89eVgw1BS7Bqa/j8D35in2fE7SZfECYPCE/wpFcozo+47UX2bu4lXapu
+Ob7kky/ZR6By6/qmW6/KUz/iDsaWVhFu9+lmqSbYf5VT7QqFiLpPKaVCjF62/IUg
+AKpoC6EahQGcxEZjgoi2IrHu/qpGWX7PNSzVttpd90gzFFS269lvzs2I1qsb2pY7
+HVkCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEA
+uI3O7+cUus/usESSbLQ5PqKEbq24IXfS1HeCh+YgQYHu4vgRt2PRFze+GXYkHAQa
+TOs9qmdvLdTN/mUxcMUbpgIKumB7bVjCmkn+YzILa+M6wKyrO7Do0wlRjBCDxjTg
+xSvgGrZgFCdsMneMvLJymM/NzD+5yCRCFNZX/OYmQ6kd5YCQzgNUKD73P9P4Te1q
+CjqTE5s7FCMTY5w/0YcneeVMUeMBrYVdGjux1XMQpNPyvG5k9VpWkKjHDkx0Dy5x
+O/fIR/RpbxXyEV6DHpx8Uq79AtoSqFlnGNu8cN2bsWntgM6JQEhqDjXKKWYVIZQs
+6GAqm4VKQPNriiTsBhYscw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AAA Certificate Services O=Comodo CA Limited
+# Subject: CN=AAA Certificate Services O=Comodo CA Limited
+# Label: "Comodo AAA Services root"
+# Serial: 1
+# MD5 Fingerprint: 49:79:04:b0:eb:87:19:ac:47:b0:bc:11:51:9b:74:d0
+# SHA1 Fingerprint: d1:eb:23:a4:6d:17:d6:8f:d9:25:64:c2:f1:f1:60:17:64:d8:e3:49
+# SHA256 Fingerprint: d7:a7:a0:fb:5d:7e:27:31:d7:71:e9:48:4e:bc:de:f7:1d:5f:0c:3e:0a:29:48:78:2b:c8:3e:e0:ea:69:9e:f4
+-----BEGIN CERTIFICATE-----
+MIIEMjCCAxqgAwIBAgIBATANBgkqhkiG9w0BAQUFADB7MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEhMB8GA1UEAwwYQUFBIENlcnRpZmlj
+YXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVowezEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxITAfBgNVBAMM
+GEFBQSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAL5AnfRu4ep2hxxNRUSOvkbIgwadwSr+GB+O5AL686tdUIoWMQua
+BtDFcCLNSS1UY8y2bmhGC1Pqy0wkwLxyTurxFa70VJoSCsN6sjNg4tqJVfMiWPPe
+3M/vg4aijJRPn2jymJBGhCfHdr/jzDUsi14HZGWCwEiwqJH5YZ92IFCokcdmtet4
+YgNW8IoaE+oxox6gmf049vYnMlhvB/VruPsUK6+3qszWY19zjNoFmag4qMsXeDZR
+rOme9Hg6jc8P2ULimAyrL58OAd7vn5lJ8S3frHRNG5i1R8XlKdH5kBjHYpy+g8cm
+ez6KJcfA3Z3mNWgQIJ2P2N7Sw4ScDV7oL8kCAwEAAaOBwDCBvTAdBgNVHQ4EFgQU
+oBEKIz6W8Qfs4q8p74Klf9AwpLQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQF
+MAMBAf8wewYDVR0fBHQwcjA4oDagNIYyaHR0cDovL2NybC5jb21vZG9jYS5jb20v
+QUFBQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmwwNqA0oDKGMGh0dHA6Ly9jcmwuY29t
+b2RvLm5ldC9BQUFDZXJ0aWZpY2F0ZVNlcnZpY2VzLmNybDANBgkqhkiG9w0BAQUF
+AAOCAQEACFb8AvCb6P+k+tZ7xkSAzk/ExfYAWMymtrwUSWgEdujm7l3sAg9g1o1Q
+GE8mTgHj5rCl7r+8dFRBv/38ErjHT1r0iWAFf2C3BUrz9vHCv8S5dIa2LX1rzNLz
+Rt0vxuBqw8M0Ayx9lt1awg6nCpnBBYurDC/zXDrPbDdVCYfeU0BsWO/8tqtlbgT2
+G9w84FoVxp7Z8VlIMCFlA2zs6SFz7JsDoeA3raAVGI/6ugLOpyypEBMs1OUIJqsi
+l2D4kF501KKaU73yqWjgom7C12yxow+ev+to51byrvLjKzg6CYG1a4XXvi3tPxq3
+smPi9WIsgtRqAEFQ8TmDn5XpNpaYbg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Certificate Services O=Comodo CA Limited
+# Subject: CN=Secure Certificate Services O=Comodo CA Limited
+# Label: "Comodo Secure Services root"
+# Serial: 1
+# MD5 Fingerprint: d3:d9:bd:ae:9f:ac:67:24:b3:c8:1b:52:e1:b9:a9:bd
+# SHA1 Fingerprint: 4a:65:d5:f4:1d:ef:39:b8:b8:90:4a:4a:d3:64:81:33:cf:c7:a1:d1
+# SHA256 Fingerprint: bd:81:ce:3b:4f:65:91:d1:1a:67:b5:fc:7a:47:fd:ef:25:52:1b:f9:aa:4e:18:b9:e3:df:2e:34:a7:80:3b:e8
+-----BEGIN CERTIFICATE-----
+MIIEPzCCAyegAwIBAgIBATANBgkqhkiG9w0BAQUFADB+MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEkMCIGA1UEAwwbU2VjdXJlIENlcnRp
+ZmljYXRlIFNlcnZpY2VzMB4XDTA0MDEwMTAwMDAwMFoXDTI4MTIzMTIzNTk1OVow
+fjELMAkGA1UEBhMCR0IxGzAZBgNVBAgMEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBwwHU2FsZm9yZDEaMBgGA1UECgwRQ29tb2RvIENBIExpbWl0ZWQxJDAiBgNV
+BAMMG1NlY3VyZSBDZXJ0aWZpY2F0ZSBTZXJ2aWNlczCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAMBxM4KK0HDrc4eCQNUd5MvJDkKQ+d40uaG6EfQlhfPM
+cm3ye5drswfxdySRXyWP9nQ95IDC+DwN879A6vfIUtFyb+/Iq0G4bi4XKpVpDM3S
+HpR7LZQdqnXXs5jLrLxkU0C8j6ysNstcrbvd4JQX7NFc0L/vpZXJkMWwrPsbQ996
+CF23uPJAGysnnlDOXmWCiIxe004MeuoIkbY2qitC++rCoznl2yY4rYsK7hljxxwk
+3wN42ubqwUcaCwtGCd0C/N7Lh1/XMGNooa7cMqG6vv5Eq2i2pRcV/b3Vp6ea5EQz
+6YiO/O1R65NxTq0B50SOqy3LqP4BSUjwwN3HaNiS/j0CAwEAAaOBxzCBxDAdBgNV
+HQ4EFgQUPNiTiMLAggnMAZkGkyDpnnAJY08wDgYDVR0PAQH/BAQDAgEGMA8GA1Ud
+EwEB/wQFMAMBAf8wgYEGA1UdHwR6MHgwO6A5oDeGNWh0dHA6Ly9jcmwuY29tb2Rv
+Y2EuY29tL1NlY3VyZUNlcnRpZmljYXRlU2VydmljZXMuY3JsMDmgN6A1hjNodHRw
+Oi8vY3JsLmNvbW9kby5uZXQvU2VjdXJlQ2VydGlmaWNhdGVTZXJ2aWNlcy5jcmww
+DQYJKoZIhvcNAQEFBQADggEBAIcBbSMdflsXfcFhMs+P5/OKlFlm4J4oqF7Tt/Q0
+5qo5spcWxYJvMqTpjOev/e/C6LlLqqP05tqNZSH7uoDrJiiFGv45jN5bBAS0VPmj
+Z55B+glSzAVIqMk/IQQezkhr/IXownuvf7fM+F86/TXGDe+X3EyrEeFryzHRbPtI
+gKvcnDe4IRRLDXE97IMzbtFuMhbsmMcWi1mmNKsFVy2T96oTy9IT4rcuO81rUBcJ
+aD61JlfutuC23bkpgHl9j6PwpCikFcSF9CfUa7/lXORlAnZUtOM3ZiTTGWHIUhDl
+izeauan5Hb/qmZJhlv8BzaFfDbxxvA6sCx1HRR3B7Hzs/Sk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Trusted Certificate Services O=Comodo CA Limited
+# Subject: CN=Trusted Certificate Services O=Comodo CA Limited
+# Label: "Comodo Trusted Services root"
+# Serial: 1
+# MD5 Fingerprint: 91:1b:3f:6e:cd:9e:ab:ee:07:fe:1f:71:d2:b3:61:27
+# SHA1 Fingerprint: e1:9f:e3:0e:8b:84:60:9e:80:9b:17:0d:72:a8:c5:ba:6e:14:09:bd
+# SHA256 Fingerprint: 3f:06:e5:56:81:d4:96:f5:be:16:9e:b5:38:9f:9f:2b:8f:f6:1e:17:08:df:68:81:72:48:49:cd:5d:27:cb:69
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIBATANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJHQjEb
+MBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHDAdTYWxmb3JkMRow
+GAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDElMCMGA1UEAwwcVHJ1c3RlZCBDZXJ0
+aWZpY2F0ZSBTZXJ2aWNlczAeFw0wNDAxMDEwMDAwMDBaFw0yODEyMzEyMzU5NTla
+MH8xCzAJBgNVBAYTAkdCMRswGQYDVQQIDBJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO
+BgNVBAcMB1NhbGZvcmQxGjAYBgNVBAoMEUNvbW9kbyBDQSBMaW1pdGVkMSUwIwYD
+VQQDDBxUcnVzdGVkIENlcnRpZmljYXRlIFNlcnZpY2VzMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA33FvNlhTWvI2VFeAxHQIIO0Yfyod5jWaHiWsnOWW
+fnJSoBVC21ndZHoa0Lh73TkVvFVIxO06AOoxEbrycXQaZ7jPM8yoMa+j49d/vzMt
+TGo87IvDktJTdyR0nAducPy9C1t2ul/y/9c3S0pgePfw+spwtOpZqqPOSC+pw7IL
+fhdyFgymBwwbOM/JYrc/oJOlh0Hyt3BAd9i+FHzjqMB6juljatEPmsbS9Is6FARW
+1O24zG71++IsWL1/T2sr92AkWCTOJu80kTrV44HQsvAEAtdbtz6SrGsSivnkBbA7
+kUlcsutT6vifR4buv5XAwAaf0lteERv0xwQ1KdJVXOTt6wIDAQABo4HJMIHGMB0G
+A1UdDgQWBBTFe1i97doladL3WRaoszLAeydb9DAOBgNVHQ8BAf8EBAMCAQYwDwYD
+VR0TAQH/BAUwAwEB/zCBgwYDVR0fBHwwejA8oDqgOIY2aHR0cDovL2NybC5jb21v
+ZG9jYS5jb20vVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMuY3JsMDqgOKA2hjRo
+dHRwOi8vY3JsLmNvbW9kby5uZXQvVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZXMu
+Y3JsMA0GCSqGSIb3DQEBBQUAA4IBAQDIk4E7ibSvuIQSTI3S8NtwuleGFTQQuS9/
+HrCoiWChisJ3DFBKmwCL2Iv0QeLQg4pKHBQGsKNoBXAxMKdTmw7pSqBYaWcOrp32
+pSxBvzwGa+RZzG0Q8ZZvH9/0BAKkn0U+yNj6NkZEUD+Cl5EfKNsYEYwq5GWDVxIS
+jBc/lDb+XbDABHcTuPQV1T84zJQ6VdCsmPW6AF/ghhmBeC8owH7TzEIK9a5QoNE+
+xqFx7D+gIIxmOom0jtTYsU0lR+4viMi14QVFwL4Ucd56/Y57fU0IlqUSc/Atyjcn
+dBInTMu2l+nZrghtWjlA3QVHdWpaIbOjGM9O9y5Xt5hwXsjEeLBi
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Subject: CN=QuoVadis Root Certification Authority O=QuoVadis Limited OU=Root Certification Authority
+# Label: "QuoVadis Root CA"
+# Serial: 985026699
+# MD5 Fingerprint: 27:de:36:fe:72:b7:00:03:00:9d:f4:f0:1e:6c:04:24
+# SHA1 Fingerprint: de:3f:40:bd:50:93:d3:9b:6c:60:f6:da:bc:07:62:01:00:89:76:c9
+# SHA256 Fingerprint: a4:5e:de:3b:bb:f0:9c:8a:e1:5c:72:ef:c0:72:68:d6:93:a2:1c:99:6f:d5:1e:67:ca:07:94:60:fd:6d:88:73
+-----BEGIN CERTIFICATE-----
+MIIF0DCCBLigAwIBAgIEOrZQizANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDElMCMGA1UECxMcUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTEuMCwGA1UEAxMlUXVvVmFkaXMgUm9vdCBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wMTAzMTkxODMzMzNaFw0yMTAzMTcxODMz
+MzNaMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMSUw
+IwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYDVQQDEyVR
+dW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAv2G1lVO6V/z68mcLOhrfEYBklbTRvM16z/Yp
+li4kVEAkOPcahdxYTMukJ0KX0J+DisPkBgNbAKVRHnAEdOLB1Dqr1607BxgFjv2D
+rOpm2RgbaIr1VxqYuvXtdj182d6UajtLF8HVj71lODqV0D1VNk7feVcxKh7YWWVJ
+WCCYfqtffp/p1k3sg3Spx2zY7ilKhSoGFPlU5tPaZQeLYzcS19Dsw3sgQUSj7cug
+F+FxZc4dZjH3dgEZyH0DWLaVSR2mEiboxgx24ONmy+pdpibu5cxfvWenAScOospU
+xbF6lR1xHkopigPcakXBpBlebzbNw6Kwt/5cOOJSvPhEQ+aQuwIDAQABo4ICUjCC
+Ak4wPQYIKwYBBQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwczovL29jc3AucXVv
+dmFkaXNvZmZzaG9yZS5jb20wDwYDVR0TAQH/BAUwAwEB/zCCARoGA1UdIASCAREw
+ggENMIIBCQYJKwYBBAG+WAABMIH7MIHUBggrBgEFBQcCAjCBxxqBxFJlbGlhbmNl
+IG9uIHRoZSBRdW9WYWRpcyBSb290IENlcnRpZmljYXRlIGJ5IGFueSBwYXJ0eSBh
+c3N1bWVzIGFjY2VwdGFuY2Ugb2YgdGhlIHRoZW4gYXBwbGljYWJsZSBzdGFuZGFy
+ZCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UsIGNlcnRpZmljYXRpb24gcHJh
+Y3RpY2VzLCBhbmQgdGhlIFF1b1ZhZGlzIENlcnRpZmljYXRlIFBvbGljeS4wIgYI
+KwYBBQUHAgEWFmh0dHA6Ly93d3cucXVvdmFkaXMuYm0wHQYDVR0OBBYEFItLbe3T
+KbkGGew5Oanwl4Rqy+/fMIGuBgNVHSMEgaYwgaOAFItLbe3TKbkGGew5Oanwl4Rq
+y+/foYGEpIGBMH8xCzAJBgNVBAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1p
+dGVkMSUwIwYDVQQLExxSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MS4wLAYD
+VQQDEyVRdW9WYWRpcyBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggQ6tlCL
+MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAitQUtf70mpKnGdSk
+fnIYj9lofFIk3WdvOXrEql494liwTXCYhGHoG+NpGA7O+0dQoE7/8CQfvbLO9Sf8
+7C9TqnN7Az10buYWnuulLsS/VidQK2K6vkscPFVcQR0kvoIgR13VRH56FmjffU1R
+cHhXHTMe/QKZnAzNCgVPx7uOpHX6Sm2xgI4JVrmcGmD+XcHXetwReNDWXcG31a0y
+mQM6isxUJTkxgXsTIlG6Rmyhu576BGxJJnSP0nPrzDCi5upZIof4l/UO/erMkqQW
+xFIY6iHOsfHmhIHluqmGKPJDWl0Snawe2ajlCmqnf6CHKc/yiU3U7MXi5nrQNiOK
+SnQ2+Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 2 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 2"
+# Serial: 1289
+# MD5 Fingerprint: 5e:39:7b:dd:f8:ba:ec:82:e9:ac:62:ba:0c:54:00:2b
+# SHA1 Fingerprint: ca:3a:fb:cf:12:40:36:4b:44:b2:16:20:88:80:48:39:19:93:7c:f7
+# SHA256 Fingerprint: 85:a0:dd:7d:d7:20:ad:b7:ff:05:f8:3d:54:2b:20:9d:c7:ff:45:28:f7:d6:77:b1:83:89:fe:a5:e5:c4:9e:86
+-----BEGIN CERTIFICATE-----
+MIIFtzCCA5+gAwIBAgICBQkwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMjAeFw0wNjExMjQxODI3MDBaFw0zMTExMjQxODIzMzNaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCa
+GMpLlA0ALa8DKYrwD4HIrkwZhR0In6spRIXzL4GtMh6QRr+jhiYaHv5+HBg6XJxg
+Fyo6dIMzMH1hVBHL7avg5tKifvVrbxi3Cgst/ek+7wrGsxDp3MJGF/hd/aTa/55J
+WpzmM+Yklvc/ulsrHHo1wtZn/qtmUIttKGAr79dgw8eTvI02kfN/+NsRE8Scd3bB
+rrcCaoF6qUWD4gXmuVbBlDePSHFjIuwXZQeVikvfj8ZaCuWw419eaxGrDPmF60Tp
++ARz8un+XJiM9XOva7R+zdRcAitMOeGylZUtQofX1bOQQ7dsE/He3fbE+Ik/0XX1
+ksOR1YqI0JDs3G3eicJlcZaLDQP9nL9bFqyS2+r+eXyt66/3FsvbzSUr5R/7mp/i
+Ucw6UwxI5g69ybR2BlLmEROFcmMDBOAENisgGQLodKcftslWZvB1JdxnwQ5hYIiz
+PtGo/KPaHbDRsSNU30R2be1B2MGyIrZTHN81Hdyhdyox5C315eXbyOD/5YDXC2Og
+/zOhD7osFRXql7PSorW+8oyWHhqPHWykYTe5hnMz15eWniN9gqRMgeKh0bpnX5UH
+oycR7hYQe7xFSkyyBNKr79X9DFHOUGoIMfmR2gyPZFwDwzqLID9ujWc9Otb+fVuI
+yV77zGHcizN300QyNQliBJIWENieJ0f7OyHj+OsdWwIDAQABo4GwMIGtMA8GA1Ud
+EwEB/wQFMAMBAf8wCwYDVR0PBAQDAgEGMB0GA1UdDgQWBBQahGK8SEwzJQTU7tD2
+A8QZRtGUazBuBgNVHSMEZzBlgBQahGK8SEwzJQTU7tD2A8QZRtGUa6FJpEcwRTEL
+MAkGA1UEBhMCQk0xGTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMT
+ElF1b1ZhZGlzIFJvb3QgQ0EgMoICBQkwDQYJKoZIhvcNAQEFBQADggIBAD4KFk2f
+BluornFdLwUvZ+YTRYPENvbzwCYMDbVHZF34tHLJRqUDGCdViXh9duqWNIAXINzn
+g/iN/Ae42l9NLmeyhP3ZRPx3UIHmfLTJDQtyU/h2BwdBR5YM++CCJpNVjP4iH2Bl
+fF/nJrP3MpCYUNQ3cVX2kiF495V5+vgtJodmVjB3pjd4M1IQWK4/YY7yarHvGH5K
+WWPKjaJW1acvvFYfzznB4vsKqBUsfU16Y8Zsl0Q80m/DShcK+JDSV6IZUaUtl0Ha
+B0+pUNqQjZRG4T7wlP0QADj1O+hA4bRuVhogzG9Yje0uRY/W6ZM/57Es3zrWIozc
+hLsib9D45MY56QSIPMO661V6bYCZJPVsAfv4l7CUW+v90m/xd2gNNWQjrLhVoQPR
+TUIZ3Ph1WVaj+ahJefivDrkRoHy3au000LYmYjgahwz46P0u05B/B5EqHdZ+XIWD
+mbA4CD/pXvk1B+TJYm5Xf6dQlfe6yJvmjqIBxdZmv3lh8zwc4bmCXF2gw+nYSL0Z
+ohEUGW6yhhtoPkg3Goi3XZZenMfvJ2II4pEZXNLxId26F0KCl3GBUzGpn/Z9Yr9y
+4aOTHcyKJloJONDO1w2AFrR4pTqHTI2KpdVGl/IsELm8VCLAAVBpQ570su9t+Oza
+8eOx79+Rj1QqCyXBJhnEUhAFZdWCEOrCMc0u
+-----END CERTIFICATE-----
+
+# Issuer: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Subject: CN=QuoVadis Root CA 3 O=QuoVadis Limited
+# Label: "QuoVadis Root CA 3"
+# Serial: 1478
+# MD5 Fingerprint: 31:85:3c:62:94:97:63:b9:aa:fd:89:4e:af:6f:e0:cf
+# SHA1 Fingerprint: 1f:49:14:f7:d8:74:95:1d:dd:ae:02:c0:be:fd:3a:2d:82:75:51:85
+# SHA256 Fingerprint: 18:f1:fc:7f:20:5d:f8:ad:dd:eb:7f:e0:07:dd:57:e3:af:37:5a:9c:4d:8d:73:54:6b:f4:f1:fe:d1:e1:8d:35
+-----BEGIN CERTIFICATE-----
+MIIGnTCCBIWgAwIBAgICBcYwDQYJKoZIhvcNAQEFBQAwRTELMAkGA1UEBhMCQk0x
+GTAXBgNVBAoTEFF1b1ZhZGlzIExpbWl0ZWQxGzAZBgNVBAMTElF1b1ZhZGlzIFJv
+b3QgQ0EgMzAeFw0wNjExMjQxOTExMjNaFw0zMTExMjQxOTA2NDRaMEUxCzAJBgNV
+BAYTAkJNMRkwFwYDVQQKExBRdW9WYWRpcyBMaW1pdGVkMRswGQYDVQQDExJRdW9W
+YWRpcyBSb290IENBIDMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDM
+V0IWVJzmmNPTTe7+7cefQzlKZbPoFog02w1ZkXTPkrgEQK0CSzGrvI2RaNggDhoB
+4hp7Thdd4oq3P5kazethq8Jlph+3t723j/z9cI8LoGe+AaJZz3HmDyl2/7FWeUUr
+H556VOijKTVopAFPD6QuN+8bv+OPEKhyq1hX51SGyMnzW9os2l2ObjyjPtr7guXd
+8lyyBTNvijbO0BNO/79KDDRMpsMhvVAEVeuxu537RR5kFd5VAYwCdrXLoT9Cabwv
+vWhDFlaJKjdhkf2mrk7AyxRllDdLkgbvBNDInIjbC3uBr7E9KsRlOni27tyAsdLT
+mZw67mtaa7ONt9XOnMK+pUsvFrGeaDsGb659n/je7Mwpp5ijJUMv7/FfJuGITfhe
+btfZFG4ZM2mnO4SJk8RTVROhUXhA+LjJou57ulJCg54U7QVSWllWp5f8nT8KKdjc
+T5EOE7zelaTfi5m+rJsziO+1ga8bxiJTyPbH7pcUsMV8eFLI8M5ud2CEpukqdiDt
+WAEXMJPpGovgc2PZapKUSU60rUqFxKMiMPwJ7Wgic6aIDFUhWMXhOp8q3crhkODZ
+c6tsgLjoC2SToJyMGf+z0gzskSaHirOi4XCPLArlzW1oUevaPwV/izLmE1xr/l9A
+4iLItLRkT9a6fUg+qGkM17uGcclzuD87nSVL2v9A6wIDAQABo4IBlTCCAZEwDwYD
+VR0TAQH/BAUwAwEB/zCB4QYDVR0gBIHZMIHWMIHTBgkrBgEEAb5YAAMwgcUwgZMG
+CCsGAQUFBwICMIGGGoGDQW55IHVzZSBvZiB0aGlzIENlcnRpZmljYXRlIGNvbnN0
+aXR1dGVzIGFjY2VwdGFuY2Ugb2YgdGhlIFF1b1ZhZGlzIFJvb3QgQ0EgMyBDZXJ0
+aWZpY2F0ZSBQb2xpY3kgLyBDZXJ0aWZpY2F0aW9uIFByYWN0aWNlIFN0YXRlbWVu
+dC4wLQYIKwYBBQUHAgEWIWh0dHA6Ly93d3cucXVvdmFkaXNnbG9iYWwuY29tL2Nw
+czALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFPLAE+CCQz777i9nMpY1XNu4ywLQMG4G
+A1UdIwRnMGWAFPLAE+CCQz777i9nMpY1XNu4ywLQoUmkRzBFMQswCQYDVQQGEwJC
+TTEZMBcGA1UEChMQUXVvVmFkaXMgTGltaXRlZDEbMBkGA1UEAxMSUXVvVmFkaXMg
+Um9vdCBDQSAzggIFxjANBgkqhkiG9w0BAQUFAAOCAgEAT62gLEz6wPJv92ZVqyM0
+7ucp2sNbtrCD2dDQ4iH782CnO11gUyeim/YIIirnv6By5ZwkajGxkHon24QRiSem
+d1o417+shvzuXYO8BsbRd2sPbSQvS3pspweWyuOEn62Iix2rFo1bZhfZFvSLgNLd
++LJ2w/w4E6oM3kJpK27zPOuAJ9v1pkQNn1pVWQvVDVJIxa6f8i+AxeoyUDUSly7B
+4f/xI4hROJ/yZlZ25w9Rl6VSDE1JUZU2Pb+iSwwQHYaZTKrzchGT5Or2m9qoXadN
+t54CrnMAyNojA+j56hl0YgCUyyIgvpSnWbWCar6ZeXqp8kokUvd0/bpO5qgdAm6x
+DYBEwa7TIzdfu4V8K5Iu6H6li92Z4b8nby1dqnuH/grdS/yO9SbkbnBCbjPsMZ57
+k8HkyWkaPcBrTiJt7qtYTcbQQcEr6k8Sh17rRdhs9ZgC06DYVYoGmRmioHfRMJ6s
+zHXug/WwYjnPbFfiTNKRCw51KBuav/0aQ/HKd/s7j2G4aSgWQgRecCocIdiP4b0j
+Wy10QJLZYxkNc91pvGJHvOB0K7Lrfb5BG7XARsWhIstfTsEokt4YutUqKLsRixeT
+mJlglFwjz1onl14LBQaTNx47aTbrqZ5hHY8y2o4M1nQ+ewkk2gF3R8Q7zTSMmfXK
+4SVhM7JZG+Ju1zdXtg2pEto=
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust.net OU=Security Communication RootCA1
+# Subject: O=SECOM Trust.net OU=Security Communication RootCA1
+# Label: "Security Communication Root CA"
+# Serial: 0
+# MD5 Fingerprint: f1:bc:63:6a:54:e0:b5:27:f5:cd:e7:1a:e3:4d:6e:4a
+# SHA1 Fingerprint: 36:b1:2b:49:f9:81:9e:d7:4c:9e:bc:38:0f:c6:56:8f:5d:ac:b2:f7
+# SHA256 Fingerprint: e7:5e:72:ed:9f:56:0e:ec:6e:b4:80:00:73:a4:3f:c3:ad:19:19:5a:39:22:82:01:78:95:97:4a:99:02:6b:6c
+-----BEGIN CERTIFICATE-----
+MIIDWjCCAkKgAwIBAgIBADANBgkqhkiG9w0BAQUFADBQMQswCQYDVQQGEwJKUDEY
+MBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYDVQQLEx5TZWN1cml0eSBDb21t
+dW5pY2F0aW9uIFJvb3RDQTEwHhcNMDMwOTMwMDQyMDQ5WhcNMjMwOTMwMDQyMDQ5
+WjBQMQswCQYDVQQGEwJKUDEYMBYGA1UEChMPU0VDT00gVHJ1c3QubmV0MScwJQYD
+VQQLEx5TZWN1cml0eSBDb21tdW5pY2F0aW9uIFJvb3RDQTEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQCzs/5/022x7xZ8V6UMbXaKL0u/ZPtM7orw8yl8
+9f/uKuDp6bpbZCKamm8sOiZpUQWZJtzVHGpxxpp9Hp3dfGzGjGdnSj74cbAZJ6kJ
+DKaVv0uMDPpVmDvY6CKhS3E4eayXkmmziX7qIWgGmBSWh9JhNrxtJ1aeV+7AwFb9
+Ms+k2Y7CI9eNqPPYJayX5HA49LY6tJ07lyZDo6G8SVlyTCMwhwFY9k6+HGhWZq/N
+QV3Is00qVUarH9oe4kA92819uZKAnDfdDJZkndwi92SL32HeFZRSFaB9UslLqCHJ
+xrHty8OVYNEP8Ktw+N/LTX7s1vqr2b1/VPKl6Xn62dZ2JChzAgMBAAGjPzA9MB0G
+A1UdDgQWBBSgc0mZaNyFW2XjmygvV5+9M7wHSDALBgNVHQ8EBAMCAQYwDwYDVR0T
+AQH/BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAaECpqLvkT115swW1F7NgE+vG
+kl3g0dNq/vu+m22/xwVtWSDEHPC32oRYAmP6SBbvT6UL90qY8j+eG61Ha2POCEfr
+Uj94nK9NrvjVT8+amCoQQTlSxN3Zmw7vkwGusi7KaEIkQmywszo+zenaSMQVy+n5
+Bw+SUEmK3TGXX8npN6o7WWWXlDLJs58+OmJYxUmtYg5xpTKqL8aJdkNAExNnPaJU
+JRDL8Try2frbSVa7pv6nQTXD4IhhyYjH3zYQIphZ6rBK+1YWc26sTfcioU+tHXot
+RSflMMFe8toTyyVCUZVHA4xsIcx0Qu1T/zOLjw9XARYvz6buyXAiFL39vmwLAw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Sonera Class2 CA O=Sonera
+# Subject: CN=Sonera Class2 CA O=Sonera
+# Label: "Sonera Class 2 Root CA"
+# Serial: 29
+# MD5 Fingerprint: a3:ec:75:0f:2e:88:df:fa:48:01:4e:0b:5c:48:6f:fb
+# SHA1 Fingerprint: 37:f7:6d:e6:07:7c:90:c5:b1:3e:93:1a:b7:41:10:b4:f2:e4:9a:27
+# SHA256 Fingerprint: 79:08:b4:03:14:c1:38:10:0b:51:8d:07:35:80:7f:fb:fc:f8:51:8a:00:95:33:71:05:ba:38:6b:15:3d:d9:27
+-----BEGIN CERTIFICATE-----
+MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
+MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
+MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
+BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
+Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
+5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
+3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
+vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
+8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
+DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
+MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
+zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
+3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
+FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
+Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
+ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA"
+# Serial: 10000010
+# MD5 Fingerprint: 60:84:7c:5a:ce:db:0c:d4:cb:a7:e9:fe:02:c6:a9:c0
+# SHA1 Fingerprint: 10:1d:fa:3f:d5:0b:cb:bb:9b:b5:60:0c:19:55:a4:1a:f4:73:3a:04
+# SHA256 Fingerprint: d4:1d:82:9e:8c:16:59:82:2a:f9:3f:ce:62:bf:fc:de:26:4f:c8:4e:8b:95:0c:5f:f2:75:d0:52:35:46:95:a3
+-----BEGIN CERTIFICATE-----
+MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJO
+TDEeMBwGA1UEChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEy
+MTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4wHAYDVQQKExVTdGFhdCBkZXIgTmVk
+ZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxhbmRlbiBSb290IENB
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFtvszn
+ExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw71
+9tV2U02PjLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MO
+hXeiD+EwR+4A5zN9RGcaC1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+U
+tFE5A3+y3qcym7RHjm+0Sq7lr7HcsBthvJly3uSJt3omXdozSVtSnA71iq3DuD3o
+BmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn622r+I/q85Ej0ZytqERAh
+SQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRVHSAAMDww
+OgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMv
+cm9vdC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA
+7Jbg0zTBLL9s+DANBgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k
+/rvuFbQvBgwp8qiSpGEN/KtcCFtREytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzm
+eafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbwMVcoEoJz6TMvplW0C5GUR5z6
+u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3ynGQI0DvDKcWy
+7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
+iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
+-----END CERTIFICATE-----
+
+# Issuer: O=TDC Internet OU=TDC Internet Root CA
+# Subject: O=TDC Internet OU=TDC Internet Root CA
+# Label: "TDC Internet Root CA"
+# Serial: 986490188
+# MD5 Fingerprint: 91:f4:03:55:20:a1:f8:63:2c:62:de:ac:fb:61:1c:8e
+# SHA1 Fingerprint: 21:fc:bd:8e:7f:6c:af:05:1b:d1:b3:43:ec:a8:e7:61:47:f2:0f:8a
+# SHA256 Fingerprint: 48:98:c6:88:8c:0c:ff:b0:d3:e3:1a:ca:8a:37:d4:e3:51:5f:f7:46:d0:26:35:d8:66:46:cf:a0:a3:18:5a:e7
+-----BEGIN CERTIFICATE-----
+MIIEKzCCAxOgAwIBAgIEOsylTDANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJE
+SzEVMBMGA1UEChMMVERDIEludGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQg
+Um9vdCBDQTAeFw0wMTA0MDUxNjMzMTdaFw0yMTA0MDUxNzAzMTdaMEMxCzAJBgNV
+BAYTAkRLMRUwEwYDVQQKEwxUREMgSW50ZXJuZXQxHTAbBgNVBAsTFFREQyBJbnRl
+cm5ldCBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxLhA
+vJHVYx/XmaCLDEAedLdInUaMArLgJF/wGROnN4NrXceO+YQwzho7+vvOi20jxsNu
+Zp+Jpd/gQlBn+h9sHvTQBda/ytZO5GhgbEaqHF1j4QeGDmUApy6mcca8uYGoOn0a
+0vnRrEvLznWv3Hv6gXPU/Lq9QYjUdLP5Xjg6PEOo0pVOd20TDJ2PeAG3WiAfAzc1
+4izbSysseLlJ28TQx5yc5IogCSEWVmb/Bexb4/DPqyQkXsN/cHoSxNK1EKC2IeGN
+eGlVRGn1ypYcNIUXJXfi9i8nmHj9eQY6otZaQ8H/7AQ77hPv01ha/5Lr7K7a8jcD
+R0G2l8ktCkEiu7vmpwIDAQABo4IBJTCCASEwEQYJYIZIAYb4QgEBBAQDAgAHMGUG
+A1UdHwReMFwwWqBYoFakVDBSMQswCQYDVQQGEwJESzEVMBMGA1UEChMMVERDIElu
+dGVybmV0MR0wGwYDVQQLExRUREMgSW50ZXJuZXQgUm9vdCBDQTENMAsGA1UEAxME
+Q1JMMTArBgNVHRAEJDAigA8yMDAxMDQwNTE2MzMxN1qBDzIwMjEwNDA1MTcwMzE3
+WjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUbGQBx/2FbazI2p5QCIUItTxWqFAw
+HQYDVR0OBBYEFGxkAcf9hW2syNqeUAiFCLU8VqhQMAwGA1UdEwQFMAMBAf8wHQYJ
+KoZIhvZ9B0EABBAwDhsIVjUuMDo0LjADAgSQMA0GCSqGSIb3DQEBBQUAA4IBAQBO
+Q8zR3R0QGwZ/t6T609lN+yOfI1Rb5osvBCiLtSdtiaHsmGnc540mgwV5dOy0uaOX
+wTUA/RXaOYE6lTGQ3pfphqiZdwzlWqCE/xIWrG64jcN7ksKsLtB9KOy282A4aW8+
+2ARVPp7MVdK6/rtHBNcK2RYKNCn1WBPVT8+PVkuzHu7TmHnaCB4Mb7j4Fifvwm89
+9qNLPg7kbWzbO0ESm70NRyN/PErQr8Cv9u8btRXE64PECV90i9kR+8JWsTz4cMo0
+jUNAE4z9mQNUecYu6oah9jrUCbz0vGbMPVjQV0kK7iXiQe4T+Zs4NNEA9X7nlB38
+aQNiuJkFBT1reBK9sG9l
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN - DATACorp SGC O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN DATACorp SGC Root CA"
+# Serial: 91374294542884689855167577680241077609
+# MD5 Fingerprint: b3:a5:3e:77:21:6d:ac:4a:c0:c9:fb:d5:41:3d:ca:06
+# SHA1 Fingerprint: 58:11:9f:0e:12:82:87:ea:50:fd:d9:87:45:6f:4f:78:dc:fa:d6:d4
+# SHA256 Fingerprint: 85:fb:2f:91:dd:12:27:5a:01:45:b6:36:53:4f:84:02:4a:d6:8b:69:b8:ee:88:68:4f:f7:11:37:58:05:b3:48
+-----BEGIN CERTIFICATE-----
+MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCB
+kzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZBgNVBAMTElVUTiAtIERBVEFDb3Jw
+IFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBaMIGTMQswCQYDVQQG
+EwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4wHAYD
+VQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cu
+dXNlcnRydXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjAN
+BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6
+E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ysraP6LnD43m77VkIVni5c7yPeIbkFdicZ
+D0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlowHDyUwDAXlCCpVZvNvlK
+4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA9P4yPykq
+lXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulW
+bfXv33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQAB
+o4GrMIGoMAsGA1UdDwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRT
+MtGzz3/64PGgXYVOktKeRR20TzA9BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3Js
+LnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dDLmNybDAqBgNVHSUEIzAhBggr
+BgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3DQEBBQUAA4IB
+AQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
+Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyj
+j98C5OBxOvG0I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVH
+KWss5nbZqSl9Mt3JNjy9rjXxEZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv
+2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwPDPafepE39peC4N1xaf92P2BNPM/3
+mfnGV/TJVTl4uix5yaaIK/QI
+-----END CERTIFICATE-----
+
+# Issuer: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Subject: CN=UTN-USERFirst-Hardware O=The USERTRUST Network OU=http://www.usertrust.com
+# Label: "UTN USERFirst Hardware Root CA"
+# Serial: 91374294542884704022267039221184531197
+# MD5 Fingerprint: 4c:56:41:e5:0d:bb:2b:e8:ca:a3:ed:18:08:ad:43:39
+# SHA1 Fingerprint: 04:83:ed:33:99:ac:36:08:05:87:22:ed:bc:5e:46:00:e3:be:f9:d7
+# SHA256 Fingerprint: 6e:a5:47:41:d0:04:66:7e:ed:1b:48:16:63:4a:a3:a7:9e:6e:4b:96:95:0f:82:79:da:fc:8d:9b:d8:81:21:37
+-----BEGIN CERTIFICATE-----
+MIIEdDCCA1ygAwIBAgIQRL4Mi1AAJLQR0zYq/mUK/TANBgkqhkiG9w0BAQUFADCB
+lzELMAkGA1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2Ug
+Q2l0eTEeMBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExho
+dHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3Qt
+SGFyZHdhcmUwHhcNOTkwNzA5MTgxMDQyWhcNMTkwNzA5MTgxOTIyWjCBlzELMAkG
+A1UEBhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEe
+MBwGA1UEChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8v
+d3d3LnVzZXJ0cnVzdC5jb20xHzAdBgNVBAMTFlVUTi1VU0VSRmlyc3QtSGFyZHdh
+cmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCx98M4P7Sof885glFn
+0G2f0v9Y8+efK+wNiVSZuTiZFvfgIXlIwrthdBKWHTxqctU8EGc6Oe0rE81m65UJ
+M6Rsl7HoxuzBdXmcRl6Nq9Bq/bkqVRcQVLMZ8Jr28bFdtqdt++BxF2uiiPsA3/4a
+MXcMmgF6sTLjKwEHOG7DpV4jvEWbe1DByTCP2+UretNb+zNAHqDVmBe8i4fDidNd
+oI6yqqr2jmmIBsX6iSHzCJ1pLgkzmykNRg+MzEk0sGlRvfkGzWitZky8PqxhvQqI
+DsjfPe58BEydCl5rkdbux+0ojatNh4lz0G6k0B4WixThdkQDf2Os5M1JnMWS9Ksy
+oUhbAgMBAAGjgbkwgbYwCwYDVR0PBAQDAgHGMA8GA1UdEwEB/wQFMAMBAf8wHQYD
+VR0OBBYEFKFyXyYbKJhDlV0HN9WFlp1L0sNFMEQGA1UdHwQ9MDswOaA3oDWGM2h0
+dHA6Ly9jcmwudXNlcnRydXN0LmNvbS9VVE4tVVNFUkZpcnN0LUhhcmR3YXJlLmNy
+bDAxBgNVHSUEKjAoBggrBgEFBQcDAQYIKwYBBQUHAwUGCCsGAQUFBwMGBggrBgEF
+BQcDBzANBgkqhkiG9w0BAQUFAAOCAQEARxkP3nTGmZev/K0oXnWO6y1n7k57K9cM
+//bey1WiCuFMVGWTYGufEpytXoMs61quwOQt9ABjHbjAbPLPSbtNk28Gpgoiskli
+CE7/yMgUsogWXecB5BKV5UU0s4tpvc+0hY91UZ59Ojg6FEgSxvunOxqNDYJAB+gE
+CJChicsZUN/KHAG8HQQZexB2lzvukJDKxA4fFm517zP4029bHpbj4HR3dHuKom4t
+3XbWOTCC8KucUvIqx69JXn7HaOWCgchqJ/kniCrVWFCVH/A7HFe7fRQ5YiuayZSS
+KqMiDP+JJn1fIytH1xUdqWqeUQ0qUZ6B+dQ7XnASfxAynB67nfhmqA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Subject: CN=Chambers of Commerce Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Label: "Camerfirma Chambers of Commerce Root"
+# Serial: 0
+# MD5 Fingerprint: b0:01:ee:14:d9:af:29:18:94:76:8e:f1:69:33:2a:84
+# SHA1 Fingerprint: 6e:3a:55:a4:19:0c:19:5c:93:84:3c:c0:db:72:2e:31:30:61:f0:b1
+# SHA256 Fingerprint: 0c:25:8a:12:a5:67:4a:ef:25:f2:8b:a7:dc:fa:ec:ee:a3:48:e5:41:e6:f5:cc:4e:e6:3b:71:b3:61:60:6a:c3
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBADANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEiMCAGA1UEAxMZQ2hhbWJlcnMg
+b2YgQ29tbWVyY2UgUm9vdDAeFw0wMzA5MzAxNjEzNDNaFw0zNzA5MzAxNjEzNDRa
+MH8xCzAJBgNVBAYTAkVVMScwJQYDVQQKEx5BQyBDYW1lcmZpcm1hIFNBIENJRiBB
+ODI3NDMyODcxIzAhBgNVBAsTGmh0dHA6Ly93d3cuY2hhbWJlcnNpZ24ub3JnMSIw
+IAYDVQQDExlDaGFtYmVycyBvZiBDb21tZXJjZSBSb290MIIBIDANBgkqhkiG9w0B
+AQEFAAOCAQ0AMIIBCAKCAQEAtzZV5aVdGDDg2olUkfzIx1L4L1DZ77F1c2VHfRtb
+unXF/KGIJPov7coISjlUxFF6tdpg6jg8gbLL8bvZkSM/SAFwdakFKq0fcfPJVD0d
+BmpAPrMMhe5cG3nCYsS4No41XQEMIwRHNaqbYE6gZj3LJgqcQKH0XZi/caulAGgq
+7YN6D6IUtdQis4CwPAxaUWktWBiP7Zme8a7ileb2R6jWDA+wWFjbw2Y3npuRVDM3
+0pQcakjJyfKl2qUMI/cjDpwyVV5xnIQFUZot/eZOKjRa3spAN2cMVCFVd9oKDMyX
+roDclDZK9D7ONhMeU+SsTjoF7Nuucpw4i9A5O4kKPnf+dQIBA6OCAUQwggFAMBIG
+A1UdEwEB/wQIMAYBAf8CAQwwPAYDVR0fBDUwMzAxoC+gLYYraHR0cDovL2NybC5j
+aGFtYmVyc2lnbi5vcmcvY2hhbWJlcnNyb290LmNybDAdBgNVHQ4EFgQU45T1sU3p
+26EpW1eLTXYGduHRooowDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIA
+BzAnBgNVHREEIDAegRxjaGFtYmVyc3Jvb3RAY2hhbWJlcnNpZ24ub3JnMCcGA1Ud
+EgQgMB6BHGNoYW1iZXJzcm9vdEBjaGFtYmVyc2lnbi5vcmcwWAYDVR0gBFEwTzBN
+BgsrBgEEAYGHLgoDATA+MDwGCCsGAQUFBwIBFjBodHRwOi8vY3BzLmNoYW1iZXJz
+aWduLm9yZy9jcHMvY2hhbWJlcnNyb290Lmh0bWwwDQYJKoZIhvcNAQEFBQADggEB
+AAxBl8IahsAifJ/7kPMa0QOx7xP5IV8EnNrJpY0nbJaHkb5BkAFyk+cefV/2icZd
+p0AJPaxJRUXcLo0waLIJuvvDL8y6C98/d3tGfToSJI6WjzwFCm/SlCgdbQzALogi
+1djPHRPH8EjX1wWnz8dHnjs8NMiAT9QUu/wNUPf6s+xCX6ndbcj0dc97wXImsQEc
+XCz9ek60AcUFV7nnPKoF2YjpB0ZBzu9Bga5Y34OirsrXdx/nADydb47kMgkdTXg0
+eDQ8lJsm7U9xxhl6vSAiSFr+S30Dt+dYvsYyTnQeaN2oaFuzPu5ifdmA6Ap1erfu
+tGWaIZDgqtCYvDi1czyL+Nw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Subject: CN=Global Chambersign Root O=AC Camerfirma SA CIF A82743287 OU=http://www.chambersign.org
+# Label: "Camerfirma Global Chambersign Root"
+# Serial: 0
+# MD5 Fingerprint: c5:e6:7b:bf:06:d0:4f:43:ed:c4:7a:65:8a:fb:6b:19
+# SHA1 Fingerprint: 33:9b:6b:14:50:24:9b:55:7a:01:87:72:84:d9:e0:2f:c3:d2:d8:e9
+# SHA256 Fingerprint: ef:3c:b4:17:fc:8e:bf:6f:97:87:6c:9e:4e:ce:39:de:1e:a5:fe:64:91:41:d1:02:8b:7d:11:c0:b2:29:8c:ed
+-----BEGIN CERTIFICATE-----
+MIIExTCCA62gAwIBAgIBADANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJFVTEn
+MCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgyNzQzMjg3MSMwIQYDVQQL
+ExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4GA1UEAxMXR2xvYmFsIENo
+YW1iZXJzaWduIFJvb3QwHhcNMDMwOTMwMTYxNDE4WhcNMzcwOTMwMTYxNDE4WjB9
+MQswCQYDVQQGEwJFVTEnMCUGA1UEChMeQUMgQ2FtZXJmaXJtYSBTQSBDSUYgQTgy
+NzQzMjg3MSMwIQYDVQQLExpodHRwOi8vd3d3LmNoYW1iZXJzaWduLm9yZzEgMB4G
+A1UEAxMXR2xvYmFsIENoYW1iZXJzaWduIFJvb3QwggEgMA0GCSqGSIb3DQEBAQUA
+A4IBDQAwggEIAoIBAQCicKLQn0KuWxfH2H3PFIP8T8mhtxOviteePgQKkotgVvq0
+Mi+ITaFgCPS3CU6gSS9J1tPfnZdan5QEcOw/Wdm3zGaLmFIoCQLfxS+EjXqXd7/s
+QJ0lcqu1PzKY+7e3/HKE5TWH+VX6ox8Oby4o3Wmg2UIQxvi1RMLQQ3/bvOSiPGpV
+eAp3qdjqGTK3L/5cPxvusZjsyq16aUXjlg9V9ubtdepl6DJWk0aJqCWKZQbua795
+B9Dxt6/tLE2Su8CoX6dnfQTyFQhwrJLWfQTSM/tMtgsL+xrJxI0DqX5c8lCrEqWh
+z0hQpe/SyBoT+rB/sYIcd2oPX9wLlY/vQ37mRQklAgEDo4IBUDCCAUwwEgYDVR0T
+AQH/BAgwBgEB/wIBDDA/BgNVHR8EODA2MDSgMqAwhi5odHRwOi8vY3JsLmNoYW1i
+ZXJzaWduLm9yZy9jaGFtYmVyc2lnbnJvb3QuY3JsMB0GA1UdDgQWBBRDnDafsJ4w
+TcbOX60Qq+UDpfqpFDAOBgNVHQ8BAf8EBAMCAQYwEQYJYIZIAYb4QgEBBAQDAgAH
+MCoGA1UdEQQjMCGBH2NoYW1iZXJzaWducm9vdEBjaGFtYmVyc2lnbi5vcmcwKgYD
+VR0SBCMwIYEfY2hhbWJlcnNpZ25yb290QGNoYW1iZXJzaWduLm9yZzBbBgNVHSAE
+VDBSMFAGCysGAQQBgYcuCgEBMEEwPwYIKwYBBQUHAgEWM2h0dHA6Ly9jcHMuY2hh
+bWJlcnNpZ24ub3JnL2Nwcy9jaGFtYmVyc2lnbnJvb3QuaHRtbDANBgkqhkiG9w0B
+AQUFAAOCAQEAPDtwkfkEVCeR4e3t/mh/YV3lQWVPMvEYBZRqHN4fcNs+ezICNLUM
+bKGKfKX0j//U2K0X1S0E0T9YgOKBWYi+wONGkyT+kL0mojAt6JcmVzWJdJYY9hXi
+ryQZVgICsroPFOrGimbBhkVVi76SvpykBMdJPJ7oKXqJ1/6v/2j1pReQvayZzKWG
+VwlnRtvWFsJG8eSpUPWP0ZIV018+xgBJOm5YstHRJw0lyDL4IBHNfTIzSJRUTN3c
+ecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREest2d/
+AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Kozjegyzoi (Class A) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Notary (Class A) Root"
+# Serial: 259
+# MD5 Fingerprint: 86:38:6d:5e:49:63:6c:85:5c:db:6d:dc:94:b7:d0:f7
+# SHA1 Fingerprint: ac:ed:5f:65:53:fd:25:ce:01:5f:1f:7a:48:3b:6a:74:9f:61:78:c6
+# SHA256 Fingerprint: 7f:12:cd:5f:7e:5e:29:0e:c7:d8:51:79:d5:b7:2c:20:a5:be:75:08:ff:db:5b:f8:1a:b9:68:4a:7f:c9:f6:67
+-----BEGIN CERTIFICATE-----
+MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhV
+MRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMe
+TmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0
+dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFzcyBB
+KSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oXDTE5MDIxOTIzMTQ0
+N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQHEwhC
+dWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQu
+MRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBL
+b3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSMD7tM9DceqQWC2ObhbHDqeLVu0ThEDaiD
+zl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZz+qMkjvN9wfcZnSX9EUi
+3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC/tmwqcm8
+WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LY
+Oph7tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2Esi
+NCubMvJIH5+hCoR64sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCC
+ApswDgYDVR0PAQH/BAQDAgAGMBIGA1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4
+QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1GSUdZRUxFTSEgRXplbiB0
+YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pvbGdhbHRhdGFz
+aSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
+IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtm
+ZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMg
+ZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVs
+amFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJhc2EgbWVndGFsYWxoYXRv
+IGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBhIGh0dHBzOi8vd3d3
+Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVub3J6
+ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1
+YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3Qg
+dG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRs
+b2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNAbmV0bG9jay5uZXQuMA0G
+CSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5ayZrU3/b39/zcT0mwBQO
+xmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjPytoUMaFP
+0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQ
+QeJBCWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxk
+f1qbFFgBJ34TUMdrKuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK
+8CtmdWOMovsEPoMOmzbwGOQmIMOM8CgHrTwXZoi1/baI
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Uzleti (Class B) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Business (Class B) Root"
+# Serial: 105
+# MD5 Fingerprint: 39:16:aa:b9:6a:41:e1:14:69:df:9e:6c:3b:72:dc:b6
+# SHA1 Fingerprint: 87:9f:4b:ee:05:df:98:58:3b:e3:60:d6:33:e7:0d:3f:fe:98:71:af
+# SHA256 Fingerprint: 39:df:7b:68:2b:7b:93:8f:84:71:54:81:cc:de:8d:60:d8:f2:2e:c5:98:87:7d:0a:aa:c1:2b:59:18:2b:03:12
+-----BEGIN CERTIFICATE-----
+MIIFSzCCBLSgAwIBAgIBaTANBgkqhkiG9w0BAQQFADCBmTELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTIwMAYDVQQD
+EylOZXRMb2NrIFV6bGV0aSAoQ2xhc3MgQikgVGFudXNpdHZhbnlraWFkbzAeFw05
+OTAyMjUxNDEwMjJaFw0xOTAyMjAxNDEwMjJaMIGZMQswCQYDVQQGEwJIVTERMA8G
+A1UEBxMIQnVkYXBlc3QxJzAlBgNVBAoTHk5ldExvY2sgSGFsb3phdGJpenRvbnNh
+Z2kgS2Z0LjEaMBgGA1UECxMRVGFudXNpdHZhbnlraWFkb2sxMjAwBgNVBAMTKU5l
+dExvY2sgVXpsZXRpIChDbGFzcyBCKSBUYW51c2l0dmFueWtpYWRvMIGfMA0GCSqG
+SIb3DQEBAQUAA4GNADCBiQKBgQCx6gTsIKAjwo84YM/HRrPVG/77uZmeBNwcf4xK
+gZjupNTKihe5In+DCnVMm8Bp2GQ5o+2So/1bXHQawEfKOml2mrriRBf8TKPV/riX
+iK+IA4kfpPIEPsgHC+b5sy96YhQJRhTKZPWLgLViqNhr1nGTLbO/CVRY7QbrqHvc
+Q7GhaQIDAQABo4ICnzCCApswEgYDVR0TAQH/BAgwBgEB/wIBBDAOBgNVHQ8BAf8E
+BAMCAAYwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaCAk1G
+SUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFu
+b3MgU3pvbGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBh
+bGFwamFuIGtlc3p1bHQuIEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExv
+Y2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2VnLWJpenRvc2l0YXNhIHZlZGkuIEEgZGln
+aXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0ZXRlbGUgYXogZWxvaXJ0
+IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFzIGxlaXJh
+c2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGph
+biBhIGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJo
+ZXRvIGF6IGVsbGVub3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBP
+UlRBTlQhIFRoZSBpc3N1YW5jZSBhbmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmlj
+YXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sgQ1BTIGF2YWlsYWJsZSBhdCBo
+dHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFpbCBhdCBjcHNA
+bmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4GBAATbrowXr/gOkDFOzT4JwG06
+sPgzTEdM43WIEJessDgVkcYplswhwG08pXTP2IKlOcNl40JwuyKQ433bNXbhoLXa
+n3BukxowOR0w2y7jfLKRstE3Kfq51hdcR0/jHTjrn9V7lagonhVK0dHQKwCXoOKS
+NitjrFgBazMpUIaD8QFI
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Subject: CN=NetLock Expressz (Class C) Tanusitvanykiado O=NetLock Halozatbiztonsagi Kft. OU=Tanusitvanykiadok
+# Label: "NetLock Express (Class C) Root"
+# Serial: 104
+# MD5 Fingerprint: 4f:eb:f1:f0:70:c2:80:63:5d:58:9f:da:12:3c:a9:c4
+# SHA1 Fingerprint: e3:92:51:2f:0a:cf:f5:05:df:f6:de:06:7f:75:37:e1:65:ea:57:4b
+# SHA256 Fingerprint: 0b:5e:ed:4e:84:64:03:cf:55:e0:65:84:84:40:ed:2a:82:75:8b:f5:b9:aa:1f:25:3d:46:13:cf:a0:80:ff:3f
+-----BEGIN CERTIFICATE-----
+MIIFTzCCBLigAwIBAgIBaDANBgkqhkiG9w0BAQQFADCBmzELMAkGA1UEBhMCSFUx
+ETAPBgNVBAcTCEJ1ZGFwZXN0MScwJQYDVQQKEx5OZXRMb2NrIEhhbG96YXRiaXp0
+b25zYWdpIEtmdC4xGjAYBgNVBAsTEVRhbnVzaXR2YW55a2lhZG9rMTQwMgYDVQQD
+EytOZXRMb2NrIEV4cHJlc3N6IChDbGFzcyBDKSBUYW51c2l0dmFueWtpYWRvMB4X
+DTk5MDIyNTE0MDgxMVoXDTE5MDIyMDE0MDgxMVowgZsxCzAJBgNVBAYTAkhVMREw
+DwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9u
+c2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE0MDIGA1UEAxMr
+TmV0TG9jayBFeHByZXNzeiAoQ2xhc3MgQykgVGFudXNpdHZhbnlraWFkbzCBnzAN
+BgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6+ywbGGKIyWvYCDj2Z/8kwvbXY2wobNA
+OoLO/XXgeDIDhlqGlZHtU/qdQPzm6N3ZW3oDvV3zOwzDUXmbrVWg6dADEK8KuhRC
+2VImESLH0iDMgqSaqf64gXadarfSNnU+sYYJ9m5tfk63euyucYT2BDMIJTLrdKwW
+RMbkQJMdf60CAwEAAaOCAp8wggKbMBIGA1UdEwEB/wQIMAYBAf8CAQQwDgYDVR0P
+AQH/BAQDAgAGMBEGCWCGSAGG+EIBAQQEAwIABzCCAmAGCWCGSAGG+EIBDQSCAlEW
+ggJNRklHWUVMRU0hIEV6ZW4gdGFudXNpdHZhbnkgYSBOZXRMb2NrIEtmdC4gQWx0
+YWxhbm9zIFN6b2xnYWx0YXRhc2kgRmVsdGV0ZWxlaWJlbiBsZWlydCBlbGphcmFz
+b2sgYWxhcGphbiBrZXN6dWx0LiBBIGhpdGVsZXNpdGVzIGZvbHlhbWF0YXQgYSBO
+ZXRMb2NrIEtmdC4gdGVybWVrZmVsZWxvc3NlZy1iaXp0b3NpdGFzYSB2ZWRpLiBB
+IGRpZ2l0YWxpcyBhbGFpcmFzIGVsZm9nYWRhc2FuYWsgZmVsdGV0ZWxlIGF6IGVs
+b2lydCBlbGxlbm9yemVzaSBlbGphcmFzIG1lZ3RldGVsZS4gQXogZWxqYXJhcyBs
+ZWlyYXNhIG1lZ3RhbGFsaGF0byBhIE5ldExvY2sgS2Z0LiBJbnRlcm5ldCBob25s
+YXBqYW4gYSBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIGNpbWVuIHZhZ3kg
+a2VyaGV0byBheiBlbGxlbm9yemVzQG5ldGxvY2submV0IGUtbWFpbCBjaW1lbi4g
+SU1QT1JUQU5UISBUaGUgaXNzdWFuY2UgYW5kIHRoZSB1c2Ugb2YgdGhpcyBjZXJ0
+aWZpY2F0ZSBpcyBzdWJqZWN0IHRvIHRoZSBOZXRMb2NrIENQUyBhdmFpbGFibGUg
+YXQgaHR0cHM6Ly93d3cubmV0bG9jay5uZXQvZG9jcyBvciBieSBlLW1haWwgYXQg
+Y3BzQG5ldGxvY2submV0LjANBgkqhkiG9w0BAQQFAAOBgQAQrX/XDDKACtiG8XmY
+ta3UzbM2xJZIwVzNmtkFLp++UOv0JhQQLdRmF/iewSf98e3ke0ugbLWrmldwpu2g
+pO0u9f38vf5NNwgMvOOWgyL1SRt/Syu0VMGAfJlOHdCM7tCs5ZL6dVb+ZKATj7i4
+Fp1hBWeAyNDYpQcCNJgEjTME1A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Subject: CN=XRamp Global Certification Authority O=XRamp Security Services Inc OU=www.xrampsecurity.com
+# Label: "XRamp Global CA Root"
+# Serial: 107108908803651509692980124233745014957
+# MD5 Fingerprint: a1:0b:44:b3:ca:10:d8:00:6e:9d:0f:d8:0f:92:0a:d1
+# SHA1 Fingerprint: b8:01:86:d1:eb:9c:86:a5:41:04:cf:30:54:f3:4c:52:b7:e5:58:c6
+# SHA256 Fingerprint: ce:cd:dc:90:50:99:d8:da:df:c5:b1:d2:09:b7:37:cb:e2:c1:8c:fb:2c:10:c0:ff:0b:cf:0d:32:86:fc:1a:a2
+-----BEGIN CERTIFICATE-----
+MIIEMDCCAxigAwIBAgIQUJRs7Bjq1ZxN1ZfvdY+grTANBgkqhkiG9w0BAQUFADCB
+gjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3dy54cmFtcHNlY3VyaXR5LmNvbTEk
+MCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2VydmljZXMgSW5jMS0wKwYDVQQDEyRY
+UmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQxMTAxMTcx
+NDA0WhcNMzUwMTAxMDUzNzE5WjCBgjELMAkGA1UEBhMCVVMxHjAcBgNVBAsTFXd3
+dy54cmFtcHNlY3VyaXR5LmNvbTEkMCIGA1UEChMbWFJhbXAgU2VjdXJpdHkgU2Vy
+dmljZXMgSW5jMS0wKwYDVQQDEyRYUmFtcCBHbG9iYWwgQ2VydGlmaWNhdGlvbiBB
+dXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCYJB69FbS6
+38eMpSe2OAtp87ZOqCwuIR1cRN8hXX4jdP5efrRKt6atH67gBhbim1vZZ3RrXYCP
+KZ2GG9mcDZhtdhAoWORlsH9KmHmf4MMxfoArtYzAQDsRhtDLooY2YKTVMIJt2W7Q
+DxIEM5dfT2Fa8OT5kavnHTu86M/0ay00fOJIYRyO82FEzG+gSqmUsE3a56k0enI4
+qEHMPJQRfevIpoy3hsvKMzvZPTeL+3o+hiznc9cKV6xkmxnr9A8ECIqsAxcZZPRa
+JSKNNCyy9mgdEm3Tih4U2sSPpuIjhdV6Db1q4Ons7Be7QhtnqiXtRYMh/MHJfNVi
+PvryxS3T/dRlAgMBAAGjgZ8wgZwwEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0P
+BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMZPoj0GY4QJnM5i5ASs
+jVy16bYbMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9jcmwueHJhbXBzZWN1cml0
+eS5jb20vWEdDQS5jcmwwEAYJKwYBBAGCNxUBBAMCAQEwDQYJKoZIhvcNAQEFBQAD
+ggEBAJEVOQMBG2f7Shz5CmBbodpNl2L5JFMn14JkTpAuw0kbK5rc/Kh4ZzXxHfAR
+vbdI4xD2Dd8/0sm2qlWkSLoC295ZLhVbO50WfUfXN+pfTXYSNrsf16GBBEYgoyxt
+qZ4Bfj8pzgCT3/3JknOJiWSe5yvkHJEs0rnOfc5vMZnT5r7SHpDwCRR5XCOrTdLa
+IR9NmXmd4c8nnxCbHIgNsIpkQTG4DmyQJKSbXHGPurt+HBvbaoAPIbzp26a3QPSy
+i6mx5O+aGtA9aZnuqCij4Tyz8LIRnM98QObd50N9otg6tamN8jSZxNQQ4Qb9CYQQ
+O+7ETPTsJ3xCwnR8gooJybQDJbw=
+-----END CERTIFICATE-----
+
+# Issuer: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Subject: O=The Go Daddy Group, Inc. OU=Go Daddy Class 2 Certification Authority
+# Label: "Go Daddy Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 91:de:06:25:ab:da:fd:32:17:0c:bb:25:17:2a:84:67
+# SHA1 Fingerprint: 27:96:ba:e6:3f:18:01:e2:77:26:1b:a0:d7:77:70:02:8f:20:ee:e4
+# SHA256 Fingerprint: c3:84:6b:f2:4b:9e:93:ca:64:27:4c:0e:c6:7c:1e:cc:5e:02:4f:fc:ac:d2:d7:40:19:35:0e:81:fe:54:6a:e4
+-----BEGIN CERTIFICATE-----
+MIIEADCCAuigAwIBAgIBADANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJVUzEh
+MB8GA1UEChMYVGhlIEdvIERhZGR5IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBE
+YWRkeSBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA0MDYyOTE3
+MDYyMFoXDTM0MDYyOTE3MDYyMFowYzELMAkGA1UEBhMCVVMxITAfBgNVBAoTGFRo
+ZSBHbyBEYWRkeSBHcm91cCwgSW5jLjExMC8GA1UECxMoR28gRGFkZHkgQ2xhc3Mg
+MiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTCCASAwDQYJKoZIhvcNAQEBBQADggEN
+ADCCAQgCggEBAN6d1+pXGEmhW+vXX0iG6r7d/+TvZxz0ZWizV3GgXne77ZtJ6XCA
+PVYYYwhv2vLM0D9/AlQiVBDYsoHUwHU9S3/Hd8M+eKsaA7Ugay9qK7HFiH7Eux6w
+wdhFJ2+qN1j3hybX2C32qRe3H3I2TqYXP2WYktsqbl2i/ojgC95/5Y0V4evLOtXi
+EqITLdiOr18SPaAIBQi2XKVlOARFmR6jYGB0xUGlcmIbYsUfb18aQr4CUWWoriMY
+avx4A6lNf4DD+qta/KFApMoZFv6yyO9ecw3ud72a9nmYvLEHZ6IVDd2gWMZEewo+
+YihfukEHU1jPEX44dMX4/7VpkI+EdOqXG68CAQOjgcAwgb0wHQYDVR0OBBYEFNLE
+sNKR1EwRcbNhyz2h/t2oatTjMIGNBgNVHSMEgYUwgYKAFNLEsNKR1EwRcbNhyz2h
+/t2oatTjoWekZTBjMQswCQYDVQQGEwJVUzEhMB8GA1UEChMYVGhlIEdvIERhZGR5
+IEdyb3VwLCBJbmMuMTEwLwYDVQQLEyhHbyBEYWRkeSBDbGFzcyAyIENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADJL87LKPpH8EsahB4yOd6AzBhRckB4Y9wimPQoZ+YeAEW5p5JYXMP80kWNy
+OO7MHAGjHZQopDH2esRU1/blMVgDoszOYtuURXO1v0XJJLXVggKtI3lpjbi2Tc7P
+TMozI+gciKqdi0FuFskg5YmezTvacPd+mSYgFFQlq25zheabIZ0KbIIOqPjCDPoQ
+HmyW74cNxA9hi63ugyuV+I6ShHI56yDqg+2DzZduCLzrTia2cyvk0/ZM/iZx4mER
+dEr/VxqHD3VILs9RaRegAhJhldXRQLIQTO7ErBBDpqWeCtWVYpoNz4iCxTIM5Cuf
+ReYNnyicsbkqWletNw+vHX/bvZ8=
+-----END CERTIFICATE-----
+
+# Issuer: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Subject: O=Starfield Technologies, Inc. OU=Starfield Class 2 Certification Authority
+# Label: "Starfield Class 2 CA"
+# Serial: 0
+# MD5 Fingerprint: 32:4a:4b:bb:c8:63:69:9b:be:74:9a:c6:dd:1d:46:24
+# SHA1 Fingerprint: ad:7e:1c:28:b0:64:ef:8f:60:03:40:20:14:c3:d0:e3:37:0e:b5:8a
+# SHA256 Fingerprint: 14:65:fa:20:53:97:b8:76:fa:a6:f0:a9:95:8e:55:90:e4:0f:cc:7f:aa:4f:b7:c2:c8:67:75:21:fb:5f:b6:58
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBADANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJVUzEl
+MCMGA1UEChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMp
+U3RhcmZpZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDQw
+NjI5MTczOTE2WhcNMzQwNjI5MTczOTE2WjBoMQswCQYDVQQGEwJVUzElMCMGA1UE
+ChMcU3RhcmZpZWxkIFRlY2hub2xvZ2llcywgSW5jLjEyMDAGA1UECxMpU3RhcmZp
+ZWxkIENsYXNzIDIgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggEgMA0GCSqGSIb3
+DQEBAQUAA4IBDQAwggEIAoIBAQC3Msj+6XGmBIWtDBFk385N78gDGIc/oav7PKaf
+8MOh2tTYbitTkPskpD6E8J7oX+zlJ0T1KKY/e97gKvDIr1MvnsoFAZMej2YcOadN
++lq2cwQlZut3f+dZxkqZJRRU6ybH838Z1TBwj6+wRir/resp7defqgSHo9T5iaU0
+X9tDkYI22WY8sbi5gv2cOj4QyDvvBmVmepsZGD3/cVE8MC5fvj13c7JdBmzDI1aa
+K4UmkhynArPkPw2vCHmCuDY96pzTNbO8acr1zJ3o/WSNF4Azbl5KXZnJHoe0nRrA
+1W4TNSNe35tfPe/W93bC6j67eA0cQmdrBNj41tpvi/JEoAGrAgEDo4HFMIHCMB0G
+A1UdDgQWBBS/X7fRzt0fhvRbVazc1xDCDqmI5zCBkgYDVR0jBIGKMIGHgBS/X7fR
+zt0fhvRbVazc1xDCDqmI56FspGowaDELMAkGA1UEBhMCVVMxJTAjBgNVBAoTHFN0
+YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsTKVN0YXJmaWVsZCBD
+bGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5ggEAMAwGA1UdEwQFMAMBAf8w
+DQYJKoZIhvcNAQEFBQADggEBAAWdP4id0ckaVaGsafPzWdqbAYcaT1epoXkJKtv3
+L7IezMdeatiDh6GX70k1PncGQVhiv45YuApnP+yz3SFmH8lU+nLMPUxA2IGvd56D
+eruix/U0F47ZEUD0/CwqTRV/p2JdLiXTAAsgGh1o+Re49L2L7ShZ3U0WixeDyLJl
+xy16paq8U4Zt3VekyvggQQto8PT7dL5WXXp59fkdheMtlb71cZBDzI0fmgAKhynp
+VSJYACPq4xJDKVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEY
+WQPJIrSPnNVeKtelttQKbfi3QBFGmh95DmK/D5fs4C8fF5Q=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: 22:4d:8f:8a:fc:f7:35:c2:bb:57:34:90:7b:8b:22:16
+# SHA1 Fingerprint: 3e:2b:f7:f2:03:1b:96:f3:8c:e6:c4:d8:a8:5d:3e:2d:58:47:6a:0f
+# SHA256 Fingerprint: c7:66:a9:be:f2:d4:07:1c:86:3a:31:aa:49:20:e8:13:b2:d1:98:60:8c:b7:b7:cf:e2:11:43:b8:36:df:09:ea
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----
+
+# Issuer: O=Government Root Certification Authority
+# Subject: O=Government Root Certification Authority
+# Label: "Taiwan GRCA"
+# Serial: 42023070807708724159991140556527066870
+# MD5 Fingerprint: 37:85:44:53:32:45:1f:20:f0:f3:95:e1:25:c4:43:4e
+# SHA1 Fingerprint: f4:8b:11:bf:de:ab:be:94:54:20:71:e6:41:de:6b:be:88:2b:40:b9
+# SHA256 Fingerprint: 76:00:29:5e:ef:e8:5b:9e:1f:d6:24:db:76:06:2a:aa:ae:59:81:8a:54:d2:77:4c:d4:c0:b2:c0:11:31:e1:b3
+-----BEGIN CERTIFICATE-----
+MIIFcjCCA1qgAwIBAgIQH51ZWtcvwgZEpYAIaeNe9jANBgkqhkiG9w0BAQUFADA/
+MQswCQYDVQQGEwJUVzEwMC4GA1UECgwnR292ZXJubWVudCBSb290IENlcnRpZmlj
+YXRpb24gQXV0aG9yaXR5MB4XDTAyMTIwNTEzMjMzM1oXDTMyMTIwNTEzMjMzM1ow
+PzELMAkGA1UEBhMCVFcxMDAuBgNVBAoMJ0dvdmVybm1lbnQgUm9vdCBDZXJ0aWZp
+Y2F0aW9uIEF1dGhvcml0eTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
+AJoluOzMonWoe/fOW1mKydGGEghU7Jzy50b2iPN86aXfTEc2pBsBHH8eV4qNw8XR
+IePaJD9IK/ufLqGU5ywck9G/GwGHU5nOp/UKIXZ3/6m3xnOUT0b3EEk3+qhZSV1q
+gQdW8or5BtD3cCJNtLdBuTK4sfCxw5w/cP1T3YGq2GN49thTbqGsaoQkclSGxtKy
+yhwOeYHWtXBiCAEuTk8O1RGvqa/lmr/czIdtJuTJV6L7lvnM4T9TjGxMfptTCAts
+F/tnyMKtsc2AtJfcdgEWFelq16TheEfOhtX7MfP6Mb40qij7cEwdScevLJ1tZqa2
+jWR+tSBqnTuBto9AAGdLiYa4zGX+FVPpBMHWXx1E1wovJ5pGfaENda1UhhXcSTvx
+ls4Pm6Dso3pdvtUqdULle96ltqqvKKyskKw4t9VoNSZ63Pc78/1Fm9G7Q3hub/FC
+VGqY8A2tl+lSXunVanLeavcbYBT0peS2cWeqH+riTcFCQP5nRhc4L0c/cZyu5SHK
+YS1tB6iEfC3uUSXxY5Ce/eFXiGvviiNtsea9P63RPZYLhY3Naye7twWb7LuRqQoH
+EgKXTiCQ8P8NHuJBO9NAOueNXdpm5AKwB1KYXA6OM5zCppX7VRluTI6uSw+9wThN
+Xo+EHWbNxWCWtFJaBYmOlXqYwZE8lSOyDvR5tMl8wUohAgMBAAGjajBoMB0GA1Ud
+DgQWBBTMzO/MKWCkO7GStjz6MmKPrCUVOzAMBgNVHRMEBTADAQH/MDkGBGcqBwAE
+MTAvMC0CAQAwCQYFKw4DAhoFADAHBgVnKgMAAAQUA5vwIhP/lSg209yewDL7MTqK
+UWUwDQYJKoZIhvcNAQEFBQADggIBAECASvomyc5eMN1PhnR2WPWus4MzeKR6dBcZ
+TulStbngCnRiqmjKeKBMmo4sIy7VahIkv9Ro04rQ2JyftB8M3jh+Vzj8jeJPXgyf
+qzvS/3WXy6TjZwj/5cAWtUgBfen5Cv8b5Wppv3ghqMKnI6mGq3ZW6A4M9hPdKmaK
+ZEk9GhiHkASfQlK3T8v+R0F2Ne//AHY2RTKbxkaFXeIksB7jSJaYV0eUVXoPQbFE
+JPPB/hprv4j9wabak2BegUqZIJxIZhm1AHlUD7gsL0u8qV1bYH+Mh6XgUmMqvtg7
+hUAV/h62ZT/FS9p+tXo1KaMuephgIqP0fSdOLeq0dDzpD6QzDxARvBMB1uUO07+1
+EqLhRSPAzAhuYbeJq4PjJB7mXQfnHyA+z2fI56wwbSdLaG5LKlwCCDTb+HbkZ6Mm
+nD+iMsJKxYEYMRBWqoTvLQr/uB930r+lWKBi5NdLkXWNiYCYfm3LU05er/ayl4WX
+udpVBrkk7tfGOB5jGxI7leFYrPLfhNVfmS8NVVvmONsuP3LpSIXLuykTjx44Vbnz
+ssQwmSNOXfJIoRIM3BKQCZBUkQM8R+XVyWXgt0t97EfTsws+rZ7QdAAO671RrcDe
+LMDDav7v3Aun+kbfYNucpllQdSNpc5Oy+fwC00fmcc4QAu4njIT/rEUNE1yDMuAl
+pYYsfPQS
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Firmaprofesional Root CA"
+# Serial: 1
+# MD5 Fingerprint: 11:92:79:40:3c:b1:83:40:e5:ab:66:4a:67:92:80:df
+# SHA1 Fingerprint: a9:62:8f:4b:98:a9:1b:48:35:ba:d2:c1:46:32:86:bb:66:64:6a:8c
+# SHA256 Fingerprint: c1:cf:0b:52:09:64:35:e3:f1:b7:1d:aa:ec:45:5a:23:11:c8:40:4f:55:83:a9:e2:13:c6:9d:85:7d:94:33:05
+-----BEGIN CERTIFICATE-----
+MIIEVzCCAz+gAwIBAgIBATANBgkqhkiG9w0BAQUFADCBnTELMAkGA1UEBhMCRVMx
+IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
+HhcNMDExMDI0MjIwMDAwWhcNMTMxMDI0MjIwMDAwWjCBnTELMAkGA1UEBhMCRVMx
+IjAgBgNVBAcTGUMvIE11bnRhbmVyIDI0NCBCYXJjZWxvbmExQjBABgNVBAMTOUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1hcHJvZmVzaW9uYWwgQ0lGIEE2
+MjYzNDA2ODEmMCQGCSqGSIb3DQEJARYXY2FAZmlybWFwcm9mZXNpb25hbC5jb20w
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDnIwNvbyOlXnjOlSztlB5u
+Cp4Bx+ow0Syd3Tfom5h5VtP8c9/Qit5Vj1H5WuretXDE7aTt/6MNbg9kUDGvASdY
+rv5sp0ovFy3Tc9UTHI9ZpTQsHVQERc1ouKDAA6XPhUJHlShbz++AbOCQl4oBPB3z
+hxAwJkh91/zpnZFx/0GaqUC1N5wpIE8fUuOgfRNtVLcK3ulqTgesrBlf3H5idPay
+BQC6haD9HThuy1q7hryUZzM1gywfI834yJFxzJeL764P3CkDG8A563DtwW4O2GcL
+iam8NeTvtjS0pbbELaW+0MOUJEjb35bTALVmGotmBQ/dPz/LP6pemkr4tErvlTcb
+AgMBAAGjgZ8wgZwwKgYDVR0RBCMwIYYfaHR0cDovL3d3dy5maXJtYXByb2Zlc2lv
+bmFsLmNvbTASBgNVHRMBAf8ECDAGAQH/AgEBMCsGA1UdEAQkMCKADzIwMDExMDI0
+MjIwMDAwWoEPMjAxMzEwMjQyMjAwMDBaMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUMwugZtHq2s7eYpMEKFK1FH84aLcwDQYJKoZIhvcNAQEFBQADggEBAEdz/o0n
+VPD11HecJ3lXV7cVVuzH2Fi3AQL0M+2TUIiefEaxvT8Ub/GzR0iLjJcG1+p+o1wq
+u00vR+L4OQbJnC4xGgN49Lw4xiKLMzHwFgQEffl25EvXwOaD7FnMP97/T2u3Z36m
+hoEyIwOdyPdfwUpgpZKpsaSgYMN4h7Mi8yrrW6ntBas3D7Hi05V2Y1Z0jFhyGzfl
+ZKG+TQyTmAyX9odtsz/ny4Cm7YjHX1BiAuiZdBbQ5rQ58SfLyEDW44YQqSMSkuBp
+QWOnryULwMWSyx6Yo1q6xTMPoJcB3X/ge9YGVM+h4k0460tQtcsm9MracEpqoeJ5
+quGnM/b9Sh/22WA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority
+# Subject: CN=Wells Fargo Root Certificate Authority O=Wells Fargo OU=Wells Fargo Certification Authority
+# Label: "Wells Fargo Root CA"
+# Serial: 971282334
+# MD5 Fingerprint: 20:0b:4a:7a:88:a7:a9:42:86:8a:5f:74:56:7b:88:05
+# SHA1 Fingerprint: 93:e6:ab:22:03:03:b5:23:28:dc:da:56:9e:ba:e4:d1:d1:cc:fb:65
+# SHA256 Fingerprint: 03:45:8b:6a:be:ec:c2:14:95:3d:97:14:9a:f4:53:91:69:1d:e9:f9:cd:cc:26:47:86:3a:3d:67:c9:5c:24:3b
+-----BEGIN CERTIFICATE-----
+MIID5TCCAs2gAwIBAgIEOeSXnjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC
+VVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSwwKgYDVQQLEyNXZWxscyBGYXJnbyBD
+ZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0GA1UEAxMmV2VsbHMgRmFyZ28gUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDAxMDExMTY0MTI4WhcNMjEwMTE0
+MTY0MTI4WjCBgjELMAkGA1UEBhMCVVMxFDASBgNVBAoTC1dlbGxzIEZhcmdvMSww
+KgYDVQQLEyNXZWxscyBGYXJnbyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEvMC0G
+A1UEAxMmV2VsbHMgRmFyZ28gUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDVqDM7Jvk0/82bfuUER84A4n13
+5zHCLielTWi5MbqNQ1mXx3Oqfz1cQJ4F5aHiidlMuD+b+Qy0yGIZLEWukR5zcUHE
+SxP9cMIlrCL1dQu3U+SlK93OvRw6esP3E48mVJwWa2uv+9iWsWCaSOAlIiR5NM4O
+JgALTqv9i86C1y8IcGjBqAr5dE8Hq6T54oN+J3N0Prj5OEL8pahbSCOz6+MlsoCu
+ltQKnMJ4msZoGK43YjdeUXWoWGPAUe5AeH6orxqg4bB4nVCMe+ez/I4jsNtlAHCE
+AQgAFG5Uhpq6zPk3EPbg3oQtnaSFN9OH4xXQwReQfhkhahKpdv0SAulPIV4XAgMB
+AAGjYTBfMA8GA1UdEwEB/wQFMAMBAf8wTAYDVR0gBEUwQzBBBgtghkgBhvt7hwcB
+CzAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3LndlbGxzZmFyZ28uY29tL2NlcnRw
+b2xpY3kwDQYJKoZIhvcNAQEFBQADggEBANIn3ZwKdyu7IvICtUpKkfnRLb7kuxpo
+7w6kAOnu5+/u9vnldKTC2FJYxHT7zmu1Oyl5GFrvm+0fazbuSCUlFLZWohDo7qd/
+0D+j0MNdJu4HzMPBJCGHHt8qElNvQRbn7a6U+oxy+hNH8Dx+rn0ROhPs7fpvcmR7
+nX1/Jv16+yWt6j4pf0zjAFcysLPp7VMX2YuyFA4w6OXVE8Zkr8QA1dhYJPz1j+zx
+x32l2w8n0cbyQIjmH/ZhqPRCyLk306m+LFZ4wnKbWV01QIroTmMatukgalHizqSQ
+33ZwmVxwQ023tqcZZE6St8WRPH9IFmV7Fv3L/PvZ1dZPIWU7Sn9Ho/s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root CA 1 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root CA 1"
+# Serial: 122348795730808398873664200247279986742
+# MD5 Fingerprint: f8:38:7c:77:88:df:2c:16:68:2e:c2:e2:52:4b:b8:f9
+# SHA1 Fingerprint: 5f:3a:fc:0a:8b:64:f6:86:67:34:74:df:7e:a9:a2:fe:f9:fa:7a:51
+# SHA256 Fingerprint: 21:db:20:12:36:60:bb:2e:d4:18:20:5d:a1:1e:e7:a8:5a:65:e2:bc:6e:55:b5:af:7e:78:99:c8:a2:66:d9:2e
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQXAuFXAvnWUHfV8w/f52oNjANBgkqhkiG9w0BAQUFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMTAeFw0wNTA4MTgxMjA2MjBaFw0yNTA4MTgyMjA2MjBaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAxMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA0LmwqAzZuz8h+BvVM5OAFmUgdbI9
+m2BtRsiMMW8Xw/qabFbtPMWRV8PNq5ZJkCoZSx6jbVfd8StiKHVFXqrWW/oLJdih
+FvkcxC7mlSpnzNApbjyFNDhhSbEAn9Y6cV9Nbc5fuankiX9qUvrKm/LcqfmdmUc/
+TilftKaNXXsLmREDA/7n29uj/x2lzZAeAR81sH8A25Bvxn570e56eqeqDFdvpG3F
+EzuwpdntMhy0XmeLVNxzh+XTF3xmUHJd1BpYwdnP2IkCb6dJtDZd0KTeByy2dbco
+kdaXvij1mB7qWybJvbCXc9qukSbraMH5ORXWZ0sKbU/Lz7DkQnGMU3nn7uHbHaBu
+HYwadzVcFh4rUx80i9Fs/PJnB3r1re3WmquhsUvhzDdf/X/NTa64H5xD+SpYVUNF
+vJbNcA78yeNmuk6NO4HLFWR7uZToXTNShXEuT46iBhFRyePLoW4xCGQMwtI89Tbo
+19AOeCMgkckkKmUpWyL3Ic6DXqTz3kvTaI9GdVyDCW4pa8RwjPWd1yAv/0bSKzjC
+L3UcPX7ape8eYIVpQtPM+GP+HkM5haa2Y0EQs3MevNP6yn0WR+Kn1dCjigoIlmJW
+bjTb2QK5MHXjBNLnj8KwEUAKrNVxAmKLMb7dxiNYMUJDLXT5xp6mig/p/r+D5kNX
+JLrvRjSq1xIBOO0CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwABBgdghXQBUwABMBIGA1UdEwEB/wQIMAYBAf8CAQcwHwYDVR0j
+BBgwFoAUAyUv3m+CATpcLNwroWm1Z9SM0/0wHQYDVR0OBBYEFAMlL95vggE6XCzc
+K6FptWfUjNP9MA0GCSqGSIb3DQEBBQUAA4ICAQA1EMvspgQNDQ/NwNurqPKIlwzf
+ky9NfEBWMXrrpA9gzXrzvsMnjgM+pN0S734edAY8PzHyHHuRMSG08NBsl9Tpl7Ik
+Vh5WwzW9iAUPWxAaZOHHgjD5Mq2eUCzneAXQMbFamIp1TpBcahQq4FJHgmDmHtqB
+sfsUC1rxn9KVuj7QG9YVHaO+htXbD8BJZLsuUBlL0iT43R4HVtA4oJVwIHaM190e
+3p9xxCPvgxNcoyQVTSlAPGrEqdi3pkSlDfTgnXceQHAm/NrZNuR55LU/vJtlvrsR
+ls/bxig5OgjOR1tTWsWZ/l2p3e9M1MalrQLmjAcSHm8D0W+go/MpvRLHUKKwf4ip
+mXeascClOS5cfGniLLDqN2qk4Vrh9VDlg++luyqI54zb/W1elxmofmZ1a3Hqv7HH
+b6D0jqTsNFFbjCYDcKF31QESVwA12yPeDooomf2xEG9L/zgtYE4snOtnta1J7ksf
+rK/7DZBaZmBwXarNeNQk7shBoJMBkpxqnvy5JMWzFYJ+vq6VK+uxwNrjAWALXmms
+hFZhvnEX/h0TD/7Gh0Xp/jKgGg0TpJRVcaUWi7rKibCyx/yP2FS1k2Kdzs9Z+z0Y
+zirLNRWCXf9UIltxUvu3yf5gmwBBZPCqKuy2QkPOiWaByIufOVQDJdMWNY6E0F/6
+MBr1mmz0DlP5OlvRHA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Assured ID Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Assured ID Root CA"
+# Serial: 17154717934120587862167794914071425081
+# MD5 Fingerprint: 87:ce:0b:7b:2a:0e:49:00:e1:58:71:9b:37:a8:93:72
+# SHA1 Fingerprint: 05:63:b8:63:0d:62:d7:5a:bb:c8:ab:1e:4b:df:b5:a8:99:b2:4d:43
+# SHA256 Fingerprint: 3e:90:99:b5:01:5e:8f:48:6c:00:bc:ea:9d:11:1e:e7:21:fa:ba:35:5a:89:bc:f1:df:69:56:1e:3d:c6:32:5c
+-----BEGIN CERTIFICATE-----
+MIIDtzCCAp+gAwIBAgIQDOfg5RfYRv6P5WD8G/AwOTANBgkqhkiG9w0BAQUFADBl
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJv
+b3QgQ0EwHhcNMDYxMTEwMDAwMDAwWhcNMzExMTEwMDAwMDAwWjBlMQswCQYDVQQG
+EwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3d3cuZGlnaWNl
+cnQuY29tMSQwIgYDVQQDExtEaWdpQ2VydCBBc3N1cmVkIElEIFJvb3QgQ0EwggEi
+MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtDhXO5EOAXLGH87dg+XESpa7c
+JpSIqvTO9SA5KFhgDPiA2qkVlTJhPLWxKISKityfCgyDF3qPkKyK53lTXDGEKvYP
+mDI2dsze3Tyoou9q+yHyUmHfnyDXH+Kx2f4YZNISW1/5WBg1vEfNoTb5a3/UsDg+
+wRvDjDPZ2C8Y/igPs6eD1sNuRMBhNZYW/lmci3Zt1/GiSw0r/wty2p5g0I6QNcZ4
+VYcgoc/lbQrISXwxmDNsIumH0DJaoroTghHtORedmTpyoeb6pNnVFzF1roV9Iq4/
+AUaG9ih5yLHa5FcXxH4cDrC0kqZWs72yl+2qp/C3xag/lRbQ/6GW6whfGHdPAgMB
+AAGjYzBhMA4GA1UdDwEB/wQEAwIBhjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
+BBRF66Kv9JLLgjEtUYunpyGd823IDzAfBgNVHSMEGDAWgBRF66Kv9JLLgjEtUYun
+pyGd823IDzANBgkqhkiG9w0BAQUFAAOCAQEAog683+Lt8ONyc3pklL/3cmbYMuRC
+dWKuh+vy1dneVrOfzM4UKLkNl2BcEkxY5NM9g0lFWJc1aRqoR+pWxnmrEthngYTf
+fwk8lOa4JiwgvT2zKIn3X/8i4peEH+ll74fg38FnSbNd67IJKusm7Xi+fT8r87cm
+NW1fiQG2SVufAQWbqz0lwcy2f8Lxb4bG+mRo64EtlOtCt/qMHt1i8b5QZ7dsvfPx
+H2sMNgcWfzd8qVttevESRmCD1ycEvkvOl77DZypoEd+A5wwzZr8TDRRu838fYxAe
++o0bJW1sj6W3YQGx0qMmoRBxna3iw/nDmVG3KwcIzi7mULKn+gpFL6Lw8g==
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert Global Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert Global Root CA"
+# Serial: 10944719598952040374951832963794454346
+# MD5 Fingerprint: 79:e4:a9:84:0d:7d:3a:96:d7:c0:4f:e2:43:4c:89:2e
+# SHA1 Fingerprint: a8:98:5d:3a:65:e5:e5:c4:b2:d7:d6:6d:40:c6:dd:2f:b1:9c:54:36
+# SHA256 Fingerprint: 43:48:a0:e9:44:4c:78:cb:26:5e:05:8d:5e:89:44:b4:d8:4f:96:62:bd:26:db:25:7f:89:34:a4:43:c7:01:61
+-----BEGIN CERTIFICATE-----
+MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG
+9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB
+CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97
+nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt
+43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P
+T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4
+gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO
+BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR
+TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw
+DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr
+hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg
+06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF
+PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls
+YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk
+CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=
+-----END CERTIFICATE-----
+
+# Issuer: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Subject: CN=DigiCert High Assurance EV Root CA O=DigiCert Inc OU=www.digicert.com
+# Label: "DigiCert High Assurance EV Root CA"
+# Serial: 3553400076410547919724730734378100087
+# MD5 Fingerprint: d4:74:de:57:5c:39:b2:d3:9c:85:83:c5:c0:65:49:8a
+# SHA1 Fingerprint: 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a:61:c7:dc:25
+# SHA256 Fingerprint: 74:31:e5:f4:c3:c1:ce:46:90:77:4f:0b:61:e0:54:40:88:3b:a9:a0:1e:d0:0b:a6:ab:d7:80:6e:d3:b1:18:cf
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j
+ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3
+LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug
+RVYgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMbM5XPm
++9S75S0tMqbf5YE/yc0lSbZxKsPVlDRnogocsF9ppkCxxLeyj9CYpKlBWTrT3JTW
+PNt0OKRKzE0lgvdKpVMSOO7zSW1xkX5jtqumX8OkhPhPYlG++MXs2ziS4wblCJEM
+xChBVfvLWokVfnHoNb9Ncgk9vjo4UFt3MRuNs8ckRZqnrG0AFFoEt7oT61EKmEFB
+Ik5lYYeBQVCmeVyJ3hlKV9Uu5l0cUyx+mM0aBhakaHPQNAQTXKFx01p8VdteZOE3
+hzBWBOURtCmAEvF5OYiiAhF8J2a3iLd48soKqDirCmTCv2ZdlYTBoSUeh10aUAsg
+EsxBu24LUTi4S8sCAwEAAaNjMGEwDgYDVR0PAQH/BAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFLE+w2kD+L9HAdSYJhoIAu9jZCvDMB8GA1UdIwQYMBaA
+FLE+w2kD+L9HAdSYJhoIAu9jZCvDMA0GCSqGSIb3DQEBBQUAA4IBAQAcGgaX3Nec
+nzyIZgYIVyHbIUf4KmeqvxgydkAQV8GK83rZEWWONfqe/EW1ntlMMUu4kehDLI6z
+eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF
+hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2
+Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe
+vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep
++OkuE6N36B9K
+-----END CERTIFICATE-----
+
+# Issuer: CN=Class 2 Primary CA O=Certplus
+# Subject: CN=Class 2 Primary CA O=Certplus
+# Label: "Certplus Class 2 Primary CA"
+# Serial: 177770208045934040241468760488327595043
+# MD5 Fingerprint: 88:2c:8c:52:b8:a2:3c:f3:f7:bb:03:ea:ae:ac:42:0b
+# SHA1 Fingerprint: 74:20:74:41:72:9c:dd:92:ec:79:31:d8:23:10:8d:c2:81:92:e2:bb
+# SHA256 Fingerprint: 0f:99:3c:8a:ef:97:ba:af:56:87:14:0e:d5:9a:d1:82:1b:b4:af:ac:f0:aa:9a:58:b5:d5:7a:33:8a:3a:fb:cb
+-----BEGIN CERTIFICATE-----
+MIIDkjCCAnqgAwIBAgIRAIW9S/PY2uNp9pTXX8OlRCMwDQYJKoZIhvcNAQEFBQAw
+PTELMAkGA1UEBhMCRlIxETAPBgNVBAoTCENlcnRwbHVzMRswGQYDVQQDExJDbGFz
+cyAyIFByaW1hcnkgQ0EwHhcNOTkwNzA3MTcwNTAwWhcNMTkwNzA2MjM1OTU5WjA9
+MQswCQYDVQQGEwJGUjERMA8GA1UEChMIQ2VydHBsdXMxGzAZBgNVBAMTEkNsYXNz
+IDIgUHJpbWFyeSBDQTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANxQ
+ltAS+DXSCHh6tlJw/W/uz7kRy1134ezpfgSN1sxvc0NXYKwzCkTsA18cgCSR5aiR
+VhKC9+Ar9NuuYS6JEI1rbLqzAr3VNsVINyPi8Fo3UjMXEuLRYE2+L0ER4/YXJQyL
+kcAbmXuZVg2v7tK8R1fjeUl7NIknJITesezpWE7+Tt9avkGtrAjFGA7v0lPubNCd
+EgETjdyAYveVqUSISnFOYFWe2yMZeVYHDD9jC1yw4r5+FfyUM1hBOHTE4Y+L3yas
+H7WLO7dDWWuwJKZtkIvEcupdM5i3y95ee++U8Rs+yskhwcWYAqqi9lt3m/V+llU0
+HGdpwPFC40es/CgcZlUCAwEAAaOBjDCBiTAPBgNVHRMECDAGAQH/AgEKMAsGA1Ud
+DwQEAwIBBjAdBgNVHQ4EFgQU43Mt38sOKAze3bOkynm4jrvoMIkwEQYJYIZIAYb4
+QgEBBAQDAgEGMDcGA1UdHwQwMC4wLKAqoCiGJmh0dHA6Ly93d3cuY2VydHBsdXMu
+Y29tL0NSTC9jbGFzczIuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQCnVM+IRBnL39R/
+AN9WM2K191EBkOvDP9GIROkkXe/nFL0gt5o8AP5tn9uQ3Nf0YtaLcF3n5QRIqWh8
+yfFC82x/xXp8HVGIutIKPidd3i1RTtMTZGnkLuPT55sJmabglZvOGtd/vjzOUrMR
+FcEPF80Du5wlFbqidon8BvEY0JNLDnyCt6X09l/+7UCmnYR0ObncHoUW2ikbhiMA
+ybuJfm6AiB4vFLQDJKgybwOaRywwvlbGp0ICcBvqQNi6BQNwB6SW//1IMwrh3KWB
+kJtN3X3n57LNXMhqlfil9o3EXXgIvnsG1knPGTZQIy4I5p4FTUcY1Rbpsda2ENW7
+l7+ijrRU
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Subject: CN=DST Root CA X3 O=Digital Signature Trust Co.
+# Label: "DST Root CA X3"
+# Serial: 91299735575339953335919266965803778155
+# MD5 Fingerprint: 41:03:52:dc:0f:f7:50:1b:16:f0:02:8e:ba:6f:45:c5
+# SHA1 Fingerprint: da:c9:02:4f:54:d8:f6:df:94:93:5f:b1:73:26:38:ca:6a:d7:7c:13
+# SHA256 Fingerprint: 06:87:26:03:31:a7:24:03:d9:09:f1:05:e6:9b:cf:0d:32:e1:bd:24:93:ff:c6:d9:20:6d:11:bc:d6:77:07:39
+-----BEGIN CERTIFICATE-----
+MIIDSjCCAjKgAwIBAgIQRK+wgNajJ7qJMDmGLvhAazANBgkqhkiG9w0BAQUFADA/
+MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT
+DkRTVCBSb290IENBIFgzMB4XDTAwMDkzMDIxMTIxOVoXDTIxMDkzMDE0MDExNVow
+PzEkMCIGA1UEChMbRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3QgQ28uMRcwFQYDVQQD
+Ew5EU1QgUm9vdCBDQSBYMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AN+v6ZdQCINXtMxiZfaQguzH0yxrMMpb7NnDfcdAwRgUi+DoM3ZJKuM/IUmTrE4O
+rz5Iy2Xu/NMhD2XSKtkyj4zl93ewEnu1lcCJo6m67XMuegwGMoOifooUMM0RoOEq
+OLl5CjH9UL2AZd+3UWODyOKIYepLYYHsUmu5ouJLGiifSKOeDNoJjj4XLh7dIN9b
+xiqKqy69cK3FCxolkHRyxXtqqzTWMIn/5WgTe1QLyNau7Fqckh49ZLOMxt+/yUFw
+7BZy1SbsOFU5Q9D8/RhcQPGX69Wam40dutolucbY38EVAjqr2m7xPi71XAicPNaD
+aeQQmxkqtilX4+U9m5/wAl0CAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFMSnsaR7LHH62+FLkHX/xBVghYkQMA0GCSqG
+SIb3DQEBBQUAA4IBAQCjGiybFwBcqR7uKGY3Or+Dxz9LwwmglSBd49lZRNI+DT69
+ikugdB/OEIKcdBodfpga3csTS7MgROSR6cz8faXbauX+5v3gTt23ADq1cEmv8uXr
+AvHRAosZy5Q6XkjEGB5YGV8eAlrwDPGxrancWYaLbumR9YbK+rlmM6pZW87ipxZz
+R8srzJmwN0jP41ZL9c8PDHIyh8bwRLtTcm1D9SZImlJnt1ir/md2cXjbDaJWFBM5
+JDGFoqgCWjBH4d1QB7wCCZAA62RjYJsWvIjJEubSfZGL+T0yjWW06XyxV3bqxbYo
+Ob8VZRzI9neWagqNdwvYkQsEjgfbKbYK7p2CNTUQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
+# Subject: CN=DST ACES CA X6 O=Digital Signature Trust OU=DST ACES
+# Label: "DST ACES CA X6"
+# Serial: 17771143917277623872238992636097467865
+# MD5 Fingerprint: 21:d8:4c:82:2b:99:09:33:a2:eb:14:24:8d:8e:5f:e8
+# SHA1 Fingerprint: 40:54:da:6f:1c:3f:40:74:ac:ed:0f:ec:cd:db:79:d1:53:fb:90:1d
+# SHA256 Fingerprint: 76:7c:95:5a:76:41:2c:89:af:68:8e:90:a1:c7:0f:55:6c:fd:6b:60:25:db:ea:10:41:6d:7e:b6:83:1f:8c:40
+-----BEGIN CERTIFICATE-----
+MIIECTCCAvGgAwIBAgIQDV6ZCtadt3js2AdWO4YV2TANBgkqhkiG9w0BAQUFADBb
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXRGlnaXRhbCBTaWduYXR1cmUgVHJ1c3Qx
+ETAPBgNVBAsTCERTVCBBQ0VTMRcwFQYDVQQDEw5EU1QgQUNFUyBDQSBYNjAeFw0w
+MzExMjAyMTE5NThaFw0xNzExMjAyMTE5NThaMFsxCzAJBgNVBAYTAlVTMSAwHgYD
+VQQKExdEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdDERMA8GA1UECxMIRFNUIEFDRVMx
+FzAVBgNVBAMTDkRTVCBBQ0VTIENBIFg2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAuT31LMmU3HWKlV1j6IR3dma5WZFcRt2SPp/5DgO0PWGSvSMmtWPu
+ktKe1jzIDZBfZIGxqAgNTNj50wUoUrQBJcWVHAx+PhCEdc/BGZFjz+iokYi5Q1K7
+gLFViYsx+tC3dr5BPTCapCIlF3PoHuLTrCq9Wzgh1SpL11V94zpVvddtawJXa+ZH
+fAjIgrrep4c9oW24MFbCswKBXy314powGCi4ZtPLAZZv6opFVdbgnf9nKxcCpk4a
+ahELfrd755jWjHZvwTvbUJN+5dCOHze4vbrGn2zpfDPyMjwmR/onJALJfh1biEIT
+ajV8fTXpLmaRcpPVMibEdPVTo7NdmvYJywIDAQABo4HIMIHFMA8GA1UdEwEB/wQF
+MAMBAf8wDgYDVR0PAQH/BAQDAgHGMB8GA1UdEQQYMBaBFHBraS1vcHNAdHJ1c3Rk
+c3QuY29tMGIGA1UdIARbMFkwVwYKYIZIAWUDAgEBATBJMEcGCCsGAQUFBwIBFjto
+dHRwOi8vd3d3LnRydXN0ZHN0LmNvbS9jZXJ0aWZpY2F0ZXMvcG9saWN5L0FDRVMt
+aW5kZXguaHRtbDAdBgNVHQ4EFgQUCXIGThhDD+XWzMNqizF7eI+og7gwDQYJKoZI
+hvcNAQEFBQADggEBAKPYjtay284F5zLNAdMEA+V25FYrnJmQ6AgwbN99Pe7lv7Uk
+QIRJ4dEorsTCOlMwiPH1d25Ryvr/ma8kXxug/fKshMrfqfBfBC6tFr8hlxCBPeP/
+h40y3JTlR4peahPJlJU90u7INJXQgNStMgiAVDzgvVJT11J8smk/f3rPanTK+gQq
+nExaBqXpIK1FZg9p8d2/6eMyi/rgwYZNcjwu2JN4Cir42NInPRmJX1p7ijvMDNpR
+rscL9yuwNwXsvFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf2
+9w4LTJxoeHtxMcfrHuBnQfO3oKfN5XozNmr6mis=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=(c) 2005 TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş.
+# Label: "TURKTRUST Certificate Services Provider Root 1"
+# Serial: 1
+# MD5 Fingerprint: f1:6a:22:18:c9:cd:df:ce:82:1d:1d:b7:78:5c:a9:a5
+# SHA1 Fingerprint: 79:98:a3:08:e1:4d:65:85:e6:c2:1e:15:3a:71:9f:ba:5a:d3:4a:d9
+# SHA256 Fingerprint: 44:04:e3:3b:5e:14:0d:cf:99:80:51:fd:fc:80:28:c7:c8:16:15:c5:ee:73:7b:11:1b:58:82:33:a9:b5:35:a0
+-----BEGIN CERTIFICATE-----
+MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGDAJUUjEPMA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykg
+MjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8
+dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMxMDI3MTdaFw0xNTAz
+MjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2Vy
+dGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYD
+VQQHDAZBTktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kg
+xLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEu
+xZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7
+XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GXyGl8hMW0kWxsE2qkVa2k
+heiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8iSi9BB35J
+YbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5C
+urKZ8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1
+JuTm5Rh8i27fbMx4W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51
+b0dewQIDAQABoxAwDjAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV
+9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46sWrv7/hg0Uw2ZkUd82YCdAR7
+kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxEq8Sn5RTOPEFh
+fEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
+B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdA
+aLX/7KfS0zgYnNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKS
+RGQDJereW26fyfJOrN3H
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Kasım 2005
+# Label: "TURKTRUST Certificate Services Provider Root 2"
+# Serial: 1
+# MD5 Fingerprint: 37:a5:6e:d4:b1:25:84:97:b7:fd:56:15:7a:f9:a2:00
+# SHA1 Fingerprint: b4:35:d4:e1:11:9d:1c:66:90:a7:49:eb:b3:94:bd:63:7b:a7:82:b7
+# SHA256 Fingerprint: c4:70:cf:54:7e:23:02:b9:77:fb:29:dd:71:a8:9a:7b:6c:1f:60:77:7b:03:29:f5:60:17:f3:28:bf:4f:6b:e6
+-----BEGIN CERTIFICATE-----
+MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcNMDUxMTA3MTAwNzU3
+WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVrdHJv
+bmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJU
+UjEPMA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSw
+bGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWe
+LiAoYykgS2FzxLFtIDIwMDUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqeLCDe2JAOCtFp0if7qnef
+J1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKIx+XlZEdh
+R3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJ
+Qv2gQrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGX
+JHpsmxcPbe9TmJEr5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1p
+zpwACPI2/z7woQ8arBT9pmAPAgMBAAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58S
+Fq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8GA1UdEwEB/wQFMAMBAf8wDQYJ
+KoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/nttRbj2hWyfIvwq
+ECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
+Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFz
+gw2lGh1uEpJ+hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotH
+uFEJjOp9zYhys2AzsfAKRO8P9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LS
+y3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5UrbnBEI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Gold CA - G2 O=SwissSign AG
+# Label: "SwissSign Gold CA - G2"
+# Serial: 13492815561806991280
+# MD5 Fingerprint: 24:77:d9:a8:91:d1:3b:fa:88:2d:c2:ff:f8:cd:33:93
+# SHA1 Fingerprint: d8:c5:38:8a:b7:30:1b:1b:6e:d4:7a:e6:45:25:3a:6f:9f:1a:27:61
+# SHA256 Fingerprint: 62:dd:0b:e9:b9:f5:0a:16:3e:a0:f8:e7:5c:05:3b:1e:ca:57:ea:55:c8:68:8f:64:7c:68:81:f2:c8:35:7b:95
+-----BEGIN CERTIFICATE-----
+MIIFujCCA6KgAwIBAgIJALtAHEP1Xk+wMA0GCSqGSIb3DQEBBQUAMEUxCzAJBgNV
+BAYTAkNIMRUwEwYDVQQKEwxTd2lzc1NpZ24gQUcxHzAdBgNVBAMTFlN3aXNzU2ln
+biBHb2xkIENBIC0gRzIwHhcNMDYxMDI1MDgzMDM1WhcNMzYxMDI1MDgzMDM1WjBF
+MQswCQYDVQQGEwJDSDEVMBMGA1UEChMMU3dpc3NTaWduIEFHMR8wHQYDVQQDExZT
+d2lzc1NpZ24gR29sZCBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIIC
+CgKCAgEAr+TufoskDhJuqVAtFkQ7kpJcyrhdhJJCEyq8ZVeCQD5XJM1QiyUqt2/8
+76LQwB8CJEoTlo8jE+YoWACjR8cGp4QjK7u9lit/VcyLwVcfDmJlD909Vopz2q5+
+bbqBHH5CjCA12UNNhPqE21Is8w4ndwtrvxEvcnifLtg+5hg3Wipy+dpikJKVyh+c
+6bM8K8vzARO/Ws/BtQpgvd21mWRTuKCWs2/iJneRjOBiEAKfNA+k1ZIzUd6+jbqE
+emA8atufK+ze3gE/bk3lUIbLtK/tREDFylqM2tIrfKjuvqblCqoOpd8FUrdVxyJd
+MmqXl2MT28nbeTZ7hTpKxVKJ+STnnXepgv9VHKVxaSvRAiTysybUa9oEVeXBCsdt
+MDeQKuSeFDNeFhdVxVu1yzSJkvGdJo+hB9TGsnhQ2wwMC3wLjEHXuendjIj3o02y
+MszYF9rNt85mndT9Xv+9lz4pded+p2JYryU0pUHHPbwNUMoDAw8IWh+Vc3hiv69y
+FGkOpeUDDniOJihC8AcLYiAQZzlG+qkDzAQ4embvIIO1jEpWjpEA/I5cgt6IoMPi
+aG59je883WX0XaxR7ySArqpWl2/5rX3aYT+YdzylkbYcjCbaZaIJbcHiVOO5ykxM
+gI93e2CaHt+28kgeDrpOVG2Y4OGiGqJ3UM/EY5LsRxmd6+ZrzsECAwEAAaOBrDCB
+qTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUWyV7
+lqRlUX64OfPAeGZe6Drn8O4wHwYDVR0jBBgwFoAUWyV7lqRlUX64OfPAeGZe6Drn
+8O4wRgYDVR0gBD8wPTA7BglghXQBWQECAQEwLjAsBggrBgEFBQcCARYgaHR0cDov
+L3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIBACe6
+45R88a7A3hfm5djV9VSwg/S7zV4Fe0+fdWavPOhWfvxyeDgD2StiGwC5+OlgzczO
+UYrHUDFu4Up+GC9pWbY9ZIEr44OE5iKHjn3g7gKZYbge9LgriBIWhMIxkziWMaa5
+O1M/wySTVltpkuzFwbs4AOPsF6m43Md8AYOfMke6UiI0HTJ6CVanfCU2qT1L2sCC
+bwq7EsiHSycR+R4tx5M/nttfJmtS2S6K8RTGRI0Vqbe/vd6mGu6uLftIdxf+u+yv
+GPUqUfA5hJeVbG4bwyvEdGB5JbAKJ9/fXtI5z0V9QkvfsywexcZdylU6oJxpmo/a
+77KwPJ+HbBIrZXAVUjEaJM9vMSNQH4xPjyPDdEFjHFWoFN0+4FFQz/EbMFYOkrCC
+hdiDyyJkvC24JdVUorgG6q2SpCSgwYa1ShNqR88uC1aVVMvOmttqtKay20EIhid3
+92qgQmwLOM7XdVAyksLfKzAiSNDVQTglXaTpXZ/GlHXQRf0wl0OPkKsKx4ZzYEpp
+Ld6leNcG2mqeSz53OiATIgHQv2ieY2BrNU0LbbqhPcCT4H8js1WtciVORvnSFu+w
+ZMEBnunKoGqYDs/YYPIvSbjkQuE4NRb0yG5P94FW6LqjviOvrv1vA+ACOzB2+htt
+Qc8Bsem4yWb02ybzOqR08kkkW8mw0FfB+j564ZfJ
+-----END CERTIFICATE-----
+
+# Issuer: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Subject: CN=SwissSign Silver CA - G2 O=SwissSign AG
+# Label: "SwissSign Silver CA - G2"
+# Serial: 5700383053117599563
+# MD5 Fingerprint: e0:06:a1:c9:7d:cf:c9:fc:0d:c0:56:75:96:d8:62:13
+# SHA1 Fingerprint: 9b:aa:e5:9f:56:ee:21:cb:43:5a:be:25:93:df:a7:f0:40:d1:1d:cb
+# SHA256 Fingerprint: be:6c:4d:a2:bb:b9:ba:59:b6:f3:93:97:68:37:42:46:c3:c0:05:99:3f:a9:8f:02:0d:1d:ed:be:d4:8a:81:d5
+-----BEGIN CERTIFICATE-----
+MIIFvTCCA6WgAwIBAgIITxvUL1S7L0swDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UE
+BhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMYU3dpc3NTaWdu
+IFNpbHZlciBDQSAtIEcyMB4XDTA2MTAyNTA4MzI0NloXDTM2MTAyNTA4MzI0Nlow
+RzELMAkGA1UEBhMCQ0gxFTATBgNVBAoTDFN3aXNzU2lnbiBBRzEhMB8GA1UEAxMY
+U3dpc3NTaWduIFNpbHZlciBDQSAtIEcyMIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
+MIICCgKCAgEAxPGHf9N4Mfc4yfjDmUO8x/e8N+dOcbpLj6VzHVxumK4DV644N0Mv
+Fz0fyM5oEMF4rhkDKxD6LHmD9ui5aLlV8gREpzn5/ASLHvGiTSf5YXu6t+WiE7br
+YT7QbNHm+/pe7R20nqA1W6GSy/BJkv6FCgU+5tkL4k+73JU3/JHpMjUi0R86TieF
+nbAVlDLaYQ1HTWBCrpJH6INaUFjpiou5XaHc3ZlKHzZnu0jkg7Y360g6rw9njxcH
+6ATK72oxh9TAtvmUcXtnZLi2kUpCe2UuMGoM9ZDulebyzYLs2aFK7PayS+VFheZt
+eJMELpyCbTapxDFkH4aDCyr0NQp4yVXPQbBH6TCfmb5hqAaEuSh6XzjZG6k4sIN/
+c8HDO0gqgg8hm7jMqDXDhBuDsz6+pJVpATqJAHgE2cn0mRmrVn5bi4Y5FZGkECwJ
+MoBgs5PAKrYYC51+jUnyEEp/+dVGLxmSo5mnJqy7jDzmDrxHB9xzUfFwZC8I+bRH
+HTBsROopN4WSaGa8gzj+ezku01DwH/teYLappvonQfGbGHLy9YR0SslnxFSuSGTf
+jNFusB3hB48IHpmccelM2KX3RxIfdNFRnobzwqIjQAtz20um53MGjMGg6cFZrEb6
+5i/4z3GcRm25xBWNOHkDRUjvxF3XCO6HOSKGsg0PWEP3calILv3q1h8CAwEAAaOB
+rDCBqTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
+F6DNweRBtjpbO8tFnb0cwpj6hlgwHwYDVR0jBBgwFoAUF6DNweRBtjpbO8tFnb0c
+wpj6hlgwRgYDVR0gBD8wPTA7BglghXQBWQEDAQEwLjAsBggrBgEFBQcCARYgaHR0
+cDovL3JlcG9zaXRvcnkuc3dpc3NzaWduLmNvbS8wDQYJKoZIhvcNAQEFBQADggIB
+AHPGgeAn0i0P4JUw4ppBf1AsX19iYamGamkYDHRJ1l2E6kFSGG9YrVBWIGrGvShp
+WJHckRE1qTodvBqlYJ7YH39FkWnZfrt4csEGDyrOj4VwYaygzQu4OSlWhDJOhrs9
+xCrZ1x9y7v5RoSJBsXECYxqCsGKrXlcSH9/L3XWgwF15kIwb4FDm3jH+mHtwX6WQ
+2K34ArZv02DdQEsixT2tOnqfGhpHkXkzuoLcMmkDlm4fS/Bx/uNncqCxv1yL5PqZ
+IseEuRuNI5c/7SXgz2W79WEE790eslpBIlqhn10s6FvJbakMDHiqYMZWjwFaDGi8
+aRl5xB9+lwW/xekkUV7U1UtT7dkjWjYDZaPBA61BMPNGG4WQr2W11bHkFlt4dR2X
+em1ZqSqPe97Dh4kQmUlzeMg9vVE1dCrV8X5pGyq7O70luJpaPXJhkGaH7gzWTdQR
+dAtq/gsD/KNVV4n+SsuuWxcFyPKNIzFTONItaj+CuY0IavdeQXRuwxF+B6wpYJE/
+OMpXEA29MC/HpeZBoNquBYeaoKRlbEwJDIm6uNO5wJOKMPqN5ZprFQFOZ6raYlY+
+hAhm0sQ2fac+EPyI4NSA5QC9qvNOBqN6avlicuMJT+ubDgEj8Z+7fNzcbBGXJbLy
+tGMU0gYqZ4yD9c7qB9iaah7s5Aq7KkzrCWA5zspi2C5u
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Subject: CN=GeoTrust Primary Certification Authority O=GeoTrust Inc.
+# Label: "GeoTrust Primary Certification Authority"
+# Serial: 32798226551256963324313806436981982369
+# MD5 Fingerprint: 02:26:c3:01:5e:08:30:37:43:a9:d0:7d:cf:37:e6:bf
+# SHA1 Fingerprint: 32:3c:11:8e:1b:f7:b8:b6:52:54:e2:e2:10:0d:d6:02:90:37:f0:96
+# SHA256 Fingerprint: 37:d5:10:06:c5:12:ea:ab:62:64:21:f1:ec:8c:92:01:3f:c5:f8:2a:e9:8e:e5:33:eb:46:19:b8:de:b4:d0:6c
+-----BEGIN CERTIFICATE-----
+MIIDfDCCAmSgAwIBAgIQGKy1av1pthU6Y2yv2vrEoTANBgkqhkiG9w0BAQUFADBY
+MQswCQYDVQQGEwJVUzEWMBQGA1UEChMNR2VvVHJ1c3QgSW5jLjExMC8GA1UEAxMo
+R2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEx
+MjcwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMFgxCzAJBgNVBAYTAlVTMRYwFAYDVQQK
+Ew1HZW9UcnVzdCBJbmMuMTEwLwYDVQQDEyhHZW9UcnVzdCBQcmltYXJ5IENlcnRp
+ZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAvrgVe//UfH1nrYNke8hCUy3f9oQIIGHWAVlqnEQRr+92/ZV+zmEwu3qDXwK9
+AWbK7hWNb6EwnL2hhZ6UOvNWiAAxz9juapYC2e0DjPt1befquFUWBRaa9OBesYjA
+ZIVcFU2Ix7e64HXprQU9nceJSOC7KMgD4TCTZF5SwFlwIjVXiIrxlQqD17wxcwE0
+7e9GceBrAqg1cmuXm2bgyxx5X9gaBGgeRwLmnWDiNpcB3841kt++Z8dtd1k7j53W
+kBWUvEI0EME5+bEnPn7WinXFsq+W06Lem+SYvn3h6YGttm/81w7a4DSwDRp35+MI
+mO9Y+pyEtzavwt+s0vQQBnBxNQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQULNVQQZcVi/CPNmFbSvtr2ZnJM5IwDQYJ
+KoZIhvcNAQEFBQADggEBAFpwfyzdtzRP9YZRqSa+S7iq8XEN3GHHoOo0Hnp3DwQ1
+6CePbJC/kRYkRj5KTs4rFtULUh38H2eiAkUxT87z+gOneZ1TatnaYzr4gNfTmeGl
+4b7UVXGYNTq+k+qurUKykG/g/CFNNWMziUnWm07Kx+dOCQD32sfvmWKZd7aVIl6K
+oKv0uHiYyjgZmclynnjNS6yvGaBzEi38wkG6gZHaFloxt/m0cYASSJlyc1pZU8Fj
+UjPtp8nSOQJw+uCxQmYpqptR7TBUIhRf2asdweSU8Pj1K/fqynhG1riR/aYNKxoU
+AT6A8EKglQdebc3MS6RFjasS6LPeWuWgfOgPIh1a6Vk=
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA O=thawte, Inc. OU=Certification Services Division/(c) 2006 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA"
+# Serial: 69529181992039203566298953787712940909
+# MD5 Fingerprint: 8c:ca:dc:0b:22:ce:f5:be:72:ac:41:1a:11:a8:d8:12
+# SHA1 Fingerprint: 91:c6:d6:ee:3e:8a:c8:63:84:e5:48:c2:99:29:5c:75:6c:81:7b:81
+# SHA256 Fingerprint: 8d:72:2f:81:a9:c1:13:c0:79:1d:f1:36:a2:96:6d:b2:6c:95:0a:97:1d:b4:6b:41:99:f4:ea:54:b7:8b:fb:9f
+-----BEGIN CERTIFICATE-----
+MIIEIDCCAwigAwIBAgIQNE7VVyDV7exJ9C/ON9srbTANBgkqhkiG9w0BAQUFADCB
+qTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxHzAdBgNV
+BAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwHhcNMDYxMTE3MDAwMDAwWhcNMzYw
+NzE2MjM1OTU5WjCBqTELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5j
+LjEoMCYGA1UECxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYG
+A1UECxMvKGMpIDIwMDYgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
+IG9ubHkxHzAdBgNVBAMTFnRoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCsoPD7gFnUnMekz52hWXMJEEUMDSxuaPFs
+W0hoSVk3/AszGcJ3f8wQLZU0HObrTQmnHNK4yZc2AreJ1CRfBsDMRJSUjQJib+ta
+3RGNKJpchJAQeg29dGYvajig4tVUROsdB58Hum/u6f1OCyn1PoSgAfGcq/gcfomk
+6KHYcWUNo1F77rzSImANuVud37r8UVsLr5iy6S7pBOhih94ryNdOwUxkHt3Ph1i6
+Sk/KaAcdHJ1KxtUvkcx8cXIcxcBn6zL9yZJclNqFwJu/U30rCfSMnZEfl2pSy94J
+NqR32HuHUETVPm4pafs5SSYeCaWAe0At6+gnhcn+Yf1+5nyXHdWdAgMBAAGjQjBA
+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBR7W0XP
+r87Lev0xkhpqtvNG61dIUDANBgkqhkiG9w0BAQUFAAOCAQEAeRHAS7ORtvzw6WfU
+DW5FvlXok9LOAz/t2iWwHVfLHjp2oEzsUHboZHIMpKnxuIvW1oeEuzLlQRHAd9mz
+YJ3rG9XRbkREqaYB7FViHXe4XI5ISXycO1cRrK1zN44veFyQaEfZYGDm/Ac9IiAX
+xPcW6cTYcvnIc3zfFi8VqT79aie2oetaupgf1eNNZAqdE8hhuvU5HIe6uL17In/2
+/qxAeeWsEG89jxt5dovEN7MhGITlNgDrYyCZuen+MwS7QcjBAvlEYyCegc5C09Y/
+LHbTY5xZ3Y+m4Q6gLkH3LpVHz7z9M/P2C2F+fpErgUfCJzDupxBdN49cOSvkBPB7
+jVaMaA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G5 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2006 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G5"
+# Serial: 33037644167568058970164719475676101450
+# MD5 Fingerprint: cb:17:e4:31:67:3e:e2:09:fe:45:57:93:f3:0a:fa:1c
+# SHA1 Fingerprint: 4e:b6:d5:78:49:9b:1c:cf:5f:58:1e:ad:56:be:3d:9b:67:44:a5:e5
+# SHA256 Fingerprint: 9a:cf:ab:7e:43:c8:d8:80:d0:6b:26:2a:94:de:ee:e4:b4:65:99:89:c3:d0:ca:f1:9b:af:64:05:e4:1a:b7:df
+-----BEGIN CERTIFICATE-----
+MIIE0zCCA7ugAwIBAgIQGNrRniZ96LtKIVjNzGs7SjANBgkqhkiG9w0BAQUFADCB
+yjELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxW
+ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1
+nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex
+t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz
+SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG
+BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+
+rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/
+NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
+BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH
+BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28udmVy
+aXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFH/TZafC3ey78DAJ80M5+gKv
+MzEzMA0GCSqGSIb3DQEBBQUAA4IBAQCTJEowX2LP2BqYLz3q3JktvXf2pXkiOOzE
+p6B4Eq1iDkVwZMXnl2YtmAl+X6/WzChl8gGqCBpH3vn5fJJaCGkgDdk+bW48DW7Y
+5gaRQBi5+MHt39tBquCWIMnNZBU4gcmU7qKEKQsTb47bDN0lAtukixlE0kF6BWlK
+WE9gyn6CagsCqiUXObXbf+eEZSqVir2G3l6BFoMtEMze/aiCKm0oHw0LxOXnGiYZ
+4fQRbxC1lfznQgUy286dUV4otp6F01vvpX1FQHKOtw5rDgb7MzVIcbidJ4vEZV8N
+hnacRHr2lVz2XTIIM6RUthg/aFzyQkqFOFSDX9HoLPKsEdao7WNq
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureTrust CA O=SecureTrust Corporation
+# Subject: CN=SecureTrust CA O=SecureTrust Corporation
+# Label: "SecureTrust CA"
+# Serial: 17199774589125277788362757014266862032
+# MD5 Fingerprint: dc:32:c3:a7:6d:25:57:c7:68:09:9d:ea:2d:a9:a2:d1
+# SHA1 Fingerprint: 87:82:c6:c3:04:35:3b:cf:d2:96:92:d2:59:3e:7d:44:d9:34:ff:11
+# SHA256 Fingerprint: f1:c1:b5:0a:e5:a2:0d:d8:03:0e:c9:f6:bc:24:82:3d:d3:67:b5:25:57:59:b4:e7:1b:61:fc:e9:f7:37:5d:73
+-----BEGIN CERTIFICATE-----
+MIIDuDCCAqCgAwIBAgIQDPCOXAgWpa1Cf/DrJxhZ0DANBgkqhkiG9w0BAQUFADBI
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+FzAVBgNVBAMTDlNlY3VyZVRydXN0IENBMB4XDTA2MTEwNzE5MzExOFoXDTI5MTIz
+MTE5NDA1NVowSDELMAkGA1UEBhMCVVMxIDAeBgNVBAoTF1NlY3VyZVRydXN0IENv
+cnBvcmF0aW9uMRcwFQYDVQQDEw5TZWN1cmVUcnVzdCBDQTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKukgeWVzfX2FI7CT8rU4niVWJxB4Q2ZQCQXOZEz
+Zum+4YOvYlyJ0fwkW2Gz4BERQRwdbvC4u/jep4G6pkjGnx29vo6pQT64lO0pGtSO
+0gMdA+9tDWccV9cGrcrI9f4Or2YlSASWC12juhbDCE/RRvgUXPLIXgGZbf2IzIao
+wW8xQmxSPmjL8xk037uHGFaAJsTQ3MBv396gwpEWoGQRS0S8Hvbn+mPeZqx2pHGj
+7DaUaHp3pLHnDi+BeuK1cobvomuL8A/b01k/unK8RCSc43Oz969XL0Imnal0ugBS
+8kvNU3xHCzaFDmapCJcWNFfBZveA4+1wVMeT4C4oFVmHursCAwEAAaOBnTCBmjAT
+BgkrBgEEAYI3FAIEBh4EAEMAQTALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
+/zAdBgNVHQ4EFgQUQjK2FvoE/f5dS3rD/fdMQB1aQ68wNAYDVR0fBC0wKzApoCeg
+JYYjaHR0cDovL2NybC5zZWN1cmV0cnVzdC5jb20vU1RDQS5jcmwwEAYJKwYBBAGC
+NxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBADDtT0rhWDpSclu1pqNlGKa7UTt3
+6Z3q059c4EVlew3KW+JwULKUBRSuSceNQQcSc5R+DCMh/bwQf2AQWnL1mA6s7Ll/
+3XpvXdMc9P+IBWlCqQVxyLesJugutIxq/3HcuLHfmbx8IVQr5Fiiu1cprp6poxkm
+D5kuCLDv/WnPmRoJjeOnnyvJNjR7JLN4TJUXpAYmHrZkUjZfYGfZnMUFdAvnZyPS
+CPyI6a6Lf+Ew9Dd+/cYy2i2eRDAwbO4H3tI0/NL/QPZL9GZGBlSm8jIKYyYwa5vR
+3ItHuuG51WLQoqD0ZwV4KWMabwTW+MZMo5qxN7SN5ShLHZ4swrhovO0C7jE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Secure Global CA O=SecureTrust Corporation
+# Subject: CN=Secure Global CA O=SecureTrust Corporation
+# Label: "Secure Global CA"
+# Serial: 9751836167731051554232119481456978597
+# MD5 Fingerprint: cf:f4:27:0d:d4:ed:dc:65:16:49:6d:3d:da:bf:6e:de
+# SHA1 Fingerprint: 3a:44:73:5a:e5:81:90:1f:24:86:61:46:1e:3b:9c:c4:5f:f5:3a:1b
+# SHA256 Fingerprint: 42:00:f5:04:3a:c8:59:0e:bb:52:7d:20:9e:d1:50:30:29:fb:cb:d4:1c:a1:b5:06:ec:27:f1:5a:de:7d:ac:69
+-----BEGIN CERTIFICATE-----
+MIIDvDCCAqSgAwIBAgIQB1YipOjUiolN9BPI8PjqpTANBgkqhkiG9w0BAQUFADBK
+MQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3QgQ29ycG9yYXRpb24x
+GTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwHhcNMDYxMTA3MTk0MjI4WhcNMjkx
+MjMxMTk1MjA2WjBKMQswCQYDVQQGEwJVUzEgMB4GA1UEChMXU2VjdXJlVHJ1c3Qg
+Q29ycG9yYXRpb24xGTAXBgNVBAMTEFNlY3VyZSBHbG9iYWwgQ0EwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvNS7YrGxVaQZx5RNoJLNP2MwhR/jxYDiJ
+iQPpvepeRlMJ3Fz1Wuj3RSoC6zFh1ykzTM7HfAo3fg+6MpjhHZevj8fcyTiW89sa
+/FHtaMbQbqR8JNGuQsiWUGMu4P51/pinX0kuleM5M2SOHqRfkNJnPLLZ/kG5VacJ
+jnIFHovdRIWCQtBJwB1g8NEXLJXr9qXBkqPFwqcIYA1gBBCWeZ4WNOaptvolRTnI
+HmX5k/Wq8VLcmZg9pYYaDDUz+kulBAYVHDGA76oYa8J719rO+TMg1fW9ajMtgQT7
+sFzUnKPiXB3jqUJ1XnvUd+85VLrJChgbEplJL4hL/VBi0XPnj3pDAgMBAAGjgZ0w
+gZowEwYJKwYBBAGCNxQCBAYeBABDAEEwCwYDVR0PBAQDAgGGMA8GA1UdEwEB/wQF
+MAMBAf8wHQYDVR0OBBYEFK9EBMJBfkiD2045AuzshHrmzsmkMDQGA1UdHwQtMCsw
+KaAnoCWGI2h0dHA6Ly9jcmwuc2VjdXJldHJ1c3QuY29tL1NHQ0EuY3JsMBAGCSsG
+AQQBgjcVAQQDAgEAMA0GCSqGSIb3DQEBBQUAA4IBAQBjGghAfaReUw132HquHw0L
+URYD7xh8yOOvaliTFGCRsoTciE6+OYo68+aCiV0BN7OrJKQVDpI1WkpEXk5X+nXO
+H0jOZvQ8QCaSmGwb7iRGDBezUqXbpZGRzzfTb+cnCDpOGR86p1hcF895P4vkp9Mm
+I50mD1hp/Ed+stCNi5O/KU9DaXR2Z0vPB4zmAve14bRDtUstFJ/53CYNv6ZHdAbY
+iNE6KTCEztI5gGIbqMdXSbxqVVFnFUq+NQfk1XWYN3kwFNspnWzFacxHVaIw98xc
+f8LDmBxrThaA63p4ZUWiABqvDA1VZDRIuJK58bRQKfJPIx/abKwfROHdI3hRW8cW
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO Certification Authority O=COMODO CA Limited
+# Label: "COMODO Certification Authority"
+# Serial: 104350513648249232941998508985834464573
+# MD5 Fingerprint: 5c:48:dc:f7:42:72:ec:56:94:6d:1c:cc:71:35:80:75
+# SHA1 Fingerprint: 66:31:bf:9e:f7:4f:9e:b6:c9:d5:a6:0c:ba:6a:be:d1:f7:bd:ef:7b
+# SHA256 Fingerprint: 0c:2c:d6:3d:f7:80:6f:a3:99:ed:e8:09:11:6b:57:5b:f8:79:89:f0:65:18:f9:80:8c:86:05:03:17:8b:af:66
+-----BEGIN CERTIFICATE-----
+MIIEHTCCAwWgAwIBAgIQToEtioJl4AsC7j41AkblPTANBgkqhkiG9w0BAQUFADCB
+gTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G
+A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxJzAlBgNV
+BAMTHkNPTU9ETyBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAeFw0wNjEyMDEwMDAw
+MDBaFw0yOTEyMzEyMzU5NTlaMIGBMQswCQYDVQQGEwJHQjEbMBkGA1UECBMSR3Jl
+YXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFDT01P
+RE8gQ0EgTGltaXRlZDEnMCUGA1UEAxMeQ09NT0RPIENlcnRpZmljYXRpb24gQXV0
+aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ECLi3LjkRv3
+UcEbVASY06m/weaKXTuH+7uIzg3jLz8GlvCiKVCZrts7oVewdFFxze1CkU1B/qnI
+2GqGd0S7WWaXUF601CxwRM/aN5VCaTwwxHGzUvAhTaHYujl8HJ6jJJ3ygxaYqhZ8
+Q5sVW7euNJH+1GImGEaaP+vB+fGQV+useg2L23IwambV4EajcNxo2f8ESIl33rXp
++2dtQem8Ob0y2WIC8bGoPW43nOIv4tOiJovGuFVDiOEjPqXSJDlqR6sA1KGzqSX+
+DT+nHbrTUcELpNqsOO9VUCQFZUaTNE8tja3G1CEZ0o7KBWFxB3NH5YoZEr0ETc5O
+nKVIrLsm9wIDAQABo4GOMIGLMB0GA1UdDgQWBBQLWOWLxkwVN6RAqTCpIb5HNlpW
+/zAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zBJBgNVHR8EQjBAMD6g
+PKA6hjhodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9DZXJ0aWZpY2F0aW9u
+QXV0aG9yaXR5LmNybDANBgkqhkiG9w0BAQUFAAOCAQEAPpiem/Yb6dc5t3iuHXIY
+SdOH5EOC6z/JqvWote9VfCFSZfnVDeFs9D6Mk3ORLgLETgdxb8CPOGEIqB6BCsAv
+IC9Bi5HcSEW88cbeunZrM8gALTFGTO3nnc+IlP8zwFboJIYmuNg4ON8qa90SzMc/
+RxdMosIGlgnW2/4/PEZB31jiVg88O8EckzXZOFKs7sjsLjBOlDW0JB9LeGna8gI4
+zJVSk/BwJVmcIGfE7vmLV2H0knZ9P4SNVbfo5azV8fUZVqZa+5Acr5Pr5RzUZ5dd
+BA6+C4OmF4O5MBKgxTMVBbkN+8cFduPYSo38NBejxiEovjBFMR7HeL5YYTisO+IB
+ZQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Subject: CN=Network Solutions Certificate Authority O=Network Solutions L.L.C.
+# Label: "Network Solutions Certificate Authority"
+# Serial: 116697915152937497490437556386812487904
+# MD5 Fingerprint: d3:f3:a6:16:c0:fa:6b:1d:59:b1:2d:96:4d:0e:11:2e
+# SHA1 Fingerprint: 74:f8:a3:c3:ef:e7:b3:90:06:4b:83:90:3c:21:64:60:20:e5:df:ce
+# SHA256 Fingerprint: 15:f0:ba:00:a3:ac:7a:f3:ac:88:4c:07:2b:10:11:a0:77:bd:77:c0:97:f4:01:64:b2:f8:59:8a:bd:83:86:0c
+-----BEGIN CERTIFICATE-----
+MIID5jCCAs6gAwIBAgIQV8szb8JcFuZHFhfjkDFo4DANBgkqhkiG9w0BAQUFADBi
+MQswCQYDVQQGEwJVUzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMu
+MTAwLgYDVQQDEydOZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3Jp
+dHkwHhcNMDYxMjAxMDAwMDAwWhcNMjkxMjMxMjM1OTU5WjBiMQswCQYDVQQGEwJV
+UzEhMB8GA1UEChMYTmV0d29yayBTb2x1dGlvbnMgTC5MLkMuMTAwLgYDVQQDEydO
+ZXR3b3JrIFNvbHV0aW9ucyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDkvH6SMG3G2I4rC7xGzuAnlt7e+foS0zwz
+c7MEL7xxjOWftiJgPl9dzgn/ggwbmlFQGiaJ3dVhXRncEg8tCqJDXRfQNJIg6nPP
+OCwGJgl6cvf6UDL4wpPTaaIjzkGxzOTVHzbRijr4jGPiFFlp7Q3Tf2vouAPlT2rl
+mGNpSAW+Lv8ztumXWWn4Zxmuk2GWRBXTcrA/vGp97Eh/jcOrqnErU2lBUzS1sLnF
+BgrEsEX1QV1uiUV7PTsmjHTC5dLRfbIR1PtYMiKagMnc/Qzpf14Dl847ABSHJ3A4
+qY5usyd2mFHgBeMhqxrVhSI8KbWaFsWAqPS7azCPL0YCorEMIuDTAgMBAAGjgZcw
+gZQwHQYDVR0OBBYEFCEwyfsA106Y2oeqKtCnLrFAMadMMA4GA1UdDwEB/wQEAwIB
+BjAPBgNVHRMBAf8EBTADAQH/MFIGA1UdHwRLMEkwR6BFoEOGQWh0dHA6Ly9jcmwu
+bmV0c29sc3NsLmNvbS9OZXR3b3JrU29sdXRpb25zQ2VydGlmaWNhdGVBdXRob3Jp
+dHkuY3JsMA0GCSqGSIb3DQEBBQUAA4IBAQC7rkvnt1frf6ott3NHhWrB5KUd5Oc8
+6fRZZXe1eltajSU24HqXLjjAV2CDmAaDn7l2em5Q4LqILPxFzBiwmZVRDuwduIj/
+h1AcgsLj4DKAv6ALR8jDMe+ZZzKATxcheQxpXN5eNK4CtSbqUN9/GGUsyfJj4akH
+/nxxH2szJGoeBfcFaMBqEssuXmHLrijTfsK0ZpEmXzwuJF/LWA/rKOyvEZbz3Htv
+wKeI8lN3s2Berq4o2jUsbzRF0ybh3uxbTydrFny9RAQYgrOJeRcQcT16ohZO9QHN
+pGxlaKFJdlxDydi8NmdspZS11My5vWo1ViHe2MPr+8ukYEywVaCge1ey
+-----END CERTIFICATE-----
+
+# Issuer: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
+# Subject: CN=WellsSecure Public Root Certificate Authority O=Wells Fargo WellsSecure OU=Wells Fargo Bank NA
+# Label: "WellsSecure Public Root Certificate Authority"
+# Serial: 1
+# MD5 Fingerprint: 15:ac:a5:c2:92:2d:79:bc:e8:7f:cb:67:ed:02:cf:36
+# SHA1 Fingerprint: e7:b4:f6:9d:61:ec:90:69:db:7e:90:a7:40:1a:3c:f4:7d:4f:e8:ee
+# SHA256 Fingerprint: a7:12:72:ae:aa:a3:cf:e8:72:7f:7f:b3:9f:0f:b3:d1:e5:42:6e:90:60:b0:6e:e6:f1:3e:9a:3c:58:33:cd:43
+-----BEGIN CERTIFICATE-----
+MIIEvTCCA6WgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBhTELMAkGA1UEBhMCVVMx
+IDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxs
+cyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9v
+dCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkwHhcNMDcxMjEzMTcwNzU0WhcNMjIxMjE0
+MDAwNzU0WjCBhTELMAkGA1UEBhMCVVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdl
+bGxzU2VjdXJlMRwwGgYDVQQLDBNXZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQD
+DC1XZWxsc1NlY3VyZSBQdWJsaWMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkw
+ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDub7S9eeKPCCGeOARBJe+r
+WxxTkqxtnt3CxC5FlAM1iGd0V+PfjLindo8796jE2yljDpFoNoqXjopxaAkH5OjU
+Dk/41itMpBb570OYj7OeUt9tkTmPOL13i0Nj67eT/DBMHAGTthP796EfvyXhdDcs
+HqRePGj4S78NuR4uNuip5Kf4D8uCdXw1LSLWwr8L87T8bJVhHlfXBIEyg1J55oNj
+z7fLY4sR4r1e6/aN7ZVyKLSsEmLpSjPmgzKuBXWVvYSV2ypcm44uDLiBK0HmOFaf
+SZtsdvqKXfcBeYF8wYNABf5x/Qw/zE5gCQ5lRxAvAcAFP4/4s0HvWkJ+We/Slwxl
+AgMBAAGjggE0MIIBMDAPBgNVHRMBAf8EBTADAQH/MDkGA1UdHwQyMDAwLqAsoCqG
+KGh0dHA6Ly9jcmwucGtpLndlbGxzZmFyZ28uY29tL3dzcHJjYS5jcmwwDgYDVR0P
+AQH/BAQDAgHGMB0GA1UdDgQWBBQmlRkQ2eihl5H/3BnZtQQ+0nMKajCBsgYDVR0j
+BIGqMIGngBQmlRkQ2eihl5H/3BnZtQQ+0nMKaqGBi6SBiDCBhTELMAkGA1UEBhMC
+VVMxIDAeBgNVBAoMF1dlbGxzIEZhcmdvIFdlbGxzU2VjdXJlMRwwGgYDVQQLDBNX
+ZWxscyBGYXJnbyBCYW5rIE5BMTYwNAYDVQQDDC1XZWxsc1NlY3VyZSBQdWJsaWMg
+Um9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHmCAQEwDQYJKoZIhvcNAQEFBQADggEB
+ALkVsUSRzCPIK0134/iaeycNzXK7mQDKfGYZUMbVmO2rvwNa5U3lHshPcZeG1eMd
+/ZDJPHV3V3p9+N701NX3leZ0bh08rnyd2wIDBSxxSyU+B+NemvVmFymIGjifz6pB
+A4SXa5M4esowRBskRDPQ5NHcKDj0E0M1NSljqHyita04pO2t/caaH/+Xc/77szWn
+k4bGdpEA5qxRFsQnMlzbc9qlk1eOPm01JghZ1edE13YgY+esE2fDbbFwRnzVlhE9
+iW9dqKHrjQrawx0zbKPqZxmamX9LPYNRKh3KL4YMon4QLSvUFpULB6ouFJJJtylv
+2G0xffX8oRAHh84vWdw+WNs=
+-----END CERTIFICATE-----
+
+# Issuer: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Subject: CN=COMODO ECC Certification Authority O=COMODO CA Limited
+# Label: "COMODO ECC Certification Authority"
+# Serial: 41578283867086692638256921589707938090
+# MD5 Fingerprint: 7c:62:ff:74:9d:31:53:5e:68:4a:d5:78:aa:1e:bf:23
+# SHA1 Fingerprint: 9f:74:4e:9f:2b:4d:ba:ec:0f:31:2c:50:b6:56:3b:8e:2d:93:c3:11
+# SHA256 Fingerprint: 17:93:92:7a:06:14:54:97:89:ad:ce:2f:8f:34:f7:f0:b6:6d:0f:3a:e3:a3:b8:4d:21:ec:15:db:ba:4f:ad:c7
+-----BEGIN CERTIFICATE-----
+MIICiTCCAg+gAwIBAgIQH0evqmIAcFBUTAGem2OZKjAKBggqhkjOPQQDAzCBhTEL
+MAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UE
+BxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMT
+IkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwMzA2MDAw
+MDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdy
+ZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09N
+T0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBFQ0MgQ2VydGlmaWNhdGlv
+biBBdXRob3JpdHkwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQDR3svdcmCFYX7deSR
+FtSrYpn1PlILBs5BAH+X4QokPB0BBO490o0JlwzgdeT6+3eKKvUDYEs2ixYjFq0J
+cfRK9ChQtP6IHG4/bC8vCVlbpVsLM5niwz2J+Wos77LTBumjQjBAMB0GA1UdDgQW
+BBR1cacZSBm8nZ3qQUfflMRId5nTeTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/
+BAUwAwEB/zAKBggqhkjOPQQDAwNoADBlAjEA7wNbeqy3eApyt4jf/7VGFAkK+qDm
+fQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdv
+GDeAU/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
+-----END CERTIFICATE-----
+
+# Issuer: CN=IGC/A O=PM/SGDN OU=DCSSI
+# Subject: CN=IGC/A O=PM/SGDN OU=DCSSI
+# Label: "IGC/A"
+# Serial: 245102874772
+# MD5 Fingerprint: 0c:7f:dd:6a:f4:2a:b9:c8:9b:bd:20:7e:a9:db:5c:37
+# SHA1 Fingerprint: 60:d6:89:74:b5:c2:65:9e:8a:0f:c1:88:7c:88:d2:46:69:1b:18:2c
+# SHA256 Fingerprint: b9:be:a7:86:0a:96:2e:a3:61:1d:ab:97:ab:6d:a3:e2:1c:10:68:b9:7d:55:57:5e:d0:e1:12:79:c1:1c:89:32
+-----BEGIN CERTIFICATE-----
+MIIEAjCCAuqgAwIBAgIFORFFEJQwDQYJKoZIhvcNAQEFBQAwgYUxCzAJBgNVBAYT
+AkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAMBgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQ
+TS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEOMAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG
+9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2LmZyMB4XDTAyMTIxMzE0MjkyM1oXDTIw
+MTAxNzE0MjkyMlowgYUxCzAJBgNVBAYTAkZSMQ8wDQYDVQQIEwZGcmFuY2UxDjAM
+BgNVBAcTBVBhcmlzMRAwDgYDVQQKEwdQTS9TR0ROMQ4wDAYDVQQLEwVEQ1NTSTEO
+MAwGA1UEAxMFSUdDL0ExIzAhBgkqhkiG9w0BCQEWFGlnY2FAc2dkbi5wbS5nb3V2
+LmZyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsh/R0GLFMzvABIaI
+s9z4iPf930Pfeo2aSVz2TqrMHLmh6yeJ8kbpO0px1R2OLc/mratjUMdUC24SyZA2
+xtgv2pGqaMVy/hcKshd+ebUyiHDKcMCWSo7kVc0dJ5S/znIq7Fz5cyD+vfcuiWe4
+u0dzEvfRNWk68gq5rv9GQkaiv6GFGvm/5P9JhfejcIYyHF2fYPepraX/z9E0+X1b
+F8bc1g4oa8Ld8fUzaJ1O/Id8NhLWo4DoQw1VYZTqZDdH6nfK0LJYBcNdfrGoRpAx
+Vs5wKpayMLh35nnAvSk7/ZR3TL0gzUEl4C7HG7vupARB0l2tEmqKm0f7yd1GQOGd
+PDPQtQIDAQABo3cwdTAPBgNVHRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBRjAVBgNV
+HSAEDjAMMAoGCCqBegF5AQEBMB0GA1UdDgQWBBSjBS8YYFDCiQrdKyFP/45OqDAx
+NjAfBgNVHSMEGDAWgBSjBS8YYFDCiQrdKyFP/45OqDAxNjANBgkqhkiG9w0BAQUF
+AAOCAQEABdwm2Pp3FURo/C9mOnTgXeQp/wYHE4RKq89toB9RlPhJy3Q2FLwV3duJ
+L92PoF189RLrn544pEfMs5bZvpwlqwN+Mw+VgQ39FuCIvjfwbF3QMZsyK10XZZOY
+YLxuj7GoPB7ZHPOpJkL5ZB3C55L29B5aqhlSXa/oovdgoPaN8In1buAKBQGVyYsg
+Crpa/JosPL3Dt8ldeCUFP1YUmwza+zpI/pdpXsoQhvdOlgQITeywvl3cO45Pwf2a
+NjSaTFR+FwNIlQgRHAdvhQh+XU3Endv7rs6y0bO4g2wdsrN58dhwmX7wEwLOXt1R
+0982gaEbeC9xs/FZTEYYKKuF0mBWWg==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication EV RootCA1
+# Label: "Security Communication EV RootCA1"
+# Serial: 0
+# MD5 Fingerprint: 22:2d:a6:01:ea:7c:0a:f7:f0:6c:56:43:3f:77:76:d3
+# SHA1 Fingerprint: fe:b8:c4:32:dc:f9:76:9a:ce:ae:3d:d8:90:8f:fd:28:86:65:64:7d
+# SHA256 Fingerprint: a2:2d:ba:68:1e:97:37:6e:2d:39:7d:72:8a:ae:3a:9b:62:96:b9:fd:ba:60:bc:2e:11:f6:47:f2:c6:75:fb:37
+-----BEGIN CERTIFICATE-----
+MIIDfTCCAmWgAwIBAgIBADANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEqMCgGA1UECxMh
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBFViBSb290Q0ExMB4XDTA3MDYwNjAyMTIz
+MloXDTM3MDYwNjAyMTIzMlowYDELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09N
+IFRydXN0IFN5c3RlbXMgQ08uLExURC4xKjAoBgNVBAsTIVNlY3VyaXR5IENvbW11
+bmljYXRpb24gRVYgUm9vdENBMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBALx/7FebJOD+nLpCeamIivqA4PUHKUPqjgo0No0c+qe1OXj/l3X3L+SqawSE
+RMqm4miO/VVQYg+kcQ7OBzgtQoVQrTyWb4vVog7P3kmJPdZkLjjlHmy1V4qe70gO
+zXppFodEtZDkBp2uoQSXWHnvIEqCa4wiv+wfD+mEce3xDuS4GBPMVjZd0ZoeUWs5
+bmB2iDQL87PRsJ3KYeJkHcFGB7hj3R4zZbOOCVVSPbW9/wfrrWFVGCypaZhKqkDF
+MxRldAD5kd6vA0jFQFTcD4SQaCDFkpbcLuUCRarAX1T4bepJz11sS6/vmsJWXMY1
+VkJqMF/Cq/biPT+zyRGPMUzXn0kCAwEAAaNCMEAwHQYDVR0OBBYEFDVK9U2vP9eC
+OKyrcWUXdYydVZPmMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQCoh+ns+EBnXcPBZsdAS5f8hxOQWsTvoMpfi7ent/HW
+tWS3irO4G8za+6xmiEHO6Pzk2x6Ipu0nUBsCMCRGef4Eh3CXQHPRwMFXGZpppSeZ
+q51ihPZRwSzJIxXYKLerJRO1RuGGAv8mjMSIkh1W/hln8lXkgKNrnKt34VFxDSDb
+EJrbvXZ5B3eZKK2aXtqxT0QsNY6llsf9g/BYxnnWmHyojf6GPgcWkuF75x3sM3Z+
+Qi5KhfmRiWiEA4Glm5q+4zfFVKtWOxgtQaQM+ELbmaDgcm+7XeEWT1MKZPlO9L9O
+VL14bIjqv5wTJMJwaaJ/D8g8rQjJsJhAoyrniIPtd490
+-----END CERTIFICATE-----
+
+# Issuer: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Subject: CN=OISTE WISeKey Global Root GA CA O=WISeKey OU=Copyright (c) 2005/OISTE Foundation Endorsed
+# Label: "OISTE WISeKey Global Root GA CA"
+# Serial: 86718877871133159090080555911823548314
+# MD5 Fingerprint: bc:6c:51:33:a7:e9:d3:66:63:54:15:72:1b:21:92:93
+# SHA1 Fingerprint: 59:22:a1:e1:5a:ea:16:35:21:f8:98:39:6a:46:46:b0:44:1b:0f:a9
+# SHA256 Fingerprint: 41:c9:23:86:6a:b4:ca:d6:b7:ad:57:80:81:58:2e:02:07:97:a6:cb:df:4f:ff:78:ce:83:96:b3:89:37:d7:f5
+-----BEGIN CERTIFICATE-----
+MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCB
+ijELMAkGA1UEBhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHly
+aWdodCAoYykgMjAwNTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
+ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQSBDQTAeFw0w
+NTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYDVQQGEwJDSDEQMA4G
+A1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIwIAYD
+VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBX
+SVNlS2V5IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAy0+zAJs9Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxR
+VVuuk+g3/ytr6dTqvirdqFEr12bDYVxgAsj1znJ7O7jyTmUIms2kahnBAbtzptf2
+w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbDd50kc3vkDIzh2TbhmYsF
+mQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ/yxViJGg
+4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t9
+4B3RLoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQw
+EAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOx
+SPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vImMMkQyh2I+3QZH4VFvbBsUfk2
+ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4+vg1YFkCExh8
+vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
+hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZi
+Fj4A4xylNoEYokxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ
+/L7fCg0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
+# Subject: CN=Microsec e-Szigno Root CA O=Microsec Ltd. OU=e-Szigno CA
+# Label: "Microsec e-Szigno Root CA"
+# Serial: 272122594155480254301341951808045322001
+# MD5 Fingerprint: f0:96:b6:2f:c5:10:d5:67:8e:83:25:32:e8:5e:2e:e5
+# SHA1 Fingerprint: 23:88:c9:d3:71:cc:9e:96:3d:ff:7d:3c:a7:ce:fc:d6:25:ec:19:0d
+# SHA256 Fingerprint: 32:7a:3d:76:1a:ba:de:a0:34:eb:99:84:06:27:5c:b1:a4:77:6e:fd:ae:2f:df:6d:01:68:ea:1c:4f:55:67:d0
+-----BEGIN CERTIFICATE-----
+MIIHqDCCBpCgAwIBAgIRAMy4579OKRr9otxmpRwsDxEwDQYJKoZIhvcNAQEFBQAw
+cjELMAkGA1UEBhMCSFUxETAPBgNVBAcTCEJ1ZGFwZXN0MRYwFAYDVQQKEw1NaWNy
+b3NlYyBMdGQuMRQwEgYDVQQLEwtlLVN6aWdubyBDQTEiMCAGA1UEAxMZTWljcm9z
+ZWMgZS1Temlnbm8gUm9vdCBDQTAeFw0wNTA0MDYxMjI4NDRaFw0xNzA0MDYxMjI4
+NDRaMHIxCzAJBgNVBAYTAkhVMREwDwYDVQQHEwhCdWRhcGVzdDEWMBQGA1UEChMN
+TWljcm9zZWMgTHRkLjEUMBIGA1UECxMLZS1Temlnbm8gQ0ExIjAgBgNVBAMTGU1p
+Y3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQDtyADVgXvNOABHzNuEwSFpLHSQDCHZU4ftPkNEU6+r+ICbPHiN1I2u
+uO/TEdyB5s87lozWbxXGd36hL+BfkrYn13aaHUM86tnsL+4582pnS4uCzyL4ZVX+
+LMsvfUh6PXX5qqAnu3jCBspRwn5mS6/NoqdNAoI/gqyFxuEPkEeZlApxcpMqyabA
+vjxWTHOSJ/FrtfX9/DAFYJLG65Z+AZHCabEeHXtTRbjcQR/Ji3HWVBTji1R4P770
+Yjtb9aPs1ZJ04nQw7wHb4dSrmZsqa/i9phyGI0Jf7Enemotb9HI6QMVJPqW+jqpx
+62z69Rrkav17fVVA71hu5tnVvCSrwe+3AgMBAAGjggQ3MIIEMzBnBggrBgEFBQcB
+AQRbMFkwKAYIKwYBBQUHMAGGHGh0dHBzOi8vcmNhLmUtc3ppZ25vLmh1L29jc3Aw
+LQYIKwYBBQUHMAKGIWh0dHA6Ly93d3cuZS1zemlnbm8uaHUvUm9vdENBLmNydDAP
+BgNVHRMBAf8EBTADAQH/MIIBcwYDVR0gBIIBajCCAWYwggFiBgwrBgEEAYGoGAIB
+AQEwggFQMCgGCCsGAQUFBwIBFhxodHRwOi8vd3d3LmUtc3ppZ25vLmh1L1NaU1ov
+MIIBIgYIKwYBBQUHAgIwggEUHoIBEABBACAAdABhAG4A+gBzAO0AdAB2AOEAbgB5
+ACAA6QByAHQAZQBsAG0AZQB6AOkAcwDpAGgAZQB6ACAA6QBzACAAZQBsAGYAbwBn
+AGEAZADhAHMA4QBoAG8AegAgAGEAIABTAHoAbwBsAGcA4QBsAHQAYQB0APMAIABT
+AHoAbwBsAGcA4QBsAHQAYQB0AOEAcwBpACAAUwB6AGEAYgDhAGwAeQB6AGEAdABh
+ACAAcwB6AGUAcgBpAG4AdAAgAGsAZQBsAGwAIABlAGwAagDhAHIAbgBpADoAIABo
+AHQAdABwADoALwAvAHcAdwB3AC4AZQAtAHMAegBpAGcAbgBvAC4AaAB1AC8AUwBa
+AFMAWgAvMIHIBgNVHR8EgcAwgb0wgbqggbeggbSGIWh0dHA6Ly93d3cuZS1zemln
+bm8uaHUvUm9vdENBLmNybIaBjmxkYXA6Ly9sZGFwLmUtc3ppZ25vLmh1L0NOPU1p
+Y3Jvc2VjJTIwZS1Temlnbm8lMjBSb290JTIwQ0EsT1U9ZS1Temlnbm8lMjBDQSxP
+PU1pY3Jvc2VjJTIwTHRkLixMPUJ1ZGFwZXN0LEM9SFU/Y2VydGlmaWNhdGVSZXZv
+Y2F0aW9uTGlzdDtiaW5hcnkwDgYDVR0PAQH/BAQDAgEGMIGWBgNVHREEgY4wgYuB
+EGluZm9AZS1zemlnbm8uaHWkdzB1MSMwIQYDVQQDDBpNaWNyb3NlYyBlLVN6aWdu
+w7MgUm9vdCBDQTEWMBQGA1UECwwNZS1TemlnbsOzIEhTWjEWMBQGA1UEChMNTWlj
+cm9zZWMgS2Z0LjERMA8GA1UEBxMIQnVkYXBlc3QxCzAJBgNVBAYTAkhVMIGsBgNV
+HSMEgaQwgaGAFMegSXUWYYTbMUuE0vE3QJDvTtz3oXakdDByMQswCQYDVQQGEwJI
+VTERMA8GA1UEBxMIQnVkYXBlc3QxFjAUBgNVBAoTDU1pY3Jvc2VjIEx0ZC4xFDAS
+BgNVBAsTC2UtU3ppZ25vIENBMSIwIAYDVQQDExlNaWNyb3NlYyBlLVN6aWdubyBS
+b290IENBghEAzLjnv04pGv2i3GalHCwPETAdBgNVHQ4EFgQUx6BJdRZhhNsxS4TS
+8TdAkO9O3PcwDQYJKoZIhvcNAQEFBQADggEBANMTnGZjWS7KXHAM/IO8VbH0jgds
+ZifOwTsgqRy7RlRw7lrMoHfqaEQn6/Ip3Xep1fvj1KcExJW4C+FEaGAHQzAxQmHl
+7tnlJNUb3+FKG6qfx1/4ehHqE5MAyopYse7tDk2016g2JnzgOsHVV4Lxdbb9iV/a
+86g4nzUGCM4ilb7N1fy+W955a9x6qWVmvrElWl/tftOsRm1M9DKHtCAE4Gx4sHfR
+hUZLphK3dehKyVZs15KrnfVJONJPU+NVkBHbmJbGSfI+9J8b4PeI3CVimUTYc78/
+MPMMNz7UwiiAc7EBt51alhQBS6kRnSlqLtBdgcDPsiBDxwPgN05dCtxZICU=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certigna O=Dhimyotis
+# Subject: CN=Certigna O=Dhimyotis
+# Label: "Certigna"
+# Serial: 18364802974209362175
+# MD5 Fingerprint: ab:57:a6:5b:7d:42:82:19:b5:d8:58:26:28:5e:fd:ff
+# SHA1 Fingerprint: b1:2e:13:63:45:86:a4:6f:1a:b2:60:68:37:58:2d:c4:ac:fd:94:97
+# SHA256 Fingerprint: e3:b6:a2:db:2e:d7:ce:48:84:2f:7a:c5:32:41:c7:b7:1d:54:14:4b:fb:40:c1:1f:3f:1d:0b:42:f5:ee:a1:2d
+-----BEGIN CERTIFICATE-----
+MIIDqDCCApCgAwIBAgIJAP7c4wEPyUj/MA0GCSqGSIb3DQEBBQUAMDQxCzAJBgNV
+BAYTAkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hMB4X
+DTA3MDYyOTE1MTMwNVoXDTI3MDYyOTE1MTMwNVowNDELMAkGA1UEBhMCRlIxEjAQ
+BgNVBAoMCURoaW15b3RpczERMA8GA1UEAwwIQ2VydGlnbmEwggEiMA0GCSqGSIb3
+DQEBAQUAA4IBDwAwggEKAoIBAQDIaPHJ1tazNHUmgh7stL7qXOEm7RFHYeGifBZ4
+QCHkYJ5ayGPhxLGWkv8YbWkj4Sti993iNi+RB7lIzw7sebYs5zRLcAglozyHGxny
+gQcPOJAZ0xH+hrTy0V4eHpbNgGzOOzGTtvKg0KmVEn2lmsxryIRWijOp5yIVUxbw
+zBfsV1/pogqYCd7jX5xv3EjjhQsVWqa6n6xI4wmy9/Qy3l40vhx4XUJbzg4ij02Q
+130yGLMLLGq/jj8UEYkgDncUtT2UCIf3JR7VsmAA7G8qKCVuKj4YYxclPz5EIBb2
+JsglrgVKtOdjLPOMFlN+XPsRGgjBRmKfIrjxwo1p3Po6WAbfAgMBAAGjgbwwgbkw
+DwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUGu3+QTmQtCRZvgHyUtVF9lo53BEw
+ZAYDVR0jBF0wW4AUGu3+QTmQtCRZvgHyUtVF9lo53BGhOKQ2MDQxCzAJBgNVBAYT
+AkZSMRIwEAYDVQQKDAlEaGlteW90aXMxETAPBgNVBAMMCENlcnRpZ25hggkA/tzj
+AQ/JSP8wDgYDVR0PAQH/BAQDAgEGMBEGCWCGSAGG+EIBAQQEAwIABzANBgkqhkiG
+9w0BAQUFAAOCAQEAhQMeknH2Qq/ho2Ge6/PAD/Kl1NqV5ta+aDY9fm4fTIrv0Q8h
+bV6lUmPOEvjvKtpv6zf+EwLHyzs+ImvaYS5/1HI93TDhHkxAGYwP15zRgzB7mFnc
+fca5DClMoTOi62c6ZYTTluLtdkVwj7Ur3vkj1kluPBS1xp81HlDQwY9qcEQCYsuu
+HWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY1gkIl2PlwS6w
+t0QmwCbAr1UwnjvVNioZBPRcHv/PLLf/0P2HQBHVESO7SMAhqaQoLf0V+LBOK/Qw
+WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.
+# Subject: CN=AC Raíz Certicámara S.A. O=Sociedad Cameral de Certificación Digital - Certicámara S.A.
+# Label: "AC Ra\xC3\xADz Certic\xC3\xA1mara S.A."
+# Serial: 38908203973182606954752843738508300
+# MD5 Fingerprint: 93:2a:3e:f6:fd:23:69:0d:71:20:d4:2b:47:99:2b:a6
+# SHA1 Fingerprint: cb:a1:c5:f8:b0:e3:5e:b8:b9:45:12:d3:f9:34:a2:e9:06:10:d3:36
+# SHA256 Fingerprint: a6:c5:1e:0d:a5:ca:0a:93:09:d2:e4:c0:e4:0c:2a:f9:10:7a:ae:82:03:85:7f:e1:98:e3:e7:69:e3:43:08:5c
+-----BEGIN CERTIFICATE-----
+MIIGZjCCBE6gAwIBAgIPB35Sk3vgFeNX8GmMy+wMMA0GCSqGSIb3DQEBBQUAMHsx
+CzAJBgNVBAYTAkNPMUcwRQYDVQQKDD5Tb2NpZWRhZCBDYW1lcmFsIGRlIENlcnRp
+ZmljYWNpw7NuIERpZ2l0YWwgLSBDZXJ0aWPDoW1hcmEgUy5BLjEjMCEGA1UEAwwa
+QUMgUmHDrXogQ2VydGljw6FtYXJhIFMuQS4wHhcNMDYxMTI3MjA0NjI5WhcNMzAw
+NDAyMjE0MjAyWjB7MQswCQYDVQQGEwJDTzFHMEUGA1UECgw+U29jaWVkYWQgQ2Ft
+ZXJhbCBkZSBDZXJ0aWZpY2FjacOzbiBEaWdpdGFsIC0gQ2VydGljw6FtYXJhIFMu
+QS4xIzAhBgNVBAMMGkFDIFJhw616IENlcnRpY8OhbWFyYSBTLkEuMIICIjANBgkq
+hkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq2uJo1PMSCMI+8PPUZYILrgIem08kBeG
+qentLhM0R7LQcNzJPNCNyu5LF6vQhbCnIwTLqKL85XXbQMpiiY9QngE9JlsYhBzL
+fDe3fezTf3MZsGqy2IiKLUV0qPezuMDU2s0iiXRNWhU5cxh0T7XrmafBHoi0wpOQ
+Y5fzp6cSsgkiBzPZkc0OnB8OIMfuuzONj8LSWKdf/WU34ojC2I+GdV75LaeHM/J4
+Ny+LvB2GNzmxlPLYvEqcgxhaBvzz1NS6jBUJJfD5to0EfhcSM2tXSExP2yYe68yQ
+54v5aHxwD6Mq0Do43zeX4lvegGHTgNiRg0JaTASJaBE8rF9ogEHMYELODVoqDA+b
+MMCm8Ibbq0nXl21Ii/kDwFJnmxL3wvIumGVC2daa49AZMQyth9VXAnow6IYm+48j
+ilSH5L887uvDdUhfHjlvgWJsxS3EF1QZtzeNnDeRyPYL1epjb4OsOMLzP96a++Ej
+YfDIJss2yKHzMI+ko6Kh3VOz3vCaMh+DkXkwwakfU5tTohVTP92dsxA7SH2JD/zt
+A/X7JWR1DhcZDY8AFmd5ekD8LVkH2ZD6mq093ICK5lw1omdMEWux+IBkAC1vImHF
+rEsm5VoQgpukg3s0956JkSCXjrdCx2bD0Omk1vUgjcTDlaxECp1bczwmPS9KvqfJ
+pxAe+59QafMCAwEAAaOB5jCB4zAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQU0QnQ6dfOeXRU+Tows/RtLAMDG2gwgaAGA1UdIASBmDCB
+lTCBkgYEVR0gADCBiTArBggrBgEFBQcCARYfaHR0cDovL3d3dy5jZXJ0aWNhbWFy
+YS5jb20vZHBjLzBaBggrBgEFBQcCAjBOGkxMaW1pdGFjaW9uZXMgZGUgZ2FyYW50
+7WFzIGRlIGVzdGUgY2VydGlmaWNhZG8gc2UgcHVlZGVuIGVuY29udHJhciBlbiBs
+YSBEUEMuMA0GCSqGSIb3DQEBBQUAA4ICAQBclLW4RZFNjmEfAygPU3zmpFmps4p6
+xbD/CHwso3EcIRNnoZUSQDWDg4902zNc8El2CoFS3UnUmjIz75uny3XlesuXEpBc
+unvFm9+7OSPI/5jOCk0iAUgHforA1SBClETvv3eiiWdIG0ADBaGJ7M9i4z0ldma/
+Jre7Ir5v/zlXdLp6yQGVwZVR6Kss+LGGIOk/yzVb0hfpKv6DExdA7ohiZVvVO2Dp
+ezy4ydV/NgIlqmjCMRW3MGXrfx1IebHPOeJCgBbT9ZMj/EyXyVo3bHwi2ErN0o42
+gzmRkBDI8ck1fj+404HGIGQatlDCIaR43NAvO2STdPCWkPHv+wlaNECW8DYSwaN0
+jJN+Qd53i+yG2dIPPy3RzECiiWZIHiCznCNZc6lEc7wkeZBWN7PGKX6jD/EpOe9+
+XCgycDWs2rjIdWb8m0w5R44bb5tNAlQiM+9hup4phO9OSzNHdpdqy35f/RWmnkJD
+W2ZaiogN9xa5P1FlK2Zqi9E4UqLWRhH6/JocdJ6PlwsCT2TG9WjTSy3/pDceiz+/
+RL5hRqGEPQgnTIEgd4kI6mdAXmwIUV80WoyWaM3X94nCHNMyAK9Sy9NgWyo6R35r
+MDOhYil/SrnhLecUIw4OGEfhefwVVdCx/CVxY3UzHCMrr1zZ7Ud3YA47Dx7SwNxk
+BYn8eNZcLCZDqQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
+# Subject: CN=TC TrustCenter Class 2 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 2 CA
+# Label: "TC TrustCenter Class 2 CA II"
+# Serial: 941389028203453866782103406992443
+# MD5 Fingerprint: ce:78:33:5c:59:78:01:6e:18:ea:b9:36:a0:b9:2e:23
+# SHA1 Fingerprint: ae:50:83:ed:7c:f4:5c:bc:8f:61:c6:21:fe:68:5d:79:42:21:15:6e
+# SHA256 Fingerprint: e6:b8:f8:76:64:85:f8:07:ae:7f:8d:ac:16:70:46:1f:07:c0:a1:3e:ef:3a:1f:f7:17:53:8d:7a:ba:d3:91:b4
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYwMTEyMTQzODQzWhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jf
+tMjWQ+nEdVl//OEd+DFwIxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKg
+uNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2J
+XjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQXa7pIXSSTYtZgo+U4+lK
+8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7uSNQZu+99
+5OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3
+kUrL84J6E1wIqzCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iS
+GNn3Bzn1LL4GdXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprt
+ZjluS5TmVfwLG4t3wVMTZonZKNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8
+au0WOB9/WIFaGusyiC2y8zl3gK9etmF1KdsjTYjKUCjLhdLTEKJZbtOTVAB6okaV
+hgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kPJOzHdiEoZa5X6AeI
+dUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfkvQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
+# Subject: CN=TC TrustCenter Class 3 CA II O=TC TrustCenter GmbH OU=TC TrustCenter Class 3 CA
+# Label: "TC TrustCenter Class 3 CA II"
+# Serial: 1506523511417715638772220530020799
+# MD5 Fingerprint: 56:5f:aa:80:61:12:17:f6:67:21:e6:2b:6d:61:56:8e
+# SHA1 Fingerprint: 80:25:ef:f4:6e:70:c8:d4:72:24:65:84:fe:40:3b:8a:8d:6a:db:f5
+# SHA256 Fingerprint: 8d:a0:84:fc:f9:9c:e0:77:22:f8:9b:32:05:93:98:06:fa:5c:b8:11:e1:c8:13:f6:a1:08:c7:d3:36:b3:40:8e
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIOSkcAAQAC5aBd1j8AUb8wDQYJKoZIhvcNAQEFBQAwdjEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNV
+BAsTGVRDIFRydXN0Q2VudGVyIENsYXNzIDMgQ0ExJTAjBgNVBAMTHFRDIFRydXN0
+Q2VudGVyIENsYXNzIDMgQ0EgSUkwHhcNMDYwMTEyMTQ0MTU3WhcNMjUxMjMxMjI1
+OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIgR21i
+SDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQTElMCMGA1UEAxMc
+VEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMyBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBALTgu1G7OVyLBMVMeRwjhjEQY0NVJz/GRcekPewJDRoeIMJW
+Ht4bNwcwIi9v8Qbxq63WyKthoy9DxLCyLfzDlml7forkzMA5EpBCYMnMNWju2l+Q
+Vl/NHE1bWEnrDgFPZPosPIlY2C8u4rBo6SI7dYnWRBpl8huXJh0obazovVkdKyT2
+1oQDZogkAHhg8fir/gKya/si+zXmFtGt9i4S5Po1auUZuV3bOx4a+9P/FRQI2Alq
+ukWdFHlgfa9Aigdzs5OW03Q0jTo3Kd5c7PXuLjHCINy+8U9/I1LZW+Jk2ZyqBwi1
+Rb3R0DHBq1SfqdLDYmAD8bs5SpJKPQq5ncWg/jcCAwEAAaOCATQwggEwMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTUovyfs8PYA9NX
+XAek0CSnwPIA1DCB7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRy
+dXN0Y2VudGVyLmRlL2NybC92Mi90Y19jbGFzc18zX2NhX0lJLmNybIaBn2xkYXA6
+Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBUcnVzdENlbnRlciUyMENsYXNz
+JTIwMyUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21iSCxPVT1yb290
+Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
+TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEANmDkcPcGIEPZIxpC8vijsrlN
+irTzwppVMXzEO2eatN9NDoqTSheLG43KieHPOh6sHfGcMrSOWXaiQYUlN6AT0PV8
+TtXqluJucsG7Kv5sbviRmEb8yRtXW+rIGjs/sFGYPAfaLFkB2otE6OF0/ado3VS6
+g0bsyEa1+K+XwDsJHI/OcpY9M1ZwvJbL2NV9IJqDnxrcOfHFcqMRA/07QlIp2+gB
+95tejNaNhk4Z+rwcvsUhpYeeeC422wlxo3I0+GzjBgnyXlal092Y+tTmBvTwtiBj
+S+opvaqCZh77gaqnN60TGOaSw4HBM7uIHqHn4rS9MWwOUT1v+5ZWgOI2F9Hc5A==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Subject: CN=TC TrustCenter Universal CA I O=TC TrustCenter GmbH OU=TC TrustCenter Universal CA
+# Label: "TC TrustCenter Universal CA I"
+# Serial: 601024842042189035295619584734726
+# MD5 Fingerprint: 45:e1:a5:72:c5:a9:36:64:40:9e:f5:e4:58:84:67:8c
+# SHA1 Fingerprint: 6b:2f:34:ad:89:58:be:62:fd:b0:6b:5c:ce:bb:9d:d9:4f:4e:39:f3
+# SHA256 Fingerprint: eb:f3:c0:2a:87:89:b1:fb:7d:51:19:95:d6:63:b7:29:06:d9:13:ce:0d:5e:10:56:8a:8a:77:e2:58:61:67:e7
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTEL
+MAkGA1UEBhMCREUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNV
+BAsTG1RDIFRydXN0Q2VudGVyIFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1
+c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcNMDYwMzIyMTU1NDI4WhcNMjUxMjMx
+MjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1c3RDZW50ZXIg
+R21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYwJAYD
+VQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSR
+JJZ4Hgmgm5qVSkr1YnwCqMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3T
+fCZdzHd55yx4Oagmcw6iXSVphU9VDprvxrlE4Vc93x9UIuVvZaozhDrzznq+VZeu
+jRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtwag+1m7Z3W0hZneTvWq3z
+wZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9OgdwZu5GQ
+fezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYD
+VR0jBBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0G
+CSqGSIb3DQEBBQUAA4IBAQAo0uCG1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X1
+7caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/CyvwbZ71q+s2IhtNerNXxTPqYn
+8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3ghUJGooWMNjs
+ydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
+ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/
+2TYcuiUaUj0a7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
+-----END CERTIFICATE-----
+
+# Issuer: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Subject: CN=Deutsche Telekom Root CA 2 O=Deutsche Telekom AG OU=T-TeleSec Trust Center
+# Label: "Deutsche Telekom Root CA 2"
+# Serial: 38
+# MD5 Fingerprint: 74:01:4a:91:b1:08:c4:58:ce:47:cd:f0:dd:11:53:08
+# SHA1 Fingerprint: 85:a4:08:c0:9c:19:3e:5d:51:58:7d:cd:d6:13:30:fd:8c:de:37:bf
+# SHA256 Fingerprint: b6:19:1a:50:d0:c3:97:7f:7d:a9:9b:cd:aa:c8:6a:22:7d:ae:b9:67:9e:c7:0b:a3:b0:c9:d9:22:71:c1:70:d3
+-----BEGIN CERTIFICATE-----
+MIIDnzCCAoegAwIBAgIBJjANBgkqhkiG9w0BAQUFADBxMQswCQYDVQQGEwJERTEc
+MBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxlU2Vj
+IFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290IENB
+IDIwHhcNOTkwNzA5MTIxMTAwWhcNMTkwNzA5MjM1OTAwWjBxMQswCQYDVQQGEwJE
+RTEcMBoGA1UEChMTRGV1dHNjaGUgVGVsZWtvbSBBRzEfMB0GA1UECxMWVC1UZWxl
+U2VjIFRydXN0IENlbnRlcjEjMCEGA1UEAxMaRGV1dHNjaGUgVGVsZWtvbSBSb290
+IENBIDIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCrC6M14IspFLEU
+ha88EOQ5bzVdSq7d6mGNlUn0b2SjGmBmpKlAIoTZ1KXleJMOaAGtuU1cOs7TuKhC
+QN/Po7qCWWqSG6wcmtoIKyUn+WkjR/Hg6yx6m/UTAtB+NHzCnjwAWav12gz1Mjwr
+rFDa1sPeg5TKqAyZMg4ISFZbavva4VhYAUlfckE8FQYBjl2tqriTtM2e66foai1S
+NNs671x1Udrb8zH57nGYMsRUFUQM+ZtV7a3fGAigo4aKSe5TBY8ZTNXeWHmb0moc
+QqvF1afPaA+W5OFhmHZhyJF81j4A4pFQh+GdCuatl9Idxjp9y7zaAzTVjlsB9WoH
+txa2bkp/AgMBAAGjQjBAMB0GA1UdDgQWBBQxw3kbuvVT1xfgiXotF2wKsyudMzAP
+BgNVHRMECDAGAQH/AgEFMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAlGRZrTlk5ynrE/5aw4sTV8gEJPB0d8Bg42f76Ymmg7+Wgnxu1MM9756Abrsp
+tJh6sTtU6zkXR34ajgv8HzFZMQSyzhfzLMdiNlXiItiJVbSYSKpk+tYcNthEeFpa
+IzpXl/V6ME+un2pMSyuOoAPjPuCp1NJ70rOo4nI8rZ7/gFnkm0W09juwzTkZmDLl
+6iFhkOQxIY40sfcvNUqFENrnijchvllj4PKFiDFT1FQUhXB59C4Gdyd1Lx+4ivn+
+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
+Cm26OWMohpLzGITY+9HPBVZkVw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=ComSign Secured CA O=ComSign
+# Subject: CN=ComSign Secured CA O=ComSign
+# Label: "ComSign Secured CA"
+# Serial: 264725503855295744117309814499492384489
+# MD5 Fingerprint: 40:01:25:06:8d:21:43:6a:0e:43:00:9c:e7:43:f3:d5
+# SHA1 Fingerprint: f9:cd:0e:2c:da:76:24:c1:8f:bd:f0:f0:ab:b6:45:b8:f7:fe:d5:7a
+# SHA256 Fingerprint: 50:79:41:c7:44:60:a0:b4:70:86:22:0d:4e:99:32:57:2a:b5:d1:b5:bb:cb:89:80:ab:1c:b1:76:51:a8:44:d2
+-----BEGIN CERTIFICATE-----
+MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAw
+PDEbMBkGA1UEAxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWdu
+MQswCQYDVQQGEwJJTDAeFw0wNDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwx
+GzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBDQTEQMA4GA1UEChMHQ29tU2lnbjEL
+MAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGtWhf
+HZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs49oh
+gHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sW
+v+bznkqH7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ue
+Mv5WJDmyVIRD9YTC2LxBkMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr
+9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d19guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt
+6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUwAwEB/zBEBgNVHR8EPTA7
+MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29tU2lnblNl
+Y3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58
+ADsAj8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkq
+hkiG9w0BAQUFAAOCAQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7p
+iL1DRYHjZiM/EoZNGeQFsOY3wo3aBijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtC
+dsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtpFhpFfTMDZflScZAmlaxMDPWL
+kz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP51qJThRv4zdL
+hfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
+OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Subject: CN=Cybertrust Global Root O=Cybertrust, Inc
+# Label: "Cybertrust Global Root"
+# Serial: 4835703278459682877484360
+# MD5 Fingerprint: 72:e4:4a:87:e3:69:40:80:77:ea:bc:e3:f4:ff:f0:e1
+# SHA1 Fingerprint: 5f:43:e5:b1:bf:f8:78:8c:ac:1c:c7:ca:4a:9a:c6:22:2b:cc:34:c6
+# SHA256 Fingerprint: 96:0a:df:00:63:e9:63:56:75:0c:29:65:dd:0a:08:67:da:0b:9c:bd:6e:77:71:4a:ea:fb:23:49:ab:39:3d:a3
+-----BEGIN CERTIFICATE-----
+MIIDoTCCAomgAwIBAgILBAAAAAABD4WqLUgwDQYJKoZIhvcNAQEFBQAwOzEYMBYG
+A1UEChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2Jh
+bCBSb290MB4XDTA2MTIxNTA4MDAwMFoXDTIxMTIxNTA4MDAwMFowOzEYMBYGA1UE
+ChMPQ3liZXJ0cnVzdCwgSW5jMR8wHQYDVQQDExZDeWJlcnRydXN0IEdsb2JhbCBS
+b290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA+Mi8vRRQZhP/8NN5
+7CPytxrHjoXxEnOmGaoQ25yiZXRadz5RfVb23CO21O1fWLE3TdVJDm71aofW0ozS
+J8bi/zafmGWgE07GKmSb1ZASzxQG9Dvj1Ci+6A74q05IlG2OlTEQXO2iLb3VOm2y
+HLtgwEZLAfVJrn5GitB0jaEMAs7u/OePuGtm839EAL9mJRQr3RAwHQeWP032a7iP
+t3sMpTjr3kfb1V05/Iin89cqdPHoWqI7n1C6poxFNcJQZZXcY4Lv3b93TZxiyWNz
+FtApD0mpSPCzqrdsxacwOUBdrsTiXSZT8M4cIwhhqJQZugRiQOwfOHB3EgZxpzAY
+XSUnpQIDAQABo4GlMIGiMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/
+MB0GA1UdDgQWBBS2CHsNesysIEyGVjJez6tuhS1wVzA/BgNVHR8EODA2MDSgMqAw
+hi5odHRwOi8vd3d3Mi5wdWJsaWMtdHJ1c3QuY29tL2NybC9jdC9jdHJvb3QuY3Js
+MB8GA1UdIwQYMBaAFLYIew16zKwgTIZWMl7Pq26FLXBXMA0GCSqGSIb3DQEBBQUA
+A4IBAQBW7wojoFROlZfJ+InaRcHUowAl9B8Tq7ejhVhpwjCt2BWKLePJzYFa+HMj
+Wqd8BfP9IjsO0QbE2zZMcwSO5bAi5MXzLqXZI+O4Tkogp24CJJ8iYGd7ix1yCcUx
+XOl5n4BHPa2hCwcUPUf/A2kaDAtE52Mlp3+yybh2hO0j9n0Hq0V+09+zv+mKts2o
+omcrUtW3ZfA5TGOgkXmTUg9U3YO7n9GPp1Nzw8v/MOx8BLjYRB+TX3EJIrduPuoc
+A06dGiBh+4E37F78CkWr1+cXVdCg6mCbpvbjjFspwgZgFJ0tl0ypkxWdYcQBX0jW
+WL1WMRJOEcgh4LMRkWXbtKaIOM5V
+-----END CERTIFICATE-----
+
+# Issuer: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Subject: O=Chunghwa Telecom Co., Ltd. OU=ePKI Root Certification Authority
+# Label: "ePKI Root Certification Authority"
+# Serial: 28956088682735189655030529057352760477
+# MD5 Fingerprint: 1b:2e:00:ca:26:06:90:3d:ad:fe:6f:15:68:d3:6b:b3
+# SHA1 Fingerprint: 67:65:0d:f1:7e:8e:7e:5b:82:40:a4:f4:56:4b:cf:e2:3d:69:c6:f0
+# SHA256 Fingerprint: c0:a6:f4:dc:63:a2:4b:fd:cf:54:ef:2a:6a:08:2a:0a:72:de:35:80:3e:2f:f5:ff:52:7a:e5:d8:72:06:df:d5
+-----BEGIN CERTIFICATE-----
+MIIFsDCCA5igAwIBAgIQFci9ZUdcr7iXAF7kBtK8nTANBgkqhkiG9w0BAQUFADBe
+MQswCQYDVQQGEwJUVzEjMCEGA1UECgwaQ2h1bmdod2EgVGVsZWNvbSBDby4sIEx0
+ZC4xKjAoBgNVBAsMIWVQS0kgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wNDEyMjAwMjMxMjdaFw0zNDEyMjAwMjMxMjdaMF4xCzAJBgNVBAYTAlRXMSMw
+IQYDVQQKDBpDaHVuZ2h3YSBUZWxlY29tIENvLiwgTHRkLjEqMCgGA1UECwwhZVBL
+SSBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIICIjANBgkqhkiG9w0BAQEF
+AAOCAg8AMIICCgKCAgEA4SUP7o3biDN1Z82tH306Tm2d0y8U82N0ywEhajfqhFAH
+SyZbCUNsIZ5qyNUD9WBpj8zwIuQf5/dqIjG3LBXy4P4AakP/h2XGtRrBp0xtInAh
+ijHyl3SJCRImHJ7K2RKilTza6We/CKBk49ZCt0Xvl/T29de1ShUCWH2YWEtgvM3X
+DZoTM1PRYfl61dd4s5oz9wCGzh1NlDivqOx4UXCKXBCDUSH3ET00hl7lSM2XgYI1
+TBnsZfZrxQWh7kcT1rMhJ5QQCtkkO7q+RBNGMD+XPNjX12ruOzjjK9SXDrkb5wdJ
+fzcq+Xd4z1TtW0ado4AOkUPB1ltfFLqfpo0kR0BZv3I4sjZsN/+Z0V0OWQqraffA
+sgRFelQArr5T9rXn4fg8ozHSqf4hUmTFpmfwdQcGlBSBVcYn5AGPF8Fqcde+S/uU
+WH1+ETOxQvdibBjWzwloPn9s9h6PYq2lY9sJpx8iQkEeb5mKPtf5P0B6ebClAZLS
+nT0IFaUQAS2zMnaolQ2zepr7BxB4EW/hj8e6DyUadCrlHJhBmd8hh+iVBmoKs2pH
+dmX2Os+PYhcZewoozRrSgx4hxyy/vv9haLdnG7t4TY3OZ+XkwY63I2binZB1NJip
+NiuKmpS5nezMirH4JYlcWrYvjB9teSSnUmjDhDXiZo1jDiVN1Rmy5nk3pyKdVDEC
+AwEAAaNqMGgwHQYDVR0OBBYEFB4M97Zn8uGSJglFwFU5Lnc/QkqiMAwGA1UdEwQF
+MAMBAf8wOQYEZyoHAAQxMC8wLQIBADAJBgUrDgMCGgUAMAcGBWcqAwAABBRFsMLH
+ClZ87lt4DJX5GFPBphzYEDANBgkqhkiG9w0BAQUFAAOCAgEACbODU1kBPpVJufGB
+uvl2ICO1J2B01GqZNF5sAFPZn/KmsSQHRGoqxqWOeBLoR9lYGxMqXnmbnwoqZ6Yl
+PwZpVnPDimZI+ymBV3QGypzqKOg4ZyYr8dW1P2WT+DZdjo2NQCCHGervJ8A9tDkP
+JXtoUHRVnAxZfVo9QZQlUgjgRywVMRnVvwdVxrsStZf0X4OFunHB2WyBEXYKCrC/
+gpf36j36+uwtqSiUO1bd0lEursC9CBWMd1I0ltabrNMdjmEPNXubrjlpC2JgQCA2
+j6/7Nu4tCEoduL+bXPjqpRugc6bY+G7gMwRfaKonh+3ZwZCc7b3jajWvY9+rGNm6
+5ulK6lCKD2GTHuItGeIwlDWSXQ62B68ZgI9HkFFLLk3dheLSClIKF5r8GrBQAuUB
+o2M3IUxExJtRmREOc5wGj1QupyheRDmHVi03vYVElOEMSyycw5KFNGHLD7ibSkNS
+/jQ6fbjpKdx2qcgw+BRxgMYeNkh0IkFch4LoGHGLQYlE535YW6i4jRPpp2zDR+2z
+Gp1iro2C6pSe3VkQw63d4k3jMdXH7OjysP6SHhYKGvzZ8/gntsm+HbRsZJB/9OTE
+W9c3rkIO3aQab3yIVMUWbuF6aC74Or8NpDyJO3inTmODBCEIZ43ygknQW/2xzQ+D
+hNQ+IIX3Sj0rnP0qCglN6oH4EZw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
+# Subject: CN=TÜBİTAK UEKAE Kök Sertifika Hizmet Sağlayıcısı - Sürüm 3 O=Türkiye Bilimsel ve Teknolojik Araştırma Kurumu - TÜBİTAK OU=Ulusal Elektronik ve Kriptoloji Araştırma Enstitüsü - UEKAE/Kamu Sertifikasyon Merkezi
+# Label: "T\xc3\x9c\x42\xC4\xB0TAK UEKAE K\xC3\xB6k Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1 - S\xC3\xBCr\xC3\xBCm 3"
+# Serial: 17
+# MD5 Fingerprint: ed:41:f5:8c:50:c5:2b:9c:73:e6:ee:6c:eb:c2:a8:26
+# SHA1 Fingerprint: 1b:4b:39:61:26:27:6b:64:91:a2:68:6d:d7:02:43:21:2d:1f:1d:96
+# SHA256 Fingerprint: e4:c7:34:30:d7:a5:b5:09:25:df:43:37:0a:0d:21:6e:9a:79:b9:d6:db:83:73:a0:c6:9e:b1:cc:31:c7:c5:2a
+-----BEGIN CERTIFICATE-----
+MIIFFzCCA/+gAwIBAgIBETANBgkqhkiG9w0BAQUFADCCASsxCzAJBgNVBAYTAlRS
+MRgwFgYDVQQHDA9HZWJ6ZSAtIEtvY2FlbGkxRzBFBgNVBAoMPlTDvHJraXllIEJp
+bGltc2VsIHZlIFRla25vbG9qaWsgQXJhxZ90xLFybWEgS3VydW11IC0gVMOcQsSw
+VEFLMUgwRgYDVQQLDD9VbHVzYWwgRWxla3Ryb25payB2ZSBLcmlwdG9sb2ppIEFy
+YcWfdMSxcm1hIEVuc3RpdMO8c8O8IC0gVUVLQUUxIzAhBgNVBAsMGkthbXUgU2Vy
+dGlmaWthc3lvbiBNZXJrZXppMUowSAYDVQQDDEFUw5xCxLBUQUsgVUVLQUUgS8O2
+ayBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSAtIFPDvHLDvG0gMzAe
+Fw0wNzA4MjQxMTM3MDdaFw0xNzA4MjExMTM3MDdaMIIBKzELMAkGA1UEBhMCVFIx
+GDAWBgNVBAcMD0dlYnplIC0gS29jYWVsaTFHMEUGA1UECgw+VMO8cmtpeWUgQmls
+aW1zZWwgdmUgVGVrbm9sb2ppayBBcmHFn3TEsXJtYSBLdXJ1bXUgLSBUw5xCxLBU
+QUsxSDBGBgNVBAsMP1VsdXNhbCBFbGVrdHJvbmlrIHZlIEtyaXB0b2xvamkgQXJh
+xZ90xLFybWEgRW5zdGl0w7xzw7wgLSBVRUtBRTEjMCEGA1UECwwaS2FtdSBTZXJ0
+aWZpa2FzeW9uIE1lcmtlemkxSjBIBgNVBAMMQVTDnELEsFRBSyBVRUtBRSBLw7Zr
+IFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIC0gU8O8csO8bSAzMIIB
+IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAim1L/xCIOsP2fpTo6iBkcK4h
+gb46ezzb8R1Sf1n68yJMlaCQvEhOEav7t7WNeoMojCZG2E6VQIdhn8WebYGHV2yK
+O7Rm6sxA/OOqbLLLAdsyv9Lrhc+hDVXDWzhXcLh1xnnRFDDtG1hba+818qEhTsXO
+fJlfbLm4IpNQp81McGq+agV/E5wrHur+R84EpW+sky58K5+eeROR6Oqeyjh1jmKw
+lZMq5d/pXpduIF9fhHpEORlAHLpVK/swsoHvhOPc7Jg4OQOFCKlUAwUp8MmPi+oL
+hmUZEdPpCSPeaJMDyTYcIW7OjGbxmTDY17PDHfiBLqi9ggtm/oLL4eAagsNAgQID
+AQABo0IwQDAdBgNVHQ4EFgQUvYiHyY/2pAoLquvF/pEjnatKijIwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAB18+kmP
+NOm3JpIWmgV050vQbTlswyb2zrgxvMTfvCr4N5EY3ATIZJkrGG2AA1nJrvhY0D7t
+wyOfaTyGOBye79oneNGEN3GKPEs5z35FBtYt2IpNeBLWrcLTy9LQQfMmNkqblWwM
+7uXRQydmwYj3erMgbOqwaSvHIOgMA8RBBZniP+Rr+KCGgceExh/VS4ESshYhLBOh
+gLJeDEoTniDYYkCrkOpkSi+sDQESeUWoL4cZaMjihccwsnX5OD+ywJO0a+IDRM5n
+oN+J1q2MdqMTw5RhK2vZbMEHCiIHhWyFJEapvj+LeISCfiQMnf2BN+MlqO02TpUs
+yZyQ2uypQjyttgI=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 CA 1 O=Buypass AS-983163327
+# Label: "Buypass Class 2 CA 1"
+# Serial: 1
+# MD5 Fingerprint: b8:08:9a:f0:03:cc:1b:0d:c8:6c:0b:76:a1:75:64:23
+# SHA1 Fingerprint: a0:a1:ab:90:c9:fc:84:7b:3b:12:61:e8:97:7d:5f:d3:22:61:d3:cc
+# SHA256 Fingerprint: 0f:4e:9c:dd:26:4b:02:55:50:d1:70:80:63:40:21:4f:e9:44:34:c9:b0:2f:69:7e:c7:10:fc:5f:ea:fb:5e:38
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBATANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMiBDQSAxMB4XDTA2MTAxMzEwMjUwOVoXDTE2MTAxMzEwMjUwOVowSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDIgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAIs8B0XY9t/mx8q6jUPFR42wWsE425KEHK8T1A9vNkYgxC7McXA0
+ojTTNy7Y3Tp3L8DrKehc0rWpkTSHIln+zNvnma+WwajHQN2lFYxuyHyXA8vmIPLX
+l18xoS830r7uvqmtqEyeIWZDO6i88wmjONVZJMHCR3axiFyCO7srpgTXjAePzdVB
+HfCuuCkslFJgNJQ72uA40Z0zPhX0kzLFANq1KWYOOngPIVJfAuWSeyXTkh4vFZ2B
+5J2O6O+JzhRMVB0cgRJNcKi+EAUXfh/RuFdV7c27UsKwHnjCTTZoy1YmwVLBvXb3
+WNVyfh9EdrsAiR0WnVE1703CVu9r4Iw7DekCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUP42aWYv8e3uco684sDntkHGA1sgwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQAVGn4TirnoB6NLJzKyQJHyIdFkhb5jatLP
+gcIV1Xp+DCmsNx4cfHZSldq1fyOhKXdlyTKdqC5Wq2B2zha0jX94wNWZUYN/Xtm+
+DKhQ7SLHrQVMdvvt7h5HZPb3J31cKA9FxVxiXqaakZG3Uxcu3K1gnZZkOb1naLKu
+BctN518fV4bVIJwo+28TOPX2EZL2fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHs
+h7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5wwDX3OaJdZtB7WZ+oRxKaJyOk
+LY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 CA 1 O=Buypass AS-983163327
+# Label: "Buypass Class 3 CA 1"
+# Serial: 2
+# MD5 Fingerprint: df:3c:73:59:81:e7:39:50:81:04:4c:34:a2:cb:b3:7b
+# SHA1 Fingerprint: 61:57:3a:11:df:0e:d8:7e:d5:92:65:22:ea:d0:56:d7:44:b3:23:71
+# SHA256 Fingerprint: b7:b1:2b:17:1f:82:1d:aa:99:0c:d0:fe:50:87:b1:28:44:8b:a8:e5:18:4f:84:c5:1e:02:b5:c8:fb:96:2b:24
+-----BEGIN CERTIFICATE-----
+MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3Mg
+Q2xhc3MgMyBDQSAxMB4XDTA1MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzEL
+MAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MR0wGwYD
+VQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZIhvcNAQEBBQADggEP
+ADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKxifZg
+isRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//z
+NIqeKNc0n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI
++MkcVyzwPX6UvCWThOiaAJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2R
+hzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+
+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNCMEAwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0PAQH/BAQD
+AgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFP
+Bdy7pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27s
+EzNxZy5p+qksP2bAEllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2
+mSlf56oBzKwzqBwKu5HEA6BvtjT5htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yC
+e/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQjel/wroQk5PMr+4okoyeYZdow
+dXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
+-----END CERTIFICATE-----
+
+# Issuer: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
+# Subject: CN=EBG Elektronik Sertifika Hizmet Sağlayıcısı O=EBG Bilişim Teknolojileri ve Hizmetleri A.Ş.
+# Label: "EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1"
+# Serial: 5525761995591021570
+# MD5 Fingerprint: 2c:20:26:9d:cb:1a:4a:00:85:b5:b7:5a:ae:c2:01:37
+# SHA1 Fingerprint: 8c:96:ba:eb:dd:2b:07:07:48:ee:30:32:66:a0:f3:98:6e:7c:ae:58
+# SHA256 Fingerprint: 35:ae:5b:dd:d8:f7:ae:63:5c:ff:ba:56:82:a8:f0:0b:95:f4:84:62:c7:10:8e:e9:a0:e5:29:2b:07:4a:af:b2
+-----BEGIN CERTIFICATE-----
+MIIF5zCCA8+gAwIBAgIITK9zQhyOdAIwDQYJKoZIhvcNAQEFBQAwgYAxODA2BgNV
+BAMML0VCRyBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMTcwNQYDVQQKDC5FQkcgQmlsacWfaW0gVGVrbm9sb2ppbGVyaSB2ZSBIaXpt
+ZXRsZXJpIEEuxZ4uMQswCQYDVQQGEwJUUjAeFw0wNjA4MTcwMDIxMDlaFw0xNjA4
+MTQwMDMxMDlaMIGAMTgwNgYDVQQDDC9FQkcgRWxla3Ryb25payBTZXJ0aWZpa2Eg
+SGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTE3MDUGA1UECgwuRUJHIEJpbGnFn2ltIFRl
+a25vbG9qaWxlcmkgdmUgSGl6bWV0bGVyaSBBLsWeLjELMAkGA1UEBhMCVFIwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDuoIRh0DpqZhAy2DE4f6en5f2h
+4fuXd7hxlugTlkaDT7byX3JWbhNgpQGR4lvFzVcfd2NR/y8927k/qqk153nQ9dAk
+tiHq6yOU/im/+4mRDGSaBUorzAzu8T2bgmmkTPiab+ci2hC6X5L8GCcKqKpE+i4s
+tPtGmggDg3KriORqcsnlZR9uKg+ds+g75AxuetpX/dfreYteIAbTdgtsApWjluTL
+dlHRKJ2hGvxEok3MenaoDT2/F08iiFD9rrbskFBKW5+VQarKD7JK/oCZTqNGFav4
+c0JqwmZ2sQomFd2TkuzbqV9UIlKRcF0T6kjsbgNs2d1s/OsNA/+mgxKb8amTD8Um
+TDGyY5lhcucqZJnSuOl14nypqZoaqsNW2xCaPINStnuWt6yHd6i58mcLlEOzrz5z
++kI2sSXFCjEmN1ZnuqMLfdb3ic1nobc6HmZP9qBVFCVMLDMNpkGMvQQxahByCp0O
+Lna9XvNRiYuoP1Vzv9s6xiQFlpJIqkuNKgPlV5EQ9GooFW5Hd4RcUXSfGenmHmMW
+OeMRFeNYGkS9y8RsZteEBt8w9DeiQyJ50hBs37vmExH8nYQKE3vwO9D8owrXieqW
+fo1IhR5kX9tUoqzVegJ5a9KK8GfaZXINFHDk6Y54jzJ0fFfy1tb0Nokb+Clsi7n2
+l9GkLqq+CxnCRelwXQIDAJ3Zo2MwYTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB
+/wQEAwIBBjAdBgNVHQ4EFgQU587GT/wWZ5b6SqMHwQSny2re2kcwHwYDVR0jBBgw
+FoAU587GT/wWZ5b6SqMHwQSny2re2kcwDQYJKoZIhvcNAQEFBQADggIBAJuYml2+
+8ygjdsZs93/mQJ7ANtyVDR2tFcU22NU57/IeIl6zgrRdu0waypIN30ckHrMk2pGI
+6YNw3ZPX6bqz3xZaPt7gyPvT/Wwp+BVGoGgmzJNSroIBk5DKd8pNSe/iWtkqvTDO
+TLKBtjDOWU/aWR1qeqRFsIImgYZ29fUQALjuswnoT4cCB64kXPBfrAowzIpAoHME
+wfuJJPaaHFy3PApnNgUIMbOv2AFoKuB4j3TeuFGkjGwgPaL7s9QJ/XvCgKqTbCmY
+Iai7FvOpEl90tYeY8pUm3zTvilORiF0alKM/fCL414i6poyWqD1SNGKfAB5UVUJn
+xk1Gj7sURT0KlhaOEKGXmdXTMIXM3rRyt7yKPBgpaP3ccQfuJDlq+u2lrDgv+R4Q
+DgZxGhBM/nV+/x5XOULK1+EVoVZVWRvRo68R2E7DpSvvkL/A7IITW43WciyTTo9q
+Kd+FPNMN4KIYEsxVL0e3p5sC/kH2iExt2qkBR4NkJ2IQgtYSe14DHzSpyZH+r11t
+hie3I6p1GMog57AP14kOpmciY/SDQSsGS7tY1dHXt7kQY9iJSrSq3RZj9W6+YKH4
+7ejWkE8axsWgKdOnIaj1Wjz3x0miIZpKlVIglnKaZsv30oZDfCK+lvm9AahH3eU7
+QPl1K5srRmSGjR70j/sHd9DqSaIcjVIUpgqT
+-----END CERTIFICATE-----
+
+# Issuer: O=certSIGN OU=certSIGN ROOT CA
+# Subject: O=certSIGN OU=certSIGN ROOT CA
+# Label: "certSIGN ROOT CA"
+# Serial: 35210227249154
+# MD5 Fingerprint: 18:98:c0:d6:e9:3a:fc:f9:b0:f5:0c:f7:4b:01:44:17
+# SHA1 Fingerprint: fa:b7:ee:36:97:26:62:fb:2d:b0:2a:f6:bf:03:fd:e8:7c:4b:2f:9b
+# SHA256 Fingerprint: ea:a9:62:c4:fa:4a:6b:af:eb:e4:15:19:6d:35:1c:cd:88:8d:4f:53:f3:fa:8a:e6:d7:c4:66:a9:4e:60:42:bb
+-----BEGIN CERTIFICATE-----
+MIIDODCCAiCgAwIBAgIGIAYFFnACMA0GCSqGSIb3DQEBBQUAMDsxCzAJBgNVBAYT
+AlJPMREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBD
+QTAeFw0wNjA3MDQxNzIwMDRaFw0zMTA3MDQxNzIwMDRaMDsxCzAJBgNVBAYTAlJP
+MREwDwYDVQQKEwhjZXJ0U0lHTjEZMBcGA1UECxMQY2VydFNJR04gUk9PVCBDQTCC
+ASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALczuX7IJUqOtdu0KBuqV5Do
+0SLTZLrTk+jUrIZhQGpgV2hUhE28alQCBf/fm5oqrl0Hj0rDKH/v+yv6efHHrfAQ
+UySQi2bJqIirr1qjAOm+ukbuW3N7LBeCgV5iLKECZbO9xSsAfsT8AzNXDe3i+s5d
+RdY4zTW2ssHQnIFKquSyAVwdj1+ZxLGt24gh65AIgoDzMKND5pCCrlUoSe1b16kQ
+OA7+j0xbm0bqQfWwCHTD0IgztnzXdN/chNFDDnU5oSVAKOp4yw4sLjmdjItuFhwv
+JoIQ4uNllAoEwF73XVv4EOLQunpL+943AAAaWyjj0pxzPjKHmKHJUS/X3qwzs08C
+AwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAcYwHQYDVR0O
+BBYEFOCMm9slSbPxfIbWskKHC9BroNnkMA0GCSqGSIb3DQEBBQUAA4IBAQA+0hyJ
+LjX8+HXd5n9liPRyTMks1zJO890ZeUe9jjtbkw9QSSQTaxQGcu8J06Gh40CEyecY
+MnQ8SG4Pn0vU9x7Tk4ZkVJdjclDVVc/6IJMCopvDI5NOFlV2oHB5bc0hH88vLbwZ
+44gx+FkagQnIl6Z0x2DEW8xXjrJ1/RsCCdtZb3KTafcxQdaIOL+Hsr0Wefmq5L6I
+Jd1hJyMctTEHBDa0GpC9oHRxUIltvBTjD4au8as+x6AJzKNI0eDbZOeStc+vckNw
+i/nDhDwTqn6Sm1dTk/pwwpEOMfmbZ13pljheX7NzTogVZ96edhBiIL5VaZVDADlN
+9u6wWk5JRFRYX0KD
+-----END CERTIFICATE-----
+
+# Issuer: CN=CNNIC ROOT O=CNNIC
+# Subject: CN=CNNIC ROOT O=CNNIC
+# Label: "CNNIC ROOT"
+# Serial: 1228079105
+# MD5 Fingerprint: 21:bc:82:ab:49:c4:13:3b:4b:b2:2b:5c:6b:90:9c:19
+# SHA1 Fingerprint: 8b:af:4c:9b:1d:f0:2a:92:f7:da:12:8e:b9:1b:ac:f4:98:60:4b:6f
+# SHA256 Fingerprint: e2:83:93:77:3d:a8:45:a6:79:f2:08:0c:c7:fb:44:a3:b7:a1:c3:79:2c:b7:eb:77:29:fd:cb:6a:8d:99:ae:a7
+-----BEGIN CERTIFICATE-----
+MIIDVTCCAj2gAwIBAgIESTMAATANBgkqhkiG9w0BAQUFADAyMQswCQYDVQQGEwJD
+TjEOMAwGA1UEChMFQ05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwHhcNMDcwNDE2
+MDcwOTE0WhcNMjcwNDE2MDcwOTE0WjAyMQswCQYDVQQGEwJDTjEOMAwGA1UEChMF
+Q05OSUMxEzARBgNVBAMTCkNOTklDIFJPT1QwggEiMA0GCSqGSIb3DQEBAQUAA4IB
+DwAwggEKAoIBAQDTNfc/c3et6FtzF8LRb+1VvG7q6KR5smzDo+/hn7E7SIX1mlwh
+IhAsxYLO2uOabjfhhyzcuQxauohV3/2q2x8x6gHx3zkBwRP9SFIhxFXf2tizVHa6
+dLG3fdfA6PZZxU3Iva0fFNrfWEQlMhkqx35+jq44sDB7R3IJMfAw28Mbdim7aXZO
+V/kbZKKTVrdvmW7bCgScEeOAH8tjlBAKqeFkgjH5jCftppkA9nCTGPihNIaj3XrC
+GHn2emU1z5DrvTOTn1OrczvmmzQgLx3vqR1jGqCA2wMv+SYahtKNu6m+UjqHZ0gN
+v7Sg2Ca+I19zN38m5pIEo3/PIKe38zrKy5nLAgMBAAGjczBxMBEGCWCGSAGG+EIB
+AQQEAwIABzAfBgNVHSMEGDAWgBRl8jGtKvf33VKWCscCwQ7vptU7ETAPBgNVHRMB
+Af8EBTADAQH/MAsGA1UdDwQEAwIB/jAdBgNVHQ4EFgQUZfIxrSr3991SlgrHAsEO
+76bVOxEwDQYJKoZIhvcNAQEFBQADggEBAEs17szkrr/Dbq2flTtLP1se31cpolnK
+OOK5Gv+e5m4y3R6u6jW39ZORTtpC4cMXYFDy0VwmuYK36m3knITnA3kXr5g9lNvH
+ugDnuL8BV8F3RTIMO/G0HAiw/VGgod2aHRM2mm23xzy54cXZF/qD1T0VoDy7Hgvi
+yJA/qIYM/PmLXoXLT1tLYhFHxUV8BS9BsZ4QaRuZluBVeftOhpm4lNqGOGqTo+fL
+buXf6iFViZx9fX+Y9QCJ7uOEwFyWtcVG6kbghVW2G8kS1sHNzYDzAgE8yGnLRUhj
+2JTQ7IUOO04RZfSCjKY9ri4ilAnIXOo8gV0WKgOXFlUJ24pBgp5mmxE=
+-----END CERTIFICATE-----
+
+# Issuer: O=Japanese Government OU=ApplicationCA
+# Subject: O=Japanese Government OU=ApplicationCA
+# Label: "ApplicationCA - Japanese Government"
+# Serial: 49
+# MD5 Fingerprint: 7e:23:4e:5b:a7:a5:b4:25:e9:00:07:74:11:62:ae:d6
+# SHA1 Fingerprint: 7f:8a:b0:cf:d0:51:87:6a:66:f3:36:0f:47:c8:8d:8c:d3:35:fc:74
+# SHA256 Fingerprint: 2d:47:43:7d:e1:79:51:21:5a:12:f3:c5:8e:51:c7:29:a5:80:26:ef:1f:cc:0a:5f:b3:d9:dc:01:2f:60:0d:19
+-----BEGIN CERTIFICATE-----
+MIIDoDCCAoigAwIBAgIBMTANBgkqhkiG9w0BAQUFADBDMQswCQYDVQQGEwJKUDEc
+MBoGA1UEChMTSmFwYW5lc2UgR292ZXJubWVudDEWMBQGA1UECxMNQXBwbGljYXRp
+b25DQTAeFw0wNzEyMTIxNTAwMDBaFw0xNzEyMTIxNTAwMDBaMEMxCzAJBgNVBAYT
+AkpQMRwwGgYDVQQKExNKYXBhbmVzZSBHb3Zlcm5tZW50MRYwFAYDVQQLEw1BcHBs
+aWNhdGlvbkNBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp23gdE6H
+j6UG3mii24aZS2QNcfAKBZuOquHMLtJqO8F6tJdhjYq+xpqcBrSGUeQ3DnR4fl+K
+f5Sk10cI/VBaVuRorChzoHvpfxiSQE8tnfWuREhzNgaeZCw7NCPbXCbkcXmP1G55
+IrmTwcrNwVbtiGrXoDkhBFcsovW8R0FPXjQilbUfKW1eSvNNcr5BViCH/OlQR9cw
+FO5cjFW6WY2H/CPek9AEjP3vbb3QesmlOmpyM8ZKDQUXKi17safY1vC+9D/qDiht
+QWEjdnjDuGWk81quzMKq2edY3rZ+nYVunyoKb58DKTCXKB28t89UKU5RMfkntigm
+/qJj5kEW8DOYRwIDAQABo4GeMIGbMB0GA1UdDgQWBBRUWssmP3HMlEYNllPqa0jQ
+k/5CdTAOBgNVHQ8BAf8EBAMCAQYwWQYDVR0RBFIwUKROMEwxCzAJBgNVBAYTAkpQ
+MRgwFgYDVQQKDA/ml6XmnKzlm73mlL/lupwxIzAhBgNVBAsMGuOCouODl+ODquOC
+seODvOOCt+ODp+ODs0NBMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQAD
+ggEBADlqRHZ3ODrso2dGD/mLBqj7apAxzn7s2tGJfHrrLgy9mTLnsCTWw//1sogJ
+hyzjVOGjprIIC8CFqMjSnHH2HZ9g/DgzE+Ge3Atf2hZQKXsvcJEPmbo0NI2VdMV+
+eKlmXb3KIXdCEKxmJj3ekav9FfBv7WxfEPjzFvYDio+nEhEMy/0/ecGc/WLuo89U
+DNErXxc+4z6/wCs+CZv+iKZ+tJIX/COUgb1up8WMwusRRdv4QcmWdupwX3kSa+Sj
+B1oF7ydJzyGfikwJcGapJsErEU4z0g781mzSDjJkaP+tBXhfAx2o45CsJOAPQKdL
+rosot4LKGAfmt1t06SAZf7IbiVQ=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G3 O=GeoTrust Inc. OU=(c) 2008 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G3"
+# Serial: 28809105769928564313984085209975885599
+# MD5 Fingerprint: b5:e8:34:36:c9:10:44:58:48:70:6d:2e:83:d4:b8:05
+# SHA1 Fingerprint: 03:9e:ed:b8:0b:e7:a0:3c:69:53:89:3b:20:d2:d9:32:3a:4c:2a:fd
+# SHA256 Fingerprint: b4:78:b8:12:25:0d:f8:78:63:5c:2a:a7:ec:7d:15:5e:aa:62:5e:e8:29:16:e2:cd:29:43:61:88:6c:d1:fb:d4
+-----BEGIN CERTIFICATE-----
+MIID/jCCAuagAwIBAgIQFaxulBmyeUtB9iepwxgPHzANBgkqhkiG9w0BAQsFADCB
+mDELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsT
+MChjKSAyMDA4IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
+eTE2MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhv
+cml0eSAtIEczMB4XDTA4MDQwMjAwMDAwMFoXDTM3MTIwMTIzNTk1OVowgZgxCzAJ
+BgNVBAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykg
+MjAwOCBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0
+BgNVBAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkg
+LSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANziXmJYHTNXOTIz
++uvLh4yn1ErdBojqZI4xmKU4kB6Yzy5jK/BGvESyiaHAKAxJcCGVn2TAppMSAmUm
+hsalifD614SgcK9PGpc/BkTVyetyEH3kMSj7HGHmKAdEc5IiaacDiGydY8hS2pgn
+5whMcD60yRLBxWeDXTPzAxHsatBT4tG6NmCUgLthY2xbF37fQJQeqw3CIShwiP/W
+JmxsYAQlTlV+fe+/lEjetx3dcI0FX4ilm/LC7urRQEFtYjgdVgbFA0dRIBn8exAL
+DmKudlW/X3e+PkkBUz2YJQN2JFodtNuJ6nnltrM7P7pMKEF/BqxqjsHQ9gUdfeZC
+huOl1UcCAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYw
+HQYDVR0OBBYEFMR5yo6hTgMdHNxr2zFblD4/MH8tMA0GCSqGSIb3DQEBCwUAA4IB
+AQAtxRPPVoB7eni9n64smefv2t+UXglpp+duaIy9cr5HqQ6XErhK8WTTOd8lNNTB
+zU6B8A8ExCSzNJbGpqow32hhc9f5joWJ7w5elShKKiePEI4ufIbEAp7aDHdlDkQN
+kv39sxY2+hENHYwOB4lqKVb3cvTdFZx3NWZXqxNT2I7BQMXXExZacse3aQHEerGD
+AWh9jUGhlBjBJVz88P6DAod8DQ3PLghcSkANPuyBYeYk28rgDi0Hsj5W3I31QYUH
+SJsMC8tJP33st/3LjWeJGqvtux6jAAgIFyqCXDFdRootD4abdNlF+9RAsXqqaC2G
+spki4cErx5z481+oghLrGREt
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G2 O=thawte, Inc. OU=(c) 2007 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G2"
+# Serial: 71758320672825410020661621085256472406
+# MD5 Fingerprint: 74:9d:ea:60:24:c4:fd:22:53:3e:cc:3a:72:d9:29:4f
+# SHA1 Fingerprint: aa:db:bc:22:23:8f:c4:01:a1:27:bb:38:dd:f4:1d:db:08:9e:f0:12
+# SHA256 Fingerprint: a4:31:0d:50:af:18:a6:44:71:90:37:2a:86:af:af:8b:95:1f:fb:43:1d:83:7f:1e:56:88:b4:59:71:ed:15:57
+-----BEGIN CERTIFICATE-----
+MIICiDCCAg2gAwIBAgIQNfwmXNmET8k9Jj1Xm67XVjAKBggqhkjOPQQDAzCBhDEL
+MAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjE4MDYGA1UECxMvKGMp
+IDIwMDcgdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAi
+BgNVBAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMjAeFw0wNzExMDUwMDAw
+MDBaFw0zODAxMTgyMzU5NTlaMIGEMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhh
+d3RlLCBJbmMuMTgwNgYDVQQLEy8oYykgMjAwNyB0aGF3dGUsIEluYy4gLSBGb3Ig
+YXV0aG9yaXplZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9v
+dCBDQSAtIEcyMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEotWcgnuVnfFSeIf+iha/
+BebfowJPDQfGAFG6DAJSLSKkQjnE/o/qycG+1E3/n3qe4rF8mq2nhglzh9HnmuN6
+papu+7qzcMBniKI11KOasf2twu8x+qi58/sIxpHR+ymVo0IwQDAPBgNVHRMBAf8E
+BTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUmtgAMADna3+FGO6Lts6K
+DPgR4bswCgYIKoZIzj0EAwMDaQAwZgIxAN344FdHW6fmCsO99YCKlzUNG4k8VIZ3
+KMqh9HneteY4sPBlcIx/AlTCv//YoT7ZzwIxAMSNlPzcU9LcnXgWHxUzI1NS41ox
+XZ3Krr0TKUQNJ1uo52icEvdYPy5yAlejj6EULg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Subject: CN=thawte Primary Root CA - G3 O=thawte, Inc. OU=Certification Services Division/(c) 2008 thawte, Inc. - For authorized use only
+# Label: "thawte Primary Root CA - G3"
+# Serial: 127614157056681299805556476275995414779
+# MD5 Fingerprint: fb:1b:5d:43:8a:94:cd:44:c6:76:f2:43:4b:47:e7:31
+# SHA1 Fingerprint: f1:8b:53:8d:1b:e9:03:b6:a6:f0:56:43:5b:17:15:89:ca:f3:6b:f2
+# SHA256 Fingerprint: 4b:03:f4:58:07:ad:70:f2:1b:fc:2c:ae:71:c9:fd:e4:60:4c:06:4c:f5:ff:b6:86:ba:e5:db:aa:d7:fd:d3:4c
+-----BEGIN CERTIFICATE-----
+MIIEKjCCAxKgAwIBAgIQYAGXt0an6rS0mtZLL/eQ+zANBgkqhkiG9w0BAQsFADCB
+rjELMAkGA1UEBhMCVVMxFTATBgNVBAoTDHRoYXd0ZSwgSW5jLjEoMCYGA1UECxMf
+Q2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjE4MDYGA1UECxMvKGMpIDIw
+MDggdGhhd3RlLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxJDAiBgNV
+BAMTG3RoYXd0ZSBQcmltYXJ5IFJvb3QgQ0EgLSBHMzAeFw0wODA0MDIwMDAwMDBa
+Fw0zNzEyMDEyMzU5NTlaMIGuMQswCQYDVQQGEwJVUzEVMBMGA1UEChMMdGhhd3Rl
+LCBJbmMuMSgwJgYDVQQLEx9DZXJ0aWZpY2F0aW9uIFNlcnZpY2VzIERpdmlzaW9u
+MTgwNgYDVQQLEy8oYykgMjAwOCB0aGF3dGUsIEluYy4gLSBGb3IgYXV0aG9yaXpl
+ZCB1c2Ugb25seTEkMCIGA1UEAxMbdGhhd3RlIFByaW1hcnkgUm9vdCBDQSAtIEcz
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsr8nLPvb2FvdeHsbnndm
+gcs+vHyu86YnmjSjaDFxODNi5PNxZnmxqWWjpYvVj2AtP0LMqmsywCPLLEHd5N/8
+YZzic7IilRFDGF/Eth9XbAoFWCLINkw6fKXRz4aviKdEAhN0cXMKQlkC+BsUa0Lf
+b1+6a4KinVvnSr0eAXLbS3ToO39/fR8EtCab4LRarEc9VbjXsCZSKAExQGbY2SS9
+9irY7CFJXJv2eul/VTV+lmuNk5Mny5K76qxAwJ/C+IDPXfRa3M50hqY+bAtTyr2S
+zhkGcuYMXDhpxwTWvGzOW/b3aJzcJRVIiKHpqfiYnODz1TEoYRFsZ5aNOZnLwkUk
+OQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNV
+HQ4EFgQUrWyqlGCc7eT/+j4KdCtjA/e2Wb8wDQYJKoZIhvcNAQELBQADggEBABpA
+2JVlrAmSicY59BDlqQ5mU1143vokkbvnRFHfxhY0Cu9qRFHqKweKA3rD6z8KLFIW
+oCtDuSWQP3CpMyVtRRooOyfPqsMpQhvfO0zAMzRbQYi/aytlryjvsvXDqmbOe1bu
+t8jLZ8HJnBoYuMTDSQPxYA5QzUbF83d597YV4Djbxy8ooAw/dyZ02SUS2jHaGh7c
+KUGRIjxpp7sC8rZcJwOJ9Abqm+RyguOhCcHpABnTPtRwa7pxpqpYrvS76Wy274fM
+m7v/OeZWYdMKp8RcTGB7BXcmer/YB1IsYvdwY9k5vG8cwnncdimvzsUsZAReiDZu
+MdRAGmI0Nj81Aa6sY6A=
+-----END CERTIFICATE-----
+
+# Issuer: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Subject: CN=GeoTrust Primary Certification Authority - G2 O=GeoTrust Inc. OU=(c) 2007 GeoTrust Inc. - For authorized use only
+# Label: "GeoTrust Primary Certification Authority - G2"
+# Serial: 80682863203381065782177908751794619243
+# MD5 Fingerprint: 01:5e:d8:6b:bd:6f:3d:8e:a1:31:f8:12:e0:98:73:6a
+# SHA1 Fingerprint: 8d:17:84:d5:37:f3:03:7d:ec:70:fe:57:8b:51:9a:99:e6:10:d7:b0
+# SHA256 Fingerprint: 5e:db:7a:c4:3b:82:a0:6a:87:61:e8:d7:be:49:79:eb:f2:61:1f:7d:d7:9b:f9:1c:1c:6b:56:6a:21:9e:d7:66
+-----BEGIN CERTIFICATE-----
+MIICrjCCAjWgAwIBAgIQPLL0SAoA4v7rJDteYD7DazAKBggqhkjOPQQDAzCBmDEL
+MAkGA1UEBhMCVVMxFjAUBgNVBAoTDUdlb1RydXN0IEluYy4xOTA3BgNVBAsTMChj
+KSAyMDA3IEdlb1RydXN0IEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE2
+MDQGA1UEAxMtR2VvVHJ1c3QgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0
+eSAtIEcyMB4XDTA3MTEwNTAwMDAwMFoXDTM4MDExODIzNTk1OVowgZgxCzAJBgNV
+BAYTAlVTMRYwFAYDVQQKEw1HZW9UcnVzdCBJbmMuMTkwNwYDVQQLEzAoYykgMjAw
+NyBHZW9UcnVzdCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNlIG9ubHkxNjA0BgNV
+BAMTLUdlb1RydXN0IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
+MjB2MBAGByqGSM49AgEGBSuBBAAiA2IABBWx6P0DFUPlrOuHNxFi79KDNlJ9RVcL
+So17VDs6bl8VAsBQps8lL33KSLjHUGMcKiEIfJo22Av+0SbFWDEwKCXzXV2juLal
+tJLtbCyf691DiaI8S0iRHVDsJt/WYC69IaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBVfNVdRVfslsq0DafwBo/q+EVXVMAoG
+CCqGSM49BAMDA2cAMGQCMGSWWaboCd6LuvpaiIjwH5HTRqjySkwCY/tsXzjbLkGT
+qQ7mndwxHLKgpxgceeHHNgIwOlavmnRs9vuD4DPTCF+hnMJbn0bWtsuRBmOiBucz
+rD6ogRLQy7rQkgu2npaqBA+K
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Universal Root Certification Authority O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2008 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Universal Root Certification Authority"
+# Serial: 85209574734084581917763752644031726877
+# MD5 Fingerprint: 8e:ad:b5:01:aa:4d:81:e4:8c:1d:d1:e1:14:00:95:19
+# SHA1 Fingerprint: 36:79:ca:35:66:87:72:30:4d:30:a5:fb:87:3b:0f:a7:7b:b7:0d:54
+# SHA256 Fingerprint: 23:99:56:11:27:a5:71:25:de:8c:ef:ea:61:0d:df:2f:a0:78:b5:c8:06:7f:4e:82:82:90:bf:b8:60:e8:4b:3c
+-----BEGIN CERTIFICATE-----
+MIIEuTCCA6GgAwIBAgIQQBrEZCGzEyEDDrvkEhrFHTANBgkqhkiG9w0BAQsFADCB
+vTELMAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQL
+ExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwOCBWZXJp
+U2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MTgwNgYDVQQDEy9W
+ZXJpU2lnbiBVbml2ZXJzYWwgUm9vdCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTAe
+Fw0wODA0MDIwMDAwMDBaFw0zNzEyMDEyMzU5NTlaMIG9MQswCQYDVQQGEwJVUzEX
+MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0
+IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAyMDA4IFZlcmlTaWduLCBJbmMuIC0gRm9y
+IGF1dGhvcml6ZWQgdXNlIG9ubHkxODA2BgNVBAMTL1ZlcmlTaWduIFVuaXZlcnNh
+bCBSb290IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEF
+AAOCAQ8AMIIBCgKCAQEAx2E3XrEBNNti1xWb/1hajCMj1mCOkdeQmIN65lgZOIzF
+9uVkhbSicfvtvbnazU0AtMgtc6XHaXGVHzk8skQHnOgO+k1KxCHfKWGPMiJhgsWH
+H26MfF8WIFFE0XBPV+rjHOPMee5Y2A7Cs0WTwCznmhcrewA3ekEzeOEz4vMQGn+H
+LL729fdC4uW/h2KJXwBL38Xd5HVEMkE6HnFuacsLdUYI0crSK5XQz/u5QGtkjFdN
+/BMReYTtXlT2NJ8IAfMQJQYXStrxHXpma5hgZqTZ79IugvHw7wnqRMkVauIDbjPT
+rJ9VAMf2CGqUuV/c4DPxhGD5WycRtPwW8rtWaoAljQIDAQABo4GyMIGvMA8GA1Ud
+EwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMG0GCCsGAQUFBwEMBGEwX6FdoFsw
+WTBXMFUWCWltYWdlL2dpZjAhMB8wBwYFKw4DAhoEFI/l0xqGrI2Oa8PPgGrUSBgs
+exkuMCUWI2h0dHA6Ly9sb2dvLnZlcmlzaWduLmNvbS92c2xvZ28uZ2lmMB0GA1Ud
+DgQWBBS2d/ppSEefUxLVwuoHMnYH0ZcHGTANBgkqhkiG9w0BAQsFAAOCAQEASvj4
+sAPmLGd75JR3Y8xuTPl9Dg3cyLk1uXBPY/ok+myDjEedO2Pzmvl2MpWRsXe8rJq+
+seQxIcaBlVZaDrHC1LGmWazxY8u4TB1ZkErvkBYoH1quEPuBUDgMbMzxPcP1Y+Oz
+4yHJJDnp/RVmRvQbEdBNc6N9Rvk97ahfYtTxP/jgdFcrGJ2BtMQo2pSXpXDrrB2+
+BxHw1dvd5Yzw1TKwg+ZX4o+/vqGqvz0dtdQ46tewXDpPaj+PwGZsY6rp2aQW9IHR
+lRQOfc2VNNnSj3BzgXucfr2YYdhFh5iQxeuGMMY1v/D/w1WIg0vvBZIGcfK4mJO3
+7M2CYfE45k+XmCpajQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Subject: CN=VeriSign Class 3 Public Primary Certification Authority - G4 O=VeriSign, Inc. OU=VeriSign Trust Network/(c) 2007 VeriSign, Inc. - For authorized use only
+# Label: "VeriSign Class 3 Public Primary Certification Authority - G4"
+# Serial: 63143484348153506665311985501458640051
+# MD5 Fingerprint: 3a:52:e1:e7:fd:6f:3a:e3:6f:f3:6f:99:1b:f9:22:41
+# SHA1 Fingerprint: 22:d5:d8:df:8f:02:31:d1:8d:f7:9d:b7:cf:8a:2d:64:c9:3f:6c:3a
+# SHA256 Fingerprint: 69:dd:d7:ea:90:bb:57:c9:3e:13:5d:c8:5e:a6:fc:d5:48:0b:60:32:39:bd:c4:54:fc:75:8b:2a:26:cf:7f:79
+-----BEGIN CERTIFICATE-----
+MIIDhDCCAwqgAwIBAgIQL4D+I4wOIg9IZxIokYesszAKBggqhkjOPQQDAzCByjEL
+MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW
+ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2ln
+biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp
+U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y
+aXR5IC0gRzQwHhcNMDcxMTA1MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCByjELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZWZXJp
+U2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNyBWZXJpU2lnbiwg
+SW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJpU2ln
+biBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5
+IC0gRzQwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASnVnp8Utpkmw4tXNherJI9/gHm
+GUo9FANL+mAnINmDiWn6VMaaGF5VKmTeBvaNSjutEDxlPZCIBIngMGGzrl0Bp3ve
+fLK+ymVhAIau2o970ImtTR1ZmkGxvEeA3J5iw/mjgbIwga8wDwYDVR0TAQH/BAUw
+AwEB/zAOBgNVHQ8BAf8EBAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJ
+aW1hZ2UvZ2lmMCEwHzAHBgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYj
+aHR0cDovL2xvZ28udmVyaXNpZ24uY29tL3ZzbG9nby5naWYwHQYDVR0OBBYEFLMW
+kf3upm7ktS5Jj4d4gYDs5bG1MAoGCCqGSM49BAMDA2gAMGUCMGYhDBgmYFo4e1ZC
+4Kf8NoRRkSAsdk1DPcQdhCPQrNZ8NQbOzWm9kA3bbEhCHQ6qQgIxAJw9SDkjOVga
+FRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
+-----END CERTIFICATE-----
+
+# Issuer: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
+# Subject: CN=NetLock Arany (Class Gold) Főtanúsítvány O=NetLock Kft. OU=Tanúsítványkiadók (Certification Services)
+# Label: "NetLock Arany (Class Gold) Főtanúsítvány"
+# Serial: 80544274841616
+# MD5 Fingerprint: c5:a1:b7:ff:73:dd:d6:d7:34:32:18:df:fc:3c:ad:88
+# SHA1 Fingerprint: 06:08:3f:59:3f:15:a1:04:a0:69:a4:6b:a9:03:d0:06:b7:97:09:91
+# SHA256 Fingerprint: 6c:61:da:c3:a2:de:f0:31:50:6b:e0:36:d2:a6:fe:40:19:94:fb:d1:3d:f9:c8:d4:66:59:92:74:c4:46:ec:98
+-----BEGIN CERTIFICATE-----
+MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQG
+EwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3
+MDUGA1UECwwuVGFuw7pzw610dsOhbnlraWFkw7NrIChDZXJ0aWZpY2F0aW9uIFNl
+cnZpY2VzKTE1MDMGA1UEAwwsTmV0TG9jayBBcmFueSAoQ2xhc3MgR29sZCkgRsWR
+dGFuw7pzw610dsOhbnkwHhcNMDgxMjExMTUwODIxWhcNMjgxMjA2MTUwODIxWjCB
+pzELMAkGA1UEBhMCSFUxETAPBgNVBAcMCEJ1ZGFwZXN0MRUwEwYDVQQKDAxOZXRM
+b2NrIEtmdC4xNzA1BgNVBAsMLlRhbsO6c8OtdHbDoW55a2lhZMOzayAoQ2VydGlm
+aWNhdGlvbiBTZXJ2aWNlcykxNTAzBgNVBAMMLE5ldExvY2sgQXJhbnkgKENsYXNz
+IEdvbGQpIEbFkXRhbsO6c8OtdHbDoW55MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAxCRec75LbRTDofTjl5Bu0jBFHjzuZ9lk4BqKf8owyoPjIMHj9DrT
+lF8afFttvzBPhCf2nx9JvMaZCpDyD/V/Q4Q3Y1GLeqVw/HpYzY6b7cNGbIRwXdrz
+AZAj/E4wqX7hJ2Pn7WQ8oLjJM2P+FpD/sLj916jAwJRDC7bVWaaeVtAkH3B5r9s5
+VA1lddkVQZQBr17s9o3x/61k/iCa11zr/qYfCGSji3ZVrR47KGAuhyXoqq8fxmRG
+ILdwfzzeSNuWU7c5d+Qa4scWhHaXWy+7GRWF+GmF9ZmnqfI0p6m2pgP8b4Y9VHx2
+BJtr+UBdADTHLpl1neWIA6pN+APSQnbAGwIDAKiLo0UwQzASBgNVHRMBAf8ECDAG
+AQH/AgEEMA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUzPpnk/C2uNClwB7zU/2M
+U9+D15YwDQYJKoZIhvcNAQELBQADggEBAKt/7hwWqZw8UQCgwBEIBaeZ5m8BiFRh
+bvG5GK1Krf6BQCOUL/t1fC8oS2IkgYIL9WHxHG64YTjrgfpioTtaYtOUZcTh5m2C
++C8lcLIhJsFyUR+MLMOEkMNaj7rP9KdlpeuY0fsFskZ1FSNqb4VjMIDw1Z4fKRzC
+bLBQWV2QWzuoDTDPv31/zvGdg73JRm4gpvlhUbohL3u+pRVjodSVh/GeufOJ8z2F
+uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2
+XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Subject: CN=Staat der Nederlanden Root CA - G2 O=Staat der Nederlanden
+# Label: "Staat der Nederlanden Root CA - G2"
+# Serial: 10000012
+# MD5 Fingerprint: 7c:a5:0f:f8:5b:9a:7d:6d:30:ae:54:5a:e3:42:a2:8a
+# SHA1 Fingerprint: 59:af:82:79:91:86:c7:b4:75:07:cb:cf:03:57:46:eb:04:dd:b7:16
+# SHA256 Fingerprint: 66:8c:83:94:7d:a6:3b:72:4b:ec:e1:74:3c:31:a0:e6:ae:d0:db:8e:c5:b3:1b:e3:77:bb:78:4f:91:b6:71:6f
+-----BEGIN CERTIFICATE-----
+MIIFyjCCA7KgAwIBAgIEAJiWjDANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJO
+TDEeMBwGA1UECgwVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSswKQYDVQQDDCJTdGFh
+dCBkZXIgTmVkZXJsYW5kZW4gUm9vdCBDQSAtIEcyMB4XDTA4MDMyNjExMTgxN1oX
+DTIwMDMyNTExMDMxMFowWjELMAkGA1UEBhMCTkwxHjAcBgNVBAoMFVN0YWF0IGRl
+ciBOZWRlcmxhbmRlbjErMCkGA1UEAwwiU3RhYXQgZGVyIE5lZGVybGFuZGVuIFJv
+b3QgQ0EgLSBHMjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMVZ5291
+qj5LnLW4rJ4L5PnZyqtdj7U5EILXr1HgO+EASGrP2uEGQxGZqhQlEq0i6ABtQ8Sp
+uOUfiUtnvWFI7/3S4GCI5bkYYCjDdyutsDeqN95kWSpGV+RLufg3fNU254DBtvPU
+Z5uW6M7XxgpT0GtJlvOjCwV3SPcl5XCsMBQgJeN/dVrlSPhOewMHBPqCYYdu8DvE
+pMfQ9XQ+pV0aCPKbJdL2rAQmPlU6Yiile7Iwr/g3wtG61jj99O9JMDeZJiFIhQGp
+5Rbn3JBV3w/oOM2ZNyFPXfUib2rFEhZgF1XyZWampzCROME4HYYEhLoaJXhena/M
+UGDWE4dS7WMfbWV9whUYdMrhfmQpjHLYFhN9C0lK8SgbIHRrxT3dsKpICT0ugpTN
+GmXZK4iambwYfp/ufWZ8Pr2UuIHOzZgweMFvZ9C+X+Bo7d7iscksWXiSqt8rYGPy
+5V6548r6f1CGPqI0GAwJaCgRHOThuVw+R7oyPxjMW4T182t0xHJ04eOLoEq9jWYv
+6q012iDTiIJh8BIitrzQ1aTsr1SIJSQ8p22xcik/Plemf1WvbibG/ufMQFxRRIEK
+eN5KzlW/HdXZt1bv8Hb/C3m1r737qWmRRpdogBQ2HbN/uymYNqUg+oJgYjOk7Na6
+B6duxc8UpufWkjTYgfX8HV2qXB72o007uPc5AgMBAAGjgZcwgZQwDwYDVR0TAQH/
+BAUwAwEB/zBSBgNVHSAESzBJMEcGBFUdIAAwPzA9BggrBgEFBQcCARYxaHR0cDov
+L3d3dy5wa2lvdmVyaGVpZC5ubC9wb2xpY2llcy9yb290LXBvbGljeS1HMjAOBgNV
+HQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJFoMocVHYnitfGsNig0jQt8YojrMA0GCSqG
+SIb3DQEBCwUAA4ICAQCoQUpnKpKBglBu4dfYszk78wIVCVBR7y29JHuIhjv5tLyS
+CZa59sCrI2AGeYwRTlHSeYAz+51IvuxBQ4EffkdAHOV6CMqqi3WtFMTC6GY8ggen
+5ieCWxjmD27ZUD6KQhgpxrRW/FYQoAUXvQwjf/ST7ZwaUb7dRUG/kSS0H4zpX897
+IZmflZ85OkYcbPnNe5yQzSipx6lVu6xiNGI1E0sUOlWDuYaNkqbG9AclVMwWVxJK
+gnjIFNkXgiYtXSAfea7+1HAWFpWD2DU5/1JddRwWxRNVz0fMdWVSSt7wsKfkCpYL
++63C4iWEst3kvX5ZbJvw8NjnyvLplzh+ib7M+zkXYT9y2zqR2GUBGR2tUKRXCnxL
+vJxxcypFURmFzI79R6d0lR2o0a9OF7FpJsKqeFdbxU2n5Z4FF5TKsl+gSRiNNOkm
+bEgeqmiSBeGCc1qb3AdbCG19ndeNIdn8FCCqwkXfP+cAslHkwvgFuXkajDTznlvk
+N1trSt8sV4pAWja63XVECDdCcAz+3F4hoKOKwJCcaNpQ5kUQR3i2TtJlycM33+FC
+Y7BXN0Ute4qcvwXqZVUz9zkQxSgqIXobisQk+T8VyJoVIPVVYpbtbZNQvOSqeK3Z
+ywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm66+KAQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig O=Disig a.s.
+# Subject: CN=CA Disig O=Disig a.s.
+# Label: "CA Disig"
+# Serial: 1
+# MD5 Fingerprint: 3f:45:96:39:e2:50:87:f7:bb:fe:98:0c:3c:20:98:e6
+# SHA1 Fingerprint: 2a:c8:d5:8b:57:ce:bf:2f:49:af:f2:fc:76:8f:51:14:62:90:7a:41
+# SHA256 Fingerprint: 92:bf:51:19:ab:ec:ca:d0:b1:33:2d:c4:e1:d0:5f:ba:75:b5:67:90:44:ee:0c:a2:6e:93:1f:74:4f:2f:33:cf
+-----BEGIN CERTIFICATE-----
+MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzET
+MBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UE
+AxMIQ0EgRGlzaWcwHhcNMDYwMzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQsw
+CQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcg
+YS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
+ggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgmGErE
+Nx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnX
+mjxUizkDPw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYD
+XcDtab86wYqg6I7ZuUUohwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhW
+S8+2rT+MitcE5eN4TPWGqvWP+j1scaMtymfraHtuM6kMgiioTGohQBUgDCZbg8Kp
+FhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8wgfwwDwYDVR0TAQH/BAUw
+AwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0PAQH/BAQD
+AgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cu
+ZGlzaWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5z
+ay9jYS9jcmwvY2FfZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2sv
+Y2EvY3JsL2NhX2Rpc2lnLmNybDAaBgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEw
+DQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59tWDYcPQuBDRIrRhCA/ec8J9B6
+yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3mkkp7M5+cTxq
+EEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
+CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeB
+EicTXxChds6KezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFN
+PGO+I++MzVpQuGhU+QqZMxEA4Z7CRneC9VkGjCFMhwnN5ag=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Juur-SK O=AS Sertifitseerimiskeskus
+# Subject: CN=Juur-SK O=AS Sertifitseerimiskeskus
+# Label: "Juur-SK"
+# Serial: 999181308
+# MD5 Fingerprint: aa:8e:5d:d9:f8:db:0a:58:b7:8d:26:87:6c:82:35:55
+# SHA1 Fingerprint: 40:9d:4b:d9:17:b5:5c:27:b6:9b:64:cb:98:22:44:0d:cd:09:b8:89
+# SHA256 Fingerprint: ec:c3:e9:c3:40:75:03:be:e0:91:aa:95:2f:41:34:8f:f8:8b:aa:86:3b:22:64:be:fa:c8:07:90:15:74:e9:39
+-----BEGIN CERTIFICATE-----
+MIIE5jCCA86gAwIBAgIEO45L/DANBgkqhkiG9w0BAQUFADBdMRgwFgYJKoZIhvcN
+AQkBFglwa2lAc2suZWUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKExlBUyBTZXJ0aWZp
+dHNlZXJpbWlza2Vza3VzMRAwDgYDVQQDEwdKdXVyLVNLMB4XDTAxMDgzMDE0MjMw
+MVoXDTE2MDgyNjE0MjMwMVowXTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMQsw
+CQYDVQQGEwJFRTEiMCAGA1UEChMZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEQ
+MA4GA1UEAxMHSnV1ci1TSzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB
+AIFxNj4zB9bjMI0TfncyRsvPGbJgMUaXhvSYRqTCZUXP00B841oiqBB4M8yIsdOB
+SvZiF3tfTQou0M+LI+5PAk676w7KvRhj6IAcjeEcjT3g/1tf6mTll+g/mX8MCgkz
+ABpTpyHhOEvWgxutr2TC+Rx6jGZITWYfGAriPrsfB2WThbkasLnE+w0R9vXW+RvH
+LCu3GFH+4Hv2qEivbDtPL+/40UceJlfwUR0zlv/vWT3aTdEVNMfqPxZIe5EcgEMP
+PbgFPtGzlc3Yyg/CQ2fbt5PgIoIuvvVoKIO5wTtpeyDaTpxt4brNj3pssAki14sL
+2xzVWiZbDcDq5WDQn/413z8CAwEAAaOCAawwggGoMA8GA1UdEwEB/wQFMAMBAf8w
+ggEWBgNVHSAEggENMIIBCTCCAQUGCisGAQQBzh8BAQEwgfYwgdAGCCsGAQUFBwIC
+MIHDHoHAAFMAZQBlACAAcwBlAHIAdABpAGYAaQBrAGEAYQB0ACAAbwBuACAAdgDk
+AGwAagBhAHMAdABhAHQAdQBkACAAQQBTAC0AaQBzACAAUwBlAHIAdABpAGYAaQB0
+AHMAZQBlAHIAaQBtAGkAcwBrAGUAcwBrAHUAcwAgAGEAbABhAG0ALQBTAEsAIABz
+AGUAcgB0AGkAZgBpAGsAYQBhAHQAaQBkAGUAIABrAGkAbgBuAGkAdABhAG0AaQBz
+AGUAawBzMCEGCCsGAQUFBwIBFhVodHRwOi8vd3d3LnNrLmVlL2Nwcy8wKwYDVR0f
+BCQwIjAgoB6gHIYaaHR0cDovL3d3dy5zay5lZS9qdXVyL2NybC8wHQYDVR0OBBYE
+FASqekej5ImvGs8KQKcYP2/v6X2+MB8GA1UdIwQYMBaAFASqekej5ImvGs8KQKcY
+P2/v6X2+MA4GA1UdDwEB/wQEAwIB5jANBgkqhkiG9w0BAQUFAAOCAQEAe8EYlFOi
+CfP+JmeaUOTDBS8rNXiRTHyoERF5TElZrMj3hWVcRrs7EKACr81Ptcw2Kuxd/u+g
+kcm2k298gFTsxwhwDY77guwqYHhpNjbRxZyLabVAyJRld/JXIWY7zoVAtjNjGr95
+HvxcHdMdkxuLDF2FvZkwMhgJkVLpfKG6/2SSmuz+Ne6ML678IIbsSt4beDI3poHS
+na9aEhbKmVv8b20OxaAehsmR0FyYgl9jDIpaq9iVpszLita/ZEuOyoqysOkhMp6q
+qIWYNIE5ITuoOlIyPfZrN4YGWhWY3PARZv40ILcD9EEQfTmEeZZyY7aWAuVrua0Z
+TbvGRNs2yyqcjg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post
+# Label: "Hongkong Post Root CA 1"
+# Serial: 1000
+# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca
+# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58
+# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2
+-----BEGIN CERTIFICATE-----
+MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx
+FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg
+Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG
+A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr
+b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ
+jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn
+PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh
+ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9
+nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h
+q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED
+MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC
+mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3
+7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB
+oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs
+EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO
+fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi
+AmvZWg==
+-----END CERTIFICATE-----
+
+# Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc.
+# Label: "SecureSign RootCA11"
+# Serial: 1
+# MD5 Fingerprint: b7:52:74:e2:92:b4:80:93:f2:75:e4:cc:d7:f2:ea:26
+# SHA1 Fingerprint: 3b:c4:9f:48:f8:f3:73:a0:9c:1e:bd:f8:5b:b1:c3:65:c7:d8:11:b3
+# SHA256 Fingerprint: bf:0f:ee:fb:9e:3a:58:1a:d5:f9:e9:db:75:89:98:57:43:d2:61:08:5c:4d:31:4f:6f:5d:72:59:aa:42:16:12
+-----BEGIN CERTIFICATE-----
+MIIDbTCCAlWgAwIBAgIBATANBgkqhkiG9w0BAQUFADBYMQswCQYDVQQGEwJKUDEr
+MCkGA1UEChMiSmFwYW4gQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcywgSW5jLjEcMBoG
+A1UEAxMTU2VjdXJlU2lnbiBSb290Q0ExMTAeFw0wOTA0MDgwNDU2NDdaFw0yOTA0
+MDgwNDU2NDdaMFgxCzAJBgNVBAYTAkpQMSswKQYDVQQKEyJKYXBhbiBDZXJ0aWZp
+Y2F0aW9uIFNlcnZpY2VzLCBJbmMuMRwwGgYDVQQDExNTZWN1cmVTaWduIFJvb3RD
+QTExMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA/XeqpRyQBTvLTJsz
+i1oURaTnkBbR31fSIRCkF/3frNYfp+TbfPfs37gD2pRY/V1yfIw/XwFndBWW4wI8
+h9uuywGOwvNmxoVF9ALGOrVisq/6nL+k5tSAMJjzDbaTj6nU2DbysPyKyiyhFTOV
+MdrAG/LuYpmGYz+/3ZMqg6h2uRMft85OQoWPIucuGvKVCbIFtUROd6EgvanyTgp9
+UK31BQ1FT0Zx/Sg+U/sE2C3XZR1KG/rPO7AxmjVuyIsG0wCR8pQIZUyxNAYAeoni
+8McDWc/V1uinMrPmmECGxc0nEovMe863ETxiYAcjPitAbpSACW22s293bzUIUPsC
+h8U+iQIDAQABo0IwQDAdBgNVHQ4EFgQUW/hNT7KlhtQ60vFjmqC+CfZXt94wDgYD
+VR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB
+AKChOBZmLqdWHyGcBvod7bkixTgm2E5P7KN/ed5GIaGHd48HCJqypMWvDzKYC3xm
+KbabfSVSSUOrTC4rbnpwrxYO4wJs+0LmGJ1F2FXI6Dvd5+H0LgscNFxsWEr7jIhQ
+X5Ucv+2rIrVls4W6ng+4reV6G4pQOh29Dbx7VFALuUKvVaAYga1lme++5Jy/xIWr
+QbJUb9wlze144o4MjQlJ3WN7WmmWAiGovVJZ6X01y8hSyn+B/tlr0/cR7SXf+Of5
+pPpyl4RTDaXQMhhRdlkUbA/r7F+AjHVDg8OFmP9Mni0N5HeDk061lgeLKBObjBmN
+QSdJQO7e5iNEOdyhIta6A/I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=ACEDICOM Root O=EDICOM OU=PKI
+# Subject: CN=ACEDICOM Root O=EDICOM OU=PKI
+# Label: "ACEDICOM Root"
+# Serial: 7029493972724711941
+# MD5 Fingerprint: 42:81:a0:e2:1c:e3:55:10:de:55:89:42:65:96:22:e6
+# SHA1 Fingerprint: e0:b4:32:2e:b2:f6:a5:68:b6:54:53:84:48:18:4a:50:36:87:43:84
+# SHA256 Fingerprint: 03:95:0f:b4:9a:53:1f:3e:19:91:94:23:98:df:a9:e0:ea:32:d7:ba:1c:dd:9b:c8:5d:b5:7e:d9:40:0b:43:4a
+-----BEGIN CERTIFICATE-----
+MIIFtTCCA52gAwIBAgIIYY3HhjsBggUwDQYJKoZIhvcNAQEFBQAwRDEWMBQGA1UE
+AwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZFRElDT00x
+CzAJBgNVBAYTAkVTMB4XDTA4MDQxODE2MjQyMloXDTI4MDQxMzE2MjQyMlowRDEW
+MBQGA1UEAwwNQUNFRElDT00gUm9vdDEMMAoGA1UECwwDUEtJMQ8wDQYDVQQKDAZF
+RElDT00xCzAJBgNVBAYTAkVTMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKC
+AgEA/5KV4WgGdrQsyFhIyv2AVClVYyT/kGWbEHV7w2rbYgIB8hiGtXxaOLHkWLn7
+09gtn70yN78sFW2+tfQh0hOR2QetAQXW8713zl9CgQr5auODAKgrLlUTY4HKRxx7
+XBZXehuDYAQ6PmXDzQHe3qTWDLqO3tkE7hdWIpuPY/1NFgu3e3eM+SW10W2ZEi5P
+Grjm6gSSrj0RuVFCPYewMYWveVqc/udOXpJPQ/yrOq2lEiZmueIM15jO1FillUAK
+t0SdE3QrwqXrIhWYENiLxQSfHY9g5QYbm8+5eaA9oiM/Qj9r+hwDezCNzmzAv+Yb
+X79nuIQZ1RXve8uQNjFiybwCq0Zfm/4aaJQ0PZCOrfbkHQl/Sog4P75n/TSW9R28
+MHTLOO7VbKvU/PQAtwBbhTIWdjPp2KOZnQUAqhbm84F9b32qhm2tFXTTxKJxqvQU
+fecyuB+81fFOvW8XAjnXDpVCOscAPukmYxHqC9FK/xidstd7LzrZlvvoHpKuE1XI
+2Sf23EgbsCTBheN3nZqk8wwRHQ3ItBTutYJXCb8gWH8vIiPYcMt5bMlL8qkqyPyH
+K9caUPgn6C9D4zq92Fdx/c6mUlv53U3t5fZvie27k5x2IXXwkkwp9y+cAS7+UEae
+ZAwUswdbxcJzbPEHXEUkFDWug/FqTYl6+rPYLWbwNof1K1MCAwEAAaOBqjCBpzAP
+BgNVHRMBAf8EBTADAQH/MB8GA1UdIwQYMBaAFKaz4SsrSbbXc6GqlPUB53NlTKxQ
+MA4GA1UdDwEB/wQEAwIBhjAdBgNVHQ4EFgQUprPhKytJttdzoaqU9QHnc2VMrFAw
+RAYDVR0gBD0wOzA5BgRVHSAAMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly9hY2VkaWNv
+bS5lZGljb21ncm91cC5jb20vZG9jMA0GCSqGSIb3DQEBBQUAA4ICAQDOLAtSUWIm
+fQwng4/F9tqgaHtPkl7qpHMyEVNEskTLnewPeUKzEKbHDZ3Ltvo/Onzqv4hTGzz3
+gvoFNTPhNahXwOf9jU8/kzJPeGYDdwdY6ZXIfj7QeQCM8htRM5u8lOk6e25SLTKe
+I6RF+7YuE7CLGLHdztUdp0J/Vb77W7tH1PwkzQSulgUV1qzOMPPKC8W64iLgpq0i
+5ALudBF/TP94HTXa5gI06xgSYXcGCRZj6hitoocf8seACQl1ThCojz2GuHURwCRi
+ipZ7SkXp7FnFvmuD5uHorLUwHv4FB4D54SMNUI8FmP8sX+g7tq3PgbUhh8oIKiMn
+MCArz+2UW6yyetLHKKGKC5tNSixthT8Jcjxn4tncB7rrZXtaAWPWkFtPF2Y9fwsZ
+o5NjEFIqnxQWWOLcpfShFosOkYuByptZ+thrkQdlVV9SH686+5DdaaVbnG0OLLb6
+zqylfDJKZ0DcMDQj3dcEI2bw/FWAp/tmGYI1Z2JwOV5vx+qQQEQIHriy1tvuWacN
+GHk0vFQYXlPKNFHtRQrmjseCNj6nOGOpMCwXEGCSn1WHElkQwg9naRHMTh5+Spqt
+r0CodaxWkHS4oJyleW/c6RrIaQXpuvoDs3zk4E7Czp3otkYNbn5XOmeUwssfnHdK
+Z05phkOTOPu220+DkdRgfks+KzgHVZhepA==
+-----END CERTIFICATE-----
+
+# Issuer: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Subject: O=VeriSign, Inc. OU=Class 3 Public Primary Certification Authority
+# Label: "Verisign Class 3 Public Primary Certification Authority"
+# Serial: 80507572722862485515306429940691309246
+# MD5 Fingerprint: ef:5a:f1:33:ef:f1:cd:bb:51:02:ee:12:14:4b:96:c4
+# SHA1 Fingerprint: a1:db:63:93:91:6f:17:e4:18:55:09:40:04:15:c7:02:40:b0:ae:6b
+# SHA256 Fingerprint: a4:b6:b3:99:6f:c2:f3:06:b3:fd:86:81:bd:63:41:3d:8c:50:09:cc:4f:a3:29:c2:cc:f0:e2:fa:1b:14:03:05
+-----BEGIN CERTIFICATE-----
+MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
+A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
+cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
+MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
+BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
+YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
+ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
+BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
+I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
+CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
+2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
+2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Subject: CN=Microsec e-Szigno Root CA 2009 O=Microsec Ltd.
+# Label: "Microsec e-Szigno Root CA 2009"
+# Serial: 14014712776195784473
+# MD5 Fingerprint: f8:49:f4:03:bc:44:2d:83:be:48:69:7d:29:64:fc:b1
+# SHA1 Fingerprint: 89:df:74:fe:5c:f4:0f:4a:80:f9:e3:37:7d:54:da:91:e1:01:31:8e
+# SHA256 Fingerprint: 3c:5f:81:fe:a5:fa:b8:2c:64:bf:a2:ea:ec:af:cd:e8:e0:77:fc:86:20:a7:ca:e5:37:16:3d:f3:6e:db:f3:78
+-----BEGIN CERTIFICATE-----
+MIIECjCCAvKgAwIBAgIJAMJ+QwRORz8ZMA0GCSqGSIb3DQEBCwUAMIGCMQswCQYD
+VQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3QxFjAUBgNVBAoMDU1pY3Jvc2VjIEx0
+ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3ppZ25vIFJvb3QgQ0EgMjAwOTEfMB0G
+CSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5odTAeFw0wOTA2MTYxMTMwMThaFw0y
+OTEyMzAxMTMwMThaMIGCMQswCQYDVQQGEwJIVTERMA8GA1UEBwwIQnVkYXBlc3Qx
+FjAUBgNVBAoMDU1pY3Jvc2VjIEx0ZC4xJzAlBgNVBAMMHk1pY3Jvc2VjIGUtU3pp
+Z25vIFJvb3QgQ0EgMjAwOTEfMB0GCSqGSIb3DQEJARYQaW5mb0BlLXN6aWduby5o
+dTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOn4j/NjrdqG2KfgQvvP
+kd6mJviZpWNwrZuuyjNAfW2WbqEORO7hE52UQlKavXWFdCyoDh2Tthi3jCyoz/tc
+cbna7P7ofo/kLx2yqHWH2Leh5TvPmUpG0IMZfcChEhyVbUr02MelTTMuhTlAdX4U
+fIASmFDHQWe4oIBhVKZsTh/gnQ4H6cm6M+f+wFUoLAKApxn1ntxVUwOXewdI/5n7
+N4okxFnMUBBjjqqpGrCEGob5X7uxUG6k0QrM1XF+H6cbfPVTbiJfyyvm1HxdrtbC
+xkzlBQHZ7Vf8wSN5/PrIJIOV87VqUQHQd9bpEqH5GoP7ghu5sJf0dgYzQ0mg/wu1
++rUCAwEAAaOBgDB+MA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0G
+A1UdDgQWBBTLD8bfQkPMPcu1SCOhGnqmKrs0aDAfBgNVHSMEGDAWgBTLD8bfQkPM
+Pcu1SCOhGnqmKrs0aDAbBgNVHREEFDASgRBpbmZvQGUtc3ppZ25vLmh1MA0GCSqG
+SIb3DQEBCwUAA4IBAQDJ0Q5eLtXMs3w+y/w9/w0olZMEyL/azXm4Q5DwpL7v8u8h
+mLzU1F0G9u5C7DBsoKqpyvGvivo/C3NqPuouQH4frlRheesuCDfXI/OMn74dseGk
+ddug4lQUsbocKaQY9hK6ohQU4zE1yED/t+AFdlfBHFny+L/k7SViXITwfn4fs775
+tyERzAMBVnCnEJIeGzSBHq2cGsMEPO0CYdYeBvNfOofyK/FFh+U9rNHHV4S9a67c
+2Pm2G2JwCz02yULyMtd6YebS2z3PyKnJm9zbWETXbzivf3jTo60adbocwTZ8jx5t
+HMN1Rq41Bab2XD0h7lbwyYIiLXpUq3DDfSJlgnCW
+-----END CERTIFICATE-----
+
+# Issuer: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.
+# Subject: CN=e-Guven Kok Elektronik Sertifika Hizmet Saglayicisi O=Elektronik Bilgi Guvenligi A.S.
+# Label: "E-Guven Kok Elektronik Sertifika Hizmet Saglayicisi"
+# Serial: 91184789765598910059173000485363494069
+# MD5 Fingerprint: 3d:41:29:cb:1e:aa:11:74:cd:5d:b0:62:af:b0:43:5b
+# SHA1 Fingerprint: dd:e1:d2:a9:01:80:2e:1d:87:5e:84:b3:80:7e:4b:b1:fd:99:41:34
+# SHA256 Fingerprint: e6:09:07:84:65:a4:19:78:0c:b6:ac:4c:1c:0b:fb:46:53:d9:d9:cc:6e:b3:94:6e:b7:f3:d6:99:97:ba:d5:98
+-----BEGIN CERTIFICATE-----
+MIIDtjCCAp6gAwIBAgIQRJmNPMADJ72cdpW56tustTANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJUUjEoMCYGA1UEChMfRWxla3Ryb25payBCaWxnaSBHdXZlbmxp
+Z2kgQS5TLjE8MDoGA1UEAxMzZS1HdXZlbiBLb2sgRWxla3Ryb25payBTZXJ0aWZp
+a2EgSGl6bWV0IFNhZ2xheWljaXNpMB4XDTA3MDEwNDExMzI0OFoXDTE3MDEwNDEx
+MzI0OFowdTELMAkGA1UEBhMCVFIxKDAmBgNVBAoTH0VsZWt0cm9uaWsgQmlsZ2kg
+R3V2ZW5saWdpIEEuUy4xPDA6BgNVBAMTM2UtR3V2ZW4gS29rIEVsZWt0cm9uaWsg
+U2VydGlmaWthIEhpem1ldCBTYWdsYXlpY2lzaTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMMSIJ6wXgBljU5Gu4Bc6SwGl9XzcslwuedLZYDBS75+PNdU
+MZTe1RK6UxYC6lhj71vY8+0qGqpxSKPcEC1fX+tcS5yWCEIlKBHMilpiAVDV6wlT
+L/jDj/6z/P2douNffb7tC+Bg62nsM+3YjfsSSYMAyYuXjDtzKjKzEve5TfL0TW3H
+5tYmNwjy2f1rXKPlSFxYvEK+A1qBuhw1DADT9SN+cTAIJjjcJRFHLfO6IxClv7wC
+90Nex/6wN1CZew+TzuZDLMN+DfIcQ2Zgy2ExR4ejT669VmxMvLz4Bcpk9Ok0oSy1
+c+HCPujIyTQlCFzz7abHlJ+tiEMl1+E5YP6sOVkCAwEAAaNCMEAwDgYDVR0PAQH/
+BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFJ/uRLOU1fqRTy7ZVZoE
+VtstxNulMA0GCSqGSIb3DQEBBQUAA4IBAQB/X7lTW2M9dTLn+sR0GstG30ZpHFLP
+qk/CaOv/gKlR6D1id4k9CnU58W5dF4dvaAXBlGzZXd/aslnLpRCKysw5zZ/rTt5S
+/wzw9JKp8mxTq5vSR6AfdPebmvEvFZ96ZDAYBzwqD2fK/A+JYZ1lpTzlvBNbCNvj
+/+27BrtqBrF6T2XGgv0enIu1De5Iu7i9qgi0+6N8y5/NkHZchpZ4Vwpm+Vganf2X
+KWDeEaaQHBkc7gGWIjQ0LpH5t8Qn0Xvmv/uARFoW5evg1Ao4vOSR49XrXMGs3xtq
+fJ7lddK2l4fbzIcrQzqECK+rPNv3PGYxhrCdU3nt+CPeQuMtgvEP5fqX
+-----END CERTIFICATE-----
+
+# Issuer: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Subject: CN=GlobalSign O=GlobalSign OU=GlobalSign Root CA - R3
+# Label: "GlobalSign Root CA - R3"
+# Serial: 4835703278459759426209954
+# MD5 Fingerprint: c5:df:b8:49:ca:05:13:55:ee:2d:ba:1a:c3:3e:b0:28
+# SHA1 Fingerprint: d6:9b:56:11:48:f0:1c:77:c5:45:78:c1:09:26:df:5b:85:69:76:ad
+# SHA256 Fingerprint: cb:b5:22:d7:b7:f1:27:ad:6a:01:13:86:5b:df:1c:d4:10:2e:7d:07:59:af:63:5a:7c:f4:72:0d:c9:63:c5:3b
+-----BEGIN CERTIFICATE-----
+MIIDXzCCAkegAwIBAgILBAAAAAABIVhTCKIwDQYJKoZIhvcNAQELBQAwTDEgMB4G
+A1UECxMXR2xvYmFsU2lnbiBSb290IENBIC0gUjMxEzARBgNVBAoTCkdsb2JhbFNp
+Z24xEzARBgNVBAMTCkdsb2JhbFNpZ24wHhcNMDkwMzE4MTAwMDAwWhcNMjkwMzE4
+MTAwMDAwWjBMMSAwHgYDVQQLExdHbG9iYWxTaWduIFJvb3QgQ0EgLSBSMzETMBEG
+A1UEChMKR2xvYmFsU2lnbjETMBEGA1UEAxMKR2xvYmFsU2lnbjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAMwldpB5BngiFvXAg7aEyiie/QV2EcWtiHL8
+RgJDx7KKnQRfJMsuS+FggkbhUqsMgUdwbN1k0ev1LKMPgj0MK66X17YUhhB5uzsT
+gHeMCOFJ0mpiLx9e+pZo34knlTifBtc+ycsmWQ1z3rDI6SYOgxXG71uL0gRgykmm
+KPZpO/bLyCiR5Z2KYVc3rHQU3HTgOu5yLy6c+9C7v/U9AOEGM+iCK65TpjoWc4zd
+QQ4gOsC0p6Hpsk+QLjJg6VfLuQSSaGjlOCZgdbKfd/+RFO+uIEn8rUAVSNECMWEZ
+XriX7613t2Saer9fwRPvm2L7DWzgVGkWqQPabumDk3F2xmmFghcCAwEAAaNCMEAw
+DgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFI/wS3+o
+LkUkrk1Q+mOai97i3Ru8MA0GCSqGSIb3DQEBCwUAA4IBAQBLQNvAUKr+yAzv95ZU
+RUm7lgAJQayzE4aGKAczymvmdLm6AC2upArT9fHxD4q/c2dKg8dEe3jgr25sbwMp
+jjM5RcOO5LlXbKr8EpbsU8Yt5CRsuZRj+9xTaGdWPoO4zzUhw8lo/s7awlOqzJCK
+6fBdRoyV3XpYKBovHd7NADdBj+1EbddTKJd+82cEHhXXipa0095MJ6RMG3NzdvQX
+mcIfeg7jLQitChws/zyrVQ4PkX4268NXSb7hLi18YIvDQVETI53O9zJrlAGomecs
+Mx86OyXShkDOOyyGeMlhLxS67ttVb9+E7gUJTb0o2HLO02JQZR7rkpeDMdmztcpH
+WD9f
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Subject: CN=Autoridad de Certificacion Firmaprofesional CIF A62634068
+# Label: "Autoridad de Certificacion Firmaprofesional CIF A62634068"
+# Serial: 6047274297262753887
+# MD5 Fingerprint: 73:3a:74:7a:ec:bb:a3:96:a6:c2:e4:e2:c8:9b:c0:c3
+# SHA1 Fingerprint: ae:c5:fb:3f:c8:e1:bf:c4:e5:4f:03:07:5a:9a:e8:00:b7:f7:b6:fa
+# SHA256 Fingerprint: 04:04:80:28:bf:1f:28:64:d4:8f:9a:d4:d8:32:94:36:6a:82:88:56:55:3f:3b:14:30:3f:90:14:7f:5d:40:ef
+-----BEGIN CERTIFICATE-----
+MIIGFDCCA/ygAwIBAgIIU+w77vuySF8wDQYJKoZIhvcNAQEFBQAwUTELMAkGA1UE
+BhMCRVMxQjBABgNVBAMMOUF1dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIEZpcm1h
+cHJvZmVzaW9uYWwgQ0lGIEE2MjYzNDA2ODAeFw0wOTA1MjAwODM4MTVaFw0zMDEy
+MzEwODM4MTVaMFExCzAJBgNVBAYTAkVTMUIwQAYDVQQDDDlBdXRvcmlkYWQgZGUg
+Q2VydGlmaWNhY2lvbiBGaXJtYXByb2Zlc2lvbmFsIENJRiBBNjI2MzQwNjgwggIi
+MA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDKlmuO6vj78aI14H9M2uDDUtd9
+thDIAl6zQyrET2qyyhxdKJp4ERppWVevtSBC5IsP5t9bpgOSL/UR5GLXMnE42QQM
+cas9UX4PB99jBVzpv5RvwSmCwLTaUbDBPLutN0pcyvFLNg4kq7/DhHf9qFD0sefG
+L9ItWY16Ck6WaVICqjaY7Pz6FIMMNx/Jkjd/14Et5cS54D40/mf0PmbR0/RAz15i
+NA9wBj4gGFrO93IbJWyTdBSTo3OxDqqHECNZXyAFGUftaI6SEspd/NYrspI8IM/h
+X68gvqB2f3bl7BqGYTM+53u0P6APjqK5am+5hyZvQWyIplD9amML9ZMWGxmPsu2b
+m8mQ9QEM3xk9Dz44I8kvjwzRAv4bVdZO0I08r0+k8/6vKtMFnXkIoctXMbScyJCy
+Z/QYFpM6/EfY0XiWMR+6KwxfXZmtY4laJCB22N/9q06mIqqdXuYnin1oKaPnirja
+EbsXLZmdEyRG98Xi2J+Of8ePdG1asuhy9azuJBCtLxTa/y2aRnFHvkLfuwHb9H/T
+KI8xWVvTyQKmtFLKbpf7Q8UIJm+K9Lv9nyiqDdVF8xM6HdjAeI9BZzwelGSuewvF
+6NkBiDkal4ZkQdU7hwxu+g/GvUgUvzlN1J5Bto+WHWOWk9mVBngxaJ43BjuAiUVh
+OSPHG0SjFeUc+JIwuwIDAQABo4HvMIHsMBIGA1UdEwEB/wQIMAYBAf8CAQEwDgYD
+VR0PAQH/BAQDAgEGMB0GA1UdDgQWBBRlzeurNR4APn7VdMActHNHDhpkLzCBpgYD
+VR0gBIGeMIGbMIGYBgRVHSAAMIGPMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmZp
+cm1hcHJvZmVzaW9uYWwuY29tL2NwczBcBggrBgEFBQcCAjBQHk4AUABhAHMAZQBv
+ACAAZABlACAAbABhACAAQgBvAG4AYQBuAG8AdgBhACAANAA3ACAAQgBhAHIAYwBl
+AGwAbwBuAGEAIAAwADgAMAAxADcwDQYJKoZIhvcNAQEFBQADggIBABd9oPm03cXF
+661LJLWhAqvdpYhKsg9VSytXjDvlMd3+xDLx51tkljYyGOylMnfX40S2wBEqgLk9
+am58m9Ot/MPWo+ZkKXzR4Tgegiv/J2Wv+xYVxC5xhOW1//qkR71kMrv2JYSiJ0L1
+ILDCExARzRAVukKQKtJE4ZYm6zFIEv0q2skGz3QeqUvVhyj5eTSSPi5E6PaPT481
+PyWzOdxjKpBrIF/EUhJOlywqrJ2X3kjyo2bbwtKDlaZmp54lD+kLM5FlClrD2VQS
+3a/DTg4fJl4N3LON7NWBcN7STyQF82xO9UxJZo3R/9ILJUFI/lGExkKvgATP0H5k
+SeTy36LssUzAKh3ntLFlosS88Zj0qnAHY7S42jtM+kAiMFsRpvAFDsYCA0irhpuF
+3dvd6qJ2gHN99ZwExEWN57kci57q13XRcrHedUTnQn3iV2t93Jm8PYMo6oCTjcVM
+ZcFwgbg4/EMxsvYDNEeyrPsiBsse3RdHHF9mudMaotoRsaS8I8nkvof/uZS2+F0g
+StRf571oe2XyFR7SOqkt6dhrJKyXWERHrVkY8SFlcN7ONGCoQPHzPKTDKCOM/icz
+Q0CgFzzr6juwcqajuUpLXhZI9LK8yIySxZ2frHI2vDSANGupi5LAuBft7HZT9SQB
+jLMi6Et8Vcad+qMUu2WFbm5PEn4KPJ2V
+-----END CERTIFICATE-----
+
+# Issuer: CN=Izenpe.com O=IZENPE S.A.
+# Subject: CN=Izenpe.com O=IZENPE S.A.
+# Label: "Izenpe.com"
+# Serial: 917563065490389241595536686991402621
+# MD5 Fingerprint: a6:b0:cd:85:80:da:5c:50:34:a3:39:90:2f:55:67:73
+# SHA1 Fingerprint: 2f:78:3d:25:52:18:a7:4a:65:39:71:b5:2c:a2:9c:45:15:6f:e9:19
+# SHA256 Fingerprint: 25:30:cc:8e:98:32:15:02:ba:d9:6f:9b:1f:ba:1b:09:9e:2d:29:9e:0f:45:48:bb:91:4f:36:3b:c0:d4:53:1f
+-----BEGIN CERTIFICATE-----
+MIIF8TCCA9mgAwIBAgIQALC3WhZIX7/hy/WL1xnmfTANBgkqhkiG9w0BAQsFADA4
+MQswCQYDVQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6
+ZW5wZS5jb20wHhcNMDcxMjEzMTMwODI4WhcNMzcxMjEzMDgyNzI1WjA4MQswCQYD
+VQQGEwJFUzEUMBIGA1UECgwLSVpFTlBFIFMuQS4xEzARBgNVBAMMCkl6ZW5wZS5j
+b20wggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDJ03rKDx6sp4boFmVq
+scIbRTJxldn+EFvMr+eleQGPicPK8lVx93e+d5TzcqQsRNiekpsUOqHnJJAKClaO
+xdgmlOHZSOEtPtoKct2jmRXagaKH9HtuJneJWK3W6wyyQXpzbm3benhB6QiIEn6H
+LmYRY2xU+zydcsC8Lv/Ct90NduM61/e0aL6i9eOBbsFGb12N4E3GVFWJGjMxCrFX
+uaOKmMPsOzTFlUFpfnXCPCDFYbpRR6AgkJOhkEvzTnyFRVSa0QUmQbC1TR0zvsQD
+yCV8wXDbO/QJLVQnSKwv4cSsPsjLkkxTOTcj7NMB+eAJRE1NZMDhDVqHIrytG6P+
+JrUV86f8hBnp7KGItERphIPzidF0BqnMC9bC3ieFUCbKF7jJeodWLBoBHmy+E60Q
+rLUk9TiRodZL2vG70t5HtfG8gfZZa88ZU+mNFctKy6lvROUbQc/hhqfK0GqfvEyN
+BjNaooXlkDWgYlwWTvDjovoDGrQscbNYLN57C9saD+veIR8GdwYDsMnvmfzAuU8L
+hij+0rnq49qlw0dpEuDb8PYZi+17cNcC1u2HGCgsBCRMd+RIihrGO5rUD8r6ddIB
+QFqNeb+Lz0vPqhbBleStTIo+F5HUsWLlguWABKQDfo2/2n+iD5dPDNMN+9fR5XJ+
+HMh3/1uaD7euBUbl8agW7EekFwIDAQABo4H2MIHzMIGwBgNVHREEgagwgaWBD2lu
+Zm9AaXplbnBlLmNvbaSBkTCBjjFHMEUGA1UECgw+SVpFTlBFIFMuQS4gLSBDSUYg
+QTAxMzM3MjYwLVJNZXJjLlZpdG9yaWEtR2FzdGVpeiBUMTA1NSBGNjIgUzgxQzBB
+BgNVBAkMOkF2ZGEgZGVsIE1lZGl0ZXJyYW5lbyBFdG9yYmlkZWEgMTQgLSAwMTAx
+MCBWaXRvcmlhLUdhc3RlaXowDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
+AQYwHQYDVR0OBBYEFB0cZQ6o8iV7tJHP5LGx5r1VdGwFMA0GCSqGSIb3DQEBCwUA
+A4ICAQB4pgwWSp9MiDrAyw6lFn2fuUhfGI8NYjb2zRlrrKvV9pF9rnHzP7MOeIWb
+laQnIUdCSnxIOvVFfLMMjlF4rJUT3sb9fbgakEyrkgPH7UIBzg/YsfqikuFgba56
+awmqxinuaElnMIAkejEWOVt+8Rwu3WwJrfIxwYJOubv5vr8qhT/AQKM6WfxZSzwo
+JNu0FXWuDYi6LnPAvViH5ULy617uHjAimcs30cQhbIHsvm0m5hzkQiCeR7Csg1lw
+LDXWrzY0tM07+DKo7+N4ifuNRSzanLh+QBxh5z6ikixL8s36mLYp//Pye6kfLqCT
+VyvehQP5aTfLnnhqBbTFMXiJ7HqnheG5ezzevh55hM6fcA5ZwjUukCox2eRFekGk
+LhObNA5me0mrZJfQRsN5nXJQY6aYWwa9SG3YOYNw6DXwBdGqvOPbyALqfP2C2sJb
+UjWumDqtujWTI6cfSN01RpiyEGjkpTHCClguGYEQyVB1/OpaFs4R1+7vUIgtYf8/
+QnMFlEPVjjxOAToZpR9GTnfQXeWBIiGH/pR9hNiTrdZoQ0iy2+tzJOeRf1SktoA+
+naM8THLCV8Sg1Mw4J87VBp6iSNnpn86CcDaTmjvfliHjWbcM2pE38P1ZWrOZyGls
+QyYBNWNgVYkDOnXYukrZVP/u3oDYLdE41V4tC5h9Pmzb/CaIxw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Chambers of Commerce Root - 2008 O=AC Camerfirma S.A.
+# Label: "Chambers of Commerce Root - 2008"
+# Serial: 11806822484801597146
+# MD5 Fingerprint: 5e:80:9e:84:5a:0e:65:0b:17:02:f3:55:18:2a:3e:d7
+# SHA1 Fingerprint: 78:6a:74:ac:76:ab:14:7f:9c:6a:30:50:ba:9e:a8:7e:fe:9a:ce:3c
+# SHA256 Fingerprint: 06:3e:4a:fa:c4:91:df:d3:32:f3:08:9b:85:42:e9:46:17:d8:93:d7:fe:94:4e:10:a7:93:7e:e2:9d:96:93:c0
+-----BEGIN CERTIFICATE-----
+MIIHTzCCBTegAwIBAgIJAKPaQn6ksa7aMA0GCSqGSIb3DQEBBQUAMIGuMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xKTAnBgNVBAMTIENoYW1iZXJz
+IG9mIENvbW1lcmNlIFJvb3QgLSAyMDA4MB4XDTA4MDgwMTEyMjk1MFoXDTM4MDcz
+MTEyMjk1MFowga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpNYWRyaWQgKHNlZSBj
+dXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29tL2FkZHJlc3MpMRIw
+EAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVyZmlybWEgUy5BLjEp
+MCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAtIDIwMDgwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCvAMtwNyuAWko6bHiUfaN/Gh/2NdW9
+28sNRHI+JrKQUrpjOyhYb6WzbZSm891kDFX29ufyIiKAXuFixrYp4YFs8r/lfTJq
+VKAyGVn+H4vXPWCGhSRv4xGzdz4gljUha7MI2XAuZPeEklPWDrCQiorjh40G072Q
+DuKZoRuGDtqaCrsLYVAGUvGef3bsyw/QHg3PmTA9HMRFEFis1tPo1+XqxQEHd9ZR
+5gN/ikilTWh1uem8nk4ZcfUyS5xtYBkL+8ydddy/Js2Pk3g5eXNeJQ7KXOt3EgfL
+ZEFHcpOrUMPrCXZkNNI5t3YRCQ12RcSprj1qr7V9ZS+UWBDsXHyvfuK2GNnQm05a
+Sd+pZgvMPMZ4fKecHePOjlO+Bd5gD2vlGts/4+EhySnB8esHnFIbAURRPHsl18Tl
+UlRdJQfKFiC4reRB7noI/plvg6aRArBsNlVq5331lubKgdaX8ZSD6e2wsWsSaR6s
++12pxZjptFtYer49okQ6Y1nUCyXeG0+95QGezdIp1Z8XGQpvvwyQ0wlf2eOKNcx5
+Wk0ZN5K3xMGtr/R5JJqyAQuxr1yW84Ay+1w9mPGgP0revq+ULtlVmhduYJ1jbLhj
+ya6BXBg14JC7vjxPNyK5fuvPnnchpj04gftI2jE9K+OJ9dC1vX7gUMQSibMjmhAx
+hduub+84Mxh2EQIDAQABo4IBbDCCAWgwEgYDVR0TAQH/BAgwBgEB/wIBDDAdBgNV
+HQ4EFgQU+SSsD7K1+HnA+mCIG8TZTQKeFxkwgeMGA1UdIwSB2zCB2IAU+SSsD7K1
++HnA+mCIG8TZTQKeFxmhgbSkgbEwga4xCzAJBgNVBAYTAkVVMUMwQQYDVQQHEzpN
+YWRyaWQgKHNlZSBjdXJyZW50IGFkZHJlc3MgYXQgd3d3LmNhbWVyZmlybWEuY29t
+L2FkZHJlc3MpMRIwEAYDVQQFEwlBODI3NDMyODcxGzAZBgNVBAoTEkFDIENhbWVy
+ZmlybWEgUy5BLjEpMCcGA1UEAxMgQ2hhbWJlcnMgb2YgQ29tbWVyY2UgUm9vdCAt
+IDIwMDiCCQCj2kJ+pLGu2jAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRV
+HSAAMCowKAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20w
+DQYJKoZIhvcNAQEFBQADggIBAJASryI1wqM58C7e6bXpeHxIvj99RZJe6dqxGfwW
+PJ+0W2aeaufDuV2I6A+tzyMP3iU6XsxPpcG1Lawk0lgH3qLPaYRgM+gQDROpI9CF
+5Y57pp49chNyM/WqfcZjHwj0/gF/JM8rLFQJ3uIrbZLGOU8W6jx+ekbURWpGqOt1
+glanq6B8aBMz9p0w8G8nOSQjKpD9kCk18pPfNKXG9/jvjA9iSnyu0/VU+I22mlaH
+FoI6M6taIgj3grrqLuBHmrS1RaMFO9ncLkVAO+rcf+g769HsJtg1pDDFOqxXnrN2
+pSB7+R5KBWIBpih1YJeSDW4+TTdDDZIVnBgizVGZoCkaPF+KMjNbMMeJL0eYD6MD
+xvbxrN8y8NmBGuScvfaAFPDRLLmF9dijscilIeUcE5fuDr3fKanvNFNb0+RqE4QG
+tjICxFKuItLcsiFCGtpA8CnJ7AoMXOLQusxI0zcKzBIKinmwPQN/aUv0NCB9szTq
+jktk9T79syNnFQ0EuPAtwQlRPLJsFfClI9eDdOTlLsn+mCdCxqvGnrDQWzilm1De
+fhiYtUU79nm06PcaewaD+9CL2rvHvRirCG88gGtAPxkZumWK5r7VXNM21+9AUiRg
+OGcEMeyP84LG3rlV8zsxkVrctQgVrXYlCg17LofiDKYGvCYQbTed7N14jHyAxfDZ
+d0jQ
+-----END CERTIFICATE-----
+
+# Issuer: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Subject: CN=Global Chambersign Root - 2008 O=AC Camerfirma S.A.
+# Label: "Global Chambersign Root - 2008"
+# Serial: 14541511773111788494
+# MD5 Fingerprint: 9e:80:ff:78:01:0c:2e:c1:36:bd:fe:96:90:6e:08:f3
+# SHA1 Fingerprint: 4a:bd:ee:ec:95:0d:35:9c:89:ae:c7:52:a1:2c:5b:29:f6:d6:aa:0c
+# SHA256 Fingerprint: 13:63:35:43:93:34:a7:69:80:16:a0:d3:24:de:72:28:4e:07:9d:7b:52:20:bb:8f:bd:74:78:16:ee:be:ba:ca
+-----BEGIN CERTIFICATE-----
+MIIHSTCCBTGgAwIBAgIJAMnN0+nVfSPOMA0GCSqGSIb3DQEBBQUAMIGsMQswCQYD
+VQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3VycmVudCBhZGRyZXNzIGF0
+IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAGA1UEBRMJQTgyNzQzMjg3
+MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAlBgNVBAMTHkdsb2JhbCBD
+aGFtYmVyc2lnbiBSb290IC0gMjAwODAeFw0wODA4MDExMjMxNDBaFw0zODA3MzEx
+MjMxNDBaMIGsMQswCQYDVQQGEwJFVTFDMEEGA1UEBxM6TWFkcmlkIChzZWUgY3Vy
+cmVudCBhZGRyZXNzIGF0IHd3dy5jYW1lcmZpcm1hLmNvbS9hZGRyZXNzKTESMBAG
+A1UEBRMJQTgyNzQzMjg3MRswGQYDVQQKExJBQyBDYW1lcmZpcm1hIFMuQS4xJzAl
+BgNVBAMTHkdsb2JhbCBDaGFtYmVyc2lnbiBSb290IC0gMjAwODCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBAMDfVtPkOpt2RbQT2//BthmLN0EYlVJH6xed
+KYiONWwGMi5HYvNJBL99RDaxccy9Wglz1dmFRP+RVyXfXjaOcNFccUMd2drvXNL7
+G706tcuto8xEpw2uIRU/uXpbknXYpBI4iRmKt4DS4jJvVpyR1ogQC7N0ZJJ0YPP2
+zxhPYLIj0Mc7zmFLmY/CDNBAspjcDahOo7kKrmCgrUVSY7pmvWjg+b4aqIG7HkF4
+ddPB/gBVsIdU6CeQNR1MM62X/JcumIS/LMmjv9GYERTtY/jKmIhYF5ntRQOXfjyG
+HoiMvvKRhI9lNNgATH23MRdaKXoKGCQwoze1eqkBfSbW+Q6OWfH9GzO1KTsXO0G2
+Id3UwD2ln58fQ1DJu7xsepeY7s2MH/ucUa6LcL0nn3HAa6x9kGbo1106DbDVwo3V
+yJ2dwW3Q0L9R5OP4wzg2rtandeavhENdk5IMagfeOx2YItaswTXbo6Al/3K1dh3e
+beksZixShNBFks4c5eUzHdwHU1SjqoI7mjcv3N2gZOnm3b2u/GSFHTynyQbehP9r
+6GsaPMWis0L7iwk+XwhSx2LE1AVxv8Rk5Pihg+g+EpuoHtQ2TS9x9o0o9oOpE9Jh
+wZG7SMA0j0GMS0zbaRL/UJScIINZc+18ofLx/d33SdNDWKBWY8o9PeU1VlnpDsog
+zCtLkykPAgMBAAGjggFqMIIBZjASBgNVHRMBAf8ECDAGAQH/AgEMMB0GA1UdDgQW
+BBS5CcqcHtvTbDprru1U8VuTBjUuXjCB4QYDVR0jBIHZMIHWgBS5CcqcHtvTbDpr
+ru1U8VuTBjUuXqGBsqSBrzCBrDELMAkGA1UEBhMCRVUxQzBBBgNVBAcTOk1hZHJp
+ZCAoc2VlIGN1cnJlbnQgYWRkcmVzcyBhdCB3d3cuY2FtZXJmaXJtYS5jb20vYWRk
+cmVzcykxEjAQBgNVBAUTCUE4Mjc0MzI4NzEbMBkGA1UEChMSQUMgQ2FtZXJmaXJt
+YSBTLkEuMScwJQYDVQQDEx5HbG9iYWwgQ2hhbWJlcnNpZ24gUm9vdCAtIDIwMDiC
+CQDJzdPp1X0jzjAOBgNVHQ8BAf8EBAMCAQYwPQYDVR0gBDYwNDAyBgRVHSAAMCow
+KAYIKwYBBQUHAgEWHGh0dHA6Ly9wb2xpY3kuY2FtZXJmaXJtYS5jb20wDQYJKoZI
+hvcNAQEFBQADggIBAICIf3DekijZBZRG/5BXqfEv3xoNa/p8DhxJJHkn2EaqbylZ
+UohwEurdPfWbU1Rv4WCiqAm57OtZfMY18dwY6fFn5a+6ReAJ3spED8IXDneRRXoz
+X1+WLGiLwUePmJs9wOzL9dWCkoQ10b42OFZyMVtHLaoXpGNR6woBrX/sdZ7LoR/x
+fxKxueRkf2fWIyr0uDldmOghp+G9PUIadJpwr2hsUF1Jz//7Dl3mLEfXgTpZALVz
+a2Mg9jFFCDkO9HB+QHBaP9BrQql0PSgvAm11cpUJjUhjxsYjV5KTXjXBjfkK9yyd
+Yhz2rXzdpjEetrHHfoUm+qRqtdpjMNHvkzeyZi99Bffnt0uYlDXA2TopwZ2yUDMd
+SqlapskD7+3056huirRXhOukP9DuqqqHW2Pok+JrqNS4cnhrG+055F3Lm6qH1U9O
+AP7Zap88MQ8oAgF9mOinsKJknnn4SPIVqczmyETrP3iZ8ntxPjzxmKfFGBI/5rso
+M0LpRQp8bfKGeS/Fghl9CYl8slR2iK7ewfPM4W7bMdaTrpmg7yVqc5iJWzouE4ge
+v8CSlDQb4ye3ix5vQv/n6TebUB0tovkC7stYWDpxvGjjqsGvHCgfotwjZT+B6q6Z
+09gwzxMNTxXJhLynSC34MCN32EZLeW32jO06f2ARePTpm67VVMB0gNELQp/B
+-----END CERTIFICATE-----
+
+# Issuer: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Subject: CN=Go Daddy Root Certificate Authority - G2 O=GoDaddy.com, Inc.
+# Label: "Go Daddy Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 80:3a:bc:22:c1:e6:fb:8d:9b:3b:27:4a:32:1b:9a:01
+# SHA1 Fingerprint: 47:be:ab:c9:22:ea:e8:0e:78:78:34:62:a7:9f:45:c2:54:fd:e6:8b
+# SHA256 Fingerprint: 45:14:0b:32:47:eb:9c:c8:c5:b4:f0:d7:b5:30:91:f7:32:92:08:9e:6e:5a:63:e2:74:9d:d3:ac:a9:19:8e:da
+-----BEGIN CERTIFICATE-----
+MIIDxTCCAq2gAwIBAgIBADANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxGjAYBgNVBAoT
+EUdvRGFkZHkuY29tLCBJbmMuMTEwLwYDVQQDEyhHbyBEYWRkeSBSb290IENlcnRp
+ZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAwMFoXDTM3MTIzMTIz
+NTk1OVowgYMxCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6b25hMRMwEQYDVQQH
+EwpTY290dHNkYWxlMRowGAYDVQQKExFHb0RhZGR5LmNvbSwgSW5jLjExMC8GA1UE
+AxMoR28gRGFkZHkgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIw
+DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAL9xYgjx+lk09xvJGKP3gElY6SKD
+E6bFIEMBO4Tx5oVJnyfq9oQbTqC023CYxzIBsQU+B07u9PpPL1kwIuerGVZr4oAH
+/PMWdYA5UXvl+TW2dE6pjYIT5LY/qQOD+qK+ihVqf94Lw7YZFAXK6sOoBJQ7Rnwy
+DfMAZiLIjWltNowRGLfTshxgtDj6AozO091GB94KPutdfMh8+7ArU6SSYmlRJQVh
+GkSBjCypQ5Yj36w6gZoOKcUcqeldHraenjAKOc7xiID7S13MMuyFYkMlNAJWJwGR
+tDtwKj9useiciAF9n9T521NtYJ2/LOdYq7hfRvzOxBsDPAnrSTFcaUaz4EcCAwEA
+AaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYE
+FDqahQcQZyi27/a9BUFuIMGU2g/eMA0GCSqGSIb3DQEBCwUAA4IBAQCZ21151fmX
+WWcDYfF+OwYxdS2hII5PZYe096acvNjpL9DbWu7PdIxztDhC2gV7+AJ1uP2lsdeu
+9tfeE8tTEH6KRtGX+rcuKxGrkLAngPnon1rpN5+r5N9ss4UXnT3ZJE95kTXWXwTr
+gIOrmgIttRD02JDHBHNA7XIloKmf7J6raBKZV8aPEjoJpL1E/QYVN8Gb5DKj7Tjo
+2GTzLH4U/ALqn83/B2gX2yKQOC16jdFU8WnjXzPKej17CuPKf1855eJ1usV2GDPO
+LPAvTK33sefOT6jEm0pUBsV/fdUID+Ic/n4XuKxe9tQWskMJDE32p2u0mYRlynqI
+4uJEvlz36hz1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: d6:39:81:c6:52:7e:96:69:fc:fc:ca:66:ed:05:f2:96
+# SHA1 Fingerprint: b5:1c:06:7c:ee:2b:0c:3d:f8:55:ab:2d:92:f4:fe:39:d4:e7:0f:0e
+# SHA256 Fingerprint: 2c:e1:cb:0b:f9:d2:f9:e1:02:99:3f:be:21:51:52:c3:b2:dd:0c:ab:de:1c:68:e5:31:9b:83:91:54:db:b7:f5
+-----BEGIN CERTIFICATE-----
+MIID3TCCAsWgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBjzELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAMTKVN0YXJmaWVs
+ZCBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5MDkwMTAwMDAw
+MFoXDTM3MTIzMTIzNTk1OVowgY8xCzAJBgNVBAYTAlVTMRAwDgYDVQQIEwdBcml6
+b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFyZmllbGQgVGVj
+aG5vbG9naWVzLCBJbmMuMTIwMAYDVQQDEylTdGFyZmllbGQgUm9vdCBDZXJ0aWZp
+Y2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAL3twQP89o/8ArFvW59I2Z154qK3A2FWGMNHttfKPTUuiUP3oWmb3ooa/RMg
+nLRJdzIpVv257IzdIvpy3Cdhl+72WoTsbhm5iSzchFvVdPtrX8WJpRBSiUZV9Lh1
+HOZ/5FSuS/hVclcCGfgXcVnrHigHdMWdSL5stPSksPNkN3mSwOxGXn/hbVNMYq/N
+Hwtjuzqd+/x5AJhhdM8mgkBj87JyahkNmcrUDnXMN/uLicFZ8WJ/X7NfZTD4p7dN
+dloedl40wOiWVpmKs/B/pM293DIxfJHP4F8R+GuqSVzRmZTRouNjWwl2tVZi4Ut0
+HZbUJtQIBFnQmA4O5t78w+wfkPECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAO
+BgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFHwMMh+n2TB/xH1oo2Kooc6rB1snMA0G
+CSqGSIb3DQEBCwUAA4IBAQARWfolTwNvlJk7mh+ChTnUdgWUXuEok21iXQnCoKjU
+sHU48TRqneSfioYmUeYs0cYtbpUgSpIB7LiKZ3sx4mcujJUDJi5DnUox9g61DLu3
+4jd/IroAow57UvtruzvE03lRTs2Q9GcHGcg8RnoNAX3FWOdt5oUwF5okxBDgBPfg
+8n/Uqgr/Qh037ZTlZFkSIHc40zI+OIF1lnP6aI+xy84fxez6nH7PfrHxBy22/L/K
+pL/QlwVKvOoYKAKQvVR4CSFx09F9HdkWsKlhPdAKACL8x3vLCWRFCztAgfd9fDL1
+mMpYjn0q7pBZc2T5NnReJaH1ZgUufzkVqSr7UIuOhWn0
+-----END CERTIFICATE-----
+
+# Issuer: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Subject: CN=Starfield Services Root Certificate Authority - G2 O=Starfield Technologies, Inc.
+# Label: "Starfield Services Root Certificate Authority - G2"
+# Serial: 0
+# MD5 Fingerprint: 17:35:74:af:7b:61:1c:eb:f4:f9:3c:e2:ee:40:f9:a2
+# SHA1 Fingerprint: 92:5a:8f:8d:2c:6d:04:e0:66:5f:59:6a:ff:22:d8:63:e8:25:6f:3f
+# SHA256 Fingerprint: 56:8d:69:05:a2:c8:87:08:a4:b3:02:51:90:ed:cf:ed:b1:97:4a:60:6a:13:c6:e5:29:0f:cb:2a:e6:3e:da:b5
+-----BEGIN CERTIFICATE-----
+MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
+EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
+HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
+ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dGhvcml0eSAtIEcyMB4XDTA5
+MDkwMTAwMDAwMFoXDTM3MTIzMTIzNTk1OVowgZgxCzAJBgNVBAYTAlVTMRAwDgYD
+VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy
+ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTswOQYDVQQDEzJTdGFyZmllbGQgU2Vy
+dmljZXMgUm9vdCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgLSBHMjCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBANUMOsQq+U7i9b4Zl1+OiFOxHz/Lz58gE20p
+OsgPfTz3a3Y4Y9k2YKibXlwAgLIvWX/2h/klQ4bnaRtSmpDhcePYLQ1Ob/bISdm2
+8xpWriu2dBTrz/sm4xq6HZYuajtYlIlHVv8loJNwU4PahHQUw2eeBGg6345AWh1K
+Ts9DkTvnVtYAcMtS7nt9rjrnvDH5RfbCYM8TWQIrgMw0R9+53pBlbQLPLJGmpufe
+hRhJfGZOozptqbXuNC66DQO4M99H67FrjSXZm86B0UVGMpZwh94CDklDhbZsc7tk
+6mFBrMnUVN+HL8cisibMn1lUaJ/8viovxFUcdUBgF4UCVTmLfwUCAwEAAaNCMEAw
+DwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFJxfAN+q
+AdcwKziIorhtSpzyEZGDMA0GCSqGSIb3DQEBCwUAA4IBAQBLNqaEd2ndOxmfZyMI
+bw5hyf2E3F/YNoHN2BtBLZ9g3ccaaNnRbobhiCPPE95Dz+I0swSdHynVv/heyNXB
+ve6SbzJ08pGCL72CQnqtKrcgfU28elUSwhXqvfdqlS5sdJ/PHLTyxQGjhdByPq1z
+qwubdQxtRbeOlKyWN7Wg0I8VRw7j6IPdj/3vQQF3zCepYoUz8jcI73HPdwbeyBkd
+iEDPfUYd/x7H4c7/I9vG+o1VTqkC50cRRj70/b17KSa7qWFiNyi2LSr2EIZkyXCn
+0q23KXB56jzaYyWf/Wi3MOxw+3WKt21gZ7IeyLnp2KhvAotnDU0mV3HaIPzBSlCN
+sSi6
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Commercial O=AffirmTrust
+# Subject: CN=AffirmTrust Commercial O=AffirmTrust
+# Label: "AffirmTrust Commercial"
+# Serial: 8608355977964138876
+# MD5 Fingerprint: 82:92:ba:5b:ef:cd:8a:6f:a6:3d:55:f9:84:f6:d6:b7
+# SHA1 Fingerprint: f9:b5:b6:32:45:5f:9c:be:ec:57:5f:80:dc:e9:6e:2c:c7:b2:78:b7
+# SHA256 Fingerprint: 03:76:ab:1d:54:c5:f9:80:3c:e4:b2:e2:01:a0:ee:7e:ef:7b:57:b6:36:e8:a9:3c:9b:8d:48:60:c9:6f:5f:a7
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIId3cGJyapsXwwDQYJKoZIhvcNAQELBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBDb21tZXJjaWFsMB4XDTEwMDEyOTE0MDYwNloXDTMwMTIzMTE0MDYwNlowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBDb21tZXJjaWFsMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEA9htPZwcroRX1BiLLHwGy43NFBkRJLLtJJRTWzsO3qyxPxkEylFf6EqdbDuKP
+Hx6GGaeqtS25Xw2Kwq+FNXkyLbscYjfysVtKPcrNcV/pQr6U6Mje+SJIZMblq8Yr
+ba0F8PrVC8+a5fBQpIs7R6UjW3p6+DM/uO+Zl+MgwdYoic+U+7lF7eNAFxHUdPAL
+MeIrJmqbTFeurCA+ukV6BfO9m2kVrn1OIGPENXY6BwLJN/3HR+7o8XYdcxXyl6S1
+yHp52UKqK39c/s4mT6NmgTWvRLpUHhwwMmWd5jyTXlBOeuM61G7MGvv50jeuJCqr
+VwMiKA1JdX+3KNp1v47j3A55MQIDAQABo0IwQDAdBgNVHQ4EFgQUnZPGU4teyq8/
+nx4P5ZmVvCT2lI8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQELBQADggEBAFis9AQOzcAN/wr91LoWXym9e2iZWEnStB03TX8nfUYG
+XUPGhi4+c7ImfU+TqbbEKpqrIZcUsd6M06uJFdhrJNTxFq7YpFzUf1GO7RgBsZNj
+vbz4YYCanrHOQnDiqX0GJX0nof5v7LMeJNrjS1UaADs1tDvZ110w/YETifLCBivt
+Z8SOyUOyXGsViQK8YvxO8rUzqrJv0wqiUOP2O+guRMLbZjipM1ZI8W0bM40NjD9g
+N53Tym1+NH4Nn3J2ixufcv1SNUFFApYvHLKac0khsUlHRUe072o0EclNmsxZt9YC
+nlpOZbWUrhvfKbAW8b8Angc6F2S1BLUjIZkKlTuXfO8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Networking O=AffirmTrust
+# Subject: CN=AffirmTrust Networking O=AffirmTrust
+# Label: "AffirmTrust Networking"
+# Serial: 8957382827206547757
+# MD5 Fingerprint: 42:65:ca:be:01:9a:9a:4c:a9:8c:41:49:cd:c0:d5:7f
+# SHA1 Fingerprint: 29:36:21:02:8b:20:ed:02:f5:66:c5:32:d1:d6:ed:90:9f:45:00:2f
+# SHA256 Fingerprint: 0a:81:ec:5a:92:97:77:f1:45:90:4a:f3:8d:5d:50:9f:66:b5:e2:c5:8f:cd:b5:31:05:8b:0e:17:f3:f0:b4:1b
+-----BEGIN CERTIFICATE-----
+MIIDTDCCAjSgAwIBAgIIfE8EORzUmS0wDQYJKoZIhvcNAQEFBQAwRDELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZpcm1UcnVz
+dCBOZXR3b3JraW5nMB4XDTEwMDEyOTE0MDgyNFoXDTMwMTIzMTE0MDgyNFowRDEL
+MAkGA1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MR8wHQYDVQQDDBZBZmZp
+cm1UcnVzdCBOZXR3b3JraW5nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC
+AQEAtITMMxcua5Rsa2FSoOujz3mUTOWUgJnLVWREZY9nZOIG41w3SfYvm4SEHi3y
+YJ0wTsyEheIszx6e/jarM3c1RNg1lho9Nuh6DtjVR6FqaYvZ/Ls6rnla1fTWcbua
+kCNrmreIdIcMHl+5ni36q1Mr3Lt2PpNMCAiMHqIjHNRqrSK6mQEubWXLviRmVSRL
+QESxG9fhwoXA3hA/Pe24/PHxI1Pcv2WXb9n5QHGNfb2V1M6+oF4nI979ptAmDgAp
+6zxG8D1gvz9Q0twmQVGeFDdCBKNwV6gbh+0t+nvujArjqWaJGctB+d1ENmHP4ndG
+yH329JKBNv3bNPFyfvMMFr20FQIDAQABo0IwQDAdBgNVHQ4EFgQUBx/S55zawm6i
+QLSwelAQUHTEyL0wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwDQYJ
+KoZIhvcNAQEFBQADggEBAIlXshZ6qML91tmbmzTCnLQyFE2npN/svqe++EPbkTfO
+tDIuUFUaNU52Q3Eg75N3ThVwLofDwR1t3Mu1J9QsVtFSUzpE0nPIxBsFZVpikpzu
+QY0x2+c06lkh1QF612S4ZDnNye2v7UsDSKegmQGA3GWjNq5lWUhPgkvIZfFXHeVZ
+Lgo/bNjR9eUJtGxUAArgFU2HdW23WJZa3W3SAKD0m0i+wzekujbgfIeFlxoVot4u
+olu9rxj5kFDNcFn4J2dHy8egBzp90SxdbBk6ZrV9/ZFvgrG+CJPbFEfxojfHRZ48
+x3evZKiT3/Zpg4Jg8klCNO1aAFSFHBY2kgxc+qatv9s=
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium O=AffirmTrust
+# Subject: CN=AffirmTrust Premium O=AffirmTrust
+# Label: "AffirmTrust Premium"
+# Serial: 7893706540734352110
+# MD5 Fingerprint: c4:5d:0e:48:b6:ac:28:30:4e:0a:bc:f9:38:16:87:57
+# SHA1 Fingerprint: d8:a6:33:2c:e0:03:6f:b1:85:f6:63:4f:7d:6a:06:65:26:32:28:27
+# SHA256 Fingerprint: 70:a7:3f:7f:37:6b:60:07:42:48:90:45:34:b1:14:82:d5:bf:0e:69:8e:cc:49:8d:f5:25:77:eb:f2:e9:3b:9a
+-----BEGIN CERTIFICATE-----
+MIIFRjCCAy6gAwIBAgIIbYwURrGmCu4wDQYJKoZIhvcNAQEMBQAwQTELMAkGA1UE
+BhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1UcnVz
+dCBQcmVtaXVtMB4XDTEwMDEyOTE0MTAzNloXDTQwMTIzMTE0MTAzNlowQTELMAkG
+A1UEBhMCVVMxFDASBgNVBAoMC0FmZmlybVRydXN0MRwwGgYDVQQDDBNBZmZpcm1U
+cnVzdCBQcmVtaXVtMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAxBLf
+qV/+Qd3d9Z+K4/as4Tx4mrzY8H96oDMq3I0gW64tb+eT2TZwamjPjlGjhVtnBKAQ
+JG9dKILBl1fYSCkTtuG+kU3fhQxTGJoeJKJPj/CihQvL9Cl/0qRY7iZNyaqoe5rZ
++jjeRFcV5fiMyNlI4g0WJx0eyIOFJbe6qlVBzAMiSy2RjYvmia9mx+n/K+k8rNrS
+s8PhaJyJ+HoAVt70VZVs+7pk3WKL3wt3MutizCaam7uqYoNMtAZ6MMgpv+0GTZe5
+HMQxK9VfvFMSF5yZVylmd2EhMQcuJUmdGPLu8ytxjLW6OQdJd/zvLpKQBY0tL3d7
+70O/Nbua2Plzpyzy0FfuKE4mX4+QaAkvuPjcBukumj5Rp9EixAqnOEhss/n/fauG
+V+O61oV4d7pD6kh/9ti+I20ev9E2bFhc8e6kGVQa9QPSdubhjL08s9NIS+LI+H+S
+qHZGnEJlPqQewQcDWkYtuJfzt9WyVSHvutxMAJf7FJUnM7/oQ0dG0giZFmA7mn7S
+5u046uwBHjxIVkkJx0w3AJ6IDsBz4W9m6XJHMD4Q5QsDyZpCAGzFlH5hxIrff4Ia
+C1nEWTJ3s7xgaVY5/bQGeyzWZDbZvUjthB9+pSKPKrhC9IK31FOQeE4tGv2Bb0TX
+OwF0lkLgAOIua+rF7nKsu7/+6qqo+Nz2snmKtmcCAwEAAaNCMEAwHQYDVR0OBBYE
+FJ3AZ6YMItkm9UWrpmVSESfYRaxjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/
+BAQDAgEGMA0GCSqGSIb3DQEBDAUAA4ICAQCzV00QYk465KzquByvMiPIs0laUZx2
+KI15qldGF9X1Uva3ROgIRL8YhNILgM3FEv0AVQVhh0HctSSePMTYyPtwni94loMg
+Nt58D2kTiKV1NpgIpsbfrM7jWNa3Pt668+s0QNiigfV4Py/VpfzZotReBA4Xrf5B
+8OWycvpEgjNC6C1Y91aMYj+6QrCcDFx+LmUmXFNPALJ4fqENmS2NuB2OosSw/WDQ
+MKSOyARiqcTtNd56l+0OOF6SL5Nwpamcb6d9Ex1+xghIsV5n61EIJenmJWtSKZGc
+0jlzCFfemQa0W50QBuHCAKi4HEoCChTQwUHK+4w1IX2COPKpVJEZNZOUbWo6xbLQ
+u4mGk+ibyQ86p3q4ofB4Rvr8Ny/lioTz3/4E2aFooC8k4gmVBtWVyuEklut89pMF
+u+1z6S3RdTnX5yTb2E5fQ4+e0BQ5v1VwSJlXMbSc7kqYA5YwH2AG7hsj/oFgIxpH
+YoWlzBk0gG+zrBrjn/B7SK3VAdlntqlyk+otZrWyuOQ9PLLvTIzq6we/qzWaVYa8
+GKa1qF60g2xraUDTn9zxw2lrueFtCfTxqlB2Cnp9ehehVZZCmTEJ3WARjQUwfuaO
+RtGdFNrHF+QFlozEJLUbzxQHskD4o55BhrwE0GuWyCqANP2/7waj3VjFhT0+j/6e
+KeC2uAloGRwYQw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Subject: CN=AffirmTrust Premium ECC O=AffirmTrust
+# Label: "AffirmTrust Premium ECC"
+# Serial: 8401224907861490260
+# MD5 Fingerprint: 64:b0:09:55:cf:b1:d5:99:e2:be:13:ab:a6:5d:ea:4d
+# SHA1 Fingerprint: b8:23:6b:00:2f:1d:16:86:53:01:55:6c:11:a4:37:ca:eb:ff:c3:bb
+# SHA256 Fingerprint: bd:71:fd:f6:da:97:e4:cf:62:d1:64:7a:dd:25:81:b0:7d:79:ad:f8:39:7e:b4:ec:ba:9c:5e:84:88:82:14:23
+-----BEGIN CERTIFICATE-----
+MIIB/jCCAYWgAwIBAgIIdJclisc/elQwCgYIKoZIzj0EAwMwRTELMAkGA1UEBhMC
+VVMxFDASBgNVBAoMC0FmZmlybVRydXN0MSAwHgYDVQQDDBdBZmZpcm1UcnVzdCBQ
+cmVtaXVtIEVDQzAeFw0xMDAxMjkxNDIwMjRaFw00MDEyMzExNDIwMjRaMEUxCzAJ
+BgNVBAYTAlVTMRQwEgYDVQQKDAtBZmZpcm1UcnVzdDEgMB4GA1UEAwwXQWZmaXJt
+VHJ1c3QgUHJlbWl1bSBFQ0MwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAAQNMF4bFZ0D
+0KF5Nbc6PJJ6yhUczWLznCZcBz3lVPqj1swS6vQUX+iOGasvLkjmrBhDeKzQN8O9
+ss0s5kfiGuZjuD0uL3jET9v0D6RoTFVya5UdThhClXjMNzyR4ptlKymjQjBAMB0G
+A1UdDgQWBBSaryl6wBE1NSZRMADDav5A1a7WPDAPBgNVHRMBAf8EBTADAQH/MA4G
+A1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNnADBkAjAXCfOHiFBar8jAQr9HX/Vs
+aobgxCd05DhT1wV/GzTjxi+zygk8N53X57hG8f2h4nECMEJZh0PUUd+60wkyWs6I
+flc9nF9Ca/UHLbXwgpP5WW+uZPpY5Yse42O+tYHNbwKMeQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Subject: CN=Certum Trusted Network CA O=Unizeto Technologies S.A. OU=Certum Certification Authority
+# Label: "Certum Trusted Network CA"
+# Serial: 279744
+# MD5 Fingerprint: d5:e9:81:40:c5:18:69:fc:46:2c:89:75:62:0f:aa:78
+# SHA1 Fingerprint: 07:e0:32:e0:20:b7:2c:3f:19:2f:06:28:a2:59:3a:19:a7:0f:06:9e
+# SHA256 Fingerprint: 5c:58:46:8d:55:f5:8e:49:7e:74:39:82:d2:b5:00:10:b6:d1:65:37:4a:cf:83:a7:d4:a3:2d:b7:68:c4:40:8e
+-----BEGIN CERTIFICATE-----
+MIIDuzCCAqOgAwIBAgIDBETAMA0GCSqGSIb3DQEBBQUAMH4xCzAJBgNVBAYTAlBM
+MSIwIAYDVQQKExlVbml6ZXRvIFRlY2hub2xvZ2llcyBTLkEuMScwJQYDVQQLEx5D
+ZXJ0dW0gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxIjAgBgNVBAMTGUNlcnR1bSBU
+cnVzdGVkIE5ldHdvcmsgQ0EwHhcNMDgxMDIyMTIwNzM3WhcNMjkxMjMxMTIwNzM3
+WjB+MQswCQYDVQQGEwJQTDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMg
+Uy5BLjEnMCUGA1UECxMeQ2VydHVtIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSIw
+IAYDVQQDExlDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENBMIIBIjANBgkqhkiG9w0B
+AQEFAAOCAQ8AMIIBCgKCAQEA4/t9o3K6wvDJFIf1awFO4W5AB7ptJ11/91sts1rH
+UV+rpDKmYYe2bg+G0jACl/jXaVehGDldamR5xgFZrDwxSjh80gTSSyjoIF87B6LM
+TXPb865Px1bVWqeWifrzq2jUI4ZZJ88JJ7ysbnKDHDBy3+Ci6dLhdHUZvSqeexVU
+BBvXQzmtVSjF4hq79MDkrjhJM8x2hZ85RdKknvISjFH4fOQtf/WsX+sWn7Et0brM
+kUJ3TCXJkDhv2/DM+44el1k+1WBO5gUo7Ul5E0u6SNsv+XLTOcr+H9g0cvW0QM8x
+AcPs3hEtF10fuFDRXhmnad4HMyjKUJX5p1TLVIZQRan5SQIDAQABo0IwQDAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBQIds3LB/8k9sXN7buQvOKEN0Z19zAOBgNV
+HQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEFBQADggEBAKaorSLOAT2mo/9i0Eidi15y
+sHhE49wcrwn9I0j6vSrEuVUEtRCjjSfeC4Jj0O7eDDd5QVsisrCaQVymcODU0HfL
+I9MA4GxWL+FpDQ3Zqr8hgVDZBqWo/5U30Kr+4rP1mS1FhIrlQgnXdAIv94nYmem8
+J9RHjboNRhx3zxSkHLmkMcScKHQDNP8zGSal6Q10tz6XxnboJ5ajZt3hrvJBW8qY
+VoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
+03YnnZotBqbJ7DnSq9ufmgsnAjUpsUCV5/nonFWIGUbWtzT1fs45mtk48VH3Tyw=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
+# Subject: CN=Certinomis - Autorité Racine O=Certinomis OU=0002 433998903
+# Label: "Certinomis - Autorité Racine"
+# Serial: 1
+# MD5 Fingerprint: 7f:30:78:8c:03:e3:ca:c9:0a:e2:c9:ea:1e:aa:55:1a
+# SHA1 Fingerprint: 2e:14:da:ec:28:f0:fa:1e:8e:38:9a:4e:ab:eb:26:c0:0a:d3:83:c3
+# SHA256 Fingerprint: fc:bf:e2:88:62:06:f7:2b:27:59:3c:8b:07:02:97:e1:2d:76:9e:d1:0e:d7:93:07:05:a8:09:8e:ff:c1:4d:17
+-----BEGIN CERTIFICATE-----
+MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjET
+MBEGA1UEChMKQ2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAk
+BgNVBAMMHUNlcnRpbm9taXMgLSBBdXRvcml0w6kgUmFjaW5lMB4XDTA4MDkxNzA4
+Mjg1OVoXDTI4MDkxNzA4Mjg1OVowYzELMAkGA1UEBhMCRlIxEzARBgNVBAoTCkNl
+cnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMSYwJAYDVQQDDB1DZXJ0
+aW5vbWlzIC0gQXV0b3JpdMOpIFJhY2luZTCCAiIwDQYJKoZIhvcNAQEBBQADggIP
+ADCCAgoCggIBAJ2Fn4bT46/HsmtuM+Cet0I0VZ35gb5j2CN2DpdUzZlMGvE5x4jY
+F1AMnmHawE5V3udauHpOd4cN5bjr+p5eex7Ezyh0x5P1FMYiKAT5kcOrJ3NqDi5N
+8y4oH3DfVS9O7cdxbwlyLu3VMpfQ8Vh30WC8Tl7bmoT2R2FFK/ZQpn9qcSdIhDWe
+rP5pqZ56XjUl+rSnSTV3lqc2W+HN3yNw2F1MpQiD8aYkOBOo7C+ooWfHpi2GR+6K
+/OybDnT0K0kCe5B1jPyZOQE51kqJ5Z52qz6WKDgmi92NjMD2AR5vpTESOH2VwnHu
+7XSu5DaiQ3XV8QCb4uTXzEIDS3h65X27uK4uIJPT5GHfceF2Z5c/tt9qc1pkIuVC
+28+BA5PY9OMQ4HL2AHCs8MF6DwV/zzRpRbWT5BnbUhYjBYkOjUjkJW+zeL9i9Qf6
+lSTClrLooyPCXQP8w9PlfMl1I9f09bze5N/NgL+RiH2nE7Q5uiy6vdFrzPOlKO1E
+nn1So2+WLhl+HPNbxxaOu2B9d2ZHVIIAEWBsMsGoOBvrbpgT1u449fCfDu/+MYHB
+0iSVL1N6aaLwD4ZFjliCK0wi1F6g530mJ0jfJUaNSih8hp75mxpZuWW/Bd22Ql09
+5gBIgl4g9xGC3srYn+Y3RyYe63j3YcNBZFgCQfna4NH4+ej9Uji29YnfAgMBAAGj
+WzBZMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBQN
+jLZh2kS40RR9w759XkjwzspqsDAXBgNVHSAEEDAOMAwGCiqBegFWAgIAAQEwDQYJ
+KoZIhvcNAQEFBQADggIBACQ+YAZ+He86PtvqrxyaLAEL9MW12Ukx9F1BjYkMTv9s
+ov3/4gbIOZ/xWqndIlgVqIrTseYyCYIDbNc/CMf4uboAbbnW/FIyXaR/pDGUu7ZM
+OH8oMDX/nyNTt7buFHAAQCvaR6s0fl6nVjBhK4tDrP22iCj1a7Y+YEq6QpA0Z43q
+619FVDsXrIvkxmUP7tCMXWY5zjKn2BCXwH40nJ+U8/aGH88bc62UeYdocMMzpXDn
+2NU4lG9jeeu/Cg4I58UvD0KgKxRA/yHgBcUn4YQRE7rWhh1BCxMjidPJC+iKunqj
+o3M3NYB9Ergzd0A4wPpeMNLytqOx1qKVl4GbUu1pTP+A5FPbVFsDbVRfsbjvJL1v
+nxHDx2TCDyhihWZeGnuyt++uNckZM6i4J9szVb9o4XVIRFb7zdNIu0eJOqxp9YDG
+5ERQL1TEqkPFMTFYvZbF6nVsmnWxTfj3l/+WFvKXTej28xH5On2KOG4Ey+HTRRWq
+pdEdnV1j6CTmNhTih60bWfVEm/vXd3wfAXBioSAaosUaKPQhA+4u2cGA6rnZgtZb
+dsLLO7XSAPCjDuGtbkD326C00EauFddEwk01+dIL8hf2rGbVJLJP0RyZwG71fet0
+BLj5TXcJ17TPBzAJ8bgAVtkXFhYKK4bfjwEZGuW7gmP/vgt2Fl43N+bYdJeimUV5
+-----END CERTIFICATE-----
+
+# Issuer: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
+# Subject: CN=Root CA Generalitat Valenciana O=Generalitat Valenciana OU=PKIGVA
+# Label: "Root CA Generalitat Valenciana"
+# Serial: 994436456
+# MD5 Fingerprint: 2c:8c:17:5e:b1:54:ab:93:17:b5:36:5a:db:d1:c6:f2
+# SHA1 Fingerprint: a0:73:e5:c5:bd:43:61:0d:86:4c:21:13:0a:85:58:57:cc:9c:ea:46
+# SHA256 Fingerprint: 8c:4e:df:d0:43:48:f3:22:96:9e:7e:29:a4:cd:4d:ca:00:46:55:06:1c:16:e1:b0:76:42:2e:f3:42:ad:63:0e
+-----BEGIN CERTIFICATE-----
+MIIGizCCBXOgAwIBAgIEO0XlaDANBgkqhkiG9w0BAQUFADBoMQswCQYDVQQGEwJF
+UzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJ
+R1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwHhcN
+MDEwNzA2MTYyMjQ3WhcNMjEwNzAxMTUyMjQ3WjBoMQswCQYDVQQGEwJFUzEfMB0G
+A1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0GA1UECxMGUEtJR1ZBMScw
+JQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVuY2lhbmEwggEiMA0GCSqG
+SIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGKqtXETcvIorKA3Qdyu0togu8M1JAJke+
+WmmmO3I2F0zo37i7L3bhQEZ0ZQKQUgi0/6iMweDHiVYQOTPvaLRfX9ptI6GJXiKj
+SgbwJ/BXufjpTjJ3Cj9BZPPrZe52/lSqfR0grvPXdMIKX/UIKFIIzFVd0g/bmoGl
+u6GzwZTNVOAydTGRGmKy3nXiz0+J2ZGQD0EbtFpKd71ng+CT516nDOeB0/RSrFOy
+A8dEJvt55cs0YFAQexvba9dHq198aMpunUEDEO5rmXteJajCq+TA81yc477OMUxk
+Hl6AovWDfgzWyoxVjr7gvkkHD6MkQXpYHYTqWBLI4bft75PelAgxAgMBAAGjggM7
+MIIDNzAyBggrBgEFBQcBAQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLnBr
+aS5ndmEuZXMwEgYDVR0TAQH/BAgwBgEB/wIBAjCCAjQGA1UdIASCAiswggInMIIC
+IwYKKwYBBAG/VQIBADCCAhMwggHoBggrBgEFBQcCAjCCAdoeggHWAEEAdQB0AG8A
+cgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEAYwBpAPMAbgAgAFIA
+YQDtAHoAIABkAGUAIABsAGEAIABHAGUAbgBlAHIAYQBsAGkAdABhAHQAIABWAGEA
+bABlAG4AYwBpAGEAbgBhAC4ADQAKAEwAYQAgAEQAZQBjAGwAYQByAGEAYwBpAPMA
+bgAgAGQAZQAgAFAAcgDhAGMAdABpAGMAYQBzACAAZABlACAAQwBlAHIAdABpAGYA
+aQBjAGEAYwBpAPMAbgAgAHEAdQBlACAAcgBpAGcAZQAgAGUAbAAgAGYAdQBuAGMA
+aQBvAG4AYQBtAGkAZQBuAHQAbwAgAGQAZQAgAGwAYQAgAHAAcgBlAHMAZQBuAHQA
+ZQAgAEEAdQB0AG8AcgBpAGQAYQBkACAAZABlACAAQwBlAHIAdABpAGYAaQBjAGEA
+YwBpAPMAbgAgAHMAZQAgAGUAbgBjAHUAZQBuAHQAcgBhACAAZQBuACAAbABhACAA
+ZABpAHIAZQBjAGMAaQDzAG4AIAB3AGUAYgAgAGgAdAB0AHAAOgAvAC8AdwB3AHcA
+LgBwAGsAaQAuAGcAdgBhAC4AZQBzAC8AYwBwAHMwJQYIKwYBBQUHAgEWGWh0dHA6
+Ly93d3cucGtpLmd2YS5lcy9jcHMwHQYDVR0OBBYEFHs100DSHHgZZu90ECjcPk+y
+eAT8MIGVBgNVHSMEgY0wgYqAFHs100DSHHgZZu90ECjcPk+yeAT8oWykajBoMQsw
+CQYDVQQGEwJFUzEfMB0GA1UEChMWR2VuZXJhbGl0YXQgVmFsZW5jaWFuYTEPMA0G
+A1UECxMGUEtJR1ZBMScwJQYDVQQDEx5Sb290IENBIEdlbmVyYWxpdGF0IFZhbGVu
+Y2lhbmGCBDtF5WgwDQYJKoZIhvcNAQEFBQADggEBACRhTvW1yEICKrNcda3Fbcrn
+lD+laJWIwVTAEGmiEi8YPyVQqHxK6sYJ2fR1xkDar1CdPaUWu20xxsdzCkj+IHLt
+b8zog2EWRpABlUt9jppSCS/2bxzkoXHPjCpaF3ODR00PNvsETUlR4hTJZGH71BTg
+9J63NI8KJr2XXPR5OkowGcytT6CYirQxlyric21+eLj4iIlPsSKRZEv1UN4D2+XF
+ducTZnV+ZfsBn5OHiJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmC
+IoaZM3Fa6hlXPZHNqcCjbgcTpsnt+GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
+-----END CERTIFICATE-----
+
+# Issuer: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
+# Subject: CN=A-Trust-nQual-03 O=A-Trust Ges. f. Sicherheitssysteme im elektr. Datenverkehr GmbH OU=A-Trust-nQual-03
+# Label: "A-Trust-nQual-03"
+# Serial: 93214
+# MD5 Fingerprint: 49:63:ae:27:f4:d5:95:3d:d8:db:24:86:b8:9c:07:53
+# SHA1 Fingerprint: d3:c0:63:f2:19:ed:07:3e:34:ad:5d:75:0b:32:76:29:ff:d5:9a:f2
+# SHA256 Fingerprint: 79:3c:bf:45:59:b9:fd:e3:8a:b2:2d:f1:68:69:f6:98:81:ae:14:c4:b0:13:9a:c7:88:a7:8a:1a:fc:ca:02:fb
+-----BEGIN CERTIFICATE-----
+MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJB
+VDFIMEYGA1UECgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBp
+bSBlbGVrdHIuIERhdGVudmVya2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5R
+dWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5RdWFsLTAzMB4XDTA1MDgxNzIyMDAw
+MFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgwRgYDVQQKDD9BLVRy
+dXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0ZW52
+ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMM
+EEEtVHJ1c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCtPWFuA/OQO8BBC4SAzewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUj
+lUC5B3ilJfYKvUWG6Nm9wASOhURh73+nyfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZ
+znF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPESU7l0+m0iKsMrmKS1GWH
+2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4iHQF63n1
+k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs
+2e3Vcuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYD
+VR0OBAoECERqlWdVeRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOC
+AQEAVdRU0VlIXLOThaq/Yy/kgM40ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fG
+KOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmrsQd7TZjTXLDR8KdCoLXEjq/+
+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZdJXDRZslo+S4R
+FGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
+mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmE
+DNuxUCAKGkq6ahq97BvIxYSazQ==
+-----END CERTIFICATE-----
+
+# Issuer: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Subject: CN=TWCA Root Certification Authority O=TAIWAN-CA OU=Root CA
+# Label: "TWCA Root Certification Authority"
+# Serial: 1
+# MD5 Fingerprint: aa:08:8f:f6:f9:7b:b7:f2:b1:a7:1e:9b:ea:ea:bd:79
+# SHA1 Fingerprint: cf:9e:87:6d:d3:eb:fc:42:26:97:a3:b5:a3:7a:a0:76:a9:06:23:48
+# SHA256 Fingerprint: bf:d8:8f:e1:10:1c:41:ae:3e:80:1b:f8:be:56:35:0e:e9:ba:d1:a6:b9:bd:51:5e:dc:5c:6d:5b:87:11:ac:44
+-----BEGIN CERTIFICATE-----
+MIIDezCCAmOgAwIBAgIBATANBgkqhkiG9w0BAQUFADBfMQswCQYDVQQGEwJUVzES
+MBAGA1UECgwJVEFJV0FOLUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFU
+V0NBIFJvb3QgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMDgwODI4MDcyNDMz
+WhcNMzAxMjMxMTU1OTU5WjBfMQswCQYDVQQGEwJUVzESMBAGA1UECgwJVEFJV0FO
+LUNBMRAwDgYDVQQLDAdSb290IENBMSowKAYDVQQDDCFUV0NBIFJvb3QgQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
+AQCwfnK4pAOU5qfeCTiRShFAh6d8WWQUe7UREN3+v9XAu1bihSX0NXIP+FPQQeFE
+AcK0HMMxQhZHhTMidrIKbw/lJVBPhYa+v5guEGcevhEFhgWQxFnQfHgQsIBct+HH
+K3XLfJ+utdGdIzdjp9xCoi2SBBtQwXu4PhvJVgSLL1KbralW6cH/ralYhzC2gfeX
+RfwZVzsrb+RH9JlF/h3x+JejiB03HFyP4HYlmlD4oFT/RJB2I9IyxsOrBr/8+7/z
+rX2SYgJbKdM1o5OaQ2RgXbL6Mv87BK9NQGr5x+PvI/1ry+UPizgN7gr8/g+YnzAx
+3WxSZfmLgb4i4RxYA7qRG4kHAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
+HRMBAf8EBTADAQH/MB0GA1UdDgQWBBRqOFsmjd6LWvJPelSDGRjjCDWmujANBgkq
+hkiG9w0BAQUFAAOCAQEAPNV3PdrfibqHDAhUaiBQkr6wQT25JmSDCi/oQMCXKCeC
+MErJk/9q56YAf4lCmtYR5VPOL8zy2gXE/uJQxDqGfczafhAJO5I1KlOy/usrBdls
+XebQ79NqZp4VKIV66IIArB6nCWlWQtNoURi+VJq/REG6Sb4gumlc7rh3zc5sH62D
+lhh9DrUUOYTxKOkto557HnpyWoOzeW/vtPzQCqVYT0bf+215WfKEIlKuD8z7fDvn
+aspHYcN6+NOSBB+4IIThNlQWx0DeO4pz3N/GCUzf7Nr/1FNCocnyYh0igzyXxfkZ
+YiesZSLX0zzG5Y6yU8xJzrww/nsOM5D77dIUkR8Hrw==
+-----END CERTIFICATE-----
+
+# Issuer: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Subject: O=SECOM Trust Systems CO.,LTD. OU=Security Communication RootCA2
+# Label: "Security Communication RootCA2"
+# Serial: 0
+# MD5 Fingerprint: 6c:39:7d:a4:0e:55:59:b2:3f:d6:41:b1:12:50:de:43
+# SHA1 Fingerprint: 5f:3b:8c:f2:f8:10:b3:7d:78:b4:ce:ec:19:19:c3:73:34:b9:c7:74
+# SHA256 Fingerprint: 51:3b:2c:ec:b8:10:d4:cd:e5:dd:85:39:1a:df:c6:c2:dd:60:d8:7b:b7:36:d2:b5:21:48:4a:a4:7a:0e:be:f6
+-----BEGIN CERTIFICATE-----
+MIIDdzCCAl+gAwIBAgIBADANBgkqhkiG9w0BAQsFADBdMQswCQYDVQQGEwJKUDEl
+MCMGA1UEChMcU0VDT00gVHJ1c3QgU3lzdGVtcyBDTy4sTFRELjEnMCUGA1UECxMe
+U2VjdXJpdHkgQ29tbXVuaWNhdGlvbiBSb290Q0EyMB4XDTA5MDUyOTA1MDAzOVoX
+DTI5MDUyOTA1MDAzOVowXTELMAkGA1UEBhMCSlAxJTAjBgNVBAoTHFNFQ09NIFRy
+dXN0IFN5c3RlbXMgQ08uLExURC4xJzAlBgNVBAsTHlNlY3VyaXR5IENvbW11bmlj
+YXRpb24gUm9vdENBMjCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANAV
+OVKxUrO6xVmCxF1SrjpDZYBLx/KWvNs2l9amZIyoXvDjChz335c9S672XewhtUGr
+zbl+dp+++T42NKA7wfYxEUV0kz1XgMX5iZnK5atq1LXaQZAQwdbWQonCv/Q4EpVM
+VAX3NuRFg3sUZdbcDE3R3n4MqzvEFb46VqZab3ZpUql6ucjrappdUtAtCms1FgkQ
+hNBqyjoGADdH5H5XTz+L62e4iKrFvlNVspHEfbmwhRkGeC7bYRr6hfVKkaHnFtWO
+ojnflLhwHyg/i/xAXmODPIMqGplrz95Zajv8bxbXH/1KEOtOghY6rCcMU/Gt1SSw
+awNQwS08Ft1ENCcadfsCAwEAAaNCMEAwHQYDVR0OBBYEFAqFqXdlBZh8QIH4D5cs
+OPEK7DzPMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3
+DQEBCwUAA4IBAQBMOqNErLlFsceTfsgLCkLfZOoc7llsCLqJX2rKSpWeeo8HxdpF
+coJxDjrSzG+ntKEju/Ykn8sX/oymzsLS28yN/HH8AynBbF0zX2S2ZTuJbxh2ePXc
+okgfGT+Ok+vx+hfuzU7jBBJV1uXk3fs+BXziHV7Gp7yXT2g69ekuCkO2r1dcYmh8
+t/2jioSgrGK+KwmHNPBqAbubKVY8/gA3zyNs8U6qtnRGEmyR7jTV7JqR50S+kDFy
+1UkC9gLl9B/rfNmWVan/7Ir5mUf/NVoCqgTLiluHcSmRvaS0eg29mvVXIwAHIRc/
+SjnRBUkLp7Y3gaVdjKozXoEofKd9J+sAro03
+-----END CERTIFICATE-----
+
+# Issuer: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Subject: CN=Hellenic Academic and Research Institutions RootCA 2011 O=Hellenic Academic and Research Institutions Cert. Authority
+# Label: "Hellenic Academic and Research Institutions RootCA 2011"
+# Serial: 0
+# MD5 Fingerprint: 73:9f:4c:4b:73:5b:79:e9:fa:ba:1c:ef:6e:cb:d5:c9
+# SHA1 Fingerprint: fe:45:65:9b:79:03:5b:98:a1:61:b5:51:2e:ac:da:58:09:48:22:4d
+# SHA256 Fingerprint: bc:10:4f:15:a4:8b:e7:09:dc:a5:42:a7:e1:d4:b9:df:6f:05:45:27:e8:02:ea:a9:2d:59:54:44:25:8a:fe:71
+-----BEGIN CERTIFICATE-----
+MIIEMTCCAxmgAwIBAgIBADANBgkqhkiG9w0BAQUFADCBlTELMAkGA1UEBhMCR1Ix
+RDBCBgNVBAoTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1
+dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUAwPgYDVQQDEzdIZWxsZW5pYyBBY2FkZW1p
+YyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIFJvb3RDQSAyMDExMB4XDTExMTIw
+NjEzNDk1MloXDTMxMTIwMTEzNDk1MlowgZUxCzAJBgNVBAYTAkdSMUQwQgYDVQQK
+EztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENl
+cnQuIEF1dGhvcml0eTFAMD4GA1UEAxM3SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJl
+c2VhcmNoIEluc3RpdHV0aW9ucyBSb290Q0EgMjAxMTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBAKlTAOMupvaO+mDYLZU++CwqVE7NuYRhlFhPjz2L5EPz
+dYmNUeTDN9KKiE15HrcS3UN4SoqS5tdI1Q+kOilENbgH9mgdVc04UfCMJDGFr4PJ
+fel3r+0ae50X+bOdOFAPplp5kYCvN66m0zH7tSYJnTxa71HFK9+WXesyHgLacEns
+bgzImjeN9/E2YEsmLIKe0HjzDQ9jpFEw4fkrJxIH2Oq9GGKYsFk3fb7u8yBRQlqD
+75O6aRXxYp2fmTmCobd0LovUxQt7L/DICto9eQqakxylKHJzkUOap9FNhYS5qXSP
+FEDH3N6sQWRstBmbAmNtJGSPRLIl6s5ddAxjMlyNh+UCAwEAAaOBiTCBhjAPBgNV
+HRMBAf8EBTADAQH/MAsGA1UdDwQEAwIBBjAdBgNVHQ4EFgQUppFC/RNhSiOeCKQp
+5dgTBCPuQSUwRwYDVR0eBEAwPqA8MAWCAy5ncjAFggMuZXUwBoIELmVkdTAGggQu
+b3JnMAWBAy5ncjAFgQMuZXUwBoEELmVkdTAGgQQub3JnMA0GCSqGSIb3DQEBBQUA
+A4IBAQAf73lB4XtuP7KMhjdCSk4cNx6NZrokgclPEg8hwAOXhiVtXdMiKahsog2p
+6z0GW5k6x8zDmjR/qw7IThzh+uTczQ2+vyT+bOdrwg3IBp5OjWEopmr95fZi6hg8
+TqBTnbI6nOulnJEWtk2C4AwFSKls9cz4y51JtPACpf1wA+2KIaWuE4ZJwzNzvoc7
+dIsXRSZMFpGD/md9zU1jZ/rzAxKWeAaNsWftjj++n08C9bMJL/NMh98qy5V8Acys
+Nnq/onN694/BtZqhFLKPM58N7yLcZnuEvUUXBj08yrl3NI/K6s8/MT7jiOOASSXI
+l7WdmplNsDz4SgCbZN2fOUvRJ9e4
+-----END CERTIFICATE-----
+
+# Issuer: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Subject: CN=Actalis Authentication Root CA O=Actalis S.p.A./03358520967
+# Label: "Actalis Authentication Root CA"
+# Serial: 6271844772424770508
+# MD5 Fingerprint: 69:c1:0d:4f:07:a3:1b:c3:fe:56:3d:04:bc:11:f6:a6
+# SHA1 Fingerprint: f3:73:b3:87:06:5a:28:84:8a:f2:f3:4a:ce:19:2b:dd:c7:8e:9c:ac
+# SHA256 Fingerprint: 55:92:60:84:ec:96:3a:64:b9:6e:2a:be:01:ce:0b:a8:6a:64:fb:fe:bc:c7:aa:b5:af:c1:55:b3:7f:d7:60:66
+-----BEGIN CERTIFICATE-----
+MIIFuzCCA6OgAwIBAgIIVwoRl0LE48wwDQYJKoZIhvcNAQELBQAwazELMAkGA1UE
+BhMCSVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8w
+MzM1ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290
+IENBMB4XDTExMDkyMjExMjIwMloXDTMwMDkyMjExMjIwMlowazELMAkGA1UEBhMC
+SVQxDjAMBgNVBAcMBU1pbGFuMSMwIQYDVQQKDBpBY3RhbGlzIFMucC5BLi8wMzM1
+ODUyMDk2NzEnMCUGA1UEAwweQWN0YWxpcyBBdXRoZW50aWNhdGlvbiBSb290IENB
+MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAp8bEpSmkLO/lGMWwUKNv
+UTufClrJwkg4CsIcoBh/kbWHuUA/3R1oHwiD1S0eiKD4j1aPbZkCkpAW1V8IbInX
+4ay8IMKx4INRimlNAJZaby/ARH6jDuSRzVju3PvHHkVH3Se5CAGfpiEd9UEtL0z9
+KK3giq0itFZljoZUj5NDKd45RnijMCO6zfB9E1fAXdKDa0hMxKufgFpbOr3JpyI/
+gCczWw63igxdBzcIy2zSekciRDXFzMwujt0q7bd9Zg1fYVEiVRvjRuPjPdA1Yprb
+rxTIW6HMiRvhMCb8oJsfgadHHwTrozmSBp+Z07/T6k9QnBn+locePGX2oxgkg4YQ
+51Q+qDp2JE+BIcXjDwL4k5RHILv+1A7TaLndxHqEguNTVHnd25zS8gebLra8Pu2F
+be8lEfKXGkJh90qX6IuxEAf6ZYGyojnP9zz/GPvG8VqLWeICrHuS0E4UT1lF9gxe
+KF+w6D9Fz8+vm2/7hNN3WpVvrJSEnu68wEqPSpP4RCHiMUVhUE4Q2OM1fEwZtN4F
+v6MGn8i1zeQf1xcGDXqVdFUNaBr8EBtiZJ1t4JWgw5QHVw0U5r0F+7if5t+L4sbn
+fpb2U8WANFAoWPASUHEXMLrmeGO89LKtmyuy/uE5jF66CyCU3nuDuP/jVo23Eek7
+jPKxwV2dpAtMK9myGPW1n0sCAwEAAaNjMGEwHQYDVR0OBBYEFFLYiDrIn3hm7Ynz
+ezhwlMkCAjbQMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAUUtiIOsifeGbt
+ifN7OHCUyQICNtAwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAL
+e3KHwGCmSUyIWOYdiPcUZEim2FgKDk8TNd81HdTtBjHIgT5q1d07GjLukD0R0i70
+jsNjLiNmsGe+b7bAEzlgqqI0JZN1Ut6nna0Oh4lScWoWPBkdg/iaKWW+9D+a2fDz
+WochcYBNy+A4mz+7+uAwTc+G02UQGRjRlwKxK3JCaKygvU5a2hi/a5iB0P2avl4V
+SM0RFbnAKVy06Ij3Pjaut2L9HmLecHgQHEhb2rykOLpn7VU+Xlff1ANATIGk0k9j
+pwlCCRT8AKnCgHNPLsBA2RF7SOp6AsDT6ygBJlh0wcBzIm2Tlf05fbsq4/aC4yyX
+X04fkZT6/iyj2HYauE2yOE+b+h1IYHkm4vP9qdCa6HCPSXrW5b0KDtst842/6+Ok
+fcvHlXHo2qN8xcL4dJIEG4aspCJTQLas/kx2z/uUMsA1n3Y/buWQbqCmJqK4LL7R
+K4X9p2jIugErsWx0Hbhzlefut8cl8ABMALJ+tguLHPPAUJ4lueAI3jZm/zel0btU
+ZCzJJ7VLkn5l/9Mt4blOvH+kQSGQQXemOR/qnuOf0GZvBeyqdn6/axag67XH/JJU
+LysRJyU3eExRarDzzFhdFPFqSBX/wge2sY0PjlxQRrM9vwGYT7JZVEc+NHt4bVaT
+LnPqZih4zR0Uv6CPLy64Lo7yFIrM6bV8+2ydDKXhlg==
+-----END CERTIFICATE-----
+
+# Issuer: O=Trustis Limited OU=Trustis FPS Root CA
+# Subject: O=Trustis Limited OU=Trustis FPS Root CA
+# Label: "Trustis FPS Root CA"
+# Serial: 36053640375399034304724988975563710553
+# MD5 Fingerprint: 30:c9:e7:1e:6b:e6:14:eb:65:b2:16:69:20:31:67:4d
+# SHA1 Fingerprint: 3b:c0:38:0b:33:c3:f6:a6:0c:86:15:22:93:d9:df:f5:4b:81:c0:04
+# SHA256 Fingerprint: c1:b4:82:99:ab:a5:20:8f:e9:63:0a:ce:55:ca:68:a0:3e:da:5a:51:9c:88:02:a0:d3:a6:73:be:8f:8e:55:7d
+-----BEGIN CERTIFICATE-----
+MIIDZzCCAk+gAwIBAgIQGx+ttiD5JNM2a/fH8YygWTANBgkqhkiG9w0BAQUFADBF
+MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPVHJ1c3RpcyBMaW1pdGVkMRwwGgYDVQQL
+ExNUcnVzdGlzIEZQUyBSb290IENBMB4XDTAzMTIyMzEyMTQwNloXDTI0MDEyMTEx
+MzY1NFowRTELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1RydXN0aXMgTGltaXRlZDEc
+MBoGA1UECxMTVHJ1c3RpcyBGUFMgUm9vdCBDQTCCASIwDQYJKoZIhvcNAQEBBQAD
+ggEPADCCAQoCggEBAMVQe547NdDfxIzNjpvto8A2mfRC6qc+gIMPpqdZh8mQRUN+
+AOqGeSoDvT03mYlmt+WKVoaTnGhLaASMk5MCPjDSNzoiYYkchU59j9WvezX2fihH
+iTHcDnlkH5nSW7r+f2C/revnPDgpai/lkQtV/+xvWNUtyd5MZnGPDNcE2gfmHhjj
+vSkCqPoc4Vu5g6hBSLwacY3nYuUtsuvffM/bq1rKMfFMIvMFE/eC+XN5DL7XSxzA
+0RU8k0Fk0ea+IxciAIleH2ulrG6nS4zto3Lmr2NNL4XSFDWaLk6M6jKYKIahkQlB
+OrTh4/L68MkKokHdqeMDx4gVOxzUGpTXn2RZEm0CAwEAAaNTMFEwDwYDVR0TAQH/
+BAUwAwEB/zAfBgNVHSMEGDAWgBS6+nEleYtXQSUhhgtx67JkDoshZzAdBgNVHQ4E
+FgQUuvpxJXmLV0ElIYYLceuyZA6LIWcwDQYJKoZIhvcNAQEFBQADggEBAH5Y//01
+GX2cGE+esCu8jowU/yyg2kdbw++BLa8F6nRIW/M+TgfHbcWzk88iNVy2P3UnXwmW
+zaD+vkAMXBJV+JOCyinpXj9WV4s4NvdFGkwozZ5BuO1WTISkQMi4sKUraXAEasP4
+1BIy+Q7DsdwyhEQsb8tGD+pmQQ9P8Vilpg0ND2HepZ5dfWWhPBfnqFVO76DH7cZE
+f1T1o+CP8HxVIo8ptoGj4W1OLBuAZ+ytIJ8MYmHVl/9D7S3B2l0pKoU/rGXuhg8F
+jZBf3+6f9L/uHfuY5H+QK4R4EA5sSVPvFVtlRkpdr7r7OnIdzfYliB6XzCGcKQEN
+ZetX2fNXlrtIzYE=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Subject: CN=StartCom Certification Authority O=StartCom Ltd. OU=Secure Digital Certificate Signing
+# Label: "StartCom Certification Authority"
+# Serial: 45
+# MD5 Fingerprint: c9:3b:0d:84:41:fc:a4:76:79:23:08:57:de:10:19:16
+# SHA1 Fingerprint: a3:f1:33:3f:e2:42:bf:cf:c5:d1:4e:8f:39:42:98:40:68:10:d1:a0
+# SHA256 Fingerprint: e1:78:90:ee:09:a3:fb:f4:f4:8b:9c:41:4a:17:d6:37:b7:a5:06:47:e9:bc:75:23:22:72:7f:cc:17:42:a9:11
+-----BEGIN CERTIFICATE-----
+MIIHhzCCBW+gAwIBAgIBLTANBgkqhkiG9w0BAQsFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM3WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICEDCCAgwwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYD
+VR0OBBYEFE4L7xqkQFulF2mHMMo0aEPQQa7yMB8GA1UdIwQYMBaAFE4L7xqkQFul
+F2mHMMo0aEPQQa7yMIIBWgYDVR0gBIIBUTCCAU0wggFJBgsrBgEEAYG1NwEBATCC
+ATgwLgYIKwYBBQUHAgEWImh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL3BvbGljeS5w
+ZGYwNAYIKwYBBQUHAgEWKGh0dHA6Ly93d3cuc3RhcnRzc2wuY29tL2ludGVybWVk
+aWF0ZS5wZGYwgc8GCCsGAQUFBwICMIHCMCcWIFN0YXJ0IENvbW1lcmNpYWwgKFN0
+YXJ0Q29tKSBMdGQuMAMCAQEagZZMaW1pdGVkIExpYWJpbGl0eSwgcmVhZCB0aGUg
+c2VjdGlvbiAqTGVnYWwgTGltaXRhdGlvbnMqIG9mIHRoZSBTdGFydENvbSBDZXJ0
+aWZpY2F0aW9uIEF1dGhvcml0eSBQb2xpY3kgYXZhaWxhYmxlIGF0IGh0dHA6Ly93
+d3cuc3RhcnRzc2wuY29tL3BvbGljeS5wZGYwEQYJYIZIAYb4QgEBBAQDAgAHMDgG
+CWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNTTCBDZXJ0aWZpY2F0aW9uIEF1
+dGhvcml0eTANBgkqhkiG9w0BAQsFAAOCAgEAjo/n3JR5fPGFf59Jb2vKXfuM/gTF
+wWLRfUKKvFO3lANmMD+x5wqnUCBVJX92ehQN6wQOQOY+2IirByeDqXWmN3PH/UvS
+Ta0XQMhGvjt/UfzDtgUx3M2FIk5xt/JxXrAaxrqTi3iSSoX4eA+D/i+tLPfkpLst
+0OcNOrg+zvZ49q5HJMqjNTbOx8aHmNrs++myziebiMMEofYLWWivydsQD032ZGNc
+pRJvkrKTlMeIFw6Ttn5ii5B/q06f/ON1FE8qMt9bDeD1e5MNq6HPh+GlBEXoPBKl
+CcWw0bdT82AUuoVpaiF8H3VhFyAXe2w7QSlc4axa0c2Mm+tgHRns9+Ww2vl5GKVF
+P0lDV9LdJNUso/2RjSe15esUBppMeyG7Oq0wBhjA2MFrLH9ZXF2RsXAiV+uKa0hK
+1Q8p7MZAwC+ITGgBF3f0JBlPvfrhsiAhS90a2Cl9qrjeVOwhVYBsHvUwyKMQ5bLm
+KhQxw4UtjJixhlpPiVktucf3HMiKf8CdBUrmQk9io20ppB+Fq9vlgcitKj1MXVuE
+JnHEhV5xJMqlG2zYYdMa4FTbzrqpMrUi9nNBCV24F10OD5mQ1kfabwo6YigUZ4LZ
+8dCAWZvLMdibD4x3TrVoivJs9iQOLWxwxXPR3hTQcY+203sC9uO41Alua551hDnm
+fyWl8kgAwKQB2j8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Subject: CN=StartCom Certification Authority G2 O=StartCom Ltd.
+# Label: "StartCom Certification Authority G2"
+# Serial: 59
+# MD5 Fingerprint: 78:4b:fb:9e:64:82:0a:d3:b8:4c:62:f3:64:f2:90:64
+# SHA1 Fingerprint: 31:f1:fd:68:22:63:20:ee:c6:3b:3f:9d:ea:4a:3e:53:7c:7c:39:17
+# SHA256 Fingerprint: c7:ba:65:67:de:93:a7:98:ae:1f:aa:79:1e:71:2d:37:8f:ae:1f:93:c4:39:7f:ea:44:1b:b7:cb:e6:fd:59:95
+-----BEGIN CERTIFICATE-----
+MIIFYzCCA0ugAwIBAgIBOzANBgkqhkiG9w0BAQsFADBTMQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoGA1UEAxMjU3RhcnRDb20gQ2VydGlm
+aWNhdGlvbiBBdXRob3JpdHkgRzIwHhcNMTAwMTAxMDEwMDAxWhcNMzkxMjMxMjM1
+OTAxWjBTMQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjEsMCoG
+A1UEAxMjU3RhcnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRzIwggIiMA0G
+CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC2iTZbB7cgNr2Cu+EWIAOVeq8Oo1XJ
+JZlKxdBWQYeQTSFgpBSHO839sj60ZwNq7eEPS8CRhXBF4EKe3ikj1AENoBB5uNsD
+vfOpL9HG4A/LnooUCri99lZi8cVytjIl2bLzvWXFDSxu1ZJvGIsAQRSCb0AgJnoo
+D/Uefyf3lLE3PbfHkffiAez9lInhzG7TNtYKGXmu1zSCZf98Qru23QumNK9LYP5/
+Q0kGi4xDuFby2X8hQxfqp0iVAXV16iulQ5XqFYSdCI0mblWbq9zSOdIxHWDirMxW
+RST1HFSr7obdljKF+ExP6JV2tgXdNiNnvP8V4so75qbsO+wmETRIjfaAKxojAuuK
+HDp2KntWFhxyKrOq42ClAJ8Em+JvHhRYW6Vsi1g8w7pOOlz34ZYrPu8HvKTlXcxN
+nw3h3Kq74W4a7I/htkxNeXJdFzULHdfBR9qWJODQcqhaX2YtENwvKhOuJv4KHBnM
+0D4LnMgJLvlblnpHnOl68wVQdJVznjAJ85eCXuaPOQgeWeU1FEIT/wCc976qUM/i
+UUjXuG+v+E5+M5iSFGI6dWPPe/regjupuznixL0sAA7IF6wT700ljtizkC+p2il9
+Ha90OrInwMEePnWjFqmveiJdnxMaz6eg6+OGCtP95paV1yPIN93EfKo2rJgaErHg
+TuixO/XWb/Ew1wIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQE
+AwIBBjAdBgNVHQ4EFgQUS8W0QGutHLOlHGVuRjaJhwUMDrYwDQYJKoZIhvcNAQEL
+BQADggIBAHNXPyzVlTJ+N9uWkusZXn5T50HsEbZH77Xe7XRcxfGOSeD8bpkTzZ+K
+2s06Ctg6Wgk/XzTQLwPSZh0avZyQN8gMjgdalEVGKua+etqhqaRpEpKwfTbURIfX
+UfEpY9Z1zRbkJ4kd+MIySP3bmdCPX1R0zKxnNBFi2QwKN4fRoxdIjtIXHfbX/dtl
+6/2o1PXWT6RbdejF0mCy2wl+JYt7ulKSnj7oxXehPOBKc2thz4bcQ///If4jXSRK
+9dNtD2IEBVeC2m6kMyV5Sy5UGYvMLD0w6dEG/+gyRr61M3Z3qAFdlsHB1b6uJcDJ
+HgoJIIihDsnzb02CVAAgp9KP5DlUFy6NHrgbuxu9mk47EDTcnIhT76IxW1hPkWLI
+wpqazRVdOKnWvvgTtZ8SafJQYqz7Fzf07rh1Z2AQ+4NQ+US1dZxAF7L+/XldblhY
+XzD8AK6vM8EOTmy6p6ahfzLbOOCxchcKK5HsamMm7YnUeMx0HgX4a/6ManY5Ka5l
+IxKVCCIcl85bBu4M4ru8H0ST9tg4RQUh7eStqxK2A6RCLi3ECToDZ2mEmuFZkIoo
+hdVddLHRDiBYmxOlsGOm7XtH/UVVMKTumtTm4ofvmMkyghEpIrwACjFeLQ/Ajulr
+so8uBtjRkcfGEvRM/TAXw8HaOFvjqermobp573PYtlNXLfbQ4ddI
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 2 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 2 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 46:a7:d2:fe:45:fb:64:5a:a8:59:90:9b:78:44:9b:29
+# SHA1 Fingerprint: 49:0a:75:74:de:87:0a:47:fe:58:ee:f6:c7:6b:eb:c6:0b:12:40:99
+# SHA256 Fingerprint: 9a:11:40:25:19:7c:5b:b9:5d:94:e6:3d:55:cd:43:79:08:47:b6:46:b2:3c:df:11:ad:a4:a0:0e:ff:15:fb:48
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMiBSb290IENBMB4XDTEwMTAyNjA4MzgwM1oXDTQwMTAyNjA4MzgwM1ow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDIgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBANfHXvfBB9R3+0Mh9PT1aeTuMgHbo4Yf5FkNuud1g1Lr
+6hxhFUi7HQfKjK6w3Jad6sNgkoaCKHOcVgb/S2TwDCo3SbXlzwx87vFKu3MwZfPV
+L4O2fuPn9Z6rYPnT8Z2SdIrkHJasW4DptfQxh6NR/Md+oW+OU3fUl8FVM5I+GC91
+1K2GScuVr1QGbNgGE41b/+EmGVnAJLqBcXmQRFBoJJRfuLMR8SlBYaNByyM21cHx
+MlAQTn/0hpPshNOOvEu/XAFOBz3cFIqUCqTqc/sLUegTBxj6DvEr0VQVfTzh97QZ
+QmdiXnfgolXsttlpF9U6r0TtSsWe5HonfOV116rLJeffawrbD02TTqigzXsu8lkB
+arcNuAeBfos4GzjmCleZPe4h6KP1DBbdi+w0jpwqHAAVF41og9JwnxgIzRFo1clr
+Us3ERo/ctfPYV3Me6ZQ5BL/T3jjetFPsaRyifsSP5BtwrfKi+fv3FmRmaZ9JUaLi
+FRhnBkp/1Wy1TbMz4GHrXb7pmA8y1x1LPC5aAVKRCfLf6o3YBkBjqhHk/sM3nhRS
+P/TizPJhk9H9Z2vXUq6/aKtAQ6BXNVN48FP4YUIHZMbXb5tMOA1jrGKvNouicwoN
+9SG9dKpN6nIDSdvHXx1iY8f93ZHsM+71bbRuMGjeyNYmsHVee7QHIJihdjK4TWxP
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFMmAd+BikoL1Rpzz
+uvdMw964o605MA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAU18h
+9bqwOlI5LJKwbADJ784g7wbylp7ppHR/ehb8t/W2+xUbP6umwHJdELFx7rxP462s
+A20ucS6vxOOto70MEae0/0qyexAQH6dXQbLArvQsWdZHEIjzIVEpMMpghq9Gqx3t
+OluwlN5E40EIosHsHdb9T7bWR9AUC8rmyrV7d35BH16Dx7aMOZawP5aBQW9gkOLo
++fsicdl9sz1Gv7SEr5AcD48Saq/v7h56rgJKihcrdv6sVIkkLE8/trKnToyokZf7
+KcZ7XC25y2a2t6hbElGFtQl+Ynhw/qlqYLYdDnkM/crqJIByw5c/8nerQyIKx+u2
+DISCLIBrQYoIwOula9+ZEsuK1V6ADJHgJgg2SMX6OBE1/yWDLfJ6v9r9jv6ly0Us
+H8SIU653DtmadsWOLB2jutXsMq7Aqqz30XpN69QH4kj3Io6wpJ9qzo6ysmD0oyLQ
+I+uUWnpp3Q+/QFesa1lQ2aOZ4W7+jQF5JyMV3pKdewlNWudLSDBaGOYKbeaP4NK7
+5t98biGCwWg5TbSYWGZizEqQXsP6JwSxeRV0mcy+rSDeJmAc61ZRpqPq5KM/p/9h
+3PFaTWwyI0PurKju7koSCTxdccK+efrCh2gdC/1cacwG0Jp9VJkqyTkaGa9LKkPz
+Y11aWOIv4x3kqdbQCtCev9eBCfHJxyYNrJgWVqA=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Subject: CN=Buypass Class 3 Root CA O=Buypass AS-983163327
+# Label: "Buypass Class 3 Root CA"
+# Serial: 2
+# MD5 Fingerprint: 3d:3b:18:9e:2c:64:5a:e8:d5:88:ce:0e:f9:37:c2:ec
+# SHA1 Fingerprint: da:fa:f7:fa:66:84:ec:06:8f:14:50:bd:c7:c2:81:a5:bc:a9:64:57
+# SHA256 Fingerprint: ed:f7:eb:bc:a2:7a:2a:38:4d:38:7b:7d:40:10:c6:66:e2:ed:b4:84:3e:4c:29:b4:ae:1d:5b:93:32:e6:b2:4d
+-----BEGIN CERTIFICATE-----
+MIIFWTCCA0GgAwIBAgIBAjANBgkqhkiG9w0BAQsFADBOMQswCQYDVQQGEwJOTzEd
+MBsGA1UECgwUQnV5cGFzcyBBUy05ODMxNjMzMjcxIDAeBgNVBAMMF0J1eXBhc3Mg
+Q2xhc3MgMyBSb290IENBMB4XDTEwMTAyNjA4Mjg1OFoXDTQwMTAyNjA4Mjg1OFow
+TjELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBhc3MgQVMtOTgzMTYzMzI3MSAw
+HgYDVQQDDBdCdXlwYXNzIENsYXNzIDMgUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEB
+BQADggIPADCCAgoCggIBAKXaCpUWUOOV8l6ddjEGMnqb8RB2uACatVI2zSRHsJ8Y
+ZLya9vrVediQYkwiL944PdbgqOkcLNt4EemOaFEVcsfzM4fkoF0LXOBXByow9c3E
+N3coTRiR5r/VUv1xLXA+58bEiuPwKAv0dpihi4dVsjoT/Lc+JzeOIuOoTyrvYLs9
+tznDDgFHmV0ST9tD+leh7fmdvhFHJlsTmKtdFoqwNxxXnUX/iJY2v7vKB3tvh2PX
+0DJq1l1sDPGzbjniazEuOQAnFN44wOwZZoYS6J1yFhNkUsepNxz9gjDthBgd9K5c
+/3ATAOux9TN6S9ZV+AWNS2mw9bMoNlwUxFFzTWsL8TQH2xc519woe2v1n/MuwU8X
+KhDzzMro6/1rqy6any2CbgTUUgGTLT2G/H783+9CHaZr77kgxve9oKeV/afmiSTY
+zIw0bOIjL9kSGiG5VZFvC5F5GQytQIgLcOJ60g7YaEi7ghM5EFjp2CoHxhLbWNvS
+O1UQRwUVZ2J+GGOmRj8JDlQyXr8NYnon74Do29lLBlo3WiXQCBJ31G8JUJc9yB3D
+34xFMFbG02SrZvPAXpacw8Tvw3xrizp5f7NJzz3iiZ+gMEuFuZyUJHmPfWupRWgP
+K9Dx2hzLabjKSWJtyNBjYt1gD1iqj6G8BaVmos8bdrKEZLFMOVLAMLrwjEsCsLa3
+AgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFEe4zf/lb+74suwv
+Tg75JbCOPGvDMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQsFAAOCAgEAACAj
+QTUEkMJAYmDv4jVM1z+s4jSQuKFvdvoWFqRINyzpkMLyPPgKn9iB5btb2iUspKdV
+cSQy9sgL8rxq+JOssgfCX5/bzMiKqr5qb+FJEMwx14C7u8jYog5kV+qi9cKpMRXS
+IGrs/CIBKM+GuIAeqcwRpTzyFrNHnfzSgCHEy9BHcEGhyoMZCCxt8l13nIoUE9Q2
+HJLw5QY33KbmkJs4j1xrG0aGQ0JfPgEHU1RdZX33inOhmlRaHylDFCfChQ+1iHsa
+O5S3HWCntZznKWlXWpuTekMwGwPXYshApqr8ZORK15FTAaggiG6cX0S5y2CBNOxv
+033aSF/rtJC8LakcC6wc1aJoIIAE1vyxjy+7SjENSoYc6+I2KSb12tjE8nVhz36u
+dmNKekBlk4f4HoCMhuWG1o8O/FMsYOgWYRqiPkN7zTlgVGr18okmAWiDSKIz6MkE
+kbIRNBE+6tBDGR8Dk5AM/1E9V/RBbuHLoL7ryWPNbczk+DaqaJ3tvV2XcEQNtg41
+3OEMXbugUZTLfhbrES+jkkXITHHZvMmZUldGL1DPvTVp9D0VzgalLA8+9oG6lLvD
+u79leNKGef9JOxqDDPDeeOzI8k1MGt6CKfjBWtrt7uYnXuhF0J0cUahoq0Tj0Itq
+4/g7u9xN12TyUb7mqqta6THuBrxzvxNiCp/HuZc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Subject: CN=T-TeleSec GlobalRoot Class 3 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center
+# Label: "T-TeleSec GlobalRoot Class 3"
+# Serial: 1
+# MD5 Fingerprint: ca:fb:40:a8:4e:39:92:8a:1d:fe:8e:2f:c4:27:ea:ef
+# SHA1 Fingerprint: 55:a6:72:3e:cb:f2:ec:cd:c3:23:74:70:19:9d:2a:be:11:e3:81:d1
+# SHA256 Fingerprint: fd:73:da:d3:1c:64:4f:f1:b4:3b:ef:0c:cd:da:96:71:0b:9c:d9:87:5e:ca:7e:31:70:7a:f3:e9:6d:52:2b:bd
+-----BEGIN CERTIFICATE-----
+MIIDwzCCAqugAwIBAgIBATANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UEBhMCREUx
+KzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnByaXNlIFNlcnZpY2VzIEdtYkgxHzAd
+BgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50ZXIxJTAjBgNVBAMMHFQtVGVsZVNl
+YyBHbG9iYWxSb290IENsYXNzIDMwHhcNMDgxMDAxMTAyOTU2WhcNMzMxMDAxMjM1
+OTU5WjCBgjELMAkGA1UEBhMCREUxKzApBgNVBAoMIlQtU3lzdGVtcyBFbnRlcnBy
+aXNlIFNlcnZpY2VzIEdtYkgxHzAdBgNVBAsMFlQtU3lzdGVtcyBUcnVzdCBDZW50
+ZXIxJTAjBgNVBAMMHFQtVGVsZVNlYyBHbG9iYWxSb290IENsYXNzIDMwggEiMA0G
+CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC9dZPwYiJvJK7genasfb3ZJNW4t/zN
+8ELg63iIVl6bmlQdTQyK9tPPcPRStdiTBONGhnFBSivwKixVA9ZIw+A5OO3yXDw/
+RLyTPWGrTs0NvvAgJ1gORH8EGoel15YUNpDQSXuhdfsaa3Ox+M6pCSzyU9XDFES4
+hqX2iys52qMzVNn6chr3IhUciJFrf2blw2qAsCTz34ZFiP0Zf3WHHx+xGwpzJFu5
+ZeAsVMhg02YXP+HMVDNzkQI6pn97djmiH5a2OK61yJN0HZ65tOVgnS9W0eDrXltM
+EnAMbEQgqxHY9Bn20pxSN+f6tsIxO0rUFJmtxxr1XV/6B7h8DR/Wgx6zAgMBAAGj
+QjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBS1
+A/d2O2GCahKqGFPrAyGUv/7OyjANBgkqhkiG9w0BAQsFAAOCAQEAVj3vlNW92nOy
+WL6ukK2YJ5f+AbGwUgC4TeQbIXQbfsDuXmkqJa9c1h3a0nnJ85cp4IaH3gRZD/FZ
+1GSFS5mvJQQeyUapl96Cshtwn5z2r3Ex3XsFpSzTucpH9sry9uetuUg/vBa3wW30
+6gmv7PO15wWeph6KU1HWk4HMdJP2udqmJQV0eVp+QD6CSyYRMG7hP0HHRwA11fXT
+91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
+e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4p
+TpPDpFQUWw==
+-----END CERTIFICATE-----
+
+# Issuer: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Subject: CN=EE Certification Centre Root CA O=AS Sertifitseerimiskeskus
+# Label: "EE Certification Centre Root CA"
+# Serial: 112324828676200291871926431888494945866
+# MD5 Fingerprint: 43:5e:88:d4:7d:1a:4a:7e:fd:84:2e:52:eb:01:d4:6f
+# SHA1 Fingerprint: c9:a8:b9:e7:55:80:5e:58:e3:53:77:a7:25:eb:af:c3:7b:27:cc:d7
+# SHA256 Fingerprint: 3e:84:ba:43:42:90:85:16:e7:75:73:c0:99:2f:09:79:ca:08:4e:46:85:68:1f:f1:95:cc:ba:8a:22:9b:8a:76
+-----BEGIN CERTIFICATE-----
+MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1
+MQswCQYDVQQGEwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1
+czEoMCYGA1UEAwwfRUUgQ2VydGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYG
+CSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIwMTAxMDMwMTAxMDMwWhgPMjAzMDEy
+MTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlBUyBTZXJ0aWZpdHNl
+ZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRyZSBS
+b290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEB
+AQUAA4IBDwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUy
+euuOF0+W2Ap7kaJjbMeMTC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvO
+bntl8jixwKIy72KyaOBhU8E2lf/slLo2rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIw
+WFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw93X2PaRka9ZP585ArQ/d
+MtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtNP2MbRMNE
+1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYD
+VR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/
+zQas8fElyalL1BSZMEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYB
+BQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEF
+BQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+RjxY6hUFaTlrg4wCQiZrxTFGGV
+v9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqMlIpPnTX/dqQG
+E5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
+uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIW
+iAYLtqZLICjU3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/v
+GVCJYMzpJJUPwssd8m92kMfMdcGWxZ0=
+-----END CERTIFICATE-----
+
+# Issuer: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
+# Subject: CN=TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı O=TÜRKTRUST Bilgi İletişim ve Bilişim Güvenliği Hizmetleri A.Ş. (c) Aralık 2007
+# Label: "TURKTRUST Certificate Services Provider Root 2007"
+# Serial: 1
+# MD5 Fingerprint: 2b:70:20:56:86:82:a0:18:c8:07:53:12:28:70:21:72
+# SHA1 Fingerprint: f1:7f:6f:b6:31:dc:99:e3:a3:c8:7f:fe:1c:f1:81:10:88:d9:60:33
+# SHA256 Fingerprint: 97:8c:d9:66:f2:fa:a0:7b:a7:aa:95:00:d9:c0:2e:9d:77:f2:cd:ad:a6:ad:6b:a7:4a:f4:b9:1c:66:59:3c:50
+-----BEGIN CERTIFICATE-----
+MIIEPTCCAyWgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvzE/MD0GA1UEAww2VMOc
+UktUUlVTVCBFbGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sx
+c8SxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMV4wXAYDVQQKDFVUw5xS
+S1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kg
+SGl6bWV0bGVyaSBBLsWeLiAoYykgQXJhbMSxayAyMDA3MB4XDTA3MTIyNTE4Mzcx
+OVoXDTE3MTIyMjE4MzcxOVowgb8xPzA9BgNVBAMMNlTDnFJLVFJVU1QgRWxla3Ry
+b25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsTELMAkGA1UEBhMC
+VFIxDzANBgNVBAcMBkFua2FyYTFeMFwGA1UECgxVVMOcUktUUlVTVCBCaWxnaSDE
+sGxldGnFn2ltIHZlIEJpbGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7F
+ni4gKGMpIEFyYWzEsWsgMjAwNzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
+ggEBAKu3PgqMyKVYFeaK7yc9SrToJdPNM8Ig3BnuiD9NYvDdE3ePYakqtdTyuTFY
+KTsvP2qcb3N2Je40IIDu6rfwxArNK4aUyeNgsURSsloptJGXg9i3phQvKUmi8wUG
++7RP2qFsmmaf8EMJyupyj+sA1zU511YXRxcw9L6/P8JorzZAwan0qafoEGsIiveG
+HtyaKhUG9qPw9ODHFNRRf8+0222vR5YXm3dx2KdxnSQM9pQ/hTEST7ruToK4uT6P
+IzdezKKqdfcYbwnTrqdUKDT74eA7YH2gvnmJhsifLfkKS8RQouf9eRbHegsYz85M
+733WB2+Y8a+xwXrXgTW4qhe04MsCAwEAAaNCMEAwHQYDVR0OBBYEFCnFkKslrxHk
+Yb+j/4hhkeYO/pyBMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MA0G
+CSqGSIb3DQEBBQUAA4IBAQAQDdr4Ouwo0RSVgrESLFF6QSU2TJ/sPx+EnWVUXKgW
+AkD6bho3hO9ynYYKVZ1WKKxmLNA6VpM0ByWtCLCPyA8JWcqdmBzlVPi5RX9ql2+I
+aE1KBiY3iAIOtsbWcpnOa3faYjGkVh+uX4132l32iPwa2Z61gfAyuOOI0JzzaqC5
+mxRZNTZPz/OOXl0XrRWV2N2y1RVuAE6zS89mlOTgzbUF2mNXi+WzqtvALhyQRNsa
+XRik7r4EW5nVcV9VZWRi1aKbBFmGyGJ353yCRWo9F7/snXUMrqNvWtMvmDb08PUZ
+qxFdyKbjKlhqQgnDvZImZjINXQhVdP+MmNAKpoRq0Tl9
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 2009"
+# Serial: 623603
+# MD5 Fingerprint: cd:e0:25:69:8d:47:ac:9c:89:35:90:f7:fd:51:3d:2f
+# SHA1 Fingerprint: 58:e8:ab:b0:36:15:33:fb:80:f7:9b:1b:6d:29:d3:ff:8d:5f:00:f0
+# SHA256 Fingerprint: 49:e7:a4:42:ac:f0:ea:62:87:05:00:54:b5:25:64:b6:50:e4:f4:9e:42:e3:48:d6:aa:38:e0:39:e9:57:b1:c1
+-----BEGIN CERTIFICATE-----
+MIIEMzCCAxugAwIBAgIDCYPzMA0GCSqGSIb3DQEBCwUAME0xCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMMHkQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgMjAwOTAeFw0wOTExMDUwODM1NThaFw0yOTExMDUwODM1NTha
+ME0xCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxJzAlBgNVBAMM
+HkQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgMjAwOTCCASIwDQYJKoZIhvcNAQEB
+BQADggEPADCCAQoCggEBANOySs96R+91myP6Oi/WUEWJNTrGa9v+2wBoqOADER03
+UAifTUpolDWzU9GUY6cgVq/eUXjsKj3zSEhQPgrfRlWLJ23DEE0NkVJD2IfgXU42
+tSHKXzlABF9bfsyjxiupQB7ZNoTWSPOSHjRGICTBpFGOShrvUD9pXRl/RcPHAY9R
+ySPocq60vFYJfxLLHLGvKZAKyVXMD9O0Gu1HNVpK7ZxzBCHQqr0ME7UAyiZsxGsM
+lFqVlNpQmvH/pStmMaTJOKDfHR+4CS7zp+hnUquVH+BGPtikw8paxTGA6Eian5Rp
+/hnd2HN8gcqW3o7tszIFZYQ05ub9VxC1X3a/L7AQDcUCAwEAAaOCARowggEWMA8G
+A1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFP3aFMSfMN4hvR5COfyrYyNJ4PGEMA4G
+A1UdDwEB/wQEAwIBBjCB0wYDVR0fBIHLMIHIMIGAoH6gfIZ6bGRhcDovL2RpcmVj
+dG9yeS5kLXRydXN0Lm5ldC9DTj1ELVRSVVNUJTIwUm9vdCUyMENsYXNzJTIwMyUy
+MENBJTIwMiUyMDIwMDksTz1ELVRydXN0JTIwR21iSCxDPURFP2NlcnRpZmljYXRl
+cmV2b2NhdGlvbmxpc3QwQ6BBoD+GPWh0dHA6Ly93d3cuZC10cnVzdC5uZXQvY3Js
+L2QtdHJ1c3Rfcm9vdF9jbGFzc18zX2NhXzJfMjAwOS5jcmwwDQYJKoZIhvcNAQEL
+BQADggEBAH+X2zDI36ScfSF6gHDOFBJpiBSVYEQBrLLpME+bUMJm2H6NMLVwMeni
+acfzcNsgFYbQDfC+rAF1hM5+n02/t2A7nPPKHeJeaNijnZflQGDSNiH+0LS4F9p0
+o3/U37CYAqxva2ssJSRyoWXuJVrl5jLn8t+rSfrzkGkj2wTZ51xY/GXUl77M/C4K
+zCUqNQT4YJEVdT1B/yMfGchs64JTBKbkTCJNjYy6zltz7GRUUG3RnFX7acM2w4y8
+PIWmawomDeCTmGCufsYkl4phX5GOZpIJhzbNi5stPvZR1FDUWSi9g/LMKHtThm3Y
+Johw1+qRzT65ysCQblrGXnRl11z+o+I=
+-----END CERTIFICATE-----
+
+# Issuer: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Subject: CN=D-TRUST Root Class 3 CA 2 EV 2009 O=D-Trust GmbH
+# Label: "D-TRUST Root Class 3 CA 2 EV 2009"
+# Serial: 623604
+# MD5 Fingerprint: aa:c6:43:2c:5e:2d:cd:c4:34:c0:50:4f:11:02:4f:b6
+# SHA1 Fingerprint: 96:c9:1b:0b:95:b4:10:98:42:fa:d0:d8:22:79:fe:60:fa:b9:16:83
+# SHA256 Fingerprint: ee:c5:49:6b:98:8c:e9:86:25:b9:34:09:2e:ec:29:08:be:d0:b0:f3:16:c2:d4:73:0c:84:ea:f1:f3:d3:48:81
+-----BEGIN CERTIFICATE-----
+MIIEQzCCAyugAwIBAgIDCYP0MA0GCSqGSIb3DQEBCwUAMFAxCzAJBgNVBAYTAkRF
+MRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNVBAMMIUQtVFJVU1QgUm9vdCBD
+bGFzcyAzIENBIDIgRVYgMjAwOTAeFw0wOTExMDUwODUwNDZaFw0yOTExMDUwODUw
+NDZaMFAxCzAJBgNVBAYTAkRFMRUwEwYDVQQKDAxELVRydXN0IEdtYkgxKjAoBgNV
+BAMMIUQtVFJVU1QgUm9vdCBDbGFzcyAzIENBIDIgRVYgMjAwOTCCASIwDQYJKoZI
+hvcNAQEBBQADggEPADCCAQoCggEBAJnxhDRwui+3MKCOvXwEz75ivJn9gpfSegpn
+ljgJ9hBOlSJzmY3aFS3nBfwZcyK3jpgAvDw9rKFs+9Z5JUut8Mxk2og+KbgPCdM0
+3TP1YtHhzRnp7hhPTFiu4h7WDFsVWtg6uMQYZB7jM7K1iXdODL/ZlGsTl28So/6Z
+qQTMFexgaDbtCHu39b+T7WYxg4zGcTSHThfqr4uRjRxWQa4iN1438h3Z0S0NL2lR
+p75mpoo6Kr3HGrHhFPC+Oh25z1uxav60sUYgovseO3Dvk5h9jHOW8sXvhXCtKSb8
+HgQ+HKDYD8tSg2J87otTlZCpV6LqYQXY+U3EJ/pure3511H3a6UCAwEAAaOCASQw
+ggEgMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNOUikxiEyoZLsyvcop9Ntea
+HNxnMA4GA1UdDwEB/wQEAwIBBjCB3QYDVR0fBIHVMIHSMIGHoIGEoIGBhn9sZGFw
+Oi8vZGlyZWN0b3J5LmQtdHJ1c3QubmV0L0NOPUQtVFJVU1QlMjBSb290JTIwQ2xh
+c3MlMjAzJTIwQ0ElMjAyJTIwRVYlMjAyMDA5LE89RC1UcnVzdCUyMEdtYkgsQz1E
+RT9jZXJ0aWZpY2F0ZXJldm9jYXRpb25saXN0MEagRKBChkBodHRwOi8vd3d3LmQt
+dHJ1c3QubmV0L2NybC9kLXRydXN0X3Jvb3RfY2xhc3NfM19jYV8yX2V2XzIwMDku
+Y3JsMA0GCSqGSIb3DQEBCwUAA4IBAQA07XtaPKSUiO8aEXUHL7P+PPoeUSbrh/Yp
+3uDx1MYkCenBz1UbtDDZzhr+BlGmFaQt77JLvyAoJUnRpjZ3NOhk31KxEcdzes05
+nsKtjHEh8lprr988TlWvsoRlFIm5d8sqMb7Po23Pb0iUMkZv53GMoKaEGTcH8gNF
+CSuGdXzfX2lXANtu2KZyIktQ1HWYVt+3GP9DQ1CuekR78HlR10M9p9OB0/DJT7na
+xpeG0ILD5EJt/rDiZE4OJudANCa1CInXCGNjOCd1HjPqbqjdn5lPdE2BiYBL3ZqX
+KVwvvoFBuYz/6n1gBp7N1z3TLqMVvKjmJuVvw9y4AyHqnxbxLFS1
+-----END CERTIFICATE-----
+
+# Issuer: CN=Autoridad de Certificacion Raiz del Estado Venezolano O=Sistema Nacional de Certificacion Electronica OU=Superintendencia de Servicios de Certificacion Electronica
+# Subject: CN=PSCProcert O=Sistema Nacional de Certificacion Electronica OU=Proveedor de Certificados PROCERT
+# Label: "PSCProcert"
+# Serial: 11
+# MD5 Fingerprint: e6:24:e9:12:01:ae:0c:de:8e:85:c4:ce:a3:12:dd:ec
+# SHA1 Fingerprint: 70:c1:8d:74:b4:28:81:0a:e4:fd:a5:75:d7:01:9f:99:b0:3d:50:74
+# SHA256 Fingerprint: 3c:fc:3c:14:d1:f6:84:ff:17:e3:8c:43:ca:44:0c:00:b9:67:ec:93:3e:8b:fe:06:4c:a1:d7:2c:90:f2:ad:b0
+-----BEGIN CERTIFICATE-----
+MIIJhjCCB26gAwIBAgIBCzANBgkqhkiG9w0BAQsFADCCAR4xPjA8BgNVBAMTNUF1
+dG9yaWRhZCBkZSBDZXJ0aWZpY2FjaW9uIFJhaXogZGVsIEVzdGFkbyBWZW5lem9s
+YW5vMQswCQYDVQQGEwJWRTEQMA4GA1UEBxMHQ2FyYWNhczEZMBcGA1UECBMQRGlz
+dHJpdG8gQ2FwaXRhbDE2MDQGA1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0
+aWZpY2FjaW9uIEVsZWN0cm9uaWNhMUMwQQYDVQQLEzpTdXBlcmludGVuZGVuY2lh
+IGRlIFNlcnZpY2lvcyBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9uaWNhMSUwIwYJ
+KoZIhvcNAQkBFhZhY3JhaXpAc3VzY2VydGUuZ29iLnZlMB4XDTEwMTIyODE2NTEw
+MFoXDTIwMTIyNTIzNTk1OVowgdExJjAkBgkqhkiG9w0BCQEWF2NvbnRhY3RvQHBy
+b2NlcnQubmV0LnZlMQ8wDQYDVQQHEwZDaGFjYW8xEDAOBgNVBAgTB01pcmFuZGEx
+KjAoBgNVBAsTIVByb3ZlZWRvciBkZSBDZXJ0aWZpY2Fkb3MgUFJPQ0VSVDE2MDQG
+A1UEChMtU2lzdGVtYSBOYWNpb25hbCBkZSBDZXJ0aWZpY2FjaW9uIEVsZWN0cm9u
+aWNhMQswCQYDVQQGEwJWRTETMBEGA1UEAxMKUFNDUHJvY2VydDCCAiIwDQYJKoZI
+hvcNAQEBBQADggIPADCCAgoCggIBANW39KOUM6FGqVVhSQ2oh3NekS1wwQYalNo9
+7BVCwfWMrmoX8Yqt/ICV6oNEolt6Vc5Pp6XVurgfoCfAUFM+jbnADrgV3NZs+J74
+BCXfgI8Qhd19L3uA3VcAZCP4bsm+lU/hdezgfl6VzbHvvnpC2Mks0+saGiKLt38G
+ieU89RLAu9MLmV+QfI4tL3czkkohRqipCKzx9hEC2ZUWno0vluYC3XXCFCpa1sl9
+JcLB/KpnheLsvtF8PPqv1W7/U0HU9TI4seJfxPmOEO8GqQKJ/+MMbpfg353bIdD0
+PghpbNjU5Db4g7ayNo+c7zo3Fn2/omnXO1ty0K+qP1xmk6wKImG20qCZyFSTXai2
+0b1dCl53lKItwIKOvMoDKjSuc/HUtQy9vmebVOvh+qBa7Dh+PsHMosdEMXXqP+UH
+0quhJZb25uSgXTcYOWEAM11G1ADEtMo88aKjPvM6/2kwLkDd9p+cJsmWN63nOaK/
+6mnbVSKVUyqUtd+tFjiBdWbjxywbk5yqjKPK2Ww8F22c3HxT4CAnQzb5EuE8XL1m
+v6JpIzi4mWCZDlZTOpx+FIywBm/xhnaQr/2v/pDGj59/i5IjnOcVdo/Vi5QTcmn7
+K2FjiO/mpF7moxdqWEfLcU8UC17IAggmosvpr2uKGcfLFFb14dq12fy/czja+eev
+bqQ34gcnAgMBAAGjggMXMIIDEzASBgNVHRMBAf8ECDAGAQH/AgEBMDcGA1UdEgQw
+MC6CD3N1c2NlcnRlLmdvYi52ZaAbBgVghl4CAqASDBBSSUYtRy0yMDAwNDAzNi0w
+MB0GA1UdDgQWBBRBDxk4qpl/Qguk1yeYVKIXTC1RVDCCAVAGA1UdIwSCAUcwggFD
+gBStuyIdxuDSAaj9dlBSk+2YwU2u06GCASakggEiMIIBHjE+MDwGA1UEAxM1QXV0
+b3JpZGFkIGRlIENlcnRpZmljYWNpb24gUmFpeiBkZWwgRXN0YWRvIFZlbmV6b2xh
+bm8xCzAJBgNVBAYTAlZFMRAwDgYDVQQHEwdDYXJhY2FzMRkwFwYDVQQIExBEaXN0
+cml0byBDYXBpdGFsMTYwNAYDVQQKEy1TaXN0ZW1hIE5hY2lvbmFsIGRlIENlcnRp
+ZmljYWNpb24gRWxlY3Ryb25pY2ExQzBBBgNVBAsTOlN1cGVyaW50ZW5kZW5jaWEg
+ZGUgU2VydmljaW9zIGRlIENlcnRpZmljYWNpb24gRWxlY3Ryb25pY2ExJTAjBgkq
+hkiG9w0BCQEWFmFjcmFpekBzdXNjZXJ0ZS5nb2IudmWCAQowDgYDVR0PAQH/BAQD
+AgEGME0GA1UdEQRGMESCDnByb2NlcnQubmV0LnZloBUGBWCGXgIBoAwMClBTQy0w
+MDAwMDKgGwYFYIZeAgKgEgwQUklGLUotMzE2MzUzNzMtNzB2BgNVHR8EbzBtMEag
+RKBChkBodHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9sY3IvQ0VSVElGSUNBRE8t
+UkFJWi1TSEEzODRDUkxERVIuY3JsMCOgIaAfhh1sZGFwOi8vYWNyYWl6LnN1c2Nl
+cnRlLmdvYi52ZTA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9v
+Y3NwLnN1c2NlcnRlLmdvYi52ZTBBBgNVHSAEOjA4MDYGBmCGXgMBAjAsMCoGCCsG
+AQUFBwIBFh5odHRwOi8vd3d3LnN1c2NlcnRlLmdvYi52ZS9kcGMwDQYJKoZIhvcN
+AQELBQADggIBACtZ6yKZu4SqT96QxtGGcSOeSwORR3C7wJJg7ODU523G0+1ng3dS
+1fLld6c2suNUvtm7CpsR72H0xpkzmfWvADmNg7+mvTV+LFwxNG9s2/NkAZiqlCxB
+3RWGymspThbASfzXg0gTB1GEMVKIu4YXx2sviiCtxQuPcD4quxtxj7mkoP3Yldmv
+Wb8lK5jpY5MvYB7Eqvh39YtsL+1+LrVPQA3uvFd359m21D+VJzog1eWuq2w1n8Gh
+HVnchIHuTQfiSLaeS5UtQbHh6N5+LwUeaO6/u5BlOsju6rEYNxxik6SgMexxbJHm
+pHmJWhSnFFAFTKQAVzAswbVhltw+HoSvOULP5dAssSS830DD7X9jSr3hTxJkhpXz
+sOfIt+FTvZLm8wyWuevo5pLtp4EJFAv8lXrPj9Y0TzYS3F7RNHXGRoAvlQSMx4bE
+qCaJqD8Zm4G7UaRKhqsLEQ+xrmNTbSjq3TNWOByyrYDT13K9mmyZY+gAu0F2Bbdb
+mRiKw7gSXFbPVgx96OLP7bx0R/vu0xdOIk9W/1DzLuY5poLWccret9W6aAjtmcz9
+opLLabid+Qqkpj5PkygqYWwHJgD/ll9ohri4zspV4KuxPX+Y1zMOWj3YeMLEYC/H
+YvBhkdI4sPaeVdtAgAUSM84dkpvRabP/v/GSCmE1P93+hvS84Bpxs2Km
+-----END CERTIFICATE-----
+
+# Issuer: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
+# Subject: CN=China Internet Network Information Center EV Certificates Root O=China Internet Network Information Center
+# Label: "China Internet Network Information Center EV Certificates Root"
+# Serial: 1218379777
+# MD5 Fingerprint: 55:5d:63:00:97:bd:6a:97:f5:67:ab:4b:fb:6e:63:15
+# SHA1 Fingerprint: 4f:99:aa:93:fb:2b:d1:37:26:a1:99:4a:ce:7f:f0:05:f2:93:5d:1e
+# SHA256 Fingerprint: 1c:01:c6:f4:db:b2:fe:fc:22:55:8b:2b:ca:32:56:3f:49:84:4a:cf:c3:2b:7b:e4:b0:ff:59:9f:9e:8c:7a:f7
+-----BEGIN CERTIFICATE-----
+MIID9zCCAt+gAwIBAgIESJ8AATANBgkqhkiG9w0BAQUFADCBijELMAkGA1UEBhMC
+Q04xMjAwBgNVBAoMKUNoaW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24g
+Q2VudGVyMUcwRQYDVQQDDD5DaGluYSBJbnRlcm5ldCBOZXR3b3JrIEluZm9ybWF0
+aW9uIENlbnRlciBFViBDZXJ0aWZpY2F0ZXMgUm9vdDAeFw0xMDA4MzEwNzExMjVa
+Fw0zMDA4MzEwNzExMjVaMIGKMQswCQYDVQQGEwJDTjEyMDAGA1UECgwpQ2hpbmEg
+SW50ZXJuZXQgTmV0d29yayBJbmZvcm1hdGlvbiBDZW50ZXIxRzBFBgNVBAMMPkNo
+aW5hIEludGVybmV0IE5ldHdvcmsgSW5mb3JtYXRpb24gQ2VudGVyIEVWIENlcnRp
+ZmljYXRlcyBSb290MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm35z
+7r07eKpkQ0H1UN+U8i6yjUqORlTSIRLIOTJCBumD1Z9S7eVnAztUwYyZmczpwA//
+DdmEEbK40ctb3B75aDFk4Zv6dOtouSCV98YPjUesWgbdYavi7NifFy2cyjw1l1Vx
+zUOFsUcW9SxTgHbP0wBkvUCZ3czY28Sf1hNfQYOL+Q2HklY0bBoQCxfVWhyXWIQ8
+hBouXJE0bhlffxdpxWXvayHG1VA6v2G5BY3vbzQ6sm8UY78WO5upKv23KzhmBsUs
+4qpnHkWnjQRmQvaPK++IIGmPMowUc9orhpFjIpryp9vOiYurXccUwVswah+xt54u
+gQEC7c+WXmPbqOY4twIDAQABo2MwYTAfBgNVHSMEGDAWgBR8cks5x8DbYqVPm6oY
+NJKiyoOCWTAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4E
+FgQUfHJLOcfA22KlT5uqGDSSosqDglkwDQYJKoZIhvcNAQEFBQADggEBACrDx0M3
+j92tpLIM7twUbY8opJhJywyA6vPtI2Z1fcXTIWd50XPFtQO3WKwMVC/GVhMPMdoG
+52U7HW8228gd+f2ABsqjPWYWqJ1MFn3AlUa1UeTiH9fqBk1jjZaM7+czV0I664zB
+echNdn3e9rG3geCg+aF4RhcaVpjwTj2rHO3sOdwHSPdj/gauwqRcalsyiMXHM4Ws
+ZkJHwlgkmeHlPuV1LI5D1l08eB6olYIpUNHRFrrvwb562bTYzB5MRuF3sTGrvSrI
+zo9uoV1/A3U05K2JRVRevq4opbs/eHnrc7MKDf2+yfdWrPa37S+bISnHOLaVxATy
+wy39FCqQmbkHzJ8=
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root CA 2 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root CA 2"
+# Serial: 40698052477090394928831521023204026294
+# MD5 Fingerprint: 5b:04:69:ec:a5:83:94:63:18:a7:86:d0:e4:f2:6e:19
+# SHA1 Fingerprint: 77:47:4f:c6:30:e4:0f:4c:47:64:3f:84:ba:b8:c6:95:4a:8a:41:ec
+# SHA256 Fingerprint: f0:9b:12:2c:71:14:f4:a0:9b:d4:ea:4f:4a:99:d5:58:b4:6e:4c:25:cd:81:14:0d:29:c0:56:13:91:4c:38:41
+-----BEGIN CERTIFICATE-----
+MIIF2TCCA8GgAwIBAgIQHp4o6Ejy5e/DfEoeWhhntjANBgkqhkiG9w0BAQsFADBk
+MQswCQYDVQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0
+YWwgQ2VydGlmaWNhdGUgU2VydmljZXMxGzAZBgNVBAMTElN3aXNzY29tIFJvb3Qg
+Q0EgMjAeFw0xMTA2MjQwODM4MTRaFw0zMTA2MjUwNzM4MTRaMGQxCzAJBgNVBAYT
+AmNoMREwDwYDVQQKEwhTd2lzc2NvbTElMCMGA1UECxMcRGlnaXRhbCBDZXJ0aWZp
+Y2F0ZSBTZXJ2aWNlczEbMBkGA1UEAxMSU3dpc3Njb20gUm9vdCBDQSAyMIICIjAN
+BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAlUJOhJ1R5tMJ6HJaI2nbeHCOFvEr
+jw0DzpPMLgAIe6szjPTpQOYXTKueuEcUMncy3SgM3hhLX3af+Dk7/E6J2HzFZ++r
+0rk0X2s682Q2zsKwzxNoysjL67XiPS4h3+os1OD5cJZM/2pYmLcX5BtS5X4HAB1f
+2uY+lQS3aYg5oUFgJWFLlTloYhyxCwWJwDaCFCE/rtuh/bxvHGCGtlOUSbkrRsVP
+ACu/obvLP+DHVxxX6NZp+MEkUp2IVd3Chy50I9AU/SpHWrumnf2U5NGKpV+GY3aF
+y6//SSj8gO1MedK75MDvAe5QQQg1I3ArqRa0jG6F6bYRzzHdUyYb3y1aSgJA/MTA
+tukxGggo5WDDH8SQjhBiYEQN7Aq+VRhxLKX0srwVYv8c474d2h5Xszx+zYIdkeNL
+6yxSNLCK/RJOlrDrcH+eOfdmQrGrrFLadkBXeyq96G4DsguAhYidDMfCd7Camlf0
+uPoTXGiTOmekl9AbmbeGMktg2M7v0Ax/lZ9vh0+Hio5fCHyqW/xavqGRn1V9TrAL
+acywlKinh/LTSlDcX3KwFnUey7QYYpqwpzmqm59m2I2mbJYV4+by+PGDYmy7Velh
+k6M99bFXi08jsJvllGov34zflVEpYKELKeRcVVi3qPyZ7iVNTA6z00yPhOgpD/0Q
+VAKFyPnlw4vP5w8CAwEAAaOBhjCBgzAOBgNVHQ8BAf8EBAMCAYYwHQYDVR0hBBYw
+FDASBgdghXQBUwIBBgdghXQBUwIBMBIGA1UdEwEB/wQIMAYBAf8CAQcwHQYDVR0O
+BBYEFE0mICKJS9PVpAqhb97iEoHF8TwuMB8GA1UdIwQYMBaAFE0mICKJS9PVpAqh
+b97iEoHF8TwuMA0GCSqGSIb3DQEBCwUAA4ICAQAyCrKkG8t9voJXiblqf/P0wS4R
+fbgZPnm3qKhyN2abGu2sEzsOv2LwnN+ee6FTSA5BesogpxcbtnjsQJHzQq0Qw1zv
+/2BZf82Fo4s9SBwlAjxnffUy6S8w5X2lejjQ82YqZh6NM4OKb3xuqFp1mrjX2lhI
+REeoTPpMSQpKwhI3qEAMw8jh0FcNlzKVxzqfl9NX+Ave5XLzo9v/tdhZsnPdTSpx
+srpJ9csc1fV5yJmz/MFMdOO0vSk3FQQoHt5FRnDsr7p4DooqzgB53MBfGWcsa0vv
+aGgLQ+OswWIJ76bdZWGgr4RVSJFSHMYlkSrQwSIjYVmvRRGFHQEkNI/Ps/8XciAT
+woCqISxxOQ7Qj1zB09GOInJGTB2Wrk9xseEFKZZZ9LuedT3PDTcNYtsmjGOpI99n
+Bjx8Oto0QuFmtEYE3saWmA9LSHokMnWRn6z3aOkquVVlzl1h0ydw2Df+n7mvoC5W
+t6NlUe07qxS/TFED6F+KBZvuim6c779o+sjaC+NCydAXFJy3SuCvkychVSa1ZC+N
+8f+mQAWFBVzKBxlcCxMoTFh/wqXvRdpg065lYZ1Tg3TCrvJcwhbtkj6EPnNgiLx2
+9CzP0H1907he0ZESEOnN3col49XtmS++dYFLJPlFRpTJKSFTnCZFqhMX5OfNeOI5
+wSsSnqaeG8XmDtkx2Q==
+-----END CERTIFICATE-----
+
+# Issuer: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
+# Subject: CN=Swisscom Root EV CA 2 O=Swisscom OU=Digital Certificate Services
+# Label: "Swisscom Root EV CA 2"
+# Serial: 322973295377129385374608406479535262296
+# MD5 Fingerprint: 7b:30:34:9f:dd:0a:4b:6b:35:ca:31:51:28:5d:ae:ec
+# SHA1 Fingerprint: e7:a1:90:29:d3:d5:52:dc:0d:0f:c6:92:d3:ea:88:0d:15:2e:1a:6b
+# SHA256 Fingerprint: d9:5f:ea:3c:a4:ee:dc:e7:4c:d7:6e:75:fc:6d:1f:f6:2c:44:1f:0f:a8:bc:77:f0:34:b1:9e:5d:b2:58:01:5d
+-----BEGIN CERTIFICATE-----
+MIIF4DCCA8igAwIBAgIRAPL6ZOJ0Y9ON/RAdBB92ylgwDQYJKoZIhvcNAQELBQAw
+ZzELMAkGA1UEBhMCY2gxETAPBgNVBAoTCFN3aXNzY29tMSUwIwYDVQQLExxEaWdp
+dGFsIENlcnRpZmljYXRlIFNlcnZpY2VzMR4wHAYDVQQDExVTd2lzc2NvbSBSb290
+IEVWIENBIDIwHhcNMTEwNjI0MDk0NTA4WhcNMzEwNjI1MDg0NTA4WjBnMQswCQYD
+VQQGEwJjaDERMA8GA1UEChMIU3dpc3Njb20xJTAjBgNVBAsTHERpZ2l0YWwgQ2Vy
+dGlmaWNhdGUgU2VydmljZXMxHjAcBgNVBAMTFVN3aXNzY29tIFJvb3QgRVYgQ0Eg
+MjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMT3HS9X6lds93BdY7Bx
+UglgRCgzo3pOCvrY6myLURYaVa5UJsTMRQdBTxB5f3HSek4/OE6zAMaVylvNwSqD
+1ycfMQ4jFrclyxy0uYAyXhqdk/HoPGAsp15XGVhRXrwsVgu42O+LgrQ8uMIkqBPH
+oCE2G3pXKSinLr9xJZDzRINpUKTk4RtiGZQJo/PDvO/0vezbE53PnUgJUmfANykR
+HvvSEaeFGHR55E+FFOtSN+KxRdjMDUN/rhPSays/p8LiqG12W0OfvrSdsyaGOx9/
+5fLoZigWJdBLlzin5M8J0TbDC77aO0RYjb7xnglrPvMyxyuHxuxenPaHZa0zKcQv
+idm5y8kDnftslFGXEBuGCxobP/YCfnvUxVFkKJ3106yDgYjTdLRZncHrYTNaRdHL
+OdAGalNgHa/2+2m8atwBz735j9m9W8E6X47aD0upm50qKGsaCnw8qyIL5XctcfaC
+NYGu+HuB5ur+rPQam3Rc6I8k9l2dRsQs0h4rIWqDJ2dVSqTjyDKXZpBy2uPUZC5f
+46Fq9mDU5zXNysRojddxyNMkM3OxbPlq4SjbX8Y96L5V5jcb7STZDxmPX2MYWFCB
+UWVv8p9+agTnNCRxunZLWB4ZvRVgRaoMEkABnRDixzgHcgplwLa7JSnaFp6LNYth
+7eVxV4O1PHGf40+/fh6Bn0GXAgMBAAGjgYYwgYMwDgYDVR0PAQH/BAQDAgGGMB0G
+A1UdIQQWMBQwEgYHYIV0AVMCAgYHYIV0AVMCAjASBgNVHRMBAf8ECDAGAQH/AgED
+MB0GA1UdDgQWBBRF2aWBbj2ITY1x0kbBbkUe88SAnTAfBgNVHSMEGDAWgBRF2aWB
+bj2ITY1x0kbBbkUe88SAnTANBgkqhkiG9w0BAQsFAAOCAgEAlDpzBp9SSzBc1P6x
+XCX5145v9Ydkn+0UjrgEjihLj6p7jjm02Vj2e6E1CqGdivdj5eu9OYLU43otb98T
+PLr+flaYC/NUn81ETm484T4VvwYmneTwkLbUwp4wLh/vx3rEUMfqe9pQy3omywC0
+Wqu1kx+AiYQElY2NfwmTv9SoqORjbdlk5LgpWgi/UOGED1V7XwgiG/W9mR4U9s70
+WBCCswo9GcG/W6uqmdjyMb3lOGbcWAXH7WMaLgqXfIeTK7KK4/HsGOV1timH59yL
+Gn602MnTihdsfSlEvoqq9X46Lmgxk7lq2prg2+kupYTNHAq4Sgj5nPFhJpiTt3tm
+7JFe3VE/23MPrQRYCd0EApUKPtN236YQHoA96M2kZNEzx5LH4k5E4wnJTsJdhw4S
+nr8PyQUQ3nqjsTzyP6WqJ3mtMX0f/fwZacXduT98zca0wjAefm6S139hdlqP65VN
+vBFuIXxZN5nQBrz5Bm0yFqXZaajh3DyAHmBR3NdUIR7KYndP+tiPsys6DXhyyWhB
+WkdKwqPrGtcKqzwyVcgKEZzfdNbwQBUdyLmPtTbFr/giuMod89a2GQ+fYWVq6nTI
+fI/DT11lgh/ZDYnadXL77/FHZxOzyNEZiCcmmpl5fx7kLD977vHeTYuWl8PVP3wb
+I+2ksx0WckNLIOFZfsLorSa/ovc=
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R1 O=Disig a.s.
+# Subject: CN=CA Disig Root R1 O=Disig a.s.
+# Label: "CA Disig Root R1"
+# Serial: 14052245610670616104
+# MD5 Fingerprint: be:ec:11:93:9a:f5:69:21:bc:d7:c1:c0:67:89:cc:2a
+# SHA1 Fingerprint: 8e:1c:74:f8:a6:20:b9:e5:8a:f4:61:fa:ec:2b:47:56:51:1a:52:c6
+# SHA256 Fingerprint: f9:6f:23:f4:c3:e7:9c:07:7a:46:98:8d:5a:f5:90:06:76:a0:f0:39:cb:64:5d:d1:75:49:b2:16:c8:24:40:ce
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAMMDmu5QkG4oMA0GCSqGSIb3DQEBBQUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIxMB4XDTEyMDcxOTA5MDY1NloXDTQy
+MDcxOTA5MDY1NlowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjEw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCqw3j33Jijp1pedxiy3QRk
+D2P9m5YJgNXoqqXinCaUOuiZc4yd39ffg/N4T0Dhf9Kn0uXKE5Pn7cZ3Xza1lK/o
+OI7bm+V8u8yN63Vz4STN5qctGS7Y1oprFOsIYgrY3LMATcMjfF9DCCMyEtztDK3A
+fQ+lekLZWnDZv6fXARz2m6uOt0qGeKAeVjGu74IKgEH3G8muqzIm1Cxr7X1r5OJe
+IgpFy4QxTaz+29FHuvlglzmxZcfe+5nkCiKxLU3lSCZpq+Kq8/v8kiky6bM+TR8n
+oc2OuRf7JT7JbvN32g0S9l3HuzYQ1VTW8+DiR0jm3hTaYVKvJrT1cU/J19IG32PK
+/yHoWQbgCNWEFVP3Q+V8xaCJmGtzxmjOZd69fwX3se72V6FglcXM6pM6vpmumwKj
+rckWtc7dXpl4fho5frLABaTAgqWjR56M6ly2vGfb5ipN0gTco65F97yLnByn1tUD
+3AjLLhbKXEAz6GfDLuemROoRRRw1ZS0eRWEkG4IupZ0zXWX4Qfkuy5Q/H6MMMSRE
+7cderVC6xkGbrPAXZcD4XW9boAo0PO7X6oifmPmvTiT6l7Jkdtqr9O3jw2Dv1fkC
+yC2fg69naQanMVXVz0tv/wQFx1isXxYb5dKj6zHbHzMVTdDypVP1y+E9Tmgt2BLd
+qvLmTZtJ5cUoobqwWsagtQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUiQq0OJMa5qvum5EY+fU8PjXQ04IwDQYJKoZI
+hvcNAQEFBQADggIBADKL9p1Kyb4U5YysOMo6CdQbzoaz3evUuii+Eq5FLAR0rBNR
+xVgYZk2C2tXck8An4b58n1KeElb21Zyp9HWc+jcSjxyT7Ff+Bw+r1RL3D65hXlaA
+SfX8MPWbTx9BLxyE04nH4toCdu0Jz2zBuByDHBb6lM19oMgY0sidbvW9adRtPTXo
+HqJPYNcHKfyyo6SdbhWSVhlMCrDpfNIZTUJG7L399ldb3Zh+pE3McgODWF3vkzpB
+emOqfDqo9ayk0d2iLbYq/J8BjuIQscTK5GfbVSUZP/3oNn6z4eGBrxEWi1CXYBmC
+AMBrTXO40RMHPuq2MU/wQppt4hF05ZSsjYSVPCGvxdpHyN85YmLLW1AL14FABZyb
+7bq2ix4Eb5YgOe2kfSnbSM6C3NQCjR0EMVrHS/BsYVLXtFHCgWzN4funodKSds+x
+DzdYpPJScWc/DIh4gInByLUfkmO+p3qKViwaqKactV2zY9ATIKHrkWzQjX2v3wvk
+F7mGnjixlAxYjOBVqjtjbZqJYLhkKpLGN/R+Q0O3c+gB53+XD9fyexn9GtePyfqF
+a3qdnom2piiZk4hA9z7NUaPK6u95RyG1/jLix8NRb76AdPCkwzryT+lf3xkK8jsT
+Q6wxpLPn6/wY1gGp8yqPNg7rtLG8t0zJa7+h89n07eLw4+1knj0vllJPgFOL
+-----END CERTIFICATE-----
+
+# Issuer: CN=CA Disig Root R2 O=Disig a.s.
+# Subject: CN=CA Disig Root R2 O=Disig a.s.
+# Label: "CA Disig Root R2"
+# Serial: 10572350602393338211
+# MD5 Fingerprint: 26:01:fb:d8:27:a7:17:9a:45:54:38:1a:43:01:3b:03
+# SHA1 Fingerprint: b5:61:eb:ea:a4:de:e4:25:4b:69:1a:98:a5:57:47:c2:34:c7:d9:71
+# SHA256 Fingerprint: e2:3d:4a:03:6d:7b:70:e9:f5:95:b1:42:20:79:d2:b9:1e:df:bb:1f:b6:51:a0:63:3e:aa:8a:9d:c5:f8:07:03
+-----BEGIN CERTIFICATE-----
+MIIFaTCCA1GgAwIBAgIJAJK4iNuwisFjMA0GCSqGSIb3DQEBCwUAMFIxCzAJBgNV
+BAYTAlNLMRMwEQYDVQQHEwpCcmF0aXNsYXZhMRMwEQYDVQQKEwpEaXNpZyBhLnMu
+MRkwFwYDVQQDExBDQSBEaXNpZyBSb290IFIyMB4XDTEyMDcxOTA5MTUzMFoXDTQy
+MDcxOTA5MTUzMFowUjELMAkGA1UEBhMCU0sxEzARBgNVBAcTCkJyYXRpc2xhdmEx
+EzARBgNVBAoTCkRpc2lnIGEucy4xGTAXBgNVBAMTEENBIERpc2lnIFJvb3QgUjIw
+ggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCio8QACdaFXS1tFPbCw3Oe
+NcJxVX6B+6tGUODBfEl45qt5WDza/3wcn9iXAng+a0EE6UG9vgMsRfYvZNSrXaNH
+PWSb6WiaxswbP7q+sos0Ai6YVRn8jG+qX9pMzk0DIaPY0jSTVpbLTAwAFjxfGs3I
+x2ymrdMxp7zo5eFm1tL7A7RBZckQrg4FY8aAamkw/dLukO8NJ9+flXP04SXabBbe
+QTg06ov80egEFGEtQX6sx3dOy1FU+16SGBsEWmjGycT6txOgmLcRK7fWV8x8nhfR
+yyX+hk4kLlYMeE2eARKmK6cBZW58Yh2EhN/qwGu1pSqVg8NTEQxzHQuyRpDRQjrO
+QG6Vrf/GlK1ul4SOfW+eioANSW1z4nuSHsPzwfPrLgVv2RvPN3YEyLRa5Beny912
+H9AZdugsBbPWnDTYltxhh5EF5EQIM8HauQhl1K6yNg3ruji6DOWbnuuNZt2Zz9aJ
+QfYEkoopKW1rOhzndX0CcQ7zwOe9yxndnWCywmZgtrEE7snmhrmaZkCo5xHtgUUD
+i/ZnWejBBhG93c+AAk9lQHhcR1DIm+YfgXvkRKhbhZri3lrVx/k6RGZL5DJUfORs
+nLMOPReisjQS1n6yqEm70XooQL6iFh/f5DcfEXP7kAplQ6INfPgGAVUzfbANuPT1
+rqVCV3w2EYx7XsQDnYx5nQIDAQABo0IwQDAPBgNVHRMBAf8EBTADAQH/MA4GA1Ud
+DwEB/wQEAwIBBjAdBgNVHQ4EFgQUtZn4r7CU9eMg1gqtzk5WpC5uQu0wDQYJKoZI
+hvcNAQELBQADggIBACYGXnDnZTPIgm7ZnBc6G3pmsgH2eDtpXi/q/075KMOYKmFM
+tCQSin1tERT3nLXK5ryeJ45MGcipvXrA1zYObYVybqjGom32+nNjf7xueQgcnYqf
+GopTpti72TVVsRHFqQOzVju5hJMiXn7B9hJSi+osZ7z+Nkz1uM/Rs0mSO9MpDpkb
+lvdhuDvEK7Z4bLQjb/D907JedR+Zlais9trhxTF7+9FGs9K8Z7RiVLoJ92Owk6Ka
++elSLotgEqv89WBW7xBci8QaQtyDW2QOy7W81k/BfDxujRNt+3vrMNDcTa/F1bal
+TFtxyegxvug4BkihGuLq0t4SOVga/4AOgnXmt8kHbA7v/zjxmHHEt38OFdAlab0i
+nSvtBfZGR6ztwPDUO+Ls7pZbkBNOHlY667DvlruWIxG68kOGdGSVyCh13x01utI3
+gzhTODY7z2zp+WsO0PsE6E9312UBeIYMej4hYvF/Y3EMyZ9E26gnonW+boE+18Dr
+G5gPcFw0sorMwIUY6256s/daoQe/qUKS82Ail+QUoQebTnbAjn39pCXHR+3/H3Os
+zMOl6W8KjptlwlCFtaOgUxLMVYdh84GuEEZhvUQhuMI9dM9+JDX6HAcOmz0iyu8x
+L4ysEr3vQCj8KWefshNPZiTEUxnpHikV7+ZtsH8tZ/3zbBt1RqPlShfppNcL
+-----END CERTIFICATE-----
diff --git a/libs/websocket/tests/__init__.py b/libs/websocket/tests/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/websocket/tests/data/header01.txt b/libs/websocket/tests/data/header01.txt
new file mode 100644
index 000000000..d44d24c20
--- /dev/null
+++ b/libs/websocket/tests/data/header01.txt
@@ -0,0 +1,6 @@
+HTTP/1.1 101 WebSocket Protocol Handshake
+Connection: Upgrade 
+Upgrade: WebSocket
+Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0=
+some_header: something
+
diff --git a/libs/websocket/tests/data/header02.txt b/libs/websocket/tests/data/header02.txt
new file mode 100644
index 000000000..f481de928
--- /dev/null
+++ b/libs/websocket/tests/data/header02.txt
@@ -0,0 +1,6 @@
+HTTP/1.1 101 WebSocket Protocol Handshake
+Connection: Upgrade
+Upgrade WebSocket
+Sec-WebSocket-Accept: Kxep+hNu9n51529fGidYu7a3wO0=
+some_header: something
+
diff --git a/libs/websocket/tests/test_cookiejar.py b/libs/websocket/tests/test_cookiejar.py
new file mode 100644
index 000000000..c40a00bd2
--- /dev/null
+++ b/libs/websocket/tests/test_cookiejar.py
@@ -0,0 +1,98 @@
+import unittest
+
+from websocket._cookiejar import SimpleCookieJar
+
+try:
+    import Cookie
+except:
+    import http.cookies as Cookie
+
+
+class CookieJarTest(unittest.TestCase):
+    def testAdd(self):
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("")
+        self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b")
+        self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; domain=.abc")
+        self.assertTrue(".abc" in cookie_jar.jar)
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; domain=abc")
+        self.assertTrue(".abc" in cookie_jar.jar)
+        self.assertTrue("abc" not in cookie_jar.jar)
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; c=d; domain=abc")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; c=d; domain=abc")
+        cookie_jar.add("e=f; domain=abc")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d; e=f")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; c=d; domain=abc")
+        cookie_jar.add("e=f; domain=.abc")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d; e=f")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.add("a=b; c=d; domain=abc")
+        cookie_jar.add("e=f; domain=xyz")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("xyz"), "e=f")
+        self.assertEquals(cookie_jar.get("something"), "")
+
+    def testSet(self):
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b")
+        self.assertFalse(cookie_jar.jar, "Cookie with no domain should not be added to the jar")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; domain=.abc")
+        self.assertTrue(".abc" in cookie_jar.jar)
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; domain=abc")
+        self.assertTrue(".abc" in cookie_jar.jar)
+        self.assertTrue("abc" not in cookie_jar.jar)
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; c=d; domain=abc")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; c=d; domain=abc")
+        cookie_jar.set("e=f; domain=abc")
+        self.assertEquals(cookie_jar.get("abc"), "e=f")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; c=d; domain=abc")
+        cookie_jar.set("e=f; domain=.abc")
+        self.assertEquals(cookie_jar.get("abc"), "e=f")
+
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; c=d; domain=abc")
+        cookie_jar.set("e=f; domain=xyz")
+        self.assertEquals(cookie_jar.get("abc"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("xyz"), "e=f")
+        self.assertEquals(cookie_jar.get("something"), "")
+
+    def testGet(self):
+        cookie_jar = SimpleCookieJar()
+        cookie_jar.set("a=b; c=d; domain=abc.com")
+        self.assertEquals(cookie_jar.get("abc.com"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("x.abc.com"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("abc.com.es"), "")
+        self.assertEquals(cookie_jar.get("xabc.com"), "")
+
+        cookie_jar.set("a=b; c=d; domain=.abc.com")
+        self.assertEquals(cookie_jar.get("abc.com"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("x.abc.com"), "a=b; c=d")
+        self.assertEquals(cookie_jar.get("abc.com.es"), "")
+        self.assertEquals(cookie_jar.get("xabc.com"), "")
diff --git a/libs/websocket/tests/test_websocket.py b/libs/websocket/tests/test_websocket.py
new file mode 100644
index 000000000..2ab738fdd
--- /dev/null
+++ b/libs/websocket/tests/test_websocket.py
@@ -0,0 +1,660 @@
+# -*- coding: utf-8 -*-
+#
+
+import sys
+sys.path[0:0] = [""]
+
+import os
+import os.path
+import socket
+
+import six
+
+# websocket-client
+import websocket as ws
+from websocket._handshake import _create_sec_websocket_key, \
+    _validate as _validate_header
+from websocket._http import read_headers
+from websocket._url import get_proxy_info, parse_url
+from websocket._utils import validate_utf8
+
+if six.PY3:
+    from base64 import decodebytes as base64decode
+else:
+    from base64 import decodestring as base64decode
+
+if sys.version_info[0] == 2 and sys.version_info[1] < 7:
+    import unittest2 as unittest
+else:
+    import unittest
+
+try:
+    from ssl import SSLError
+except ImportError:
+    # dummy class of SSLError for ssl none-support environment.
+    class SSLError(Exception):
+        pass
+
+# Skip test to access the internet.
+TEST_WITH_INTERNET = os.environ.get('TEST_WITH_INTERNET', '0') == '1'
+
+# Skip Secure WebSocket test.
+TEST_SECURE_WS = False
+TRACEABLE = False
+
+
+def create_mask_key(_):
+    return "abcd"
+
+
+class SockMock(object):
+    def __init__(self):
+        self.data = []
+        self.sent = []
+
+    def add_packet(self, data):
+        self.data.append(data)
+
+    def recv(self, bufsize):
+        if self.data:
+            e = self.data.pop(0)
+            if isinstance(e, Exception):
+                raise e
+            if len(e) > bufsize:
+                self.data.insert(0, e[bufsize:])
+            return e[:bufsize]
+
+    def send(self, data):
+        self.sent.append(data)
+        return len(data)
+
+    def close(self):
+        pass
+
+
+class HeaderSockMock(SockMock):
+
+    def __init__(self, fname):
+        SockMock.__init__(self)
+        path = os.path.join(os.path.dirname(__file__), fname)
+        with open(path, "rb") as f:
+            self.add_packet(f.read())
+
+
+class WebSocketTest(unittest.TestCase):
+    def setUp(self):
+        ws.enableTrace(TRACEABLE)
+
+    def tearDown(self):
+        pass
+
+    def testDefaultTimeout(self):
+        self.assertEqual(ws.getdefaulttimeout(), None)
+        ws.setdefaulttimeout(10)
+        self.assertEqual(ws.getdefaulttimeout(), 10)
+        ws.setdefaulttimeout(None)
+
+    def testParseUrl(self):
+        p = parse_url("ws://www.example.com/r")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 80)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com/r/")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 80)
+        self.assertEqual(p[2], "/r/")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com/")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 80)
+        self.assertEqual(p[2], "/")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 80)
+        self.assertEqual(p[2], "/")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com:8080/r")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com:8080/")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://www.example.com:8080")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("wss://www.example.com:8080/r")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], True)
+
+        p = parse_url("wss://www.example.com:8080/r?key=value")
+        self.assertEqual(p[0], "www.example.com")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/r?key=value")
+        self.assertEqual(p[3], True)
+
+        self.assertRaises(ValueError, parse_url, "http://www.example.com/r")
+
+        if sys.version_info[0] == 2 and sys.version_info[1] < 7:
+            return
+
+        p = parse_url("ws://[2a03:4000:123:83::3]/r")
+        self.assertEqual(p[0], "2a03:4000:123:83::3")
+        self.assertEqual(p[1], 80)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("ws://[2a03:4000:123:83::3]:8080/r")
+        self.assertEqual(p[0], "2a03:4000:123:83::3")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], False)
+
+        p = parse_url("wss://[2a03:4000:123:83::3]/r")
+        self.assertEqual(p[0], "2a03:4000:123:83::3")
+        self.assertEqual(p[1], 443)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], True)
+
+        p = parse_url("wss://[2a03:4000:123:83::3]:8080/r")
+        self.assertEqual(p[0], "2a03:4000:123:83::3")
+        self.assertEqual(p[1], 8080)
+        self.assertEqual(p[2], "/r")
+        self.assertEqual(p[3], True)
+
+    def testWSKey(self):
+        key = _create_sec_websocket_key()
+        self.assertTrue(key != 24)
+        self.assertTrue(six.u("ÂĄn") not in key)
+
+    def testWsUtils(self):
+        key = "c6b8hTg4EeGb2gQMztV1/g=="
+        required_header = {
+            "upgrade": "websocket",
+            "connection": "upgrade",
+            "sec-websocket-accept": "Kxep+hNu9n51529fGidYu7a3wO0=",
+            }
+        self.assertEqual(_validate_header(required_header, key, None), (True, None))
+
+        header = required_header.copy()
+        header["upgrade"] = "http"
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+        del header["upgrade"]
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+
+        header = required_header.copy()
+        header["connection"] = "something"
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+        del header["connection"]
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+
+        header = required_header.copy()
+        header["sec-websocket-accept"] = "something"
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+        del header["sec-websocket-accept"]
+        self.assertEqual(_validate_header(header, key, None), (False, None))
+
+        header = required_header.copy()
+        header["sec-websocket-protocol"] = "sub1"
+        self.assertEqual(_validate_header(header, key, ["sub1", "sub2"]), (True, "sub1"))
+        self.assertEqual(_validate_header(header, key, ["sub2", "sub3"]), (False, None))
+
+        header = required_header.copy()
+        header["sec-websocket-protocol"] = "sUb1"
+        self.assertEqual(_validate_header(header, key, ["Sub1", "suB2"]), (True, "sub1"))
+
+
+    def testReadHeader(self):
+        status, header = read_headers(HeaderSockMock("data/header01.txt"))
+        self.assertEqual(status, 101)
+        self.assertEqual(header["connection"], "Upgrade")
+
+        HeaderSockMock("data/header02.txt")
+        self.assertRaises(ws.WebSocketException, read_headers, HeaderSockMock("data/header02.txt"))
+
+    def testSend(self):
+        # TODO: add longer frame data
+        sock = ws.WebSocket()
+        sock.set_mask_key(create_mask_key)
+        s = sock.sock = HeaderSockMock("data/header01.txt")
+        sock.send("Hello")
+        self.assertEqual(s.sent[0], six.b("\x81\x85abcd)\x07\x0f\x08\x0e"))
+
+        sock.send("ă“ă‚“ă«ăˇăŻ")
+        self.assertEqual(s.sent[1], six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc"))
+
+        sock.send(u"ă“ă‚“ă«ăˇăŻ")
+        self.assertEqual(s.sent[1], six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc"))
+
+        sock.send("x" * 127)
+
+    def testRecv(self):
+        # TODO: add longer frame data
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        something = six.b("\x81\x8fabcd\x82\xe3\xf0\x87\xe3\xf1\x80\xe5\xca\x81\xe2\xc5\x82\xe3\xcc")
+        s.add_packet(something)
+        data = sock.recv()
+        self.assertEqual(data, "ă“ă‚“ă«ăˇăŻ")
+
+        s.add_packet(six.b("\x81\x85abcd)\x07\x0f\x08\x0e"))
+        data = sock.recv()
+        self.assertEqual(data, "Hello")
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testIter(self):
+        count = 2
+        for _ in ws.create_connection('ws://stream.meetup.com/2/rsvps'):
+            count -= 1
+            if count == 0:
+                break
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testNext(self):
+        sock = ws.create_connection('ws://stream.meetup.com/2/rsvps')
+        self.assertEqual(str, type(next(sock)))
+
+    def testInternalRecvStrict(self):
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        s.add_packet(six.b("foo"))
+        s.add_packet(socket.timeout())
+        s.add_packet(six.b("bar"))
+        # s.add_packet(SSLError("The read operation timed out"))
+        s.add_packet(six.b("baz"))
+        with self.assertRaises(ws.WebSocketTimeoutException):
+            sock.frame_buffer.recv_strict(9)
+        # if six.PY2:
+        #     with self.assertRaises(ws.WebSocketTimeoutException):
+        #         data = sock._recv_strict(9)
+        # else:
+        #     with self.assertRaises(SSLError):
+        #         data = sock._recv_strict(9)
+        data = sock.frame_buffer.recv_strict(9)
+        self.assertEqual(data, six.b("foobarbaz"))
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.frame_buffer.recv_strict(1)
+
+    def testRecvTimeout(self):
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        s.add_packet(six.b("\x81"))
+        s.add_packet(socket.timeout())
+        s.add_packet(six.b("\x8dabcd\x29\x07\x0f\x08\x0e"))
+        s.add_packet(socket.timeout())
+        s.add_packet(six.b("\x4e\x43\x33\x0e\x10\x0f\x00\x40"))
+        with self.assertRaises(ws.WebSocketTimeoutException):
+            sock.recv()
+        with self.assertRaises(ws.WebSocketTimeoutException):
+            sock.recv()
+        data = sock.recv()
+        self.assertEqual(data, "Hello, World!")
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.recv()
+
+    def testRecvWithSimpleFragmentation(self):
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        # OPCODE=TEXT, FIN=0, MSG="Brevity is "
+        s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
+        # OPCODE=CONT, FIN=1, MSG="the soul of wit"
+        s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
+        data = sock.recv()
+        self.assertEqual(data, "Brevity is the soul of wit")
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.recv()
+
+    def testRecvWithFireEventOfFragmentation(self):
+        sock = ws.WebSocket(fire_cont_frame=True)
+        s = sock.sock = SockMock()
+        # OPCODE=TEXT, FIN=0, MSG="Brevity is "
+        s.add_packet(six.b("\x01\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
+        # OPCODE=CONT, FIN=0, MSG="Brevity is "
+        s.add_packet(six.b("\x00\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
+        # OPCODE=CONT, FIN=1, MSG="the soul of wit"
+        s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
+
+        _, data = sock.recv_data()
+        self.assertEqual(data, six.b("Brevity is "))
+        _, data = sock.recv_data()
+        self.assertEqual(data, six.b("Brevity is "))
+        _, data = sock.recv_data()
+        self.assertEqual(data, six.b("the soul of wit"))
+
+        # OPCODE=CONT, FIN=0, MSG="Brevity is "
+        s.add_packet(six.b("\x80\x8babcd#\x10\x06\x12\x08\x16\x1aD\x08\x11C"))
+
+        with self.assertRaises(ws.WebSocketException):
+            sock.recv_data()
+
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.recv()
+
+    def testClose(self):
+        sock = ws.WebSocket()
+        sock.sock = SockMock()
+        sock.connected = True
+        sock.close()
+        self.assertEqual(sock.connected, False)
+
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        sock.connected = True
+        s.add_packet(six.b('\x88\x80\x17\x98p\x84'))
+        sock.recv()
+        self.assertEqual(sock.connected, False)
+
+    def testRecvContFragmentation(self):
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        # OPCODE=CONT, FIN=1, MSG="the soul of wit"
+        s.add_packet(six.b("\x80\x8fabcd\x15\n\x06D\x12\r\x16\x08A\r\x05D\x16\x0b\x17"))
+        self.assertRaises(ws.WebSocketException, sock.recv)
+
+    def testRecvWithProlongedFragmentation(self):
+        sock = ws.WebSocket()
+        s = sock.sock = SockMock()
+        # OPCODE=TEXT, FIN=0, MSG="Once more unto the breach, "
+        s.add_packet(six.b("\x01\x9babcd.\x0c\x00\x01A\x0f\x0c\x16\x04B\x16\n\x15"
+                           "\rC\x10\t\x07C\x06\x13\x07\x02\x07\tNC"))
+        # OPCODE=CONT, FIN=0, MSG="dear friends, "
+        s.add_packet(six.b("\x00\x8eabcd\x05\x07\x02\x16A\x04\x11\r\x04\x0c\x07"
+                           "\x17MB"))
+        # OPCODE=CONT, FIN=1, MSG="once more"
+        s.add_packet(six.b("\x80\x89abcd\x0e\x0c\x00\x01A\x0f\x0c\x16\x04"))
+        data = sock.recv()
+        self.assertEqual(
+            data,
+            "Once more unto the breach, dear friends, once more")
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.recv()
+
+    def testRecvWithFragmentationAndControlFrame(self):
+        sock = ws.WebSocket()
+        sock.set_mask_key(create_mask_key)
+        s = sock.sock = SockMock()
+        # OPCODE=TEXT, FIN=0, MSG="Too much "
+        s.add_packet(six.b("\x01\x89abcd5\r\x0cD\x0c\x17\x00\x0cA"))
+        # OPCODE=PING, FIN=1, MSG="Please PONG this"
+        s.add_packet(six.b("\x89\x90abcd1\x0e\x06\x05\x12\x07C4.,$D\x15\n\n\x17"))
+        # OPCODE=CONT, FIN=1, MSG="of a good thing"
+        s.add_packet(six.b("\x80\x8fabcd\x0e\x04C\x05A\x05\x0c\x0b\x05B\x17\x0c"
+                           "\x08\x0c\x04"))
+        data = sock.recv()
+        self.assertEqual(data, "Too much of a good thing")
+        with self.assertRaises(ws.WebSocketConnectionClosedException):
+            sock.recv()
+        self.assertEqual(
+            s.sent[0],
+            six.b("\x8a\x90abcd1\x0e\x06\x05\x12\x07C4.,$D\x15\n\n\x17"))
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testWebSocket(self):
+        s = ws.create_connection("ws://echo.websocket.org/")
+        self.assertNotEqual(s, None)
+        s.send("Hello, World")
+        result = s.recv()
+        self.assertEqual(result, "Hello, World")
+
+        s.send(u"ă“ă«ă‚ă«ă‚ăˇăŻă€ä¸–ç•Ś")
+        result = s.recv()
+        self.assertEqual(result, "ă“ă«ă‚ă«ă‚ăˇăŻă€ä¸–ç•Ś")
+        s.close()
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testPingPong(self):
+        s = ws.create_connection("ws://echo.websocket.org/")
+        self.assertNotEqual(s, None)
+        s.ping("Hello")
+        s.pong("Hi")
+        s.close()
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    @unittest.skipUnless(TEST_SECURE_WS, "wss://echo.websocket.org doesn't work well.")
+    def testSecureWebSocket(self):
+        if 1:
+            import ssl
+            s = ws.create_connection("wss://echo.websocket.org/")
+            self.assertNotEqual(s, None)
+            self.assertTrue(isinstance(s.sock, ssl.SSLSocket))
+            s.send("Hello, World")
+            result = s.recv()
+            self.assertEqual(result, "Hello, World")
+            s.send(u"ă“ă«ă‚ă«ă‚ăˇăŻă€ä¸–ç•Ś")
+            result = s.recv()
+            self.assertEqual(result, "ă“ă«ă‚ă«ă‚ăˇăŻă€ä¸–ç•Ś")
+            s.close()
+        #except:
+        #    pass
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testWebSocketWihtCustomHeader(self):
+        s = ws.create_connection("ws://echo.websocket.org/",
+                                 headers={"User-Agent": "PythonWebsocketClient"})
+        self.assertNotEqual(s, None)
+        s.send("Hello, World")
+        result = s.recv()
+        self.assertEqual(result, "Hello, World")
+        s.close()
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testAfterClose(self):
+        s = ws.create_connection("ws://echo.websocket.org/")
+        self.assertNotEqual(s, None)
+        s.close()
+        self.assertRaises(ws.WebSocketConnectionClosedException, s.send, "Hello")
+        self.assertRaises(ws.WebSocketConnectionClosedException, s.recv)
+
+    def testNonce(self):
+        """ WebSocket key should be a random 16-byte nonce.
+        """
+        key = _create_sec_websocket_key()
+        nonce = base64decode(key.encode("utf-8"))
+        self.assertEqual(16, len(nonce))
+
+
+class WebSocketAppTest(unittest.TestCase):
+
+    class NotSetYet(object):
+        """ A marker class for signalling that a value hasn't been set yet.
+        """
+
+    def setUp(self):
+        ws.enableTrace(TRACEABLE)
+
+        WebSocketAppTest.keep_running_open = WebSocketAppTest.NotSetYet()
+        WebSocketAppTest.keep_running_close = WebSocketAppTest.NotSetYet()
+        WebSocketAppTest.get_mask_key_id = WebSocketAppTest.NotSetYet()
+
+    def tearDown(self):
+        WebSocketAppTest.keep_running_open = WebSocketAppTest.NotSetYet()
+        WebSocketAppTest.keep_running_close = WebSocketAppTest.NotSetYet()
+        WebSocketAppTest.get_mask_key_id = WebSocketAppTest.NotSetYet()
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testKeepRunning(self):
+        """ A WebSocketApp should keep running as long as its self.keep_running
+        is not False (in the boolean context).
+        """
+
+        def on_open(self, *args, **kwargs):
+            """ Set the keep_running flag for later inspection and immediately
+            close the connection.
+            """
+            WebSocketAppTest.keep_running_open = self.keep_running
+
+            self.close()
+
+        def on_close(self, *args, **kwargs):
+            """ Set the keep_running flag for the test to use.
+            """
+            WebSocketAppTest.keep_running_close = self.keep_running
+
+        app = ws.WebSocketApp('ws://echo.websocket.org/', on_open=on_open, on_close=on_close)
+        app.run_forever()
+
+        self.assertFalse(isinstance(WebSocketAppTest.keep_running_open,
+                                    WebSocketAppTest.NotSetYet))
+
+        self.assertFalse(isinstance(WebSocketAppTest.keep_running_close,
+                                    WebSocketAppTest.NotSetYet))
+
+        self.assertEqual(True, WebSocketAppTest.keep_running_open)
+        self.assertEqual(False, WebSocketAppTest.keep_running_close)
+
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testSockMaskKey(self):
+        """ A WebSocketApp should forward the received mask_key function down
+        to the actual socket.
+        """
+
+        def my_mask_key_func():
+            pass
+
+        def on_open(self, *args, **kwargs):
+            """ Set the value so the test can use it later on and immediately
+            close the connection.
+            """
+            WebSocketAppTest.get_mask_key_id = id(self.get_mask_key)
+            self.close()
+
+        app = ws.WebSocketApp('ws://echo.websocket.org/', on_open=on_open, get_mask_key=my_mask_key_func)
+        app.run_forever()
+
+        # Note: We can't use 'is' for comparing the functions directly, need to use 'id'.
+        self.assertEqual(WebSocketAppTest.get_mask_key_id, id(my_mask_key_func))
+
+
+class SockOptTest(unittest.TestCase):
+    @unittest.skipUnless(TEST_WITH_INTERNET, "Internet-requiring tests are disabled")
+    def testSockOpt(self):
+        sockopt = ((socket.IPPROTO_TCP, socket.TCP_NODELAY, 1),)
+        s = ws.create_connection("ws://echo.websocket.org", sockopt=sockopt)
+        self.assertNotEqual(s.sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY), 0)
+        s.close()
+
+class UtilsTest(unittest.TestCase):
+    def testUtf8Validator(self):
+        state = validate_utf8(six.b('\xf0\x90\x80\x80'))
+        self.assertEqual(state, True)
+        state = validate_utf8(six.b('\xce\xba\xe1\xbd\xb9\xcf\x83\xce\xbc\xce\xb5\xed\xa0\x80edited'))
+        self.assertEqual(state, False)
+        state = validate_utf8(six.b(''))
+        self.assertEqual(state, True)
+
+class ProxyInfoTest(unittest.TestCase):
+    def setUp(self):
+        self.http_proxy = os.environ.get("http_proxy", None)
+        self.https_proxy = os.environ.get("https_proxy", None)
+        if "http_proxy" in os.environ:
+            del os.environ["http_proxy"]
+        if "https_proxy" in os.environ:
+            del os.environ["https_proxy"]
+
+    def tearDown(self):
+        if self.http_proxy:
+            os.environ["http_proxy"] = self.http_proxy
+        elif "http_proxy" in os.environ:
+            del os.environ["http_proxy"]
+
+        if self.https_proxy:
+            os.environ["https_proxy"] = self.https_proxy
+        elif "https_proxy" in os.environ:
+            del os.environ["https_proxy"]
+
+
+    def testProxyFromArgs(self):
+        self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost"), ("localhost", 0, None))
+        self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_port=3128), ("localhost", 3128, None))
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost"), ("localhost", 0, None))
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128), ("localhost", 3128, None))
+
+        self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_auth=("a", "b")),
+            ("localhost", 0, ("a", "b")))
+        self.assertEqual(get_proxy_info("echo.websocket.org", False, proxy_host="localhost", proxy_port=3128, proxy_auth=("a", "b")),
+            ("localhost", 3128, ("a", "b")))
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_auth=("a", "b")),
+            ("localhost", 0, ("a", "b")))
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128, proxy_auth=("a", "b")),
+            ("localhost", 3128, ("a", "b")))
+
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128, no_proxy=["example.com"], proxy_auth=("a", "b")),
+            ("localhost", 3128, ("a", "b")))
+        self.assertEqual(get_proxy_info("echo.websocket.org", True, proxy_host="localhost", proxy_port=3128, no_proxy=["echo.websocket.org"], proxy_auth=("a", "b")),
+            (None, 0, None))
+
+
+    def testProxyFromEnv(self):
+        os.environ["http_proxy"] = "http://localhost/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, None))
+        os.environ["http_proxy"] = "http://localhost:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, None))
+
+        os.environ["http_proxy"] = "http://localhost/"
+        os.environ["https_proxy"] = "http://localhost2/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, None))
+        os.environ["http_proxy"] = "http://localhost:3128/"
+        os.environ["https_proxy"] = "http://localhost2:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, None))
+
+        os.environ["http_proxy"] = "http://localhost/"
+        os.environ["https_proxy"] = "http://localhost2/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", None, None))
+        os.environ["http_proxy"] = "http://localhost:3128/"
+        os.environ["https_proxy"] = "http://localhost2:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", 3128, None))
+
+
+        os.environ["http_proxy"] = "http://a:b@localhost/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, ("a", "b")))
+        os.environ["http_proxy"] = "http://a:b@localhost:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, ("a", "b")))
+
+        os.environ["http_proxy"] = "http://a:b@localhost/"
+        os.environ["https_proxy"] = "http://a:b@localhost2/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", None, ("a", "b")))
+        os.environ["http_proxy"] = "http://a:b@localhost:3128/"
+        os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", False), ("localhost", 3128, ("a", "b")))
+
+        os.environ["http_proxy"] = "http://a:b@localhost/"
+        os.environ["https_proxy"] = "http://a:b@localhost2/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", None, ("a", "b")))
+        os.environ["http_proxy"] = "http://a:b@localhost:3128/"
+        os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
+        self.assertEqual(get_proxy_info("echo.websocket.org", True), ("localhost2", 3128, ("a", "b")))
+
+        os.environ["http_proxy"] = "http://a:b@localhost/"
+        os.environ["https_proxy"] = "http://a:b@localhost2/"
+        os.environ["no_proxy"] = "example1.com,example2.com"
+        self.assertEqual(get_proxy_info("example.1.com", True), ("localhost2", None, ("a", "b")))
+        os.environ["http_proxy"] = "http://a:b@localhost:3128/"
+        os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
+        os.environ["no_proxy"] = "example1.com,example2.com, echo.websocket.org"
+        self.assertEqual(get_proxy_info("echo.websocket.org", True), (None, 0, None))
+
+        os.environ["http_proxy"] = "http://a:b@localhost:3128/"
+        os.environ["https_proxy"] = "http://a:b@localhost2:3128/"
+        os.environ["no_proxy"] = "127.0.0.0/8, 192.168.0.0/16"
+        self.assertEqual(get_proxy_info("127.0.0.1", False), (None, 0, None))
+        self.assertEqual(get_proxy_info("192.168.1.1", False), (None, 0, None))
+
+
+if __name__ == "__main__":
+    unittest.main()
diff --git a/libs/winreparse.h b/libs/winreparse.h
new file mode 100644
index 000000000..66f7775dd
--- /dev/null
+++ b/libs/winreparse.h
@@ -0,0 +1,53 @@
+#ifndef Py_WINREPARSE_H
+#define Py_WINREPARSE_H
+
+#ifdef MS_WINDOWS
+#include <Windows.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The following structure was copied from
+   http://msdn.microsoft.com/en-us/library/ff552012.aspx as the required
+   include doesn't seem to be present in the Windows SDK (at least as included
+   with Visual Studio Express). */
+typedef struct _REPARSE_DATA_BUFFER {
+    ULONG ReparseTag;
+    USHORT ReparseDataLength;
+    USHORT Reserved;
+    union {
+        struct {
+            USHORT SubstituteNameOffset;
+            USHORT SubstituteNameLength;
+            USHORT PrintNameOffset;
+            USHORT PrintNameLength;
+            ULONG Flags;
+            WCHAR PathBuffer[1];
+        } SymbolicLinkReparseBuffer;
+
+        struct {
+            USHORT SubstituteNameOffset;
+            USHORT  SubstituteNameLength;
+            USHORT  PrintNameOffset;
+            USHORT  PrintNameLength;
+            WCHAR  PathBuffer[1];
+        } MountPointReparseBuffer;
+
+        struct {
+            UCHAR  DataBuffer[1];
+        } GenericReparseBuffer;
+    };
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+#define REPARSE_DATA_BUFFER_HEADER_SIZE  FIELD_OFFSET(REPARSE_DATA_BUFFER,\
+                                                      GenericReparseBuffer)
+#define MAXIMUM_REPARSE_DATA_BUFFER_SIZE  ( 16 * 1024 )
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* MS_WINDOWS */
+
+#endif /* !Py_WINREPARSE_H */
diff --git a/libs/wraptor/__init__.py b/libs/wraptor/__init__.py
new file mode 100644
index 000000000..a1f838168
--- /dev/null
+++ b/libs/wraptor/__init__.py
@@ -0,0 +1,7 @@
+""" Wraptor
+
+Provides a set of useful decorators and other wrap-like python utility functions
+
+"""
+
+__version__ = "0.6.0"
diff --git a/libs/wraptor/context/__init__.py b/libs/wraptor/context/__init__.py
new file mode 100644
index 000000000..1f7c627de
--- /dev/null
+++ b/libs/wraptor/context/__init__.py
@@ -0,0 +1,5 @@
+from wraptor.context.maybe import maybe
+from wraptor.context.throttle import throttle
+from wraptor.context.timer import timer
+
+__all__ = ['maybe', 'throttle', 'timer']
diff --git a/libs/wraptor/context/maybe.py b/libs/wraptor/context/maybe.py
new file mode 100644
index 000000000..599c65363
--- /dev/null
+++ b/libs/wraptor/context/maybe.py
@@ -0,0 +1,27 @@
+import sys
+import inspect
+
+class _SkippedBlock(Exception):
+    pass
+
+class maybe(object):
+    def __init__(self, predicate):
+        self.predicate = predicate
+
+    def __empty_fn(self, *args, **kwargs):
+        return None
+
+    def __enter__(self):
+        if not self.predicate():
+            sys.settrace(self.__empty_fn)
+            frame = inspect.currentframe(1)
+            frame.f_trace = self.__trace
+
+    def __trace(self, *args, **kwargs):
+        raise _SkippedBlock()
+
+    def __exit__(self, type, value, traceback):
+        if isinstance(value, _SkippedBlock):
+            sys.settrace(None)
+            return True
+        return False
diff --git a/libs/wraptor/context/test/__init__.py b/libs/wraptor/context/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/wraptor/context/test/test_maybe.py b/libs/wraptor/context/test/test_maybe.py
new file mode 100644
index 000000000..cdbf356ed
--- /dev/null
+++ b/libs/wraptor/context/test/test_maybe.py
@@ -0,0 +1,26 @@
+from threading import Thread
+
+from wraptor.context import maybe
+
+def test_basic():
+    with maybe(lambda: False):
+        assert False
+
+    check = False
+    with maybe(lambda: True):
+        check = True
+    assert check
+
+def test_threads():
+    def worker(arr, index):
+        for i in range(5):
+            with maybe(lambda: i == 3):
+                arr[index] = True
+
+    workers = 100
+    arr = [False for i in range(workers)]
+    threads = [Thread(target=worker, args=(arr, i)) for i in range(workers)]
+    [t.start() for t in threads]
+    [t.join() for t in threads]
+
+    assert all(arr)
diff --git a/libs/wraptor/context/test/test_throttle.py b/libs/wraptor/context/test/test_throttle.py
new file mode 100644
index 000000000..3484e97b5
--- /dev/null
+++ b/libs/wraptor/context/test/test_throttle.py
@@ -0,0 +1,17 @@
+import time
+
+from wraptor.context import throttle
+
+def test_basic():
+    arr = []
+    t = throttle(.1)
+
+    with t:
+        arr.append(1)
+    with t:
+        arr.append(1)
+    time.sleep(.2)
+    with t:
+        arr.append(1)
+
+    assert arr == [1, 1]
diff --git a/libs/wraptor/context/test/test_timer.py b/libs/wraptor/context/test/test_timer.py
new file mode 100644
index 000000000..6f89cb455
--- /dev/null
+++ b/libs/wraptor/context/test/test_timer.py
@@ -0,0 +1,15 @@
+from wraptor.context import timer
+import time
+
+def test_basic():
+    with timer() as t:
+        time.sleep(0.1000000)     # sleep 100 ms
+
+    assert t.interval >= 100
+
+def test_params():
+    with timer('test') as t:
+        pass
+
+    assert t.name == 'test'
+    assert str(t).startswith('test')
diff --git a/libs/wraptor/context/throttle.py b/libs/wraptor/context/throttle.py
new file mode 100644
index 000000000..0c444c8c5
--- /dev/null
+++ b/libs/wraptor/context/throttle.py
@@ -0,0 +1,16 @@
+import time
+from wraptor.context import maybe
+
+class throttle(maybe):
+    def __init__(self, seconds=1):
+        self.seconds = seconds
+        self.last_run = 0
+
+        def predicate():
+            now = time.time()
+            if now > self.last_run + self.seconds:
+                self.last_run = now
+                return True
+            return False
+
+        maybe.__init__(self, predicate)
diff --git a/libs/wraptor/context/timer.py b/libs/wraptor/context/timer.py
new file mode 100644
index 000000000..13bd6b934
--- /dev/null
+++ b/libs/wraptor/context/timer.py
@@ -0,0 +1,18 @@
+import time
+
+class timer(object):
+    __slots__ = ('name', 'interval', 'start', 'end')
+
+    def __init__(self, name=None):
+        self.name = name
+
+    def __enter__(self):
+        self.start = time.time() * 1e3
+        return self
+
+    def __exit__(self, *args):
+        self.end = time.time() * 1e3
+        self.interval = self.end - self.start
+
+    def __str__(self):
+        return "%s took %.03f ms" % (self.name, self.interval)
diff --git a/libs/wraptor/decorators/__init__.py b/libs/wraptor/decorators/__init__.py
new file mode 100644
index 000000000..201245842
--- /dev/null
+++ b/libs/wraptor/decorators/__init__.py
@@ -0,0 +1,6 @@
+from wraptor.decorators.memoize import memoize
+from wraptor.decorators.throttle import throttle
+from wraptor.decorators.timeout import timeout, TimeoutException
+from wraptor.decorators.exception_catcher import exception_catcher
+
+__all__ = ['memoize', 'throttle', 'timeout', 'TimeoutException', 'exception_catcher']
diff --git a/libs/wraptor/decorators/exception_catcher.py b/libs/wraptor/decorators/exception_catcher.py
new file mode 100644
index 000000000..71653e685
--- /dev/null
+++ b/libs/wraptor/decorators/exception_catcher.py
@@ -0,0 +1,29 @@
+from functools import wraps
+import sys
+import Queue
+
+def exception_catcher(fn):
+    """ Catch exceptions raised by the decorated function.
+        Call check() to raise any caught exceptions.
+    """
+    exceptions = Queue.Queue()
+
+    @wraps(fn)
+    def wrapped(*args, **kwargs):
+        try:
+            ret = fn(*args, **kwargs)
+        except Exception:
+            exceptions.put(sys.exc_info())
+            raise
+        return ret
+
+    def check():
+        try:
+            item = exceptions.get(block=False)
+            klass, value, tb = item
+            raise klass, value, tb
+        except Queue.Empty:
+            pass
+
+    setattr(wrapped, 'check', check)
+    return wrapped
diff --git a/libs/wraptor/decorators/memoize.py b/libs/wraptor/decorators/memoize.py
new file mode 100644
index 000000000..ffd49916c
--- /dev/null
+++ b/libs/wraptor/decorators/memoize.py
@@ -0,0 +1,70 @@
+from functools import wraps
+import time
+from hashlib import md5
+import threading
+
+class memoize(object):
+    """ Memoize the results of a function.  Supports an optional timeout
+        for automatic cache expiration.
+
+        If the optional manual_flush argument is True, a function called
+        "flush_cache" will be added to the wrapped function.  When
+        called, it will remove all the timed out values from the cache.
+
+        If you use this decorator as a class method, you must specify
+        instance_method=True otherwise you will have a single shared
+        cache for every instance of your class.
+
+        This decorator is thread safe.
+    """
+    def __init__(self, timeout=None, manual_flush=False, instance_method=False):
+        self.timeout = timeout
+        self.manual_flush = manual_flush
+        self.instance_method = instance_method
+        self.cache = {}
+        self.cache_lock = threading.RLock()
+
+    def __call__(self, fn):
+        if self.instance_method:
+            @wraps(fn)
+            def rewrite_instance_method(instance, *args, **kwargs):
+                # the first time we are called we overwrite the method
+                # on the class instance with a new memoize instance
+                if hasattr(instance, fn.__name__):
+                    bound_fn = fn.__get__(instance, instance.__class__)
+                    new_memoizer = memoize(self.timeout, self.manual_flush)(bound_fn)
+                    setattr(instance, fn.__name__, new_memoizer)
+                    return getattr(instance, fn.__name__)(*args, **kwargs)
+
+            return rewrite_instance_method
+
+        def flush_cache():
+            with self.cache_lock:
+                for key in self.cache.keys():
+                    if (time.time() - self.cache[key][1]) > self.timeout:
+                        del(self.cache[key])
+
+        @wraps(fn)
+        def wrapped(*args, **kwargs):
+            kw = kwargs.items()
+            kw.sort()
+            key_str = repr((args, kw))
+            key = md5(key_str).hexdigest()
+
+            with self.cache_lock:
+                try:
+                    result, cache_time = self.cache[key]
+                    if self.timeout is not None and (time.time() - cache_time) > self.timeout:
+                        raise KeyError
+                except KeyError:
+                    result, _ = self.cache[key] = (fn(*args, **kwargs), time.time())
+
+            if not self.manual_flush and self.timeout is not None:
+                flush_cache()
+
+            return result
+
+        if self.manual_flush:
+            wrapped.flush_cache = flush_cache
+
+        return wrapped
diff --git a/libs/wraptor/decorators/test/__init__.py b/libs/wraptor/decorators/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/wraptor/decorators/test/test_called_with_args.py b/libs/wraptor/decorators/test/test_called_with_args.py
new file mode 100644
index 000000000..306901686
--- /dev/null
+++ b/libs/wraptor/decorators/test/test_called_with_args.py
@@ -0,0 +1,18 @@
+from wraptor.decorators import timeout, throttle, memoize
+import pytest
+
+with_decorators = pytest.mark.parametrize("decorator", [
+    timeout, throttle, memoize
+])
+
+@with_decorators
+def test_called_with_args(decorator):
+    test_args = [1, 2, [1, 2, 3], { 'asdf': 5 }]
+    test_kwargs = { 'a': 1, 'b': [1, 2, 3] }
+
+    @decorator()
+    def fn(*args, **kwargs):
+        assert tuple(test_args) == args
+        assert test_kwargs == kwargs
+
+    fn(*test_args, **test_kwargs)
diff --git a/libs/wraptor/decorators/test/test_exception_catcher.py b/libs/wraptor/decorators/test/test_exception_catcher.py
new file mode 100644
index 000000000..2944fb7e7
--- /dev/null
+++ b/libs/wraptor/decorators/test/test_exception_catcher.py
@@ -0,0 +1,16 @@
+from wraptor.decorators import exception_catcher
+import threading
+import pytest
+
+def test_basic():
+
+    @exception_catcher
+    def work():
+        raise Exception()
+
+    t = threading.Thread(target=work)
+    t.start()
+    t.join()
+
+    with pytest.raises(Exception):
+        work.check()
diff --git a/libs/wraptor/decorators/test/test_memoize.py b/libs/wraptor/decorators/test/test_memoize.py
new file mode 100644
index 000000000..d7c7e5870
--- /dev/null
+++ b/libs/wraptor/decorators/test/test_memoize.py
@@ -0,0 +1,147 @@
+import time
+
+from wraptor.decorators import memoize
+
+def test_basic_noargs():
+    arr = []
+
+    @memoize()
+    def fn():
+        arr.append(1)
+
+    fn()
+    fn()
+
+    assert arr == [1]
+
+def test_basic_args():
+    arr = []
+
+    @memoize()
+    def fn(*args, **kwargs):
+        arr.append(1)
+
+    s_args = [1, 2, 3]
+    fn(*s_args)
+    fn(*s_args)
+    c_args = [[1], "asdjf", {'a': 5}]
+    fn(*c_args)
+    fn(*c_args)
+    kw_args = {'a': 234, 'b': [1, 2, "asdf"], 'c': [5, 6]}
+    kw_args_2 = {'a': 234, 'b': [1, 3, "asdf"], 'c': [5, 6]}
+    fn(*c_args, **kw_args)
+    fn(*c_args, **kw_args_2)
+    fn(*c_args, **kw_args)
+
+    fn(fn)
+    fn(fn)
+
+    assert arr == [1, 1, 1, 1, 1]
+
+def test_timeout():
+    arr = []
+
+    @memoize(timeout=.1)
+    def fn(*args, **kwargs):
+        arr.append(1)
+
+    fn(1, 2, 3)
+    time.sleep(.2)
+    fn(1, 2, 3)
+
+    assert arr == [1, 1]
+
+def test_auto_flush():
+    memoize_inst = memoize(timeout=.1)
+
+    @memoize_inst
+    def fn(*args, **kwargs):
+        pass
+
+    fn(1, 2, 3)
+    assert len(memoize_inst.cache.keys()) == 1
+    time.sleep(.2)
+    fn(1, 2, 3)
+    assert len(memoize_inst.cache.keys()) == 1
+
+def test_manual_flush():
+    memoize_inst = memoize(timeout=.1, manual_flush=True)
+
+    @memoize_inst
+    def fn(*args, **kwargs):
+        pass
+
+    fn(1, 2, 3)
+    assert len(memoize_inst.cache.keys()) == 1
+    time.sleep(.2)
+    fn(3, 4, 5)
+    assert len(memoize_inst.cache.keys()) == 2
+    time.sleep(.2)
+    fn.flush_cache()
+    assert len(memoize_inst.cache.keys()) == 0
+
+def test_class_method():
+    import random
+
+    memoizer = memoize(manual_flush=True, instance_method=True)
+
+    class foo(object):
+        @memoizer
+        def bar(self, *args):
+            return random.random()
+
+    x = foo()
+    x2 = foo()
+
+    assert x.bar('a', 'b') != x2.bar('a', 'b')
+    assert x.bar('a', 'b') == x.bar('a', 'b')
+    assert x.bar('a', 'b') != x.bar('a', 'd')
+    assert x2.bar('a', 'b') == x2.bar('a', 'b')
+
+    # the memoizer should have made private caches for each instance
+    assert len(memoizer.cache) == 0
+
+    # now make sure that they don't share caches
+    res1 = x.bar('a', 'b')
+    res2 = x2.bar('a', 'b')
+    x.bar.flush_cache()
+    assert res1 != x.bar('a', 'b')
+    assert res2 == x2.bar('a', 'b')
+
+def test_instance_method_extended():
+
+    class foo(object):
+        def __init__(self):
+            self.i = 0
+
+        @memoize(instance_method=True)
+        def bar(self, instance):
+            assert self == instance
+            self.i += 1
+            return self.i
+
+    f = foo()
+    assert f.bar(f) == 1
+    assert f.bar(f) == 1
+
+def test_fail_instance_method():
+    """ Test that memoize without instance_method creates a globally
+        shared memoize instance (shared by all instances of the class)
+    """
+    memoizer = memoize(manual_flush=True)
+
+    class foo(object):
+        def __init__(self, x):
+            self._x = x
+
+        @memoizer
+        def bar(self):
+            return self._x
+
+    x = foo(1)
+    x2 = foo(2)
+
+    assert x.bar() != x2.bar()
+
+    # note that they share the same cache
+    assert len(memoizer.cache) == 2
diff --git a/libs/wraptor/decorators/test/test_throttle.py b/libs/wraptor/decorators/test/test_throttle.py
new file mode 100644
index 000000000..9b04bc80c
--- /dev/null
+++ b/libs/wraptor/decorators/test/test_throttle.py
@@ -0,0 +1,51 @@
+import time
+
+from wraptor.decorators import throttle
+
+def test_basic():
+    arr = []
+
+    @throttle(.1)
+    def test():
+        arr.append(1)
+
+    test()
+    test()
+    time.sleep(.2)
+    test()
+
+    assert arr == [1, 1]
+
+def test_fail_instance_method():
+    """ Test that throttle without instance_method creates a globally
+        shared throttle instance (shared by all instances of the class)
+    """
+    arr = []
+
+    class foo(object):
+        @throttle(1)
+        def bar(self):
+            arr.append(1)
+
+    x = foo()
+    x2 = foo()
+
+    x.bar()
+    x2.bar()
+    # throttle
+    assert arr == [1]
+
+def test_class_method():
+    arr = []
+
+    class foo(object):
+        @throttle(1, instance_method=True)
+        def bar(self):
+            arr.append(1)
+
+    x = foo()
+    x2 = foo()
+
+    x.bar()
+    x2.bar()
+    assert arr == [1, 1]
diff --git a/libs/wraptor/decorators/test/test_timeout.py b/libs/wraptor/decorators/test/test_timeout.py
new file mode 100644
index 000000000..f7758c53f
--- /dev/null
+++ b/libs/wraptor/decorators/test/test_timeout.py
@@ -0,0 +1,31 @@
+import time
+
+from wraptor.decorators import timeout, TimeoutException
+
+def test_basic():
+    @timeout(1)
+    def fn():
+        try:
+            time.sleep(2)
+            assert False
+        except TimeoutException:
+            pass
+    fn()
+
+def test_catch_exception_outsize():
+    @timeout(1)
+    def fn():
+        time.sleep(2)
+        assert False
+
+    try:
+        fn()
+    except TimeoutException:
+        pass
+
+def test_cancels_signal():
+    @timeout(1)
+    def fn():
+        pass
+    fn()
+    time.sleep(1)
diff --git a/libs/wraptor/decorators/throttle.py b/libs/wraptor/decorators/throttle.py
new file mode 100644
index 000000000..3a7c5eb07
--- /dev/null
+++ b/libs/wraptor/decorators/throttle.py
@@ -0,0 +1,31 @@
+from functools import wraps
+from wraptor import context
+
+class throttle(object):
+    """ Throttle a function to execute at most 1 time per <seconds> seconds
+        The function is executed on the forward edge.
+    """
+    def __init__(self, seconds=1, instance_method=False):
+        self.throttler = context.throttle(seconds=seconds)
+        self.seconds = seconds
+        self.instance_method = instance_method
+
+    def __call__(self, fn):
+        if self.instance_method:
+            @wraps(fn)
+            def rewrite_instance_method(instance, *args, **kwargs):
+                # the first time we are called we overwrite the method
+                # on the class instance with a new memoize instance
+                if hasattr(instance, fn.__name__):
+                    bound_fn = fn.__get__(instance, instance.__class__)
+                    new_throttler = throttle(self.seconds)(bound_fn)
+                    setattr(instance, fn.__name__, new_throttler)
+                    return getattr(instance, fn.__name__)(*args, **kwargs)
+
+            return rewrite_instance_method
+
+        @wraps(fn)
+        def wrapped(*args, **kwargs):
+            with self.throttler:
+                return fn(*args, **kwargs)
+        return wrapped
diff --git a/libs/wraptor/decorators/timeout.py b/libs/wraptor/decorators/timeout.py
new file mode 100644
index 000000000..7843823bf
--- /dev/null
+++ b/libs/wraptor/decorators/timeout.py
@@ -0,0 +1,31 @@
+from functools import wraps
+import signal
+
+class TimeoutException(Exception):
+    pass
+
+class timeout(object):
+    """ Basic timeout decorator
+        * Uses signals, so this can only be used in the main thread of execution
+        * seconds must be a positive integer
+        Signal implementation based on http://code.activestate.com/recipes/307871-timing-out-function/
+    """
+    def __init__(self, seconds=1):
+        self.seconds = seconds
+
+    def __call__(self, fn):
+        def sig_handler(signum, frame):
+            raise TimeoutException()
+
+        @wraps(fn)
+        def wrapped(*args, **kwargs):
+            old = signal.signal(signal.SIGALRM, sig_handler)
+            signal.alarm(self.seconds)
+            try:
+                result = fn(*args, **kwargs)
+            finally:
+                signal.signal(signal.SIGALRM, old)
+            signal.alarm(0)
+            return result
+
+        return wrapped
diff --git a/libs/wraptor/test/__init__.py b/libs/wraptor/test/__init__.py
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/xdg/AUTHORS b/libs/xdg/AUTHORS
new file mode 100644
index 000000000..588313387
--- /dev/null
+++ b/libs/xdg/AUTHORS
@@ -0,0 +1,6 @@
+Current Maintainer:
+Thomas Kluyver <thomas@kluyver.me.uk>
+
+Inactive:
+Heinrich Wendel <h_wendel@cojobo.net>
+Sergey Kuleshov <svyatogor@gentoo.org>
diff --git a/libs/xdg/BaseDirectory.py b/libs/xdg/BaseDirectory.py
new file mode 100644
index 000000000..cececa3cc
--- /dev/null
+++ b/libs/xdg/BaseDirectory.py
@@ -0,0 +1,145 @@
+"""
+This module is based on a rox module (LGPL):
+
+http://cvs.sourceforge.net/viewcvs.py/rox/ROX-Lib2/python/rox/basedir.py?rev=1.9&view=log
+
+The freedesktop.org Base Directory specification provides a way for
+applications to locate shared data and configuration:
+
+    http://standards.freedesktop.org/basedir-spec/
+
+(based on version 0.6)
+
+This module can be used to load and save from and to these directories.
+
+Typical usage:
+
+    from rox import basedir
+    
+    for dir in basedir.load_config_paths('mydomain.org', 'MyProg', 'Options'):
+        print "Load settings from", dir
+
+    dir = basedir.save_config_path('mydomain.org', 'MyProg')
+    print >>file(os.path.join(dir, 'Options'), 'w'), "foo=2"
+
+Note: see the rox.Options module for a higher-level API for managing options.
+"""
+
+import os
+
+_home = os.path.expanduser('~')
+xdg_data_home = os.environ.get('XDG_DATA_HOME') or \
+            os.path.join(_home, '.local', 'share')
+
+xdg_data_dirs = [xdg_data_home] + \
+    (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share').split(':')
+
+xdg_config_home = os.environ.get('XDG_CONFIG_HOME') or \
+            os.path.join(_home, '.config')
+
+xdg_config_dirs = [xdg_config_home] + \
+    (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg').split(':')
+
+xdg_cache_home = os.environ.get('XDG_CACHE_HOME') or \
+            os.path.join(_home, '.cache')
+
+xdg_data_dirs = [x for x in xdg_data_dirs if x]
+xdg_config_dirs = [x for x in xdg_config_dirs if x]
+
+def save_config_path(*resource):
+    """Ensure ``$XDG_CONFIG_HOME/<resource>/`` exists, and return its path.
+    'resource' should normally be the name of your application. Use this
+    when saving configuration settings.
+    """
+    resource = os.path.join(*resource)
+    assert not resource.startswith('/')
+    path = os.path.join(xdg_config_home, resource)
+    if not os.path.isdir(path):
+        os.makedirs(path, 0o700)
+    return path
+
+def save_data_path(*resource):
+    """Ensure ``$XDG_DATA_HOME/<resource>/`` exists, and return its path.
+    'resource' should normally be the name of your application or a shared
+    resource. Use this when saving or updating application data.
+    """
+    resource = os.path.join(*resource)
+    assert not resource.startswith('/')
+    path = os.path.join(xdg_data_home, resource)
+    if not os.path.isdir(path):
+        os.makedirs(path)
+    return path
+
+def save_cache_path(*resource):
+    """Ensure ``$XDG_CACHE_HOME/<resource>/`` exists, and return its path.
+    'resource' should normally be the name of your application or a shared
+    resource."""
+    resource = os.path.join(*resource)
+    assert not resource.startswith('/')
+    path = os.path.join(xdg_cache_home, resource)
+    if not os.path.isdir(path):
+        os.makedirs(path)
+    return path
+
+def load_config_paths(*resource):
+    """Returns an iterator which gives each directory named 'resource' in the
+    configuration search path. Information provided by earlier directories should
+    take precedence over later ones, and the user-specific config dir comes
+    first."""
+    resource = os.path.join(*resource)
+    for config_dir in xdg_config_dirs:
+        path = os.path.join(config_dir, resource)
+        if os.path.exists(path): yield path
+
+def load_first_config(*resource):
+    """Returns the first result from load_config_paths, or None if there is nothing
+    to load."""
+    for x in load_config_paths(*resource):
+        return x
+    return None
+
+def load_data_paths(*resource):
+    """Returns an iterator which gives each directory named 'resource' in the
+    application data search path. Information provided by earlier directories
+    should take precedence over later ones."""
+    resource = os.path.join(*resource)
+    for data_dir in xdg_data_dirs:
+        path = os.path.join(data_dir, resource)
+        if os.path.exists(path): yield path
+
+def get_runtime_dir(strict=True):
+    """Returns the value of $XDG_RUNTIME_DIR, a directory path.
+    
+    This directory is intended for 'user-specific non-essential runtime files
+    and other file objects (such as sockets, named pipes, ...)', and
+    'communication and synchronization purposes'.
+    
+    As of late 2012, only quite new systems set $XDG_RUNTIME_DIR. If it is not
+    set, with ``strict=True`` (the default), a KeyError is raised. With 
+    ``strict=False``, PyXDG will create a fallback under /tmp for the current
+    user. This fallback does *not* provide the same guarantees as the
+    specification requires for the runtime directory.
+    
+    The strict default is deliberately conservative, so that application
+    developers can make a conscious decision to allow the fallback.
+    """
+    try:
+        return os.environ['XDG_RUNTIME_DIR']
+    except KeyError:
+        if strict:
+            raise
+        
+        import getpass
+        fallback = '/tmp/pyxdg-runtime-dir-fallback-' + getpass.getuser()
+        try:
+            os.mkdir(fallback, 0o700)
+        except OSError as e:
+            import errno
+            if e.errno == errno.EEXIST:
+                # Already exists - set 700 permissions again.
+                import stat
+                os.chmod(fallback, stat.S_IRUSR|stat.S_IWUSR|stat.S_IXUSR)
+            else: # pragma: no cover
+                raise
+        
+        return fallback
diff --git a/libs/xdg/COPYING b/libs/xdg/COPYING
new file mode 100644
index 000000000..161a3d1d4
--- /dev/null
+++ b/libs/xdg/COPYING
@@ -0,0 +1,482 @@
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1991 Free Software Foundation, Inc.
+ 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the library GPL.  It is
+ numbered 2 because it goes with version 2 of the ordinary GPL.]
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+  This license, the Library General Public License, applies to some
+specially designated Free Software Foundation software, and to any
+other libraries whose authors decide to use it.  You can use it for
+your libraries, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if
+you distribute copies of the library, or if you modify it.
+
+  For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you.  You must make sure that they, too, receive or can get the source
+code.  If you link a program with the library, you must provide
+complete object files to the recipients so that they can relink them
+with the library, after making changes to the library and recompiling
+it.  And you must show them these terms so they know their rights.
+
+  Our method of protecting your rights has two steps: (1) copyright
+the library, and (2) offer you this license which gives you legal
+permission to copy, distribute and/or modify the library.
+
+  Also, for each distributor's protection, we want to make certain
+that everyone understands that there is no warranty for this free
+library.  If the library is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original
+version, so that any problems introduced by others will not reflect on
+the original authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that companies distributing free
+software will individually obtain patent licenses, thus in effect
+transforming the program into proprietary software.  To prevent this,
+we have made it clear that any patent must be licensed for everyone's
+free use or not licensed at all.
+
+  Most GNU software, including some libraries, is covered by the ordinary
+GNU General Public License, which was designed for utility programs.  This
+license, the GNU Library General Public License, applies to certain
+designated libraries.  This license is quite different from the ordinary
+one; be sure to read it in full, and don't assume that anything in it is
+the same as in the ordinary license.
+
+  The reason we have a separate public license for some libraries is that
+they blur the distinction we usually make between modifying or adding to a
+program and simply using it.  Linking a program with a library, without
+changing the library, is in some sense simply using the library, and is
+analogous to running a utility program or application program.  However, in
+a textual and legal sense, the linked executable is a combined work, a
+derivative of the original library, and the ordinary General Public License
+treats it as such.
+
+  Because of this blurred distinction, using the ordinary General
+Public License for libraries did not effectively promote software
+sharing, because most developers did not use the libraries.  We
+concluded that weaker conditions might promote sharing better.
+
+  However, unrestricted linking of non-free programs would deprive the
+users of those programs of all benefit from the free status of the
+libraries themselves.  This Library General Public License is intended to
+permit developers of non-free programs to use free libraries, while
+preserving your freedom as a user of such programs to change the free
+libraries that are incorporated in them.  (We have not seen how to achieve
+this as regards changes in header files, but we have achieved it as regards
+changes in the actual functions of the Library.)  The hope is that this
+will lead to faster development of free libraries.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.  Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library".  The
+former contains code derived from the library, while the latter only
+works together with the library.
+
+  Note that it is possible for a library to be covered by the ordinary
+General Public License rather than by this special one.
+
+		  GNU LIBRARY GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License Agreement applies to any software library which
+contains a notice placed by the copyright holder or other authorized
+party saying it may be distributed under the terms of this Library
+General Public License (also called "this License").  Each licensee is
+addressed as "you".
+
+  A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+  The "Library", below, refers to any such software library or work
+which has been distributed under these terms.  A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language.  (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+  "Source code" for a work means the preferred form of the work for
+making modifications to it.  For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+  Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it).  Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+  
+  1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+  You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+  2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) The modified work must itself be a software library.
+
+    b) You must cause the files modified to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    c) You must cause the whole of the work to be licensed at no
+    charge to all third parties under the terms of this License.
+
+    d) If a facility in the modified Library refers to a function or a
+    table of data to be supplied by an application program that uses
+    the facility, other than as an argument passed when the facility
+    is invoked, then you must make a good faith effort to ensure that,
+    in the event an application does not supply such function or
+    table, the facility still operates, and performs whatever part of
+    its purpose remains meaningful.
+
+    (For example, a function in a library to compute square roots has
+    a purpose that is entirely well-defined independent of the
+    application.  Therefore, Subsection 2d requires that any
+    application-supplied function or table used by this function must
+    be optional: if the application does not supply it, the square
+    root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library.  To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License.  (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.)  Do not make any other change in
+these notices.
+
+  Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+  This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+  4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+  If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library".  Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+  However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library".  The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+  When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library.  The
+threshold for this to be true is not precisely defined by law.
+
+  If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work.  (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+  Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+  6. As an exception to the Sections above, you may also compile or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+  You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License.  You must supply a copy of this License.  If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License.  Also, you must do one
+of these things:
+
+    a) Accompany the work with the complete corresponding
+    machine-readable source code for the Library including whatever
+    changes were used in the work (which must be distributed under
+    Sections 1 and 2 above); and, if the work is an executable linked
+    with the Library, with the complete machine-readable "work that
+    uses the Library", as object code and/or source code, so that the
+    user can modify the Library and then relink to produce a modified
+    executable containing the modified Library.  (It is understood
+    that the user who changes the contents of definitions files in the
+    Library will not necessarily be able to recompile the application
+    to use the modified definitions.)
+
+    b) Accompany the work with a written offer, valid for at
+    least three years, to give the same user the materials
+    specified in Subsection 6a, above, for a charge no more
+    than the cost of performing this distribution.
+
+    c) If distribution of the work is made by offering access to copy
+    from a designated place, offer equivalent access to copy the above
+    specified materials from the same place.
+
+    d) Verify that the user has already received a copy of these
+    materials or that you have already sent this user a copy.
+
+  For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it.  However, as a special exception,
+the source code distributed need not include anything that is normally
+distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+  It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system.  Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+  7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+    a) Accompany the combined library with a copy of the same work
+    based on the Library, uncombined with any other library
+    facilities.  This must be distributed under the terms of the
+    Sections above.
+
+    b) Give prominent notice with the combined library of the fact
+    that part of it is a work based on the Library, and explaining
+    where to find the accompanying uncombined form of the same work.
+
+  8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License.  Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License.  However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+  9. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Library or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+  10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded.  In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+  13. The Free Software Foundation may publish revised and/or new
+versions of the Library General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation.  If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+  14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission.  For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this.  Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+			    NO WARRANTY
+
+  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+     Appendix: How to Apply These Terms to Your New Libraries
+
+  If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change.  You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+  To apply these terms, attach the following notices to the library.  It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the library's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This library is free software; you can redistribute it and/or
+    modify it under the terms of the GNU Library General Public
+    License as published by the Free Software Foundation; either
+    version 2 of the License, or (at your option) any later version.
+
+    This library is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+    Library General Public License for more details.
+
+    You should have received a copy of the GNU Library General Public
+    License along with this library; if not, write to the Free
+    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+    MA 02111-1307, USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the
+  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+  <signature of Ty Coon>, 1 April 1990
+  Ty Coon, President of Vice
+
+That's all there is to it!
diff --git a/libs/xdg/ChangeLog b/libs/xdg/ChangeLog
new file mode 100644
index 000000000..d0db2f9d2
--- /dev/null
+++ b/libs/xdg/ChangeLog
@@ -0,0 +1,253 @@
+Version 0.25 (December 2012)
+    * Add support for $XDG_RUNTIME_DIR, Debian bug #656338.
+    * Allow desktop entry files that are not encoded in UTF-8, Debian bug #693855.
+    * Mime: Add support for subclasses and aliases.
+
+Version 0.24 (October 2012)
+    * Update allowed DesktopEntry categories following changes to the
+      specification.
+    * Fix removal of empty submenu, freedesktop bug #54747.
+    * Documentation is now available on RTD: http://pyxdg.readthedocs.org/
+    * A few more tests, and some code cleanup.
+    * Fix failure to parse some menu files when kde-config is missing,
+      freedesktop bug #56426.
+
+Version 0.23 (July 2012)
+    * Fix a test for non-UTF-8 locales.
+
+Version 0.22 (July 2012)
+    * Better unicode handling in several modules.
+    * Fix for sorting non-ASCII menu entries, freedesktop bug #52492.
+    * More tests.
+
+Version 0.21 (July 2012)
+    * Tests can now be run conveniently using nosetests, and cover more of the
+      code.
+    * BaseDirectory: New save_cache_path() function, freedesktop bug #26458.
+    * Config: Default icon theme is 'hicolor', not 'highcolor'.
+    * Menu: Obsolete Rule.compile() method removed.
+    * DesktopEntry: Corrected spelling of checkCategories() method, freedesktop
+      bug #24974.
+    * DesktopEntry: Consider Actions and Keywords keys standard.
+    * DesktopEntry: Accept non-ASCII Keywords.
+    * DesktopEntry: Update list of environments valid for OnlyShowIn.
+    * Mime: Fix get_type_by_contents() in Python 3.
+    * RecentFiles: Minor bug fixes.
+
+Version 0.20 (June 2012)
+    * Compatible with Python 3; requires Python 2.6 or later
+    * Clean up accidental GPL license notice in Menu.py
+    * Add test scripts for xdg.Mime, xdg.Locale and xdg.RecentFiles
+    * Fixes for icon theme validation
+    * Fix exception in xdg.Mime
+    * Replace invalid string exceptions
+    * Fall back to default base directories if $XDG* environment variables are
+      set but empty.
+    * Remove use of deprecated os.popen3 in Menu.py
+    * Correct URLs in README
+
+Version 0.19
+    * IniFile.py: add support for trusted desktop files (thanks to karl mikaelsson)
+    * DesktopEntry.py: Support spec version 1.0, Debian bug #563660
+    * MimeType.py: Fix parsing of in memory data, Debian bug #563718
+    * DesktopEntry.py: Fix constructor, Debian bug #551297, #562951, #562952
+
+Version 0.18
+
+    * DesktopEntry.py: Add getMimeTypes() method, correctly returning strings
+    * DesktopEntry.py: Deprecated getMimeType() returning list of regex
+    * Menu.py: Add support for XDG_MENU_PREFIX
+    * Mime.py: Add get_type_by_contents()
+
+Version 0.17
+
+2008-10-30 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py: Python <= 2.3 compatibility fix
+    * DesktopEntry.py: Fix wrong indention
+
+Version 0.16
+
+2008-08-07 Heinrich Wendel <h_wendel@cojobo.net>
+	* IconTheme.py: Add more directories to the pixmap path
+
+2008-03-02 Heinrich Wendel <h_wendel@cojobo.net>
+    * IniFile.py: Fix saving of relative filenames
+    * IniFile.py, DesktopEntry.py: Fix __cmp__ method
+	* IniFile.py, IconTheme.py: Better error handling
+
+Version 0.15
+
+2005-08-10 Heinrich Wendel <h_wendel@cojoob.net>
+    * Menu.py: Add support for TryExec
+
+2005-08-09 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py: Unicode bug fixed!
+    * IconTheme.py: small speedup
+
+2005-08-04 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py, IconTheme.py: Bugfixes...
+    * MenuEditor.py: Make xml nice; add hide/unhide functions
+
+Versinon 0.14
+
+2005-06-02 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py, MenuEditor.py: Bugfixes...
+
+version 0.13
+
+2005-06-01 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py, MenuEditor.py: Bugfixes...
+    * Config.py: Add root_mode
+
+Version 0.12
+
+2005-05-30 Heinrich Wendel <h_wendel@cojobo.net>
+    * MenuEditor.py: New in this release, use to edit Menus thx to Travis
+    Watkins <alleykat@gmail.com> and Matt Kynaston <mattkyn@gmail.com> for
+    their help
+    * Menu.py, IniFile.py, DesktopEntry.py: Lot of bugfixing...
+    * BaseDirectory.py: Add xdg_cache_home
+    * IconTheme.py, Config.py: More caching stuff, make cachetime
+    configurable
+
+Version 0.11
+
+2005-05-23 Heinrich Wendel <h_wendel@cojobo.net>
+    * DesktopEntry.p, Menu.py: A lot of bugfixes, thx to Travis Watkins
+    <alleykat@gmail.com>
+
+2005-05-02 Heinrich Wendel <h_wendel@cojobo.net>
+    * Config.py:
+    Module to configure Basic Settings, currently available:
+    - Locale, IconTheme, IconSize, WindowManager
+    * Locale.py:
+    Internal Module to support Locales
+    * Mime.py:
+    Implementation of the Mime Specification
+    * Menu.py:
+    Now supports LegacyDirs
+    * RecentFiles.py:
+    Implementation of the Recent Files Specification
+
+Version 0.10
+
+2005-04-26 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py:
+    various bug fixing to support version 1.0.draft-1
+
+2005-04-13 Heinrich Wendel <h_wendel@cojobo.net>
+    * IniFily.py:
+    Detect if a .desktop file was edited
+    * Menu.py
+    Fix bug caused by excluding NoDisplay/Hidden Items to early
+
+Version 0.9
+
+2005-03-23 Heinrich Wendel <h_wendel@cojobo.net>
+    * IniFile.py:
+    various speedups
+    * Menu.py:
+    add support for <MergeFile type="parent">, menu-spec-0.91
+
+2005-03-21 Heinrich Wendel <h_wendel@cojobo.net>
+    * IniFily.py:
+    Small fixes
+    * Menu.py:
+    remove __preparse and don't edit the parsed document, so menu editing is
+    possible
+    store parsed document in Menu.Doc
+    store document name in Menu.Filename
+
+2005-03-18 Heinrich Wendel <h_wendel@cojobo.net>
+    * Menu.py:
+    fix basename argument, thx to Matt Kynaston <mattkyn@gmail.com>;
+    make it comply to menu-spec-0.9
+
+2004-30-11 Heinrich Wendel <h_wendel@cojobo.net>
+    * Update BaseDirectory.py to the current ROX version
+
+Version 0.8
+
+2004-10-18  Ross Burton  <ross@burtonini.com>
+    * xdg/DesktopEntry.py, xdg/IconTheme.py:
+    Add . to the literal FileExtensions so that the checks work.
+    * xdg/Menu.py:
+    Don't read .desktop-* files, only .desktop
+
+2004-10-18  Martin Grimme  <martin@pycage.de>
+    * xdg/IconTheme.py (getIconPath): The "hicolor" theme has to be used as
+    the fallback.
+    * xdg/IniFile.py (IniFile.getList): Fixed bug in splitting up strings.
+
+Version 0.7
+
+2004-09-04 Heinrich Wendel <h_wendel@cojobo.net>
+    * Add 'import codecs' to IniFile, needed by write support
+    * Fix parsing of lists with only one entry
+
+Version 0.6
+
+2004-08-04 Heinrich Wendel <h_wendel@cojobo.net>
+    * Performance Improvements
+
+Version 0.5
+
+2004-03-29 Heinrich Wendel <h_wendel@cojobo.net>
+    * Finished Support for menu-spec 0.7
+
+2004-03-27 Heinrich Wendel <h_wendel@cojobo.net>
+    * 5* speed improvement in Menu.py parsing code
+
+2004-03-20 Heinrich Wendel <h_wendel@cojobo.net>
+    * check values of Categories/OnlyShowIn keys
+    * various misc changes
+
+2004-03-17 Martin Grimme  <martin@pycage.de>
+
+    * xdg/Menu.py (__preparse): 
+    * xdg/IconTheme.py (IconTheme.parse): Made compatible with Python 2.3
+    (None is a keyword).
+    (__parseTheme): Prepend new icon themes to make sure that they have
+    priority when looking up icons.
+    (icondirs): Add "~/.icons" to the paths where to look for icons. Users
+    may have icon themes installed in their home directory.
+
+2003-10-08 Heinrich Wendel <h_wendel@cojobo.net>
+    * Completed write-support in IniFile
+
+2003-10-05 Heinrich Wendel <h_wendel@cojobo.net>
+    * Added support for Hidden and NoDisplay in menu-spec
+    * inital write-support in IniFile
+
+2003-10-04 Heinrich Wendel <h_wendel@cojobo.net>
+    * License change to LGPL-2
+    * initial support for menu-spec 0.7
+
+Version 0.4
+
+2003-09-30 Heinrich Wendel <h_wendel@cojobo.net>
+    * Bugfix release
+
+Version 0.3
+
+2003-09-12 Heinrich Wendel <h_wendel@cojobo.net>
+    * Complete IconSpec implementation, including cache and validation
+
+2003-09-07 Heinrich Wendel <h_wendel@cojobo.net>
+
+    * Basedir spec converted to version 0.6
+    * First part of separating DesktopEntry backend in IniFile
+    * added getPath(...) function to Menu.py
+
+Version 0.2
+
+2003-09-05 Heinrich Wendel <h_wendel@cojobo.net>
+
+    * Rewrite of menu-spec code
+    * Taken basedir-spec code from ROX
+
+Version 0.1
+
+2003-08-08 Heinrich Wendel <h_wendel@cojobo.net>
+
+    * initial public release
diff --git a/libs/xdg/Config.py b/libs/xdg/Config.py
new file mode 100644
index 000000000..3f5d6545e
--- /dev/null
+++ b/libs/xdg/Config.py
@@ -0,0 +1,39 @@
+"""
+Functions to configure Basic Settings
+"""
+
+language = "C"
+windowmanager = None
+icon_theme = "hicolor"
+icon_size = 48
+cache_time = 5
+root_mode = False
+
+def setWindowManager(wm):
+    global windowmanager
+    windowmanager = wm
+
+def setIconTheme(theme):
+    global icon_theme
+    icon_theme = theme
+    import xdg.IconTheme
+    xdg.IconTheme.themes = []
+
+def setIconSize(size):
+    global icon_size
+    icon_size = size
+
+def setCacheTime(time):
+    global cache_time
+    cache_time = time
+
+def setLocale(lang):
+    import locale
+    lang = locale.normalize(lang)
+    locale.setlocale(locale.LC_ALL, lang)
+    import xdg.Locale
+    xdg.Locale.update(lang)
+
+def setRootMode(boolean):
+    global root_mode
+    root_mode = boolean
diff --git a/libs/xdg/DesktopEntry.py b/libs/xdg/DesktopEntry.py
new file mode 100644
index 000000000..d50640a36
--- /dev/null
+++ b/libs/xdg/DesktopEntry.py
@@ -0,0 +1,417 @@
+"""
+Complete implementation of the XDG Desktop Entry Specification Version 0.9.4
+http://standards.freedesktop.org/desktop-entry-spec/
+
+Not supported:
+- Encoding: Legacy Mixed
+- Does not check exec parameters
+- Does not check URL's
+- Does not completly validate deprecated/kde items
+- Does not completly check categories
+"""
+
+from xdg.IniFile import IniFile, is_ascii
+import xdg.Locale
+from xdg.Exceptions import ParsingError
+import os.path
+import re
+import warnings
+
+class DesktopEntry(IniFile):
+    "Class to parse and validate Desktop Entries"
+
+    defaultGroup = 'Desktop Entry'
+
+    def __init__(self, filename=None):
+        """Create a new DesktopEntry
+        
+        If filename exists, it will be parsed as a desktop entry file. If not,
+        or if filename is None, a blank DesktopEntry is created.
+        """
+        self.content = dict()
+        if filename and os.path.exists(filename):
+            self.parse(filename)
+        elif filename:
+            self.new(filename)
+
+    def __str__(self):
+        return self.getName()
+
+    def parse(self, file):
+        """Parse a desktop entry file."""
+        IniFile.parse(self, file, ["Desktop Entry", "KDE Desktop Entry"])
+
+    # start standard keys
+    def getType(self):
+        return self.get('Type')
+    def getVersion(self):
+        """deprecated, use getVersionString instead """
+        return self.get('Version', type="numeric")
+    def getVersionString(self):
+        return self.get('Version')
+    def getName(self):
+        return self.get('Name', locale=True)
+    def getGenericName(self):
+        return self.get('GenericName', locale=True)
+    def getNoDisplay(self):
+        return self.get('NoDisplay', type="boolean")
+    def getComment(self):
+        return self.get('Comment', locale=True)
+    def getIcon(self):
+        return self.get('Icon', locale=True)
+    def getHidden(self):
+        return self.get('Hidden', type="boolean")
+    def getOnlyShowIn(self):
+        return self.get('OnlyShowIn', list=True)
+    def getNotShowIn(self):
+        return self.get('NotShowIn', list=True)
+    def getTryExec(self):
+        return self.get('TryExec')
+    def getExec(self):
+        return self.get('Exec')
+    def getPath(self):
+        return self.get('Path')
+    def getTerminal(self):
+        return self.get('Terminal', type="boolean")
+    def getMimeType(self):
+        """deprecated, use getMimeTypes instead """
+        return self.get('MimeType', list=True, type="regex")
+    def getMimeTypes(self):
+        return self.get('MimeType', list=True)
+    def getCategories(self):
+        return self.get('Categories', list=True)
+    def getStartupNotify(self):
+        return self.get('StartupNotify', type="boolean")
+    def getStartupWMClass(self):
+        return self.get('StartupWMClass')
+    def getURL(self):
+        return self.get('URL')
+    # end standard keys
+
+    # start kde keys
+    def getServiceTypes(self):
+        return self.get('ServiceTypes', list=True)
+    def getDocPath(self):
+        return self.get('DocPath')
+    def getKeywords(self):
+        return self.get('Keywords', list=True, locale=True)
+    def getInitialPreference(self):
+        return self.get('InitialPreference')
+    def getDev(self):
+        return self.get('Dev')
+    def getFSType(self):
+        return self.get('FSType')
+    def getMountPoint(self):
+        return self.get('MountPoint')
+    def getReadonly(self):
+        return self.get('ReadOnly', type="boolean")
+    def getUnmountIcon(self):
+        return self.get('UnmountIcon', locale=True)
+    # end kde keys
+
+    # start deprecated keys
+    def getMiniIcon(self):
+        return self.get('MiniIcon', locale=True)
+    def getTerminalOptions(self):
+        return self.get('TerminalOptions')
+    def getDefaultApp(self):
+        return self.get('DefaultApp')
+    def getProtocols(self):
+        return self.get('Protocols', list=True)
+    def getExtensions(self):
+        return self.get('Extensions', list=True)
+    def getBinaryPattern(self):
+        return self.get('BinaryPattern')
+    def getMapNotify(self):
+        return self.get('MapNotify')
+    def getEncoding(self):
+        return self.get('Encoding')
+    def getSwallowTitle(self):
+        return self.get('SwallowTitle', locale=True)
+    def getSwallowExec(self):
+        return self.get('SwallowExec')
+    def getSortOrder(self): 
+        return self.get('SortOrder', list=True)
+    def getFilePattern(self):
+        return self.get('FilePattern', type="regex")
+    def getActions(self):
+        return self.get('Actions', list=True)
+    # end deprecated keys
+
+    # desktop entry edit stuff
+    def new(self, filename):
+        """Make this instance into a new desktop entry.
+        
+        If filename has a .desktop extension, Type is set to Application. If it
+        has a .directory extension, Type is Directory.
+        """
+        if os.path.splitext(filename)[1] == ".desktop":
+            type = "Application"
+        elif os.path.splitext(filename)[1] == ".directory":
+            type = "Directory"
+        else:
+            raise ParsingError("Unknown extension", filename)
+
+        self.content = dict()
+        self.addGroup(self.defaultGroup)
+        self.set("Type", type)
+        self.filename = filename
+    # end desktop entry edit stuff
+
+    # validation stuff
+    def checkExtras(self):
+        # header
+        if self.defaultGroup == "KDE Desktop Entry":
+            self.warnings.append('[KDE Desktop Entry]-Header is deprecated')
+
+        # file extension
+        if self.fileExtension == ".kdelnk":
+            self.warnings.append("File extension .kdelnk is deprecated")
+        elif self.fileExtension != ".desktop" and self.fileExtension != ".directory":
+            self.warnings.append('Unknown File extension')
+
+        # Type
+        try:
+            self.type = self.content[self.defaultGroup]["Type"]
+        except KeyError:
+            self.errors.append("Key 'Type' is missing")
+
+        # Name
+        try:
+            self.name = self.content[self.defaultGroup]["Name"]
+        except KeyError:
+            self.errors.append("Key 'Name' is missing")
+
+    def checkGroup(self, group):
+        # check if group header is valid
+        if not (group == self.defaultGroup \
+        or re.match("^Desktop Action [a-zA-Z0-9\-]+$", group) \
+        or (re.match("^X-", group) and is_ascii(group))):
+            self.errors.append("Invalid Group name: %s" % group)
+        else:
+            #OnlyShowIn and NotShowIn
+            if ("OnlyShowIn" in self.content[group]) and ("NotShowIn" in self.content[group]):
+                self.errors.append("Group may either have OnlyShowIn or NotShowIn, but not both")
+
+    def checkKey(self, key, value, group):
+        # standard keys     
+        if key == "Type":
+            if value == "ServiceType" or value == "Service" or value == "FSDevice":
+                self.warnings.append("Type=%s is a KDE extension" % key)
+            elif value == "MimeType":
+                self.warnings.append("Type=MimeType is deprecated")
+            elif not (value == "Application" or value == "Link" or value == "Directory"):
+                self.errors.append("Value of key 'Type' must be Application, Link or Directory, but is '%s'" % value)
+
+            if self.fileExtension == ".directory" and not value == "Directory":
+                self.warnings.append("File extension is .directory, but Type is '%s'" % value)
+            elif self.fileExtension == ".desktop" and value == "Directory":
+                self.warnings.append("Files with Type=Directory should have the extension .directory")
+
+            if value == "Application":
+                if "Exec" not in self.content[group]:
+                    self.warnings.append("Type=Application needs 'Exec' key")
+            if value == "Link":
+                if "URL" not in self.content[group]:
+                    self.warnings.append("Type=Link needs 'URL' key")
+
+        elif key == "Version":
+            self.checkValue(key, value)
+
+        elif re.match("^Name"+xdg.Locale.regex+"$", key):
+            pass # locale string
+
+        elif re.match("^GenericName"+xdg.Locale.regex+"$", key):
+            pass # locale string
+
+        elif key == "NoDisplay":
+            self.checkValue(key, value, type="boolean")
+
+        elif re.match("^Comment"+xdg.Locale.regex+"$", key):
+            pass # locale string
+
+        elif re.match("^Icon"+xdg.Locale.regex+"$", key):
+            self.checkValue(key, value)
+
+        elif key == "Hidden":
+            self.checkValue(key, value, type="boolean")
+
+        elif key == "OnlyShowIn":
+            self.checkValue(key, value, list=True)
+            self.checkOnlyShowIn(value)
+
+        elif key == "NotShowIn":
+            self.checkValue(key, value, list=True)
+            self.checkOnlyShowIn(value)
+
+        elif key == "TryExec":
+            self.checkValue(key, value)
+            self.checkType(key, "Application")
+
+        elif key == "Exec":
+            self.checkValue(key, value)
+            self.checkType(key, "Application")
+
+        elif key == "Path":
+            self.checkValue(key, value)
+            self.checkType(key, "Application")
+
+        elif key == "Terminal":
+            self.checkValue(key, value, type="boolean")
+            self.checkType(key, "Application")
+        
+        elif key == "Actions":
+            self.checkValue(key, value, list=True)
+            self.checkType(key, "Application")
+
+        elif key == "MimeType":
+            self.checkValue(key, value, list=True)
+            self.checkType(key, "Application")
+
+        elif key == "Categories":
+            self.checkValue(key, value)
+            self.checkType(key, "Application")
+            self.checkCategories(value)
+        
+        elif re.match("^Keywords"+xdg.Locale.regex+"$", key):
+            self.checkValue(key, value, type="localestring", list=True)
+            self.checkType(key, "Application")
+
+        elif key == "StartupNotify":
+            self.checkValue(key, value, type="boolean")
+            self.checkType(key, "Application")
+
+        elif key == "StartupWMClass":
+            self.checkType(key, "Application")
+
+        elif key == "URL":
+            self.checkValue(key, value)
+            self.checkType(key, "URL")
+
+        # kde extensions
+        elif key == "ServiceTypes":
+            self.checkValue(key, value, list=True)
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "DocPath":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "InitialPreference":
+            self.checkValue(key, value, type="numeric")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "Dev":
+            self.checkValue(key, value)
+            self.checkType(key, "FSDevice")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "FSType":
+            self.checkValue(key, value)
+            self.checkType(key, "FSDevice")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "MountPoint":
+            self.checkValue(key, value)
+            self.checkType(key, "FSDevice")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif key == "ReadOnly":
+            self.checkValue(key, value, type="boolean")
+            self.checkType(key, "FSDevice")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        elif re.match("^UnmountIcon"+xdg.Locale.regex+"$", key):
+            self.checkValue(key, value)
+            self.checkType(key, "FSDevice")
+            self.warnings.append("Key '%s' is a KDE extension" % key)
+
+        # deprecated keys
+        elif key == "Encoding":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif re.match("^MiniIcon"+xdg.Locale.regex+"$", key):
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "TerminalOptions":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "DefaultApp":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "Protocols":
+            self.checkValue(key, value, list=True)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "Extensions":
+            self.checkValue(key, value, list=True)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "BinaryPattern":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "MapNotify":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif re.match("^SwallowTitle"+xdg.Locale.regex+"$", key):
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "SwallowExec":
+            self.checkValue(key, value)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "FilePattern":
+            self.checkValue(key, value, type="regex", list=True)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        elif key == "SortOrder":
+            self.checkValue(key, value, list=True)
+            self.warnings.append("Key '%s' is deprecated" % key)
+
+        # "X-" extensions
+        elif re.match("^X-[a-zA-Z0-9-]+", key):
+            pass
+
+        else:
+            self.errors.append("Invalid key: %s" % key)
+
+    def checkType(self, key, type):
+        if not self.getType() == type:
+            self.errors.append("Key '%s' only allowed in Type=%s" % (key, type))
+
+    def checkOnlyShowIn(self, value):
+        values = self.getList(value)
+        valid = ["GNOME", "KDE", "LXDE", "MATE", "Razor", "ROX", "TDE", "Unity",
+                 "XFCE", "Old"]
+        for item in values:
+            if item not in valid and item[0:2] != "X-":
+                self.errors.append("'%s' is not a registered OnlyShowIn value" % item);
+
+    def checkCategories(self, value):
+        values = self.getList(value)
+
+        main = ["AudioVideo", "Audio", "Video", "Development", "Education", "Game", "Graphics", "Network", "Office", "Science", "Settings", "System", "Utility"]
+        if not any(item in main for item in values):
+            self.errors.append("Missing main category")
+
+        additional = ['Building', 'Debugger', 'IDE', 'GUIDesigner', 'Profiling', 'RevisionControl', 'Translation', 'Calendar', 'ContactManagement', 'Database', 'Dictionary', 'Chart', 'Email', 'Finance', 'FlowChart', 'PDA', 'ProjectManagement', 'Presentation', 'Spreadsheet', 'WordProcessor', '2DGraphics', 'VectorGraphics', 'RasterGraphics', '3DGraphics', 'Scanning', 'OCR', 'Photography', 'Publishing', 'Viewer', 'TextTools', 'DesktopSettings', 'HardwareSettings', 'Printing', 'PackageManager', 'Dialup', 'InstantMessaging', 'Chat', 'IRCClient', 'Feed', 'FileTransfer', 'HamRadio', 'News', 'P2P', 'RemoteAccess', 'Telephony', 'TelephonyTools', 'VideoConference', 'WebBrowser', 'WebDevelopment', 'Midi', 'Mixer', 'Sequencer', 'Tuner', 'TV', 'AudioVideoEditing', 'Player', 'Recorder', 'DiscBurning', 'ActionGame', 'AdventureGame', 'ArcadeGame', 'BoardGame', 'BlocksGame', 'CardGame', 'KidsGame', 'LogicGame', 'RolePlaying', 'Shooter', 'Simulation', 'SportsGame', 'StrategyGame', 'Art', 'Construction', 'Music', 'Languages', 'ArtificialIntelligence', 'Astronomy', 'Biology', 'Chemistry', 'ComputerScience', 'DataVisualization', 'Economy', 'Electricity', 'Geography', 'Geology', 'Geoscience', 'History', 'Humanities', 'ImageProcessing', 'Literature', 'Maps', 'Math', 'NumericalAnalysis', 'MedicalSoftware', 'Physics', 'Robotics', 'Spirituality', 'Sports', 'ParallelComputing', 'Amusement', 'Archiving', 'Compression', 'Electronics', 'Emulator', 'Engineering', 'FileTools', 'FileManager', 'TerminalEmulator', 'Filesystem', 'Monitor', 'Security', 'Accessibility', 'Calculator', 'Clock', 'TextEditor', 'Documentation', 'Adult', 'Core', 'KDE', 'GNOME', 'XFCE', 'GTK', 'Qt', 'Motif', 'Java', 'ConsoleOnly']
+        allcategories = additional + main
+        
+        for item in values:
+            if item not in allcategories and not item.startswith("X-"):
+                self.errors.append("'%s' is not a registered Category" % item);
+    
+    def checkCategorie(self, value):
+        """Deprecated alias for checkCategories - only exists for backwards
+        compatibility.
+        """
+        warnings.warn("checkCategorie is deprecated, use checkCategories",
+                                                            DeprecationWarning)
+        return self.checkCategories(value)
+
diff --git a/libs/xdg/Exceptions.py b/libs/xdg/Exceptions.py
new file mode 100644
index 000000000..f7d08be4c
--- /dev/null
+++ b/libs/xdg/Exceptions.py
@@ -0,0 +1,51 @@
+"""
+Exception Classes for the xdg package
+"""
+
+debug = False
+
+class Error(Exception):
+    def __init__(self, msg):
+        self.msg = msg
+        Exception.__init__(self, msg)
+    def __str__(self):
+        return self.msg
+
+class ValidationError(Error):
+    def __init__(self, msg, file):
+        self.msg = msg
+        self.file = file
+        Error.__init__(self, "ValidationError in file '%s': %s " % (file, msg))
+
+class ParsingError(Error):
+    def __init__(self, msg, file):
+        self.msg = msg
+        self.file = file
+        Error.__init__(self, "ParsingError in file '%s', %s" % (file, msg))
+
+class NoKeyError(Error):
+    def __init__(self, key, group, file):
+        Error.__init__(self, "No key '%s' in group %s of file %s" % (key, group, file))
+        self.key = key
+        self.group = group
+
+class DuplicateKeyError(Error):
+    def __init__(self, key, group, file):
+        Error.__init__(self, "Duplicate key '%s' in group %s of file %s" % (key, group, file))
+        self.key = key
+        self.group = group
+
+class NoGroupError(Error):
+    def __init__(self, group, file):
+        Error.__init__(self, "No group: %s in file %s" % (group, file))
+        self.group = group
+
+class DuplicateGroupError(Error):
+    def __init__(self, group, file):
+        Error.__init__(self, "Duplicate group: %s in file %s" % (group, file))
+        self.group = group
+
+class NoThemeError(Error):
+    def __init__(self, theme):
+        Error.__init__(self, "No such icon-theme: %s" % theme)
+        self.theme = theme
diff --git a/libs/xdg/INSTALL b/libs/xdg/INSTALL
new file mode 100644
index 000000000..e0acc204f
--- /dev/null
+++ b/libs/xdg/INSTALL
@@ -0,0 +1,3 @@
+Quite easy, just run:
+
+python setup.py install
diff --git a/libs/xdg/IconTheme.py b/libs/xdg/IconTheme.py
new file mode 100644
index 000000000..aa88e0099
--- /dev/null
+++ b/libs/xdg/IconTheme.py
@@ -0,0 +1,435 @@
+"""
+Complete implementation of the XDG Icon Spec Version 0.8
+http://standards.freedesktop.org/icon-theme-spec/
+"""
+
+import os, time
+import re
+
+from xdg.IniFile import IniFile, is_ascii
+from xdg.BaseDirectory import xdg_data_dirs
+from xdg.Exceptions import NoThemeError, debug
+
+import xdg.Config
+
+class IconTheme(IniFile):
+    "Class to parse and validate IconThemes"
+    def __init__(self):
+        IniFile.__init__(self)
+
+    def __repr__(self):
+        return self.name
+
+    def parse(self, file):
+        IniFile.parse(self, file, ["Icon Theme", "KDE Icon Theme"])
+        self.dir = os.path.dirname(file)
+        (nil, self.name) = os.path.split(self.dir)
+
+    def getDir(self):
+        return self.dir
+
+    # Standard Keys
+    def getName(self):
+        return self.get('Name', locale=True)
+    def getComment(self):
+        return self.get('Comment', locale=True)
+    def getInherits(self):
+        return self.get('Inherits', list=True)
+    def getDirectories(self):
+        return self.get('Directories', list=True)
+    def getHidden(self):
+        return self.get('Hidden', type="boolean")
+    def getExample(self):
+        return self.get('Example')
+
+    # Per Directory Keys
+    def getSize(self, directory):
+        return self.get('Size', type="integer", group=directory)
+    def getContext(self, directory):
+        return self.get('Context', group=directory)
+    def getType(self, directory):
+        value = self.get('Type', group=directory)
+        if value:
+            return value
+        else:
+            return "Threshold"
+    def getMaxSize(self, directory):
+        value = self.get('MaxSize', type="integer", group=directory)
+        if value or value == 0:
+            return value
+        else:
+            return self.getSize(directory)
+    def getMinSize(self, directory):
+        value = self.get('MinSize', type="integer", group=directory)
+        if value or value == 0:
+            return value
+        else:
+            return self.getSize(directory)
+    def getThreshold(self, directory):
+        value = self.get('Threshold', type="integer", group=directory)
+        if value or value == 0:
+            return value
+        else:
+            return 2
+
+    # validation stuff
+    def checkExtras(self):
+        # header
+        if self.defaultGroup == "KDE Icon Theme":
+            self.warnings.append('[KDE Icon Theme]-Header is deprecated')
+
+        # file extension
+        if self.fileExtension == ".theme":
+            pass
+        elif self.fileExtension == ".desktop":
+            self.warnings.append('.desktop fileExtension is deprecated')
+        else:
+            self.warnings.append('Unknown File extension')
+
+        # Check required keys
+        # Name
+        try:
+            self.name = self.content[self.defaultGroup]["Name"]
+        except KeyError:
+            self.errors.append("Key 'Name' is missing")
+
+        # Comment
+        try:
+            self.comment = self.content[self.defaultGroup]["Comment"]
+        except KeyError:
+            self.errors.append("Key 'Comment' is missing")
+
+        # Directories
+        try:
+            self.directories = self.content[self.defaultGroup]["Directories"]
+        except KeyError:
+            self.errors.append("Key 'Directories' is missing")
+
+    def checkGroup(self, group):
+        # check if group header is valid
+        if group == self.defaultGroup:
+            try:
+                self.name = self.content[group]["Name"]
+            except KeyError:
+                self.errors.append("Key 'Name' in Group '%s' is missing" % group)
+            try:
+                self.name = self.content[group]["Comment"]
+            except KeyError:
+                self.errors.append("Key 'Comment' in Group '%s' is missing" % group)
+        elif group in self.getDirectories():
+            try:
+                self.type = self.content[group]["Type"]
+            except KeyError:
+                self.type = "Threshold"
+            try:
+                self.name = self.content[group]["Size"]
+            except KeyError:
+                self.errors.append("Key 'Size' in Group '%s' is missing" % group)
+        elif not (re.match("^\[X-", group) and is_ascii(group)):
+            self.errors.append("Invalid Group name: %s" % group)
+
+    def checkKey(self, key, value, group):
+        # standard keys     
+        if group == self.defaultGroup:
+            if re.match("^Name"+xdg.Locale.regex+"$", key):
+                pass
+            elif re.match("^Comment"+xdg.Locale.regex+"$", key):
+                pass
+            elif key == "Inherits":
+                self.checkValue(key, value, list=True)
+            elif key == "Directories":
+                self.checkValue(key, value, list=True)
+            elif key == "Hidden":
+                self.checkValue(key, value, type="boolean")
+            elif key == "Example":
+                self.checkValue(key, value)
+            elif re.match("^X-[a-zA-Z0-9-]+", key):
+                pass
+            else:
+                self.errors.append("Invalid key: %s" % key)
+        elif group in self.getDirectories():
+            if key == "Size":
+                self.checkValue(key, value, type="integer")
+            elif key == "Context":
+                self.checkValue(key, value)
+            elif key == "Type":
+                self.checkValue(key, value)
+                if value not in ["Fixed", "Scalable", "Threshold"]:
+                    self.errors.append("Key 'Type' must be one out of 'Fixed','Scalable','Threshold', but is %s" % value)
+            elif key == "MaxSize":
+                self.checkValue(key, value, type="integer")
+                if self.type != "Scalable":
+                    self.errors.append("Key 'MaxSize' give, but Type is %s" % self.type)
+            elif key == "MinSize":
+                self.checkValue(key, value, type="integer")
+                if self.type != "Scalable":
+                    self.errors.append("Key 'MinSize' give, but Type is %s" % self.type)
+            elif key == "Threshold":
+                self.checkValue(key, value, type="integer")
+                if self.type != "Threshold":
+                    self.errors.append("Key 'Threshold' give, but Type is %s" % self.type)
+            elif re.match("^X-[a-zA-Z0-9-]+", key):
+                pass
+            else:
+                self.errors.append("Invalid key: %s" % key)
+
+
+class IconData(IniFile):
+    "Class to parse and validate IconData Files"
+    def __init__(self):
+        IniFile.__init__(self)
+
+    def __repr__(self):
+        displayname = self.getDisplayName()
+        if displayname:
+            return "<IconData: %s>" % displayname
+        else:
+            return "<IconData>"
+
+    def parse(self, file):
+        IniFile.parse(self, file, ["Icon Data"])
+
+    # Standard Keys
+    def getDisplayName(self):
+        """Retrieve the display name from the icon data, if one is specified."""
+        return self.get('DisplayName', locale=True)
+    def getEmbeddedTextRectangle(self):
+        """Retrieve the embedded text rectangle from the icon data as a list of
+        numbers (x0, y0, x1, y1), if it is specified."""
+        return self.get('EmbeddedTextRectangle', type="integer", list=True)
+    def getAttachPoints(self):
+        """Retrieve the anchor points for overlays & emblems from the icon data,
+        as a list of co-ordinate pairs, if they are specified."""
+        return self.get('AttachPoints', type="point", list=True)
+
+    # validation stuff
+    def checkExtras(self):
+        # file extension
+        if self.fileExtension != ".icon":
+            self.warnings.append('Unknown File extension')
+
+    def checkGroup(self, group):
+        # check if group header is valid
+        if not (group == self.defaultGroup \
+        or (re.match("^\[X-", group) and is_ascii(group))):
+            self.errors.append("Invalid Group name: %s" % group.encode("ascii", "replace"))
+
+    def checkKey(self, key, value, group):
+        # standard keys     
+        if re.match("^DisplayName"+xdg.Locale.regex+"$", key):
+            pass
+        elif key == "EmbeddedTextRectangle":
+            self.checkValue(key, value, type="integer", list=True)
+        elif key == "AttachPoints":
+            self.checkValue(key, value, type="point", list=True)
+        elif re.match("^X-[a-zA-Z0-9-]+", key):
+            pass
+        else:
+            self.errors.append("Invalid key: %s" % key)
+
+
+
+icondirs = []
+for basedir in xdg_data_dirs:
+    icondirs.append(os.path.join(basedir, "icons"))
+    icondirs.append(os.path.join(basedir, "pixmaps"))
+icondirs.append(os.path.expanduser("~/.icons"))
+
+# just cache variables, they give a 10x speed improvement
+themes = []
+theme_cache = {}
+dir_cache = {}
+icon_cache = {}
+
+def getIconPath(iconname, size = None, theme = None, extensions = ["png", "svg", "xpm"]):
+    """Get the path to a specified icon.
+    
+    size :
+      Icon size in pixels. Defaults to ``xdg.Config.icon_size``.
+    theme :
+      Icon theme name. Defaults to ``xdg.Config.icon_theme``. If the icon isn't
+      found in the specified theme, it will be looked up in the basic 'hicolor'
+      theme.
+    extensions :
+      List of preferred file extensions.
+    
+    Example::
+    
+        >>> getIconPath("inkscape", 32)
+        '/usr/share/icons/hicolor/32x32/apps/inkscape.png'
+    """
+    
+    global themes
+
+    if size == None:
+        size = xdg.Config.icon_size
+    if theme == None:
+        theme = xdg.Config.icon_theme
+
+    # if we have an absolute path, just return it
+    if os.path.isabs(iconname):
+        return iconname
+
+    # check if it has an extension and strip it
+    if os.path.splitext(iconname)[1][1:] in extensions:
+        iconname = os.path.splitext(iconname)[0]
+
+    # parse theme files
+    if (themes == []) or (themes[0].name != theme):
+        themes = list(__get_themes(theme))
+
+    # more caching (icon looked up in the last 5 seconds?)
+    tmp = (iconname, size, theme, tuple(extensions))
+    try:
+        timestamp, icon = icon_cache[tmp]
+    except KeyError:
+        pass
+    else:
+        if (time.time() - timestamp) >= xdg.Config.cache_time:
+            del icon_cache[tmp]
+        else:
+            return icon
+
+    for thme in themes:
+        icon = LookupIcon(iconname, size, thme, extensions)
+        if icon:
+            icon_cache[tmp] = (time.time(), icon)
+            return icon
+
+    # cache stuff again (directories looked up in the last 5 seconds?)
+    for directory in icondirs:
+        if (directory not in dir_cache \
+            or (int(time.time() - dir_cache[directory][1]) >= xdg.Config.cache_time \
+            and dir_cache[directory][2] < os.path.getmtime(directory))) \
+            and os.path.isdir(directory):
+            dir_cache[directory] = (os.listdir(directory), time.time(), os.path.getmtime(directory))
+
+    for dir, values in dir_cache.items():
+        for extension in extensions:
+            try:
+                if iconname + "." + extension in values[0]:
+                    icon = os.path.join(dir, iconname + "." + extension)
+                    icon_cache[tmp] = [time.time(), icon]
+                    return icon
+            except UnicodeDecodeError as e:
+                if debug:
+                    raise e
+                else:
+                    pass
+
+    # we haven't found anything? "hicolor" is our fallback
+    if theme != "hicolor":
+        icon = getIconPath(iconname, size, "hicolor")
+        icon_cache[tmp] = [time.time(), icon]
+        return icon
+
+def getIconData(path):
+    """Retrieve the data from the .icon file corresponding to the given file. If
+    there is no .icon file, it returns None.
+    
+    Example::
+    
+        getIconData("/usr/share/icons/Tango/scalable/places/folder.svg")
+    """
+    if os.path.isfile(path):
+        icon_file = os.path.splitext(path)[0] + ".icon"
+        if os.path.isfile(icon_file):
+            data = IconData()
+            data.parse(icon_file)
+            return data
+
+def __get_themes(themename):
+    """Generator yielding IconTheme objects for a specified theme and any themes
+    from which it inherits.
+    """
+    for dir in icondirs:
+        theme_file = os.path.join(dir, themename, "index.theme")
+        if os.path.isfile(theme_file):
+            break
+        theme_file = os.path.join(dir, themename, "index.desktop")
+        if os.path.isfile(theme_file):
+            break
+    else:
+        if debug:
+            raise NoThemeError(themename)
+        return
+    
+    theme = IconTheme()
+    theme.parse(theme_file)
+    yield theme
+    for subtheme in theme.getInherits():
+        for t in __get_themes(subtheme):
+            yield t
+
+def LookupIcon(iconname, size, theme, extensions):
+    # look for the cache
+    if theme.name not in theme_cache:
+        theme_cache[theme.name] = []
+        theme_cache[theme.name].append(time.time() - (xdg.Config.cache_time + 1)) # [0] last time of lookup
+        theme_cache[theme.name].append(0)               # [1] mtime
+        theme_cache[theme.name].append(dict())          # [2] dir: [subdir, [items]]
+
+    # cache stuff (directory lookuped up the in the last 5 seconds?)
+    if int(time.time() - theme_cache[theme.name][0]) >= xdg.Config.cache_time:
+        theme_cache[theme.name][0] = time.time()
+        for subdir in theme.getDirectories():
+            for directory in icondirs:
+                dir = os.path.join(directory,theme.name,subdir)
+                if (dir not in theme_cache[theme.name][2] \
+                or theme_cache[theme.name][1] < os.path.getmtime(os.path.join(directory,theme.name))) \
+                and subdir != "" \
+                and os.path.isdir(dir):
+                    theme_cache[theme.name][2][dir] = [subdir, os.listdir(dir)]
+                    theme_cache[theme.name][1] = os.path.getmtime(os.path.join(directory,theme.name))
+
+    for dir, values in theme_cache[theme.name][2].items():
+        if DirectoryMatchesSize(values[0], size, theme):
+            for extension in extensions:
+                if iconname + "." + extension in values[1]:
+                    return os.path.join(dir, iconname + "." + extension)
+
+    minimal_size = 2**31
+    closest_filename = ""
+    for dir, values in theme_cache[theme.name][2].items():
+        distance = DirectorySizeDistance(values[0], size, theme)
+        if distance < minimal_size:
+            for extension in extensions:
+                if iconname + "." + extension in values[1]:
+                    closest_filename = os.path.join(dir, iconname + "." + extension)
+                    minimal_size = distance
+
+    return closest_filename
+
+def DirectoryMatchesSize(subdir, iconsize, theme):
+    Type = theme.getType(subdir)
+    Size = theme.getSize(subdir)
+    Threshold = theme.getThreshold(subdir)
+    MinSize = theme.getMinSize(subdir)
+    MaxSize = theme.getMaxSize(subdir)
+    if Type == "Fixed":
+        return Size == iconsize
+    elif Type == "Scaleable":
+        return MinSize <= iconsize <= MaxSize
+    elif Type == "Threshold":
+        return Size - Threshold <= iconsize <= Size + Threshold
+
+def DirectorySizeDistance(subdir, iconsize, theme):
+    Type = theme.getType(subdir)
+    Size = theme.getSize(subdir)
+    Threshold = theme.getThreshold(subdir)
+    MinSize = theme.getMinSize(subdir)
+    MaxSize = theme.getMaxSize(subdir)
+    if Type == "Fixed":
+        return abs(Size - iconsize)
+    elif Type == "Scalable":
+        if iconsize < MinSize:
+            return MinSize - iconsize
+        elif iconsize > MaxSize:
+            return MaxSize - iconsize
+        return 0
+    elif Type == "Threshold":
+        if iconsize < Size - Threshold:
+            return MinSize - iconsize
+        elif iconsize > Size + Threshold:
+            return iconsize - MaxSize
+        return 0
diff --git a/libs/xdg/IniFile.py b/libs/xdg/IniFile.py
new file mode 100644
index 000000000..de6dcbf55
--- /dev/null
+++ b/libs/xdg/IniFile.py
@@ -0,0 +1,418 @@
+"""
+Base Class for DesktopEntry, IconTheme and IconData
+"""
+
+import re, os, stat, io
+from xdg.Exceptions import (ParsingError, DuplicateGroupError, NoGroupError,
+                            NoKeyError, DuplicateKeyError, ValidationError,
+                            debug)
+import xdg.Locale
+from xdg.util import u
+
+def is_ascii(s):
+    """Return True if a string consists entirely of ASCII characters."""
+    try:
+        s.encode('ascii', 'strict')
+        return True
+    except UnicodeError:
+        return False
+
+class IniFile:
+    defaultGroup = ''
+    fileExtension = ''
+
+    filename = ''
+
+    tainted = False
+
+    def __init__(self, filename=None):
+        self.content = dict()
+        if filename:
+            self.parse(filename)
+
+    def __cmp__(self, other):
+        return cmp(self.content, other.content)
+
+    def parse(self, filename, headers=None):
+        '''Parse an INI file.
+        
+        headers -- list of headers the parser will try to select as a default header
+        '''
+        # for performance reasons
+        content = self.content
+
+        if not os.path.isfile(filename):
+            raise ParsingError("File not found", filename)
+
+        try:
+            # The content should be UTF-8, but legacy files can have other
+            # encodings, including mixed encodings in one file. We don't attempt
+            # to decode them, but we silence the errors.
+            fd = io.open(filename, 'r', encoding='utf-8', errors='replace')
+        except IOError as e:
+            if debug:
+                raise e
+            else:
+                return
+
+        # parse file
+        for line in fd:
+            line = line.strip()
+            # empty line
+            if not line:
+                continue
+            # comment
+            elif line[0] == '#':
+                continue
+            # new group
+            elif line[0] == '[':
+                currentGroup = line.lstrip("[").rstrip("]")
+                if debug and self.hasGroup(currentGroup):
+                    raise DuplicateGroupError(currentGroup, filename)
+                else:
+                    content[currentGroup] = {}
+            # key
+            else:
+                try:
+                    key, value = line.split("=", 1)
+                except ValueError:
+                    raise ParsingError("Invalid line: " + line, filename)
+                
+                key = key.strip() # Spaces before/after '=' should be ignored
+                try:
+                    if debug and self.hasKey(key, currentGroup):
+                        raise DuplicateKeyError(key, currentGroup, filename)
+                    else:
+                        content[currentGroup][key] = value.strip()
+                except (IndexError, UnboundLocalError):
+                    raise ParsingError("Parsing error on key, group missing", filename)
+
+        fd.close()
+
+        self.filename = filename
+        self.tainted = False
+
+        # check header
+        if headers:
+            for header in headers:
+                if header in content:
+                    self.defaultGroup = header
+                    break
+            else:
+                raise ParsingError("[%s]-Header missing" % headers[0], filename)
+
+    # start stuff to access the keys
+    def get(self, key, group=None, locale=False, type="string", list=False):
+        # set default group
+        if not group:
+            group = self.defaultGroup
+
+        # return key (with locale)
+        if (group in self.content) and (key in self.content[group]):
+            if locale:
+                value = self.content[group][self.__addLocale(key, group)]
+            else:
+                value = self.content[group][key]
+        else:
+            if debug:
+                if group not in self.content:
+                    raise NoGroupError(group, self.filename)
+                elif key not in self.content[group]:
+                    raise NoKeyError(key, group, self.filename)
+            else:
+                value = ""
+
+        if list == True:
+            values = self.getList(value)
+            result = []
+        else:
+            values = [value]
+
+        for value in values:
+            if type == "boolean":
+                value = self.__getBoolean(value)
+            elif type == "integer":
+                try:
+                    value = int(value)
+                except ValueError:
+                    value = 0
+            elif type == "numeric":
+                try:
+                    value = float(value)
+                except ValueError:
+                    value = 0.0
+            elif type == "regex":
+                value = re.compile(value)
+            elif type == "point":
+                x, y = value.split(",")
+                value = int(x), int(y)
+
+            if list == True:
+                result.append(value)
+            else:
+                result = value
+
+        return result
+    # end stuff to access the keys
+
+    # start subget
+    def getList(self, string):
+        if re.search(r"(?<!\\)\;", string):
+            list = re.split(r"(?<!\\);", string)
+        elif re.search(r"(?<!\\)\|", string):
+            list = re.split(r"(?<!\\)\|", string)
+        elif re.search(r"(?<!\\),", string):
+            list = re.split(r"(?<!\\),", string)
+        else:
+            list = [string]
+        if list[-1] == "":
+            list.pop()
+        return list
+
+    def __getBoolean(self, boolean):
+        if boolean == 1 or boolean == "true" or boolean == "True":
+            return True
+        elif boolean == 0 or boolean == "false" or boolean == "False":
+            return False
+        return False
+    # end subget
+
+    def __addLocale(self, key, group=None):
+        "add locale to key according the current lc_messages"
+        # set default group
+        if not group:
+            group = self.defaultGroup
+
+        for lang in xdg.Locale.langs:
+            langkey = "%s[%s]" % (key, lang)
+            if langkey in self.content[group]:
+                return langkey
+
+        return key
+
+    # start validation stuff
+    def validate(self, report="All"):
+        """Validate the contents, raising ``ValidationError`` if there
+        is anything amiss.
+        
+        report can be 'All' / 'Warnings' / 'Errors'
+        """
+
+        self.warnings = []
+        self.errors = []
+
+        # get file extension
+        self.fileExtension = os.path.splitext(self.filename)[1]
+
+        # overwrite this for own checkings
+        self.checkExtras()
+
+        # check all keys
+        for group in self.content:
+            self.checkGroup(group)
+            for key in self.content[group]:
+                self.checkKey(key, self.content[group][key], group)
+                # check if value is empty
+                if self.content[group][key] == "":
+                    self.warnings.append("Value of Key '%s' is empty" % key)
+
+        # raise Warnings / Errors
+        msg = ""
+
+        if report == "All" or report == "Warnings":
+            for line in self.warnings:
+                msg += "\n- " + line
+
+        if report == "All" or report == "Errors":
+            for line in self.errors:
+                msg += "\n- " + line
+
+        if msg:
+            raise ValidationError(msg, self.filename)
+
+    # check if group header is valid
+    def checkGroup(self, group):
+        pass
+
+    # check if key is valid
+    def checkKey(self, key, value, group):
+        pass
+
+    # check random stuff
+    def checkValue(self, key, value, type="string", list=False):
+        if list == True:
+            values = self.getList(value)
+        else:
+            values = [value]
+
+        for value in values:
+            if type == "string":
+                code = self.checkString(value)
+            if type == "localestring":
+                continue
+            elif type == "boolean":
+                code = self.checkBoolean(value)
+            elif type == "numeric":
+                code = self.checkNumber(value)
+            elif type == "integer":
+                code = self.checkInteger(value)
+            elif type == "regex":
+                code = self.checkRegex(value)
+            elif type == "point":
+                code = self.checkPoint(value)
+            if code == 1:
+                self.errors.append("'%s' is not a valid %s" % (value, type))
+            elif code == 2:
+                self.warnings.append("Value of key '%s' is deprecated" % key)
+
+    def checkExtras(self):
+        pass
+
+    def checkBoolean(self, value):
+        # 1 or 0 : deprecated
+        if (value == "1" or value == "0"):
+            return 2
+        # true or false: ok
+        elif not (value == "true" or value == "false"):
+            return 1
+
+    def checkNumber(self, value):
+        # float() ValueError
+        try:
+            float(value)
+        except:
+            return 1
+
+    def checkInteger(self, value):
+        # int() ValueError
+        try:
+            int(value)
+        except:
+            return 1
+
+    def checkPoint(self, value):
+        if not re.match("^[0-9]+,[0-9]+$", value):
+            return 1
+
+    def checkString(self, value):
+        return 0 if is_ascii(value) else 1
+
+    def checkRegex(self, value):
+        try:
+            re.compile(value)
+        except:
+            return 1
+
+    # write support
+    def write(self, filename=None, trusted=False):
+        if not filename and not self.filename:
+            raise ParsingError("File not found", "")
+
+        if filename:
+            self.filename = filename
+        else:
+            filename = self.filename
+
+        if os.path.dirname(filename) and not os.path.isdir(os.path.dirname(filename)):
+            os.makedirs(os.path.dirname(filename))
+
+        with io.open(filename, 'w', encoding='utf-8') as fp:
+
+            # An executable bit signifies that the desktop file is
+            # trusted, but then the file can be executed. Add hashbang to
+            # make sure that the file is opened by something that
+            # understands desktop files.
+            if trusted:
+                fp.write(u("#!/usr/bin/env xdg-open\n"))
+
+            if self.defaultGroup:
+                fp.write(u("[%s]\n") % self.defaultGroup)
+                for (key, value) in self.content[self.defaultGroup].items():
+                    fp.write(u("%s=%s\n") % (key, value))
+                fp.write(u("\n"))
+            for (name, group) in self.content.items():
+                if name != self.defaultGroup:
+                    fp.write(u("[%s]\n") % name)
+                    for (key, value) in group.items():
+                        fp.write(u("%s=%s\n") % (key, value))
+                    fp.write(u("\n"))
+
+        # Add executable bits to the file to show that it's trusted.
+        if trusted:
+            oldmode = os.stat(filename).st_mode
+            mode = oldmode | stat.S_IXUSR | stat.S_IXGRP | stat.S_IXOTH
+            os.chmod(filename, mode)
+
+        self.tainted = False
+
+    def set(self, key, value, group=None, locale=False):
+        # set default group
+        if not group:
+            group = self.defaultGroup
+
+        if locale == True and len(xdg.Locale.langs) > 0:
+            key = key + "[" + xdg.Locale.langs[0] + "]"
+
+        try:
+            self.content[group][key] = value
+        except KeyError:
+            raise NoGroupError(group, self.filename)
+            
+        self.tainted = (value == self.get(key, group))
+
+    def addGroup(self, group):
+        if self.hasGroup(group):
+            if debug:
+                raise DuplicateGroupError(group, self.filename)
+        else:
+            self.content[group] = {}
+            self.tainted = True
+
+    def removeGroup(self, group):
+        existed = group in self.content
+        if existed:
+            del self.content[group]
+            self.tainted = True
+        else:
+            if debug:
+                raise NoGroupError(group, self.filename)
+        return existed
+
+    def removeKey(self, key, group=None, locales=True):
+        # set default group
+        if not group:
+            group = self.defaultGroup
+
+        try:
+            if locales:
+                for name in list(self.content[group]):
+                    if re.match("^" + key + xdg.Locale.regex + "$", name) and name != key:
+                        del self.content[group][name]
+            value = self.content[group].pop(key)
+            self.tainted = True
+            return value
+        except KeyError as e:
+            if debug:
+                if e == group:
+                    raise NoGroupError(group, self.filename)
+                else:
+                    raise NoKeyError(key, group, self.filename)
+            else:
+                return ""
+
+    # misc
+    def groups(self):
+        return self.content.keys()
+
+    def hasGroup(self, group):
+        return group in self.content
+
+    def hasKey(self, key, group=None):
+        # set default group
+        if not group:
+            group = self.defaultGroup
+
+        return key in self.content[group]
+
+    def getFileName(self):
+        return self.filename
diff --git a/libs/xdg/Locale.py b/libs/xdg/Locale.py
new file mode 100644
index 000000000..d30d91a6a
--- /dev/null
+++ b/libs/xdg/Locale.py
@@ -0,0 +1,79 @@
+"""
+Helper Module for Locale settings
+
+This module is based on a ROX module (LGPL):
+
+http://cvs.sourceforge.net/viewcvs.py/rox/ROX-Lib2/python/rox/i18n.py?rev=1.3&view=log
+"""
+
+import os
+from locale import normalize
+
+regex = "(\[([a-zA-Z]+)(_[a-zA-Z]+)?(\.[a-zA-Z\-0-9]+)?(@[a-zA-Z]+)?\])?"
+
+def _expand_lang(locale):
+    locale = normalize(locale)
+    COMPONENT_CODESET   = 1 << 0
+    COMPONENT_MODIFIER  = 1 << 1
+    COMPONENT_TERRITORY = 1 << 2
+    # split up the locale into its base components
+    mask = 0
+    pos = locale.find('@')
+    if pos >= 0:
+        modifier = locale[pos:]
+        locale = locale[:pos]
+        mask |= COMPONENT_MODIFIER
+    else:
+        modifier = ''
+    pos = locale.find('.')
+    codeset = ''
+    if pos >= 0:
+        locale = locale[:pos]
+    pos = locale.find('_')
+    if pos >= 0:
+        territory = locale[pos:]
+        locale = locale[:pos]
+        mask |= COMPONENT_TERRITORY
+    else:
+        territory = ''
+    language = locale
+    ret = []
+    for i in range(mask+1):
+        if not (i & ~mask):  # if all components for this combo exist ...
+            val = language
+            if i & COMPONENT_TERRITORY: val += territory
+            if i & COMPONENT_CODESET:   val += codeset
+            if i & COMPONENT_MODIFIER:  val += modifier
+            ret.append(val)
+    ret.reverse()
+    return ret
+
+def expand_languages(languages=None):
+    # Get some reasonable defaults for arguments that were not supplied
+    if languages is None:
+        languages = []
+        for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
+            val = os.environ.get(envar)
+            if val:
+                languages = val.split(':')
+                break
+    #if 'C' not in languages:
+    #   languages.append('C')
+
+    # now normalize and expand the languages
+    nelangs = []
+    for lang in languages:
+        for nelang in _expand_lang(lang):
+            if nelang not in nelangs:
+                nelangs.append(nelang)
+    return nelangs
+
+def update(language=None):
+    global langs
+    if language:
+        langs = expand_languages([language])
+    else:
+        langs = expand_languages()
+
+langs = []
+update()
diff --git a/libs/xdg/Menu.py b/libs/xdg/Menu.py
new file mode 100644
index 000000000..6252c8005
--- /dev/null
+++ b/libs/xdg/Menu.py
@@ -0,0 +1,1134 @@
+"""
+Implementation of the XDG Menu Specification Version 1.0.draft-1
+http://standards.freedesktop.org/menu-spec/
+
+Example code:
+
+from xdg.Menu import parse, Menu, MenuEntry
+
+def print_menu(menu, tab=0):
+  for submenu in menu.Entries:
+    if isinstance(submenu, Menu):
+      print ("\t" * tab) + unicode(submenu)
+      print_menu(submenu, tab+1)
+    elif isinstance(submenu, MenuEntry):
+      print ("\t" * tab) + unicode(submenu.DesktopEntry)
+
+print_menu(parse())
+"""
+
+import locale, os, xml.dom.minidom
+import subprocess
+
+from xdg.BaseDirectory import xdg_data_dirs, xdg_config_dirs
+from xdg.DesktopEntry import DesktopEntry
+from xdg.Exceptions import ParsingError, ValidationError, debug
+from xdg.util import PY3
+
+import xdg.Locale
+import xdg.Config
+
+ELEMENT_NODE = xml.dom.Node.ELEMENT_NODE
+
+def _strxfrm(s):
+    """Wrapper around locale.strxfrm that accepts unicode strings on Python 2.
+    
+    See Python bug #2481.
+    """
+    if (not PY3) and isinstance(s, unicode):
+        s = s.encode('utf-8')
+    return locale.strxfrm(s)
+
+class Menu:
+    """Menu containing sub menus under menu.Entries
+
+	Contains both Menu and MenuEntry items.
+    """
+    def __init__(self):
+        # Public stuff
+        self.Name = ""
+        self.Directory = None
+        self.Entries = []
+        self.Doc = ""
+        self.Filename = ""
+        self.Depth = 0
+        self.Parent = None
+        self.NotInXml = False
+
+        # Can be one of Deleted/NoDisplay/Hidden/Empty/NotShowIn or True
+        self.Show = True
+        self.Visible = 0
+
+        # Private stuff, only needed for parsing
+        self.AppDirs = []
+        self.DefaultLayout = None
+        self.Deleted = "notset"
+        self.Directories = []
+        self.DirectoryDirs = []
+        self.Layout = None
+        self.MenuEntries = []
+        self.Moves = []
+        self.OnlyUnallocated = "notset"
+        self.Rules = []
+        self.Submenus = []
+
+    def __str__(self):
+        return self.Name
+
+    def __add__(self, other):
+        for dir in other.AppDirs:
+            self.AppDirs.append(dir)
+
+        for dir in other.DirectoryDirs:
+            self.DirectoryDirs.append(dir)
+
+        for directory in other.Directories:
+            self.Directories.append(directory)
+
+        if other.Deleted != "notset":
+            self.Deleted = other.Deleted
+
+        if other.OnlyUnallocated != "notset":
+            self.OnlyUnallocated = other.OnlyUnallocated
+
+        if other.Layout:
+            self.Layout = other.Layout
+
+        if other.DefaultLayout:
+            self.DefaultLayout = other.DefaultLayout
+
+        for rule in other.Rules:
+            self.Rules.append(rule)
+
+        for move in other.Moves:
+            self.Moves.append(move)
+
+        for submenu in other.Submenus:
+            self.addSubmenu(submenu)
+
+        return self
+
+    # FIXME: Performance: cache getName()
+    def __cmp__(self, other):
+        return locale.strcoll(self.getName(), other.getName())
+    
+    def _key(self):
+        """Key function for locale-aware sorting."""
+        return _strxfrm(self.getName())
+    
+    def __lt__(self, other):
+        try:
+            other = other._key()
+        except AttributeError:
+            pass
+        return self._key() < other
+
+    def __eq__(self, other):
+        try:
+            return self.Name == unicode(other)
+        except NameError:  # unicode() becomes str() in Python 3
+            return self.Name == str(other)
+
+    """ PUBLIC STUFF """
+    def getEntries(self, hidden=False):
+        """Interator for a list of Entries visible to the user."""
+        for entry in self.Entries:
+            if hidden == True:
+                yield entry
+            elif entry.Show == True:
+                yield entry
+
+    # FIXME: Add searchEntry/seaqrchMenu function
+    # search for name/comment/genericname/desktopfileide
+    # return multiple items
+
+    def getMenuEntry(self, desktopfileid, deep = False):
+        """Searches for a MenuEntry with a given DesktopFileID."""
+        for menuentry in self.MenuEntries:
+            if menuentry.DesktopFileID == desktopfileid:
+                return menuentry
+        if deep == True:
+            for submenu in self.Submenus:
+                submenu.getMenuEntry(desktopfileid, deep)
+
+    def getMenu(self, path):
+        """Searches for a Menu with a given path."""
+        array = path.split("/", 1)
+        for submenu in self.Submenus:
+            if submenu.Name == array[0]:
+                if len(array) > 1:
+                    return submenu.getMenu(array[1])
+                else:
+                    return submenu
+
+    def getPath(self, org=False, toplevel=False):
+        """Returns this menu's path in the menu structure."""
+        parent = self
+        names=[]
+        while 1:
+            if org:
+                names.append(parent.Name)
+            else:
+                names.append(parent.getName())
+            if parent.Depth > 0:
+                parent = parent.Parent
+            else:
+                break
+        names.reverse()
+        path = ""
+        if toplevel == False:
+            names.pop(0)
+        for name in names:
+            path = os.path.join(path, name)
+        return path
+
+    def getName(self):
+        """Returns the menu's localised name."""
+        try:
+            return self.Directory.DesktopEntry.getName()
+        except AttributeError:
+            return self.Name
+
+    def getGenericName(self):
+        """Returns the menu's generic name."""
+        try:
+            return self.Directory.DesktopEntry.getGenericName()
+        except AttributeError:
+            return ""
+
+    def getComment(self):
+        """Returns the menu's comment text."""
+        try:
+            return self.Directory.DesktopEntry.getComment()
+        except AttributeError:
+            return ""
+
+    def getIcon(self):
+        """Returns the menu's icon, filename or simple name"""
+        try:
+            return self.Directory.DesktopEntry.getIcon()
+        except AttributeError:
+            return ""
+
+    """ PRIVATE STUFF """
+    def addSubmenu(self, newmenu):
+        for submenu in self.Submenus:
+            if submenu == newmenu:
+                submenu += newmenu
+                break
+        else:
+            self.Submenus.append(newmenu)
+            newmenu.Parent = self
+            newmenu.Depth = self.Depth + 1
+
+class Move:
+    "A move operation"
+    def __init__(self, node=None):
+        if node:
+            self.parseNode(node)
+        else:
+            self.Old = ""
+            self.New = ""
+
+    def __cmp__(self, other):
+        return cmp(self.Old, other.Old)
+
+    def parseNode(self, node):
+        for child in node.childNodes:
+            if child.nodeType == ELEMENT_NODE:
+                if child.tagName == "Old":
+                    try:
+                        self.parseOld(child.childNodes[0].nodeValue)
+                    except IndexError:
+                        raise ValidationError('Old cannot be empty', '??')                                            
+                elif child.tagName == "New":
+                    try:
+                        self.parseNew(child.childNodes[0].nodeValue)
+                    except IndexError:
+                        raise ValidationError('New cannot be empty', '??')                                            
+
+    def parseOld(self, value):
+        self.Old = value
+    def parseNew(self, value):
+        self.New = value
+
+
+class Layout:
+    "Menu Layout class"
+    def __init__(self, node=None):
+        self.order = []
+        if node:
+            self.show_empty = node.getAttribute("show_empty") or "false"
+            self.inline = node.getAttribute("inline") or "false"
+            self.inline_limit = node.getAttribute("inline_limit") or 4
+            self.inline_header = node.getAttribute("inline_header") or "true"
+            self.inline_alias = node.getAttribute("inline_alias") or "false"
+            self.inline_limit = int(self.inline_limit)
+            self.parseNode(node)
+        else:
+            self.show_empty = "false"
+            self.inline = "false"
+            self.inline_limit = 4
+            self.inline_header = "true"
+            self.inline_alias = "false"
+            self.order.append(["Merge", "menus"])
+            self.order.append(["Merge", "files"])
+
+    def parseNode(self, node):
+        for child in node.childNodes:
+            if child.nodeType == ELEMENT_NODE:
+                if child.tagName == "Menuname":
+                    try:
+                        self.parseMenuname(
+                            child.childNodes[0].nodeValue,
+                            child.getAttribute("show_empty") or "false",
+                            child.getAttribute("inline") or "false",
+                            child.getAttribute("inline_limit") or 4,
+                            child.getAttribute("inline_header") or "true",
+                            child.getAttribute("inline_alias") or "false" )
+                    except IndexError:
+                        raise ValidationError('Menuname cannot be empty', "")
+                elif child.tagName == "Separator":
+                    self.parseSeparator()
+                elif child.tagName == "Filename":
+                    try:
+                        self.parseFilename(child.childNodes[0].nodeValue)
+                    except IndexError:
+                        raise ValidationError('Filename cannot be empty', "")
+                elif child.tagName == "Merge":
+                    self.parseMerge(child.getAttribute("type") or "all")
+
+    def parseMenuname(self, value, empty="false", inline="false", inline_limit=4, inline_header="true", inline_alias="false"):
+        self.order.append(["Menuname", value, empty, inline, inline_limit, inline_header, inline_alias])
+        self.order[-1][4] = int(self.order[-1][4])
+
+    def parseSeparator(self):
+        self.order.append(["Separator"])
+
+    def parseFilename(self, value):
+        self.order.append(["Filename", value])
+
+    def parseMerge(self, type="all"):
+        self.order.append(["Merge", type])
+
+
+class Rule:
+    "Inlcude / Exclude Rules Class"
+    def __init__(self, type, node=None):
+        # Type is Include or Exclude
+        self.Type = type
+        # Rule is a python expression
+        self.Rule = ""
+
+        # Private attributes, only needed for parsing
+        self.Depth = 0
+        self.Expr = [ "or" ]
+        self.New = True
+
+        # Begin parsing
+        if node:
+            self.parseNode(node)
+
+    def __str__(self):
+        return self.Rule
+    
+    def do(self, menuentries, type, run):
+        for menuentry in menuentries:
+            if run == 2 and ( menuentry.MatchedInclude == True \
+            or menuentry.Allocated == True ):
+                continue
+            elif eval(self.Rule):
+                if type == "Include":
+                    menuentry.Add = True
+                    menuentry.MatchedInclude = True
+                else:
+                    menuentry.Add = False
+        return menuentries
+
+    def parseNode(self, node):
+        for child in node.childNodes:
+            if child.nodeType == ELEMENT_NODE:
+                if child.tagName == 'Filename':
+                    try:
+                        self.parseFilename(child.childNodes[0].nodeValue)
+                    except IndexError:
+                        raise ValidationError('Filename cannot be empty', "???")
+                elif child.tagName == 'Category':
+                    try:
+                        self.parseCategory(child.childNodes[0].nodeValue)
+                    except IndexError:
+                        raise ValidationError('Category cannot be empty', "???")
+                elif child.tagName == 'All':
+                    self.parseAll()
+                elif child.tagName == 'And':
+                    self.parseAnd(child)
+                elif child.tagName == 'Or':
+                    self.parseOr(child)
+                elif child.tagName == 'Not':
+                    self.parseNot(child)
+
+    def parseNew(self, set=True):
+        if not self.New:
+            self.Rule += " " + self.Expr[self.Depth] + " "
+        if not set:
+            self.New = True
+        elif set:
+            self.New = False
+
+    def parseFilename(self, value):
+        self.parseNew()
+        self.Rule += "menuentry.DesktopFileID == '%s'" % value.strip().replace("\\", r"\\").replace("'", r"\'")
+
+    def parseCategory(self, value):
+        self.parseNew()
+        self.Rule += "'%s' in menuentry.Categories" % value.strip()
+
+    def parseAll(self):
+        self.parseNew()
+        self.Rule += "True"
+
+    def parseAnd(self, node):
+        self.parseNew(False)
+        self.Rule += "("
+        self.Depth += 1
+        self.Expr.append("and")
+        self.parseNode(node)
+        self.Depth -= 1
+        self.Expr.pop()
+        self.Rule += ")"
+
+    def parseOr(self, node):
+        self.parseNew(False)
+        self.Rule += "("
+        self.Depth += 1
+        self.Expr.append("or")
+        self.parseNode(node)
+        self.Depth -= 1
+        self.Expr.pop()
+        self.Rule += ")"
+
+    def parseNot(self, node):
+        self.parseNew(False)
+        self.Rule += "not ("
+        self.Depth += 1
+        self.Expr.append("or")
+        self.parseNode(node)
+        self.Depth -= 1
+        self.Expr.pop()
+        self.Rule += ")"
+
+
+class MenuEntry:
+    "Wrapper for 'Menu Style' Desktop Entries"
+    def __init__(self, filename, dir="", prefix=""):
+        # Create entry
+        self.DesktopEntry = DesktopEntry(os.path.join(dir,filename))
+        self.setAttributes(filename, dir, prefix)
+
+        # Can be one of Deleted/Hidden/Empty/NotShowIn/NoExec or True
+        self.Show = True
+
+        # Semi-Private
+        self.Original = None
+        self.Parents = []
+
+        # Private Stuff
+        self.Allocated = False
+        self.Add = False
+        self.MatchedInclude = False
+
+        # Caching
+        self.Categories = self.DesktopEntry.getCategories()
+
+    def save(self):
+        """Save any changes to the desktop entry."""
+        if self.DesktopEntry.tainted == True:
+            self.DesktopEntry.write()
+
+    def getDir(self):
+        """Return the directory containing the desktop entry file."""
+        return self.DesktopEntry.filename.replace(self.Filename, '')
+
+    def getType(self):
+        """Return the type of MenuEntry, System/User/Both"""
+        if xdg.Config.root_mode == False:
+            if self.Original:
+                return "Both"
+            elif xdg_data_dirs[0] in self.DesktopEntry.filename:
+                return "User"
+            else:
+                return "System"
+        else:
+            return "User"
+
+    def setAttributes(self, filename, dir="", prefix=""):
+        self.Filename = filename
+        self.Prefix = prefix
+        self.DesktopFileID = os.path.join(prefix,filename).replace("/", "-")
+
+        if not os.path.isabs(self.DesktopEntry.filename):
+            self.__setFilename()
+
+    def updateAttributes(self):
+        if self.getType() == "System":
+            self.Original = MenuEntry(self.Filename, self.getDir(), self.Prefix)
+            self.__setFilename()
+
+    def __setFilename(self):
+        if xdg.Config.root_mode == False:
+            path = xdg_data_dirs[0]
+        else:
+            path= xdg_data_dirs[1]
+
+        if self.DesktopEntry.getType() == "Application":
+            dir = os.path.join(path, "applications")
+        else:
+            dir = os.path.join(path, "desktop-directories")
+
+        self.DesktopEntry.filename = os.path.join(dir, self.Filename)
+
+    def __cmp__(self, other):
+        return locale.strcoll(self.DesktopEntry.getName(), other.DesktopEntry.getName())
+    
+    def _key(self):
+        """Key function for locale-aware sorting."""
+        return _strxfrm(self.DesktopEntry.getName())
+    
+    def __lt__(self, other):
+        try:
+            other = other._key()
+        except AttributeError:
+            pass
+        return self._key() < other
+            
+
+    def __eq__(self, other):
+        if self.DesktopFileID == str(other):
+            return True
+        else:
+            return False
+
+    def __repr__(self):
+        return self.DesktopFileID
+
+
+class Separator:
+    "Just a dummy class for Separators"
+    def __init__(self, parent):
+        self.Parent = parent
+        self.Show = True
+
+
+class Header:
+    "Class for Inline Headers"
+    def __init__(self, name, generic_name, comment):
+        self.Name = name
+        self.GenericName = generic_name
+        self.Comment = comment
+
+    def __str__(self):
+        return self.Name
+
+
+tmp = {}
+
+def __getFileName(filename):
+    dirs = xdg_config_dirs[:]
+    if xdg.Config.root_mode == True:
+        dirs.pop(0)
+
+    for dir in dirs:
+        menuname = os.path.join (dir, "menus" , filename)
+        if os.path.isdir(dir) and os.path.isfile(menuname):
+            return menuname
+
+def parse(filename=None):
+    """Load an applications.menu file.
+    
+    filename : str, optional
+      The default is ``$XDG_CONFIG_DIRS/menus/${XDG_MENU_PREFIX}applications.menu``.
+    """
+    # convert to absolute path
+    if filename and not os.path.isabs(filename):
+        filename = __getFileName(filename)
+
+    # use default if no filename given
+    if not filename: 
+        candidate = os.environ.get('XDG_MENU_PREFIX', '') + "applications.menu"
+        filename = __getFileName(candidate)
+        
+    if not filename:
+        raise ParsingError('File not found', "/etc/xdg/menus/%s" % candidate)
+
+    # check if it is a .menu file
+    if not os.path.splitext(filename)[1] == ".menu":
+        raise ParsingError('Not a .menu file', filename)
+
+    # create xml parser
+    try:
+        doc = xml.dom.minidom.parse(filename)
+    except xml.parsers.expat.ExpatError:
+        raise ParsingError('Not a valid .menu file', filename)
+
+    # parse menufile
+    tmp["Root"] = ""
+    tmp["mergeFiles"] = []
+    tmp["DirectoryDirs"] = []
+    tmp["cache"] = MenuEntryCache()
+
+    __parse(doc, filename, tmp["Root"])
+    __parsemove(tmp["Root"])
+    __postparse(tmp["Root"])
+
+    tmp["Root"].Doc = doc
+    tmp["Root"].Filename = filename
+
+    # generate the menu
+    __genmenuNotOnlyAllocated(tmp["Root"])
+    __genmenuOnlyAllocated(tmp["Root"])
+
+    # and finally sort
+    sort(tmp["Root"])
+
+    return tmp["Root"]
+
+
+def __parse(node, filename, parent=None):
+    for child in node.childNodes:
+        if child.nodeType == ELEMENT_NODE:
+            if child.tagName == 'Menu':
+                __parseMenu(child, filename, parent)
+            elif child.tagName == 'AppDir':
+                try:
+                    __parseAppDir(child.childNodes[0].nodeValue, filename, parent)
+                except IndexError:
+                    raise ValidationError('AppDir cannot be empty', filename)
+            elif child.tagName == 'DefaultAppDirs':
+                __parseDefaultAppDir(filename, parent)
+            elif child.tagName == 'DirectoryDir':
+                try:
+                    __parseDirectoryDir(child.childNodes[0].nodeValue, filename, parent)
+                except IndexError:
+                    raise ValidationError('DirectoryDir cannot be empty', filename)
+            elif child.tagName == 'DefaultDirectoryDirs':
+                __parseDefaultDirectoryDir(filename, parent)
+            elif child.tagName == 'Name' :
+                try:
+                    parent.Name = child.childNodes[0].nodeValue
+                except IndexError:
+                    raise ValidationError('Name cannot be empty', filename)
+            elif child.tagName == 'Directory' :
+                try:
+                    parent.Directories.append(child.childNodes[0].nodeValue)
+                except IndexError:
+                    raise ValidationError('Directory cannot be empty', filename)
+            elif child.tagName == 'OnlyUnallocated':
+                parent.OnlyUnallocated = True
+            elif child.tagName == 'NotOnlyUnallocated':
+                parent.OnlyUnallocated = False
+            elif child.tagName == 'Deleted':
+                parent.Deleted = True
+            elif child.tagName == 'NotDeleted':
+                parent.Deleted = False
+            elif child.tagName == 'Include' or child.tagName == 'Exclude':
+                parent.Rules.append(Rule(child.tagName, child))
+            elif child.tagName == 'MergeFile':
+                try:
+                    if child.getAttribute("type") == "parent":
+                        __parseMergeFile("applications.menu", child, filename, parent)
+                    else:
+                        __parseMergeFile(child.childNodes[0].nodeValue, child, filename, parent)
+                except IndexError:
+                    raise ValidationError('MergeFile cannot be empty', filename)
+            elif child.tagName == 'MergeDir':
+                try:
+                    __parseMergeDir(child.childNodes[0].nodeValue, child, filename, parent)
+                except IndexError:
+                    raise ValidationError('MergeDir cannot be empty', filename)
+            elif child.tagName == 'DefaultMergeDirs':
+                __parseDefaultMergeDirs(child, filename, parent)
+            elif child.tagName == 'Move':
+                parent.Moves.append(Move(child))
+            elif child.tagName == 'Layout':
+                if len(child.childNodes) > 1:
+                    parent.Layout = Layout(child)
+            elif child.tagName == 'DefaultLayout':
+                if len(child.childNodes) > 1:
+                    parent.DefaultLayout = Layout(child)
+            elif child.tagName == 'LegacyDir':
+                try:
+                    __parseLegacyDir(child.childNodes[0].nodeValue, child.getAttribute("prefix"), filename, parent)
+                except IndexError:
+                    raise ValidationError('LegacyDir cannot be empty', filename)
+            elif child.tagName == 'KDELegacyDirs':
+                __parseKDELegacyDirs(filename, parent)
+
+def __parsemove(menu):
+    for submenu in menu.Submenus:
+        __parsemove(submenu)
+
+    # parse move operations
+    for move in menu.Moves:
+        move_from_menu = menu.getMenu(move.Old)
+        if move_from_menu:
+            move_to_menu = menu.getMenu(move.New)
+
+            menus = move.New.split("/")
+            oldparent = None
+            while len(menus) > 0:
+                if not oldparent:
+                    oldparent = menu
+                newmenu = oldparent.getMenu(menus[0])
+                if not newmenu:
+                    newmenu = Menu()
+                    newmenu.Name = menus[0]
+                    if len(menus) > 1:
+                        newmenu.NotInXml = True
+                    oldparent.addSubmenu(newmenu)
+                oldparent = newmenu
+                menus.pop(0)
+
+            newmenu += move_from_menu
+            move_from_menu.Parent.Submenus.remove(move_from_menu)
+
+def __postparse(menu):
+    # unallocated / deleted
+    if menu.Deleted == "notset":
+        menu.Deleted = False
+    if menu.OnlyUnallocated == "notset":
+        menu.OnlyUnallocated = False
+
+    # Layout Tags
+    if not menu.Layout or not menu.DefaultLayout:
+        if menu.DefaultLayout:
+            menu.Layout = menu.DefaultLayout
+        elif menu.Layout:
+            if menu.Depth > 0:
+                menu.DefaultLayout = menu.Parent.DefaultLayout
+            else:
+                menu.DefaultLayout = Layout()
+        else:
+            if menu.Depth > 0:
+                menu.Layout = menu.Parent.DefaultLayout
+                menu.DefaultLayout = menu.Parent.DefaultLayout
+            else:
+                menu.Layout = Layout()
+                menu.DefaultLayout = Layout()
+
+    # add parent's app/directory dirs
+    if menu.Depth > 0:
+        menu.AppDirs = menu.Parent.AppDirs + menu.AppDirs
+        menu.DirectoryDirs = menu.Parent.DirectoryDirs + menu.DirectoryDirs
+
+    # remove duplicates
+    menu.Directories = __removeDuplicates(menu.Directories)
+    menu.DirectoryDirs = __removeDuplicates(menu.DirectoryDirs)
+    menu.AppDirs = __removeDuplicates(menu.AppDirs)
+
+    # go recursive through all menus
+    for submenu in menu.Submenus:
+        __postparse(submenu)
+
+    # reverse so handling is easier
+    menu.Directories.reverse()
+    menu.DirectoryDirs.reverse()
+    menu.AppDirs.reverse()
+
+    # get the valid .directory file out of the list
+    for directory in menu.Directories:
+        for dir in menu.DirectoryDirs:
+            if os.path.isfile(os.path.join(dir, directory)):
+                menuentry = MenuEntry(directory, dir)
+                if not menu.Directory:
+                    menu.Directory = menuentry
+                elif menuentry.getType() == "System":
+                    if menu.Directory.getType() == "User":
+                        menu.Directory.Original = menuentry
+        if menu.Directory:
+            break
+
+
+# Menu parsing stuff
+def __parseMenu(child, filename, parent):
+    m = Menu()
+    __parse(child, filename, m)
+    if parent:
+        parent.addSubmenu(m)
+    else:
+        tmp["Root"] = m
+
+# helper function
+def __check(value, filename, type):
+    path = os.path.dirname(filename)
+
+    if not os.path.isabs(value):
+        value = os.path.join(path, value)
+
+    value = os.path.abspath(value)
+
+    if type == "dir" and os.path.exists(value) and os.path.isdir(value):
+        return value
+    elif type == "file" and os.path.exists(value) and os.path.isfile(value):
+        return value
+    else:
+        return False
+
+# App/Directory Dir Stuff
+def __parseAppDir(value, filename, parent):
+    value = __check(value, filename, "dir")
+    if value:
+        parent.AppDirs.append(value)
+
+def __parseDefaultAppDir(filename, parent):
+    for dir in reversed(xdg_data_dirs):
+        __parseAppDir(os.path.join(dir, "applications"), filename, parent)
+
+def __parseDirectoryDir(value, filename, parent):
+    value = __check(value, filename, "dir")
+    if value:
+        parent.DirectoryDirs.append(value)
+
+def __parseDefaultDirectoryDir(filename, parent):
+    for dir in reversed(xdg_data_dirs):
+        __parseDirectoryDir(os.path.join(dir, "desktop-directories"), filename, parent)
+
+# Merge Stuff
+def __parseMergeFile(value, child, filename, parent):
+    if child.getAttribute("type") == "parent":
+        for dir in xdg_config_dirs:
+            rel_file = filename.replace(dir, "").strip("/")
+            if rel_file != filename:
+                for p in xdg_config_dirs:
+                    if dir == p:
+                        continue
+                    if os.path.isfile(os.path.join(p,rel_file)):
+                        __mergeFile(os.path.join(p,rel_file),child,parent)
+                        break
+    else:
+        value = __check(value, filename, "file")
+        if value:
+            __mergeFile(value, child, parent)
+
+def __parseMergeDir(value, child, filename, parent):
+    value = __check(value, filename, "dir")
+    if value:
+        for item in os.listdir(value):
+            try:
+                if os.path.splitext(item)[1] == ".menu":
+                    __mergeFile(os.path.join(value, item), child, parent)
+            except UnicodeDecodeError:
+                continue
+
+def __parseDefaultMergeDirs(child, filename, parent):
+    basename = os.path.splitext(os.path.basename(filename))[0]
+    for dir in reversed(xdg_config_dirs):
+        __parseMergeDir(os.path.join(dir, "menus", basename + "-merged"), child, filename, parent)
+
+def __mergeFile(filename, child, parent):
+    # check for infinite loops
+    if filename in tmp["mergeFiles"]:
+        if debug:
+            raise ParsingError('Infinite MergeFile loop detected', filename)
+        else:
+            return
+
+    tmp["mergeFiles"].append(filename)
+
+    # load file
+    try:
+        doc = xml.dom.minidom.parse(filename)
+    except IOError:
+        if debug:
+            raise ParsingError('File not found', filename)
+        else:
+            return
+    except xml.parsers.expat.ExpatError:
+        if debug:
+            raise ParsingError('Not a valid .menu file', filename)
+        else:
+            return
+
+    # append file
+    for child in doc.childNodes:
+        if child.nodeType == ELEMENT_NODE:
+            __parse(child,filename,parent)
+            break
+
+# Legacy Dir Stuff
+def __parseLegacyDir(dir, prefix, filename, parent):
+    m = __mergeLegacyDir(dir,prefix,filename,parent)
+    if m:
+        parent += m
+
+def __mergeLegacyDir(dir, prefix, filename, parent):
+    dir = __check(dir,filename,"dir")
+    if dir and dir not in tmp["DirectoryDirs"]:
+        tmp["DirectoryDirs"].append(dir)
+
+        m = Menu()
+        m.AppDirs.append(dir)
+        m.DirectoryDirs.append(dir)
+        m.Name = os.path.basename(dir)
+        m.NotInXml = True
+
+        for item in os.listdir(dir):
+            try:
+                if item == ".directory":
+                    m.Directories.append(item)
+                elif os.path.isdir(os.path.join(dir,item)):
+                    m.addSubmenu(__mergeLegacyDir(os.path.join(dir,item), prefix, filename, parent))
+            except UnicodeDecodeError:
+                continue
+
+        tmp["cache"].addMenuEntries([dir],prefix, True)
+        menuentries = tmp["cache"].getMenuEntries([dir], False)
+
+        for menuentry in menuentries:
+            categories = menuentry.Categories
+            if len(categories) == 0:
+                r = Rule("Include")
+                r.parseFilename(menuentry.DesktopFileID)
+                m.Rules.append(r)
+            if not dir in parent.AppDirs:
+                categories.append("Legacy")
+                menuentry.Categories = categories
+
+        return m
+
+def __parseKDELegacyDirs(filename, parent):
+    try:
+        proc = subprocess.Popen(['kde-config', '--path', 'apps'],
+                                stdout=subprocess.PIPE, universal_newlines=True)
+        output = proc.communicate()[0].splitlines()
+    except OSError:
+        # If kde-config doesn't exist, ignore this.
+        return
+    
+    try:
+        for dir in output[0].split(":"):
+            __parseLegacyDir(dir,"kde", filename, parent)
+    except IndexError:
+        pass
+
+# remove duplicate entries from a list
+def __removeDuplicates(list):
+    set = {}
+    list.reverse()
+    list = [set.setdefault(e,e) for e in list if e not in set]
+    list.reverse()
+    return list
+
+# Finally generate the menu
+def __genmenuNotOnlyAllocated(menu):
+    for submenu in menu.Submenus:
+        __genmenuNotOnlyAllocated(submenu)
+
+    if menu.OnlyUnallocated == False:
+        tmp["cache"].addMenuEntries(menu.AppDirs)
+        menuentries = []
+        for rule in menu.Rules:
+            menuentries = rule.do(tmp["cache"].getMenuEntries(menu.AppDirs), rule.Type, 1)
+        for menuentry in menuentries:
+            if menuentry.Add == True:
+                menuentry.Parents.append(menu)
+                menuentry.Add = False
+                menuentry.Allocated = True
+                menu.MenuEntries.append(menuentry)
+
+def __genmenuOnlyAllocated(menu):
+    for submenu in menu.Submenus:
+        __genmenuOnlyAllocated(submenu)
+
+    if menu.OnlyUnallocated == True:
+        tmp["cache"].addMenuEntries(menu.AppDirs)
+        menuentries = []
+        for rule in menu.Rules:
+            menuentries = rule.do(tmp["cache"].getMenuEntries(menu.AppDirs), rule.Type, 2)
+        for menuentry in menuentries:
+            if menuentry.Add == True:
+                menuentry.Parents.append(menu)
+            #   menuentry.Add = False
+            #   menuentry.Allocated = True
+                menu.MenuEntries.append(menuentry)
+
+# And sorting ...
+def sort(menu):
+    menu.Entries = []
+    menu.Visible = 0
+
+    for submenu in menu.Submenus:
+        sort(submenu)
+
+    tmp_s = []
+    tmp_e = []
+
+    for order in menu.Layout.order:
+        if order[0] == "Filename":
+            tmp_e.append(order[1])
+        elif order[0] == "Menuname":
+            tmp_s.append(order[1])
+    
+    for order in menu.Layout.order:
+        if order[0] == "Separator":
+            separator = Separator(menu)
+            if len(menu.Entries) > 0 and isinstance(menu.Entries[-1], Separator):
+                separator.Show = False
+            menu.Entries.append(separator)
+        elif order[0] == "Filename":
+            menuentry = menu.getMenuEntry(order[1])
+            if menuentry:
+                menu.Entries.append(menuentry)
+        elif order[0] == "Menuname":
+            submenu = menu.getMenu(order[1])
+            if submenu:
+                __parse_inline(submenu, menu)
+        elif order[0] == "Merge":
+            if order[1] == "files" or order[1] == "all":
+                menu.MenuEntries.sort()
+                for menuentry in menu.MenuEntries:
+                    if menuentry not in tmp_e:
+                        menu.Entries.append(menuentry)
+            elif order[1] == "menus" or order[1] == "all":
+                menu.Submenus.sort()
+                for submenu in menu.Submenus:
+                    if submenu.Name not in tmp_s:
+                        __parse_inline(submenu, menu)
+
+    # getHidden / NoDisplay / OnlyShowIn / NotOnlyShowIn / Deleted / NoExec
+    for entry in menu.Entries:
+        entry.Show = True
+        menu.Visible += 1
+        if isinstance(entry, Menu):
+            if entry.Deleted == True:
+                entry.Show = "Deleted"
+                menu.Visible -= 1
+            elif isinstance(entry.Directory, MenuEntry):
+                if entry.Directory.DesktopEntry.getNoDisplay() == True:
+                    entry.Show = "NoDisplay"
+                    menu.Visible -= 1
+                elif entry.Directory.DesktopEntry.getHidden() == True:
+                    entry.Show = "Hidden"
+                    menu.Visible -= 1
+        elif isinstance(entry, MenuEntry):
+            if entry.DesktopEntry.getNoDisplay() == True:
+                entry.Show = "NoDisplay"
+                menu.Visible -= 1
+            elif entry.DesktopEntry.getHidden() == True:
+                entry.Show = "Hidden"
+                menu.Visible -= 1
+            elif entry.DesktopEntry.getTryExec() and not __try_exec(entry.DesktopEntry.getTryExec()):
+                entry.Show = "NoExec"
+                menu.Visible -= 1
+            elif xdg.Config.windowmanager:
+                if ( entry.DesktopEntry.getOnlyShowIn() != [] and xdg.Config.windowmanager not in entry.DesktopEntry.getOnlyShowIn() ) \
+                or xdg.Config.windowmanager in entry.DesktopEntry.getNotShowIn():
+                    entry.Show = "NotShowIn"
+                    menu.Visible -= 1
+        elif isinstance(entry,Separator):
+            menu.Visible -= 1
+
+    # remove separators at the beginning and at the end
+    if len(menu.Entries) > 0:
+        if isinstance(menu.Entries[0], Separator):
+            menu.Entries[0].Show = False
+    if len(menu.Entries) > 1:
+        if isinstance(menu.Entries[-1], Separator):
+            menu.Entries[-1].Show = False
+
+    # show_empty tag
+    for entry in menu.Entries[:]:
+        if isinstance(entry, Menu) and entry.Layout.show_empty == "false" and entry.Visible == 0:
+            entry.Show = "Empty"
+            menu.Visible -= 1
+            if entry.NotInXml == True:
+                menu.Entries.remove(entry)
+
+def __try_exec(executable):
+    paths = os.environ['PATH'].split(os.pathsep)
+    if not os.path.isfile(executable):
+        for p in paths:
+            f = os.path.join(p, executable)
+            if os.path.isfile(f):
+                if os.access(f, os.X_OK):
+                    return True
+    else:
+        if os.access(executable, os.X_OK):
+            return True
+    return False
+
+# inline tags
+def __parse_inline(submenu, menu):
+    if submenu.Layout.inline == "true":
+        if len(submenu.Entries) == 1 and submenu.Layout.inline_alias == "true":
+            menuentry = submenu.Entries[0]
+            menuentry.DesktopEntry.set("Name", submenu.getName(), locale = True)
+            menuentry.DesktopEntry.set("GenericName", submenu.getGenericName(), locale = True)
+            menuentry.DesktopEntry.set("Comment", submenu.getComment(), locale = True)
+            menu.Entries.append(menuentry)
+        elif len(submenu.Entries) <= submenu.Layout.inline_limit or submenu.Layout.inline_limit == 0:
+            if submenu.Layout.inline_header == "true":
+                header = Header(submenu.getName(), submenu.getGenericName(), submenu.getComment())
+                menu.Entries.append(header)
+            for entry in submenu.Entries:
+                menu.Entries.append(entry)
+        else:
+            menu.Entries.append(submenu)
+    else:
+        menu.Entries.append(submenu)
+
+class MenuEntryCache:
+    "Class to cache Desktop Entries"
+    def __init__(self):
+        self.cacheEntries = {}
+        self.cacheEntries['legacy'] = []
+        self.cache = {}
+
+    def addMenuEntries(self, dirs, prefix="", legacy=False):
+        for dir in dirs:
+            if not dir in self.cacheEntries:
+                self.cacheEntries[dir] = []
+                self.__addFiles(dir, "", prefix, legacy)
+
+    def __addFiles(self, dir, subdir, prefix, legacy):
+        for item in os.listdir(os.path.join(dir,subdir)):
+            if os.path.splitext(item)[1] == ".desktop":
+                try:
+                    menuentry = MenuEntry(os.path.join(subdir,item), dir, prefix)
+                except ParsingError:
+                    continue
+
+                self.cacheEntries[dir].append(menuentry)
+                if legacy == True:
+                    self.cacheEntries['legacy'].append(menuentry)
+            elif os.path.isdir(os.path.join(dir,subdir,item)) and legacy == False:
+                self.__addFiles(dir, os.path.join(subdir,item), prefix, legacy)
+
+    def getMenuEntries(self, dirs, legacy=True):
+        list = []
+        ids = []
+        # handle legacy items
+        appdirs = dirs[:]
+        if legacy == True:
+            appdirs.append("legacy")
+        # cache the results again
+        key = "".join(appdirs)
+        try:
+            return self.cache[key]
+        except KeyError:
+            pass
+        for dir in appdirs:
+            for menuentry in self.cacheEntries[dir]:
+                try:
+                    if menuentry.DesktopFileID not in ids:
+                        ids.append(menuentry.DesktopFileID)
+                        list.append(menuentry)
+                    elif menuentry.getType() == "System":
+                    # FIXME: This is only 99% correct, but still...
+                        i = list.index(menuentry)
+                        e = list[i]
+                        if e.getType() == "User":
+                            e.Original = menuentry
+                except UnicodeDecodeError:
+                    continue
+        self.cache[key] = list
+        return list
diff --git a/libs/xdg/MenuEditor.py b/libs/xdg/MenuEditor.py
new file mode 100644
index 000000000..cc5ce54db
--- /dev/null
+++ b/libs/xdg/MenuEditor.py
@@ -0,0 +1,511 @@
+""" CLass to edit XDG Menus """
+
+from xdg.Menu import *
+from xdg.BaseDirectory import *
+from xdg.Exceptions import *
+from xdg.DesktopEntry import *
+from xdg.Config import *
+
+import xml.dom.minidom
+import os
+import re
+
+# XML-Cleanups: Move / Exclude
+# FIXME: proper reverte/delete
+# FIXME: pass AppDirs/DirectoryDirs around in the edit/move functions
+# FIXME: catch Exceptions
+# FIXME: copy functions
+# FIXME: More Layout stuff
+# FIXME: unod/redo function / remove menu...
+# FIXME: Advanced MenuEditing Stuff: LegacyDir/MergeFile
+#        Complex Rules/Deleted/OnlyAllocated/AppDirs/DirectoryDirs
+
+class MenuEditor:
+    def __init__(self, menu=None, filename=None, root=False):
+        self.menu = None
+        self.filename = None
+        self.doc = None
+        self.parse(menu, filename, root)
+
+        # fix for creating two menus with the same name on the fly
+        self.filenames = []
+
+    def parse(self, menu=None, filename=None, root=False):
+        if root == True:
+            setRootMode(True)
+
+        if isinstance(menu, Menu):
+            self.menu = menu
+        elif menu:
+            self.menu = parse(menu)
+        else:
+            self.menu = parse()
+
+        if root == True:
+            self.filename = self.menu.Filename
+        elif filename:
+            self.filename = filename
+        else:
+            self.filename = os.path.join(xdg_config_dirs[0], "menus", os.path.split(self.menu.Filename)[1])
+
+        try:
+            self.doc = xml.dom.minidom.parse(self.filename)
+        except IOError:
+            self.doc = xml.dom.minidom.parseString('<!DOCTYPE Menu PUBLIC "-//freedesktop//DTD Menu 1.0//EN" "http://standards.freedesktop.org/menu-spec/menu-1.0.dtd"><Menu><Name>Applications</Name><MergeFile type="parent">'+self.menu.Filename+'</MergeFile></Menu>')
+        except xml.parsers.expat.ExpatError:
+            raise ParsingError('Not a valid .menu file', self.filename)
+
+        self.__remove_whilespace_nodes(self.doc)
+
+    def save(self):
+        self.__saveEntries(self.menu)
+        self.__saveMenu()
+
+    def createMenuEntry(self, parent, name, command=None, genericname=None, comment=None, icon=None, terminal=None, after=None, before=None):
+        menuentry = MenuEntry(self.__getFileName(name, ".desktop"))
+        menuentry = self.editMenuEntry(menuentry, name, genericname, comment, command, icon, terminal)
+
+        self.__addEntry(parent, menuentry, after, before)
+
+        sort(self.menu)
+
+        return menuentry
+
+    def createMenu(self, parent, name, genericname=None, comment=None, icon=None, after=None, before=None):
+        menu = Menu()
+
+        menu.Parent = parent
+        menu.Depth = parent.Depth + 1
+        menu.Layout = parent.DefaultLayout
+        menu.DefaultLayout = parent.DefaultLayout
+
+        menu = self.editMenu(menu, name, genericname, comment, icon)
+
+        self.__addEntry(parent, menu, after, before)
+
+        sort(self.menu)
+
+        return menu
+
+    def createSeparator(self, parent, after=None, before=None):
+        separator = Separator(parent)
+
+        self.__addEntry(parent, separator, after, before)
+
+        sort(self.menu)
+
+        return separator
+
+    def moveMenuEntry(self, menuentry, oldparent, newparent, after=None, before=None):
+        self.__deleteEntry(oldparent, menuentry, after, before)
+        self.__addEntry(newparent, menuentry, after, before)
+
+        sort(self.menu)
+
+        return menuentry
+
+    def moveMenu(self, menu, oldparent, newparent, after=None, before=None):
+        self.__deleteEntry(oldparent, menu, after, before)
+        self.__addEntry(newparent, menu, after, before)
+
+        root_menu = self.__getXmlMenu(self.menu.Name)
+        if oldparent.getPath(True) != newparent.getPath(True):
+            self.__addXmlMove(root_menu, os.path.join(oldparent.getPath(True), menu.Name), os.path.join(newparent.getPath(True), menu.Name))
+
+        sort(self.menu)
+
+        return menu
+
+    def moveSeparator(self, separator, parent, after=None, before=None):
+        self.__deleteEntry(parent, separator, after, before)
+        self.__addEntry(parent, separator, after, before)
+
+        sort(self.menu)
+
+        return separator
+
+    def copyMenuEntry(self, menuentry, oldparent, newparent, after=None, before=None):
+        self.__addEntry(newparent, menuentry, after, before)
+
+        sort(self.menu)
+
+        return menuentry
+
+    def editMenuEntry(self, menuentry, name=None, genericname=None, comment=None, command=None, icon=None, terminal=None, nodisplay=None, hidden=None):
+        deskentry = menuentry.DesktopEntry
+
+        if name:
+            if not deskentry.hasKey("Name"):
+                deskentry.set("Name", name)
+            deskentry.set("Name", name, locale = True)
+        if comment:
+            if not deskentry.hasKey("Comment"):
+                deskentry.set("Comment", comment)
+            deskentry.set("Comment", comment, locale = True)
+        if genericname:
+            if not deskentry.hasKey("GnericNe"):
+                deskentry.set("GenericName", genericname)
+            deskentry.set("GenericName", genericname, locale = True)
+        if command:
+            deskentry.set("Exec", command)
+        if icon:
+            deskentry.set("Icon", icon)
+
+        if terminal == True:
+            deskentry.set("Terminal", "true")
+        elif terminal == False:
+            deskentry.set("Terminal", "false")
+
+        if nodisplay == True:
+            deskentry.set("NoDisplay", "true")
+        elif nodisplay == False:
+            deskentry.set("NoDisplay", "false")
+
+        if hidden == True:
+            deskentry.set("Hidden", "true")
+        elif hidden == False:
+            deskentry.set("Hidden", "false")
+
+        menuentry.updateAttributes()
+
+        if len(menuentry.Parents) > 0:
+            sort(self.menu)
+
+        return menuentry
+
+    def editMenu(self, menu, name=None, genericname=None, comment=None, icon=None, nodisplay=None, hidden=None):
+        # Hack for legacy dirs
+        if isinstance(menu.Directory, MenuEntry) and menu.Directory.Filename == ".directory":
+            xml_menu = self.__getXmlMenu(menu.getPath(True, True))
+            self.__addXmlTextElement(xml_menu, 'Directory', menu.Name + ".directory")
+            menu.Directory.setAttributes(menu.Name + ".directory")
+        # Hack for New Entries
+        elif not isinstance(menu.Directory, MenuEntry):
+            if not name:
+                name = menu.Name
+            filename = self.__getFileName(name, ".directory").replace("/", "")
+            if not menu.Name:
+                menu.Name = filename.replace(".directory", "")
+            xml_menu = self.__getXmlMenu(menu.getPath(True, True))
+            self.__addXmlTextElement(xml_menu, 'Directory', filename)
+            menu.Directory = MenuEntry(filename)
+
+        deskentry = menu.Directory.DesktopEntry
+
+        if name:
+            if not deskentry.hasKey("Name"):
+                deskentry.set("Name", name)
+            deskentry.set("Name", name, locale = True)
+        if genericname:
+            if not deskentry.hasKey("GenericName"):
+                deskentry.set("GenericName", genericname)
+            deskentry.set("GenericName", genericname, locale = True)
+        if comment:
+            if not deskentry.hasKey("Comment"):
+                deskentry.set("Comment", comment)
+            deskentry.set("Comment", comment, locale = True)
+        if icon:
+            deskentry.set("Icon", icon)
+
+        if nodisplay == True:
+            deskentry.set("NoDisplay", "true")
+        elif nodisplay == False:
+            deskentry.set("NoDisplay", "false")
+
+        if hidden == True:
+            deskentry.set("Hidden", "true")
+        elif hidden == False:
+            deskentry.set("Hidden", "false")
+
+        menu.Directory.updateAttributes()
+
+        if isinstance(menu.Parent, Menu):
+            sort(self.menu)
+
+        return menu
+
+    def hideMenuEntry(self, menuentry):
+        self.editMenuEntry(menuentry, nodisplay = True)
+
+    def unhideMenuEntry(self, menuentry):
+        self.editMenuEntry(menuentry, nodisplay = False, hidden = False)
+
+    def hideMenu(self, menu):
+        self.editMenu(menu, nodisplay = True)
+
+    def unhideMenu(self, menu):
+        self.editMenu(menu, nodisplay = False, hidden = False)
+        xml_menu = self.__getXmlMenu(menu.getPath(True,True), False)
+        for node in self.__getXmlNodesByName(["Deleted", "NotDeleted"], xml_menu):
+            node.parentNode.removeChild(node)
+
+    def deleteMenuEntry(self, menuentry):
+        if self.getAction(menuentry) == "delete":
+            self.__deleteFile(menuentry.DesktopEntry.filename)
+            for parent in menuentry.Parents:
+                self.__deleteEntry(parent, menuentry)
+            sort(self.menu)
+        return menuentry
+
+    def revertMenuEntry(self, menuentry):
+        if self.getAction(menuentry) == "revert":
+            self.__deleteFile(menuentry.DesktopEntry.filename)
+            menuentry.Original.Parents = []
+            for parent in menuentry.Parents:
+                index = parent.Entries.index(menuentry)
+                parent.Entries[index] = menuentry.Original
+                index = parent.MenuEntries.index(menuentry)
+                parent.MenuEntries[index] = menuentry.Original
+                menuentry.Original.Parents.append(parent)
+            sort(self.menu)
+        return menuentry
+
+    def deleteMenu(self, menu):
+        if self.getAction(menu) == "delete":
+            self.__deleteFile(menu.Directory.DesktopEntry.filename)
+            self.__deleteEntry(menu.Parent, menu)
+            xml_menu = self.__getXmlMenu(menu.getPath(True, True))
+            xml_menu.parentNode.removeChild(xml_menu)
+            sort(self.menu)
+        return menu
+
+    def revertMenu(self, menu):
+        if self.getAction(menu) == "revert":
+            self.__deleteFile(menu.Directory.DesktopEntry.filename)
+            menu.Directory = menu.Directory.Original
+            sort(self.menu)
+        return menu
+
+    def deleteSeparator(self, separator):
+        self.__deleteEntry(separator.Parent, separator, after=True)
+
+        sort(self.menu)
+
+        return separator
+
+    """ Private Stuff """
+    def getAction(self, entry):
+        if isinstance(entry, Menu):
+            if not isinstance(entry.Directory, MenuEntry):
+                return "none"
+            elif entry.Directory.getType() == "Both":
+                return "revert"
+            elif entry.Directory.getType() == "User" \
+            and (len(entry.Submenus) + len(entry.MenuEntries)) == 0:
+                return "delete"
+
+        elif isinstance(entry, MenuEntry):
+            if entry.getType() == "Both":
+                return "revert"
+            elif entry.getType() == "User":
+                return "delete"
+            else:
+                return "none"
+
+        return "none"
+
+    def __saveEntries(self, menu):
+        if not menu:
+            menu = self.menu
+        if isinstance(menu.Directory, MenuEntry):
+            menu.Directory.save()
+        for entry in menu.getEntries(hidden=True):
+            if isinstance(entry, MenuEntry):
+                entry.save()
+            elif isinstance(entry, Menu):
+                self.__saveEntries(entry)
+
+    def __saveMenu(self):
+        if not os.path.isdir(os.path.dirname(self.filename)):
+            os.makedirs(os.path.dirname(self.filename))
+        fd = open(self.filename, 'w')
+        fd.write(re.sub("\n[\s]*([^\n<]*)\n[\s]*</", "\\1</", self.doc.toprettyxml().replace('<?xml version="1.0" ?>\n', '')))
+        fd.close()
+
+    def __getFileName(self, name, extension):
+        postfix = 0
+        while 1:
+            if postfix == 0:
+                filename = name + extension
+            else:
+                filename = name + "-" + str(postfix) + extension
+            if extension == ".desktop":
+                dir = "applications"
+            elif extension == ".directory":
+                dir = "desktop-directories"
+            if not filename in self.filenames and not \
+                os.path.isfile(os.path.join(xdg_data_dirs[0], dir, filename)):
+                self.filenames.append(filename)
+                break
+            else:
+                postfix += 1
+
+        return filename
+
+    def __getXmlMenu(self, path, create=True, element=None):
+        if not element:
+            element = self.doc
+
+        if "/" in path:
+            (name, path) = path.split("/", 1)
+        else:
+            name = path
+            path = ""
+
+        found = None
+        for node in self.__getXmlNodesByName("Menu", element):
+            for child in self.__getXmlNodesByName("Name", node):
+                if child.childNodes[0].nodeValue == name:
+                    if path:
+                        found = self.__getXmlMenu(path, create, node)
+                    else:
+                        found = node
+                    break
+            if found:
+                break
+        if not found and create == True:
+            node = self.__addXmlMenuElement(element, name)
+            if path:
+                found = self.__getXmlMenu(path, create, node)
+            else:
+                found = node
+
+        return found
+
+    def __addXmlMenuElement(self, element, name):
+        node = self.doc.createElement('Menu')
+        self.__addXmlTextElement(node, 'Name', name)
+        return element.appendChild(node)
+
+    def __addXmlTextElement(self, element, name, text):
+        node = self.doc.createElement(name)
+        text = self.doc.createTextNode(text)
+        node.appendChild(text)
+        return element.appendChild(node)
+
+    def __addXmlFilename(self, element, filename, type = "Include"):
+        # remove old filenames
+        for node in self.__getXmlNodesByName(["Include", "Exclude"], element):
+            if node.childNodes[0].nodeName == "Filename" and node.childNodes[0].childNodes[0].nodeValue == filename:
+                element.removeChild(node)
+
+        # add new filename
+        node = self.doc.createElement(type)
+        node.appendChild(self.__addXmlTextElement(node, 'Filename', filename))
+        return element.appendChild(node)
+
+    def __addXmlMove(self, element, old, new):
+        node = self.doc.createElement("Move")
+        node.appendChild(self.__addXmlTextElement(node, 'Old', old))
+        node.appendChild(self.__addXmlTextElement(node, 'New', new))
+        return element.appendChild(node)
+
+    def __addXmlLayout(self, element, layout):
+        # remove old layout
+        for node in self.__getXmlNodesByName("Layout", element):
+            element.removeChild(node)
+
+        # add new layout
+        node = self.doc.createElement("Layout")
+        for order in layout.order:
+            if order[0] == "Separator":
+                child = self.doc.createElement("Separator")
+                node.appendChild(child)
+            elif order[0] == "Filename":
+                child = self.__addXmlTextElement(node, "Filename", order[1])
+            elif order[0] == "Menuname":
+                child = self.__addXmlTextElement(node, "Menuname", order[1])
+            elif order[0] == "Merge":
+                child = self.doc.createElement("Merge")
+                child.setAttribute("type", order[1])
+                node.appendChild(child)
+        return element.appendChild(node)
+
+    def __getXmlNodesByName(self, name, element):
+        for child in element.childNodes:
+            if child.nodeType == xml.dom.Node.ELEMENT_NODE and child.nodeName in name:
+                yield child
+
+    def __addLayout(self, parent):
+        layout = Layout()
+        layout.order = []
+        layout.show_empty = parent.Layout.show_empty
+        layout.inline = parent.Layout.inline
+        layout.inline_header = parent.Layout.inline_header
+        layout.inline_alias = parent.Layout.inline_alias
+        layout.inline_limit = parent.Layout.inline_limit
+
+        layout.order.append(["Merge", "menus"])
+        for entry in parent.Entries:
+            if isinstance(entry, Menu):
+                layout.parseMenuname(entry.Name)
+            elif isinstance(entry, MenuEntry):
+                layout.parseFilename(entry.DesktopFileID)
+            elif isinstance(entry, Separator):
+                layout.parseSeparator()
+        layout.order.append(["Merge", "files"])
+
+        parent.Layout = layout
+
+        return layout
+
+    def __addEntry(self, parent, entry, after=None, before=None):
+        if after or before:
+            if after:
+                index = parent.Entries.index(after) + 1
+            elif before:
+                index = parent.Entries.index(before)
+            parent.Entries.insert(index, entry)
+        else:
+            parent.Entries.append(entry)
+
+        xml_parent = self.__getXmlMenu(parent.getPath(True, True))
+
+        if isinstance(entry, MenuEntry):
+            parent.MenuEntries.append(entry)
+            entry.Parents.append(parent)
+            self.__addXmlFilename(xml_parent, entry.DesktopFileID, "Include")
+        elif isinstance(entry, Menu):
+            parent.addSubmenu(entry)
+
+        if after or before:
+            self.__addLayout(parent)
+            self.__addXmlLayout(xml_parent, parent.Layout)
+
+    def __deleteEntry(self, parent, entry, after=None, before=None):
+        parent.Entries.remove(entry)
+
+        xml_parent = self.__getXmlMenu(parent.getPath(True, True))
+
+        if isinstance(entry, MenuEntry):
+            entry.Parents.remove(parent)
+            parent.MenuEntries.remove(entry)
+            self.__addXmlFilename(xml_parent, entry.DesktopFileID, "Exclude")
+        elif isinstance(entry, Menu):
+            parent.Submenus.remove(entry)
+
+        if after or before:
+            self.__addLayout(parent)
+            self.__addXmlLayout(xml_parent, parent.Layout)
+
+    def __deleteFile(self, filename):
+        try:
+            os.remove(filename)
+        except OSError:
+            pass
+        try:
+            self.filenames.remove(filename)
+        except ValueError:
+            pass
+
+    def __remove_whilespace_nodes(self, node):
+        remove_list = []
+        for child in node.childNodes:
+            if child.nodeType == xml.dom.minidom.Node.TEXT_NODE:
+                child.data = child.data.strip()
+                if not child.data.strip():
+                    remove_list.append(child)
+            elif child.hasChildNodes():
+                self.__remove_whilespace_nodes(child)
+        for node in remove_list:
+            node.parentNode.removeChild(node)
diff --git a/libs/xdg/Mime.py b/libs/xdg/Mime.py
new file mode 100644
index 000000000..b20159e58
--- /dev/null
+++ b/libs/xdg/Mime.py
@@ -0,0 +1,519 @@
+"""
+This module is based on a rox module (LGPL):
+
+http://cvs.sourceforge.net/viewcvs.py/rox/ROX-Lib2/python/rox/mime.py?rev=1.21&view=log
+
+This module provides access to the shared MIME database.
+
+types is a dictionary of all known MIME types, indexed by the type name, e.g.
+types['application/x-python']
+
+Applications can install information about MIME types by storing an
+XML file as <MIME>/packages/<application>.xml and running the
+update-mime-database command, which is provided by the freedesktop.org
+shared mime database package.
+
+See http://www.freedesktop.org/standards/shared-mime-info-spec/ for
+information about the format of these files.
+
+(based on version 0.13)
+"""
+
+import os
+import stat
+import sys
+import fnmatch
+
+from xdg import BaseDirectory
+import xdg.Locale
+
+from xml.dom import minidom, XML_NAMESPACE
+from collections import defaultdict
+
+FREE_NS = 'http://www.freedesktop.org/standards/shared-mime-info'
+
+types = {}      # Maps MIME names to type objects
+
+exts = None     # Maps extensions to types
+globs = None    # List of (glob, type) pairs
+literals = None # Maps liternal names to types
+magic = None
+
+PY3 = (sys.version_info[0] >= 3)
+
+def _get_node_data(node):
+    """Get text of XML node"""
+    return ''.join([n.nodeValue for n in node.childNodes]).strip()
+
+def lookup(media, subtype = None):
+    """Get the MIMEtype object for this type, creating a new one if needed.
+    
+    The name can either be passed as one part ('text/plain'), or as two
+    ('text', 'plain').
+    """
+    if subtype is None and '/' in media:
+        media, subtype = media.split('/', 1)
+    if (media, subtype) not in types:
+        types[(media, subtype)] = MIMEtype(media, subtype)
+    return types[(media, subtype)]
+
+class MIMEtype:
+    """Type holding data about a MIME type"""
+    def __init__(self, media, subtype):
+        "Don't use this constructor directly; use mime.lookup() instead."
+        assert media and '/' not in media
+        assert subtype and '/' not in subtype
+        assert (media, subtype) not in types
+
+        self.media = media
+        self.subtype = subtype
+        self._comment = None
+
+    def _load(self):
+        "Loads comment for current language. Use get_comment() instead."
+        resource = os.path.join('mime', self.media, self.subtype + '.xml')
+        for path in BaseDirectory.load_data_paths(resource):
+            doc = minidom.parse(path)
+            if doc is None:
+                continue
+            for comment in doc.documentElement.getElementsByTagNameNS(FREE_NS, 'comment'):
+                lang = comment.getAttributeNS(XML_NAMESPACE, 'lang') or 'en'
+                goodness = 1 + (lang in xdg.Locale.langs)
+                if goodness > self._comment[0]:
+                    self._comment = (goodness, _get_node_data(comment))
+                if goodness == 2: return
+
+    # FIXME: add get_icon method
+    def get_comment(self):
+        """Returns comment for current language, loading it if needed."""
+        # Should we ever reload?
+        if self._comment is None:
+            self._comment = (0, str(self))
+            self._load()
+        return self._comment[1]
+    
+    def canonical(self):
+        """Returns the canonical MimeType object if this is an alias."""
+        update_cache()
+        s = str(self)
+        if s in aliases:
+            return lookup(aliases[s])
+        return self
+    
+    def inherits_from(self):
+        """Returns a set of Mime types which this inherits from."""
+        update_cache()
+        return set(lookup(t) for t in inheritance[str(self)])
+
+    def __str__(self):
+        return self.media + '/' + self.subtype
+
+    def __repr__(self):
+        return '<%s: %s>' % (self, self._comment or '(comment not loaded)')
+
+class MagicRule:
+    def __init__(self, f):
+        self.next=None
+        self.prev=None
+
+        #print line
+        ind=b''
+        while True:
+            c=f.read(1)
+            if c == b'>':
+                break
+            ind+=c
+        if not ind:
+            self.nest=0
+        else:
+            self.nest=int(ind.decode('ascii'))
+
+        start = b''
+        while True:
+            c = f.read(1)
+            if c == b'=':
+                break
+            start += c
+        self.start = int(start.decode('ascii'))
+        
+        hb=f.read(1)
+        lb=f.read(1)
+        self.lenvalue = ord(lb)+(ord(hb)<<8)
+
+        self.value = f.read(self.lenvalue)
+
+        c = f.read(1)
+        if c == b'&':
+            self.mask = f.read(self.lenvalue)
+            c = f.read(1)
+        else:
+            self.mask=None
+
+        if c == b'~':
+            w = b''
+            while c!=b'+' and c!=b'\n':
+                c=f.read(1)
+                if c==b'+' or c==b'\n':
+                    break
+                w+=c
+            
+            self.word=int(w.decode('ascii'))
+        else:
+            self.word=1
+
+        if c==b'+':
+            r=b''
+            while c!=b'\n':
+                c=f.read(1)
+                if c==b'\n':
+                    break
+                r+=c
+            #print r
+            self.range = int(r.decode('ascii'))
+        else:
+            self.range = 1
+
+        if c != b'\n':
+            raise ValueError('Malformed MIME magic line')
+
+    def getLength(self):
+        return self.start+self.lenvalue+self.range
+
+    def appendRule(self, rule):
+        if self.nest<rule.nest:
+            self.next=rule
+            rule.prev=self
+
+        elif self.prev:
+            self.prev.appendRule(rule)
+        
+    def match(self, buffer):
+        if self.match0(buffer):
+            if self.next:
+                return self.next.match(buffer)
+            return True
+
+    def match0(self, buffer):
+        l=len(buffer)
+        for o in range(self.range):
+            s=self.start+o
+            e=s+self.lenvalue
+            if l<e:
+                return False
+            if self.mask:
+                test=''
+                for i in range(self.lenvalue):
+                    if PY3:
+                        c = buffer[s+i] & self.mask[i]
+                    else:
+                        c = ord(buffer[s+i]) & ord(self.mask[i])
+                    test += chr(c)
+            else:
+                test = buffer[s:e]
+
+            if test==self.value:
+                return True
+
+    def __repr__(self):
+        return '<MagicRule %d>%d=[%d]%r&%r~%d+%d>' % (self.nest,
+                                  self.start,
+                                  self.lenvalue,
+                                  self.value,
+                                  self.mask,
+                                  self.word,
+                                  self.range)
+
+class MagicType:
+    def __init__(self, mtype):
+        self.mtype=mtype
+        self.top_rules=[]
+        self.last_rule=None
+
+    def getLine(self, f):
+        nrule=MagicRule(f)
+
+        if nrule.nest and self.last_rule:
+            self.last_rule.appendRule(nrule)
+        else:
+            self.top_rules.append(nrule)
+
+        self.last_rule=nrule
+
+        return nrule
+
+    def match(self, buffer):
+        for rule in self.top_rules:
+            if rule.match(buffer):
+                return self.mtype
+
+    def __repr__(self):
+        return '<MagicType %s>' % self.mtype
+    
+class MagicDB:
+    def __init__(self):
+        self.types={}   # Indexed by priority, each entry is a list of type rules
+        self.maxlen=0
+
+    def mergeFile(self, fname):
+        with open(fname, 'rb') as f:
+            line = f.readline()
+            if line != b'MIME-Magic\0\n':
+                raise IOError('Not a MIME magic file')
+
+            while True:
+                shead = f.readline().decode('ascii')
+                #print shead
+                if not shead:
+                    break
+                if shead[0] != '[' or shead[-2:] != ']\n':
+                    raise ValueError('Malformed section heading')
+                pri, tname = shead[1:-2].split(':')
+                #print shead[1:-2]
+                pri = int(pri)
+                mtype = lookup(tname)
+
+                try:
+                    ents = self.types[pri]
+                except:
+                    ents = []
+                    self.types[pri] = ents
+
+                magictype = MagicType(mtype)
+                #print tname
+
+                #rline=f.readline()
+                c=f.read(1)
+                f.seek(-1, 1)
+                while c and c != b'[':
+                    rule=magictype.getLine(f)
+                    #print rule
+                    if rule and rule.getLength() > self.maxlen:
+                        self.maxlen = rule.getLength()
+
+                    c = f.read(1)
+                    f.seek(-1, 1)
+
+                ents.append(magictype)
+                #self.types[pri]=ents
+                if not c:
+                    break
+
+    def match_data(self, data, max_pri=100, min_pri=0):
+        for priority in sorted(self.types.keys(), reverse=True):
+            #print priority, max_pri, min_pri
+            if priority > max_pri:
+                continue
+            if priority < min_pri:
+                break
+            for type in self.types[priority]:
+                m=type.match(data)
+                if m:
+                    return m
+
+    def match(self, path, max_pri=100, min_pri=0):
+        try:
+            with open(path, 'rb') as f:
+                buf = f.read(self.maxlen)
+            return self.match_data(buf, max_pri, min_pri)
+        except:
+            pass
+    
+    def __repr__(self):
+        return '<MagicDB %s>' % self.types
+            
+
+# Some well-known types
+text = lookup('text', 'plain')
+inode_block = lookup('inode', 'blockdevice')
+inode_char = lookup('inode', 'chardevice')
+inode_dir = lookup('inode', 'directory')
+inode_fifo = lookup('inode', 'fifo')
+inode_socket = lookup('inode', 'socket')
+inode_symlink = lookup('inode', 'symlink')
+inode_door = lookup('inode', 'door')
+app_exe = lookup('application', 'executable')
+
+_cache_uptodate = False
+
+def _cache_database():
+    global exts, globs, literals, magic, aliases, inheritance, _cache_uptodate
+
+    _cache_uptodate = True
+
+    exts = {}       # Maps extensions to types
+    globs = []      # List of (glob, type) pairs
+    literals = {}   # Maps literal names to types
+    aliases = {}    # Maps alias Mime types to canonical names
+    inheritance = defaultdict(set) # Maps to sets of parent mime types.
+    magic = MagicDB()
+
+    def _import_glob_file(path):
+        """Loads name matching information from a MIME directory."""
+        with open(path) as f:
+          for line in f:
+            if line.startswith('#'): continue
+            line = line[:-1]
+
+            type_name, pattern = line.split(':', 1)
+            mtype = lookup(type_name)
+
+            if pattern.startswith('*.'):
+                rest = pattern[2:]
+                if not ('*' in rest or '[' in rest or '?' in rest):
+                    exts[rest] = mtype
+                    continue
+            if '*' in pattern or '[' in pattern or '?' in pattern:
+                globs.append((pattern, mtype))
+            else:
+                literals[pattern] = mtype
+
+    for path in BaseDirectory.load_data_paths(os.path.join('mime', 'globs')):
+        _import_glob_file(path)
+    for path in BaseDirectory.load_data_paths(os.path.join('mime', 'magic')):
+        magic.mergeFile(path)
+
+    # Sort globs by length
+    globs.sort(key=lambda x: len(x[0]) )
+    
+    # Load aliases
+    for path in BaseDirectory.load_data_paths(os.path.join('mime', 'aliases')):
+        with open(path, 'r') as f:
+            for line in f:
+                alias, canonical = line.strip().split(None, 1)
+                aliases[alias] = canonical
+    
+    # Load subclasses
+    for path in BaseDirectory.load_data_paths(os.path.join('mime', 'subclasses')):
+        with open(path, 'r') as f:
+            for line in f:
+                sub, parent = line.strip().split(None, 1)
+                inheritance[sub].add(parent)
+
+def update_cache():
+    if not _cache_uptodate:
+        _cache_database()
+
+def get_type_by_name(path):
+    """Returns type of file by its name, or None if not known"""
+    update_cache()
+
+    leaf = os.path.basename(path)
+    if leaf in literals:
+        return literals[leaf]
+
+    lleaf = leaf.lower()
+    if lleaf in literals:
+        return literals[lleaf]
+
+    ext = leaf
+    while 1:
+        p = ext.find('.')
+        if p < 0: break
+        ext = ext[p + 1:]
+        if ext in exts:
+            return exts[ext]
+    ext = lleaf
+    while 1:
+        p = ext.find('.')
+        if p < 0: break
+        ext = ext[p+1:]
+        if ext in exts:
+            return exts[ext]
+    for (glob, mime_type) in globs:
+        if fnmatch.fnmatch(leaf, glob):
+            return mime_type
+        if fnmatch.fnmatch(lleaf, glob):
+            return mime_type
+    return None
+
+def get_type_by_contents(path, max_pri=100, min_pri=0):
+    """Returns type of file by its contents, or None if not known"""
+    update_cache()
+
+    return magic.match(path, max_pri, min_pri)
+
+def get_type_by_data(data, max_pri=100, min_pri=0):
+    """Returns type of the data, which should be bytes."""
+    update_cache()
+
+    return magic.match_data(data, max_pri, min_pri)
+
+def get_type(path, follow=True, name_pri=100):
+    """Returns type of file indicated by path.
+    
+    path :
+      pathname to check (need not exist)
+    follow :
+      when reading file, follow symbolic links
+    name_pri :
+      Priority to do name matches.  100=override magic
+    
+    This tries to use the contents of the file, and falls back to the name. It
+    can also handle special filesystem objects like directories and sockets.
+    """
+    update_cache()
+    
+    try:
+        if follow:
+            st = os.stat(path)
+        else:
+            st = os.lstat(path)
+    except:
+        t = get_type_by_name(path)
+        return t or text
+
+    if stat.S_ISREG(st.st_mode):
+        t = get_type_by_contents(path, min_pri=name_pri)
+        if not t: t = get_type_by_name(path)
+        if not t: t = get_type_by_contents(path, max_pri=name_pri)
+        if t is None:
+            if stat.S_IMODE(st.st_mode) & 0o111:
+                return app_exe
+            else:
+                return text
+        return t
+    elif stat.S_ISDIR(st.st_mode): return inode_dir
+    elif stat.S_ISCHR(st.st_mode): return inode_char
+    elif stat.S_ISBLK(st.st_mode): return inode_block
+    elif stat.S_ISFIFO(st.st_mode): return inode_fifo
+    elif stat.S_ISLNK(st.st_mode): return inode_symlink
+    elif stat.S_ISSOCK(st.st_mode): return inode_socket
+    return inode_door
+
+def install_mime_info(application, package_file):
+    """Copy 'package_file' as ``~/.local/share/mime/packages/<application>.xml.``
+    If package_file is None, install ``<app_dir>/<application>.xml``.
+    If already installed, does nothing. May overwrite an existing
+    file with the same name (if the contents are different)"""
+    application += '.xml'
+
+    new_data = open(package_file).read()
+
+    # See if the file is already installed
+    package_dir = os.path.join('mime', 'packages')
+    resource = os.path.join(package_dir, application)
+    for x in BaseDirectory.load_data_paths(resource):
+        try:
+            old_data = open(x).read()
+        except:
+            continue
+        if old_data == new_data:
+            return  # Already installed
+
+    global _cache_uptodate
+    _cache_uptodate = False
+
+    # Not already installed; add a new copy
+    # Create the directory structure...
+    new_file = os.path.join(BaseDirectory.save_data_path(package_dir), application)
+
+    # Write the file...
+    open(new_file, 'w').write(new_data)
+
+    # Update the database...
+    command = 'update-mime-database'
+    if os.spawnlp(os.P_WAIT, command, command, BaseDirectory.save_data_path('mime')):
+        os.unlink(new_file)
+        raise Exception("The '%s' command returned an error code!\n" \
+                  "Make sure you have the freedesktop.org shared MIME package:\n" \
+                  "http://standards.freedesktop.org/shared-mime-info/" % command)
diff --git a/libs/xdg/README b/libs/xdg/README
new file mode 100644
index 000000000..c09f489db
--- /dev/null
+++ b/libs/xdg/README
@@ -0,0 +1,21 @@
+The XDG Package contains:
+
+    - Implementation of the XDG-Base-Directory Standard
+      http://standards.freedesktop.org/basedir-spec/
+
+    - Implementation of the XDG-Desktop Standard
+      http://standards.freedesktop.org/desktop-entry-spec/
+
+    - Implementation of the XDG-Menu Standard
+      http://standards.freedesktop.org/menu-spec/
+
+    - Implementation of the XDG-Icon-Theme Standard
+      http://standards.freedesktop.org/icon-theme-spec/
+
+    - Implementation of the XDG-Shared MIME-info Database
+      http://standards.freedesktop.org/shared-mime-info-spec/
+
+    - Implementation of the XDG-Recent File Storage Specification
+      http://standards.freedesktop.org/recent-file-spec/
+
+To run the tests, run nosetests in the top level directory.
diff --git a/libs/xdg/RecentFiles.py b/libs/xdg/RecentFiles.py
new file mode 100644
index 000000000..10489468a
--- /dev/null
+++ b/libs/xdg/RecentFiles.py
@@ -0,0 +1,181 @@
+"""
+Implementation of the XDG Recent File Storage Specification Version 0.2
+http://standards.freedesktop.org/recent-file-spec
+"""
+
+import xml.dom.minidom, xml.sax.saxutils
+import os, time, fcntl
+from xdg.Exceptions import ParsingError
+
+class RecentFiles:
+    def __init__(self):
+        self.RecentFiles = []
+        self.filename = ""
+
+    def parse(self, filename=None):
+        """Parse a list of recently used files.
+        
+        filename defaults to ``~/.recently-used``.
+        """
+        if not filename:
+            filename = os.path.join(os.getenv("HOME"), ".recently-used")
+
+        try:
+            doc = xml.dom.minidom.parse(filename)
+        except IOError:
+            raise ParsingError('File not found', filename)
+        except xml.parsers.expat.ExpatError:
+            raise ParsingError('Not a valid .menu file', filename)
+
+        self.filename = filename
+
+        for child in doc.childNodes:
+            if child.nodeType == xml.dom.Node.ELEMENT_NODE:
+                if child.tagName == "RecentFiles":
+                    for recent in child.childNodes:
+                        if recent.nodeType == xml.dom.Node.ELEMENT_NODE:    
+                            if recent.tagName == "RecentItem":
+                                self.__parseRecentItem(recent)
+
+        self.sort()
+
+    def __parseRecentItem(self, item):
+        recent = RecentFile()
+        self.RecentFiles.append(recent)
+
+        for attribute in item.childNodes:
+            if attribute.nodeType == xml.dom.Node.ELEMENT_NODE:
+                if attribute.tagName == "URI":
+                    recent.URI = attribute.childNodes[0].nodeValue
+                elif attribute.tagName == "Mime-Type":
+                    recent.MimeType = attribute.childNodes[0].nodeValue
+                elif attribute.tagName == "Timestamp":
+                    recent.Timestamp = int(attribute.childNodes[0].nodeValue)
+                elif attribute.tagName == "Private":
+                    recent.Prviate = True
+                elif attribute.tagName == "Groups":
+
+                    for group in attribute.childNodes:
+                        if group.nodeType == xml.dom.Node.ELEMENT_NODE:
+                            if group.tagName == "Group":
+                                recent.Groups.append(group.childNodes[0].nodeValue)
+
+    def write(self, filename=None):
+        """Write the list of recently used files to disk.
+        
+        If the instance is already associated with a file, filename can be
+        omitted to save it there again.
+        """
+        if not filename and not self.filename:
+            raise ParsingError('File not found', filename)
+        elif not filename:
+            filename = self.filename
+
+        f = open(filename, "w")
+        fcntl.lockf(f, fcntl.LOCK_EX)
+        f.write('<?xml version="1.0"?>\n')
+        f.write("<RecentFiles>\n")
+
+        for r in self.RecentFiles:
+            f.write("  <RecentItem>\n")
+            f.write("    <URI>%s</URI>\n" % xml.sax.saxutils.escape(r.URI))
+            f.write("    <Mime-Type>%s</Mime-Type>\n" % r.MimeType)
+            f.write("    <Timestamp>%s</Timestamp>\n" % r.Timestamp)
+            if r.Private == True:
+                f.write("    <Private/>\n")
+            if len(r.Groups) > 0:
+                f.write("    <Groups>\n")
+                for group in r.Groups:
+                    f.write("      <Group>%s</Group>\n" % group)
+                f.write("    </Groups>\n")
+            f.write("  </RecentItem>\n")
+
+        f.write("</RecentFiles>\n")
+        fcntl.lockf(f, fcntl.LOCK_UN)
+        f.close()
+
+    def getFiles(self, mimetypes=None, groups=None, limit=0):
+        """Get a list of recently used files.
+        
+        The parameters can be used to filter by mime types, by group, or to
+        limit the number of items returned. By default, the entire list is
+        returned, except for items marked private.
+        """
+        tmp = []
+        i = 0
+        for item in self.RecentFiles:
+            if groups:
+                for group in groups:
+                    if group in item.Groups:
+                        tmp.append(item)
+                        i += 1
+            elif mimetypes:
+                for mimetype in mimetypes:
+                    if mimetype == item.MimeType:
+                        tmp.append(item)
+                        i += 1
+            else:
+                if item.Private == False:
+                    tmp.append(item)
+                    i += 1
+            if limit != 0 and i == limit:
+                break
+
+        return tmp
+
+    def addFile(self, item, mimetype, groups=None, private=False):
+        """Add a recently used file.
+        
+        item should be the URI of the file, typically starting with ``file:///``.
+        """
+        # check if entry already there
+        if item in self.RecentFiles:
+            index = self.RecentFiles.index(item)
+            recent = self.RecentFiles[index]
+        else:
+            # delete if more then 500 files
+            if len(self.RecentFiles) == 500:
+                self.RecentFiles.pop()
+            # add entry
+            recent = RecentFile()
+            self.RecentFiles.append(recent)
+
+        recent.URI = item
+        recent.MimeType = mimetype
+        recent.Timestamp = int(time.time())
+        recent.Private = private
+        if groups:
+            recent.Groups = groups
+
+        self.sort()
+
+    def deleteFile(self, item):
+        """Remove a recently used file, by URI, from the list.
+        """
+        if item in self.RecentFiles:
+            self.RecentFiles.remove(item)
+
+    def sort(self):
+        self.RecentFiles.sort()
+        self.RecentFiles.reverse()
+
+
+class RecentFile:
+    def __init__(self):
+        self.URI = ""
+        self.MimeType = ""
+        self.Timestamp = ""
+        self.Private = False
+        self.Groups = []
+
+    def __cmp__(self, other):
+        return cmp(self.Timestamp, other.Timestamp)
+    
+    def __lt__ (self, other):
+        return self.Timestamp < other.Timestamp
+
+    def __eq__(self, other):
+        return self.URI == str(other)
+
+    def __str__(self):
+        return self.URI
diff --git a/libs/xdg/__init__.py b/libs/xdg/__init__.py
new file mode 100644
index 000000000..2bddf0094
--- /dev/null
+++ b/libs/xdg/__init__.py
@@ -0,0 +1,3 @@
+__all__ = [ "BaseDirectory", "DesktopEntry", "Menu", "Exceptions", "IniFile", "IconTheme", "Locale", "Config", "Mime", "RecentFiles", "MenuEditor" ]
+
+__version__ = "0.25"
diff --git a/libs/xdg/util.py b/libs/xdg/util.py
new file mode 100644
index 000000000..5d54e4b85
--- /dev/null
+++ b/libs/xdg/util.py
@@ -0,0 +1,11 @@
+import sys
+
+PY3 = sys.version_info[0] >= 3
+
+if PY3:
+    def u(s):
+        return s
+else:
+    # Unicode-like literals
+    def u(s):
+        return s.decode('utf-8')